Modbus RTU 通信
Modbus RTU (Remote Terminal Unit) 是用于网络中通信的标准协议,使用 RS232 或 RS422/485 连接在网络中的 Modbus 设备之间进行串行数据传输。
Modbus RTU 使用主/从站网络,其中整个通信仅由一个主站设备触发,而从站只能响应主站的请求。 主站将请求发送到一个从站地址,并且只有该地址上的从站做出响应。
例外: Modbus 从站地址为 0 时会向所有从站发送广播帧(从站均不响应)。
Modbus 功能代码
作为 Modbus RTU 主站运行的 CPU 能够在 Modbus RTU 从站中通过通信连接读取和写入数据和 I/O 状态。
作为 Modbus RTU 从站运行的 CPU 允许利用通信连接进行连接的 Modbus RTU 主站在其自身的 CPU 中读取并写入数据和 I/O 状态。
用于读取数据的功能: 读取分布式 I/O 和程序数据
Modbus 功能代码
|
用于读取从站(服务器)数据的功能 - 标准寻址
|
01
|
读取输出位: 每个请求 1 至2000/19921) 位
|
02
|
读取输入位: 每个请求 1 至 2000/19921) 位
|
03
|
读取保持寄存器: 每个请求 1 至 125/1241) 字
|
04
|
读取输入字: 每个请求 1 至 125/1241) 字
|
1) 用于扩展寻址
|
用于写入数据的功能: 更改分布式 I/O 和程序数据
Modbus 功能代码
|
用于向从站(服务器)写入数据的功能 - 标准寻址
|
05
|
写入一个输出位: 每个请求 1 位
|
06
|
写入一个保持寄存器: 每个请求 1 个字
|
15
|
写入一个或多个输出位:每个请求 1 至 1960 位
|
16
|
写入一个或多个保持寄存器:每个请求 1 至 122 个字
|
Modbus 功能代码 08 和 11 提供从站设备的通信诊断选项。
Modbus 从站地址为 0 时会将广播帧发送给所有从站(无从站响应;针对功能代码 5、6、15、16)。
Modbus 网络中的站地址
站
|
地址
|
RTU 站
|
标准站地址
|
1 到 247 , 0 用于广播
|
扩展站地址
|
1 到 65535,0 用于广播
|
Modbus 存储器地址
可用的 Modbus 存储器地址(输入/输出地址)的实际数量取决于 CPU 版本和可用的工作存储器。
程序中的 Modbus RTU 指令
Modbus_Comm_Load:需要运行 Modbus_Comm_Load 来设置 PtP 参数,例如数据传输速率、奇偶校验和数据流控制。 为 Modbus RTU 协议组态完通信模块后,它只能由 Modbus_Master 指令或 Modbus_Slave 指令使用。
Modbus_Master:利用 Modbus 主站指令,CPU 可用作 Modbus RTU 主站设备,与一个或更多的 Modbus 从站设备进行通信。
Modbus_Slave:利用 Modbus 从站指令,CPU 可用作 Modbus RTU 从站设备,与一个 Modbus 主站设备进行通信。
Modbus_Comm_Load: 对 Modbus 的通信模块进行组态
说明
Modbus_Comm_Load 指令通过 Modbus RTU 协议对用于通信的通信模块进行组态。当在程序中添加 Modbus_Comm_Load 指令时,将自动分配背景数据块。
Modbus_Comm_Load 的组态更改将保存在 CM 中,而不是 CPU 中。恢复电压和插拔时,将使用保存在设备配置中的数据组态 CM。必须在这些情况下调用 Modbus_Comm_Load 指令。
参数
参数
|
声明
|
数据类型
|
标准
|
说明
|
S7-
1200/1500
|
S7-
300/400/
WinAC
|
REQ
|
IN
|
Bool
|
FALSE
|
当此输入出现上升沿时,启动该指令。
|
PORT
|
IN
|
Port
|
Laddr
|
0
|
指定用于以下通信的通信模块:
对于 S7-1500/S7-1200:设备组态中的“硬件标识符”。
符号端口名称在 PLC 变量表的“系统常数”(System constants) 选项卡中指定并可应用于此处。
对于 S7-300/S7-400:设备组态中的“输入地址”。
在 S7-300/400/WinAC 系统中,在 HWCN 中分配的输入地址中分配端口参数。
|
BAUD
|
IN
|
UDInt
|
DWord
|
9600
|
选择数据传输速率
有效值为:300、600、1200、2400、4800、9600、19200、38400、57600、76800、115200 bit/s。
|
PARITY
|
IN
|
UInt
|
Word
|
0
|
选择奇偶校验:
|
FLOW_CTRL
|
IN
|
UInt
|
Word
|
0
|
选择流控制:
0 – (默认)无流控制
1 – 硬件流控制,RTS 始终开启(不适用于 RS422/485 CM)
2 – 硬件流控制,RTS 切换(不适用于 RS422/485 CM)
|
RTS_ON_DLY
|
IN
|
UInt
|
Word
|
0
|
RTS 接通延迟选择:
0 – 从“RTS 激活”直到发送帧的第一个字符之前无延迟。
1 到 65535 - 从“RTS 激活”一直到发送帧的第一个字符之前的延迟(以毫秒表示)(不适用于 RS422/485 CM)。不论选择 FLOW_CTRL 为何,都会使用 RTS 延迟。
|
RTS_OFF_DLY
|
IN
|
UInt
|
Word
|
0
|
RTS 关断延迟选择:
0 - 从传送上一个字符一直到“RTS 未激活”之前无延迟
1 到 65535 - 从传送上一个字符直到“RTS 未激活”之前的延迟(以毫秒表示)(不适用于 RS422/485 端口)。不论选择 FLOW_CTRL 为何,都会使用 RTS 延迟。
|
RESP_TO
|
IN
|
UInt
|
Word
|
1000
|
响应超时:
5 ms 到 65535 ms - Modbus_Master 等待从站响应的时间(以毫秒为单位)。如果从站在此时间段内未响应,Modbus_Master 将重复请求,或者在指定数量的重试请求后取消请求并提示错误(请参见下文,RETRIES 参数)。
|
MB_DB
|
IN/OUT
|
MB_BASE
|
‑
|
对 Modbus_Master 或 Modbus_Slave 指令的背景数据块的引用。
MB_DB 参数必须与 Modbus_Master 或 Modbus_Slave 指令的(静态,因此在指令中不可见)MB_DB 参数相连。
|
COM_RST
|
IN/OUT
|
---
|
Bool
|
FALSE
|
Modbus_Comm_Load 指令的初始化
将使用 TRUE 对指令进行初始化。随后会将 COM_RST 复位为 FALSE。
注:
该参数仅适用于 S7-300/400 指令。
|
DONE
|
OUT
|
Bool
|
FALSE
|
如果上一个请求完成并且没有错误,DONE 位将变为 TRUE 并保持一个周期。
|
ERROR
|
OUT
|
Bool
|
FALSE
|
如果上一个请求完成出错,则 ERROR 位将变为 TRUE 并保持一个周期。STATUS 参数中的错误代码仅在 ERROR = TRUE 的周期内有效。
|
STATUS
|
OUT
|
Word
|
16#7000
|
错误代码(请参见错误消息)
|
执行 Modbus_Comm_Load 以对 Modbus RTU 协议的端口进行组态。为 Modbus RTU 协议组态完端口后,它只能由 Modbus_Master 指令或 Modbus_Slave 指令使用。
必须运行 Modbus_Comm_Load 来完成将用于 Modbus 通信的每个通信端口的组态。必须为使用的每个端口分配唯一的 Modbus_Comm_Load 背景数据块。如果需要更改数据传输速率或奇偶校验等通信参数,或者网络已经恢复,只需再次运行 Modbus_Comm_Load。
例如,当在程序中添加 Modbus_Master 或 Modbus_Slave 指令时,将自动为指令分配背景数据块。需要将 Modbus_Comm_Load 指令的 MB_DB 参数连接到 Modbus_Master 或 Modbus_Slave 指令的 MB_DB 参数。
Modbus_Comm_Load 数据块变量
下表显示了可在程序中使用的 Modbus_Comm_Load 背景数据块中的公共静态变量。
背景数据块中的静态变量
变量
|
数据类型
|
标准
|
说明
|
S7-
1200/1500
|
S7-
300/400/
WinAC
|
ICHAR_GAP
|
Word
|
0
|
字符间的最长字符延迟时间。此参数以毫秒为单位指定,并且增加了所接收字符之间的预期周期。将此参数的相应位时间数添加到 Modbus 默认值 35 位时间(3.5 字符时间)。
|
RETRIES
|
Word
|
2
|
返回“无响应”错误代码 0x80C8 之前主站执行的重复尝试次数。
|
EN_SUPPLY_VOLT
|
Bool
|
0
|
启用对电源电压 L+ 缺失的诊断
|
MODE
|
USInt
|
字节
|
0
|
工作模式
有效的工作模式包括:
0 = 全双工 (RS232)
1 = 全双工 (RS422) 四线制模式(点对点)
2 = 全双工 (RS 422) 四线制模式(多点主站,CM PtP (ET 200SP))
3 = 全双工 (RS 422) 四线制模式(多点从站,CM PtP (ET 200SP))
4 = 半双工 (RS485) 二线制模式 1)
|
LINE_PRE
|
USInt
|
字节
|
0
|
接收线路初始状态
有效的初始状态是:
0 =“无”初始状态 1)
1 = 信号 R(A)=5 V,信号 R(B)=0 V(断路检测):
在此初始状态下,可进行断路检测。
仅可以选择以下项:“全双工 (RS422) 四线制模式(点对点连接)”和“全双工 (RS422) 四线制模式(多点从站)”。
2 = 信号 R(A)=0 V,信号 R(B)=5 V:
此默认设置对应于空闲状态(无激活的发送操作)。在此初始状态下,无法进行断路检测。
|
BRK_DET
|
USInt
|
字节
|
0
|
断路检测
以下内容有效:
|
EN_DIAG_ALARM
|
Bool
|
0
|
激活诊断中断:
|
STOP_BITS
|
USINT
|
字节
|
1
|
停止位个数;
1 = 1 个停止位,
2 = 2 个停止位,
0、3 到 255 = 保留
|
1) 使用 PROFIBUS 电缆连接 CM 1241 的 RS485 时所需的设置
|
Modbus_Master: 作为 Modbus 主站进行通信
Modbus_Master 指令可通过由 Modbus_Comm_Load 指令组态的端口作为 Modbus 主站进行通信。当在程序中添加 Modbus_Master 指令时,将自动分配背景数据块。Modbus_Comm_Load 指令的 MB_DB参数必须连接到 Modbus_Master 指令的(静态)MB_DB参数。
参数
参数
|
声明
|
数据类型
|
标准
|
说明
|
S7-
1200/1500
|
S7-
300/400/
WinAC
|
REQ
|
IN
|
Bool
|
FALSE
|
FALSE = 无请求
TRUE = 请求向 Modbus 从站发送数据
|
MB_ADDR
|
IN
|
UInt
|
Word
|
‑
|
Modbus RTU 站地址:
标准地址范围(1 到 247 以及 0用于 Broadcast)
扩展地址范围(1 到 65535以及 0 ,用于 Broadcast)
值 0 为将帧广播到所有 Modbus 从站预留。广播仅支持 Modbus 功能代码 05、06、15 和 16。
|
MODE
|
IN
|
USInt
|
Byte
|
0
|
模式选择:指定请求类型(读取、写入或诊断)。下面的 Modbus 功能表中提供了其它信息。
|
DATA_ADDR
|
IN
|
UDInt
|
DWord
|
0
|
从站中的起始地址:指定在 Modbus 从站中访问的数据的起始地址。下面的 Modbus 功能表中列出了有效地址。
|
DATA_LEN
|
IN
|
UInt
|
Word
|
0
|
数据长度:指定此指令将访问的位或字的个数。下面的 Modbus 功能表中列出了有效长度。
|
COM_RST
|
IN/OUT
|
---
|
Bool
|
FALSE
|
Modbus_Master 指令的初始化
将使用 TRUE 对指令进行初始化。随后会将 COM_RST 复位为 FALSE。
注:
该参数仅适用于 S7-300/400 指令。
|
DATA_PTR
|
IN/OUT
|
Variant
|
Any
|
‑
|
数据指针:指向要进行数据写入或数据读取的标记或数据块地址。
自指令版本 V3.0 起:
该参数可指向优化存储区。在优化存储区中,允许使用以下数据类型的单个元素或数组:Bool, Byte, Char, Word, Int, DWord, DInt, Real, USInt, UInt, UDInt, SInt, WChar。所有其它数据类型都会导致出现错误消息 16#818C。
|
DONE
|
OUT
|
Bool
|
FALSE
|
如果上一个请求完成并且没有错误,DONE 位将变为 TRUE 并保持一个周期。
|
BUSY
|
OUT
|
Bool
|
‑
|
FALSE – Modbus_Master 无激活命令
TRUE – Modbus_Master 命令执行中
|
ERROR
|
OUT
|
Bool
|
FALSE
|
如果上一个请求完成出错,则 ERROR 位将变为 TRUE 并保持一个周期。STATUS 参数中的错误代码仅在 ERROR = TRUE 的周期内有效。
|
STATUS
|
OUT
|
Word
|
0
|
错误代码(请参见错误消息)
|
Modbus 主站数据块中的变量
下表显示了可在程序中使用的 Modbus_Master 背景数据块中的公共静态变量。
背景数据块中的静态变量
变量
|
数据类型
|
标准
|
说明
|
Blocked_Proc_Timeout
|
Real
|
3.0
|
在“激活”状态移除此实例前,等待受阻的 Modbus 主站实例的持续时间(以秒为单位)。例如,如果输出主站请求,随后在其完全结束请求之前,程序停止并调用主站功能,则可能发生这种情况。时间值必须大于 0 秒而小于 55 秒,以避免发生错误。
另请参见“Modbus-Master 通信规则”和“使用不同的参数设置调用 Modbus_Master 指令”。
|
Extended_Addressing
|
Bool
|
FALSE
|
将从站地址组态为单字节或双字节。
FALSE = 1 字节地址;0 到 247
TRUE = 2 字节地址(对应于扩展地址);
0 到 65535
|
Compatibility_Mode 1)
|
Bool
|
FALSE
|
对于 Modbus,使用 Modbus RTU 驱动程序 的 CP 341、CP 441-2 和 ET 200SP 1SI,以及 ET 200SP 1SI 的兼容模式
默认值为 0。
FALSE = 根据 Modbus 规范,不兼容
TRUE = 兼容
对于 FC1 和 FC2:从帧中读取的数据逐字写入访问的 CPU 存储器内,并逐字节替换。
如果要传输的位数不是 16 的倍数,那么不相关的位将在最后一个字中设置为空值。
对于 FC15:要传输的字从访问的存储器中逐字读取并逐字节写入发送帧。
如果要传输的位数不是 8 的倍数,那么最后一个字节中不相关的位将从访问的存储器中读取,并输入到发送帧中。
|
MB_DB
|
MB_BASE
|
-
|
Modbus_Comm_Load 指令的 MB_DB 参数必须连接到 Modbus_Master 指令的此 MB_DB 参数。
|
1) 点对点通信模块会根据 Modbus 规范中的定义进行响应。对于 Modbus,要保留与 CP 341, CP 441‑2 和 ET 200SP 1SI一样的响应,使用“Compatibility_Mode”参数。
|
程序可以向 Blocked_Proc_Timeout 和 Extended_Addressing 变量中写入值来控制 Modbus 主站的操作。
Modbus-Master 通信规则
必须运行 Modbus_Comm_Load 来组态端口,以便 Modbus_Master 指令可以使用该端口进行通信。
要用来作为 Modbus 主站的端口不可作为 Modbus_Slave 使用。对于该端口,可以使用一个或多个 Modbus_Master1) 的实例。但是,所有版本的 Modbus_Master 都必须为该端口使用相同的背景数据块。
Modbus 指令不会使用通信报警事件来控制通信过程。程序必须查询 Modbus_Master 指令来获得完整的命令(DONE、ERROR)。
我们建议为来自程序周期 OB 的特定端口调用 Modbus_Master 的所有执行。Modbus 主站指令只能在一个程序周期或一个周期/时间控制的处理级别中执行。它们无法在不同的处理级别中进行处理。由具有较高优先级的处理级别中的 Modbus 主站指令引起的 Modbus 主站指令的优先级中断将导致操作不正确。Modbus 主站指令无法在启动、诊断或时间错误级别中处理。
1) 此处的“Modbus 主站的实例”意味着,调用具有与 Modbus_Comm_Load 指令相同的互联,并具有与 MB_ADDR、MODE、DATA_ADDR和 DATA_LEN参数相同的设置的 Modbus_Master 指令。
示例
MODE = 0 且 DATA_ADDR = 10 时会调用 Modbus_Master
此作业将一直处于激活状态,直到通过参数 DONE=1 或 ERROR=1 完成,或者 Blocked_Proc_Timeout 参数中组态的监视时间到期。如果在看门狗时间用完且之前的命令还未完成时启动了新命令,那么之前的命令将会中止而不会有错误消息。
如果在此命令正在运行期间使用相同的实例数据以不同的 MODE和 DATA_ADDR参数设置再次调用,则第二次的调用将以 ERROR = 1 和 STATUS = 8200 终止。
使用不同的参数设置调用 Modbus_Master 指令
如果程序中含有使用不同 MB_ADDR、MODE、DATA_ADDR或 DATA_LEN设置的多个 Modbus_Master 指令调用,必须确保在任意给定时间,只有一个调用处于激活状态。否则,将输出错误消息 16#8200(接口正忙于处理当前请求)。
如果无法完整地完成调用,那么看门狗会由 Blocked_Proc_Timeout 参数激活,并终止当前命令。
REQ 参数
FALSE = 无请求;TRUE = 请求向 Modbus 从站发送数据
启用请求的传输。这会将缓冲区中的内容传送到点对点通信接口。
可以使用 DATA_ADDR 和 MODE 参数来选择 Modbus 功能代码。
DATA_ADDR(从站中的 Modbus 起始地址):指定在 Modbus 从站中访问的数据的起始地址。
Modbus_Master 指令使用 MODE 输入,不使用功能代码输入。MODE 和 DATA_ADDR 结合使用可指定在实际 Modbus 帧中使用的功能代码。下表显示了 MODE 参数、Modbus 功能代码和DATA_ADDR 中 Modbus 地址范围之间的关系。
Modbus 功能
MODE
|
DATA_ADDR(Modbus 地址)
|
DATA_LEN
(数据长度)
|
Modbus 功能代码
|
运行和数据
|
0
|
|
每个请求的位数
|
01
|
读取输出位:
|
1
|
到
|
9999
|
1
|
到
|
2000/1992 1
|
0
|
到
|
9998
|
0
|
|
每个请求的位数
|
02
|
读取输入位:
|
10001
|
到
|
19999
|
1
|
到
|
2000/1992 1
|
0
|
到
|
9998
|
0
|
|
每个请求的字数
|
03
|
读取保持寄存器:
|
40001
|
到
|
49999
|
1
|
到
|
125/124 1
|
0
|
到
|
9998
|
400001
|
到
|
465535
|
1
|
到
|
125/124 1
|
0
|
到
|
65534
|
0
|
|
每个请求的字数
|
04
|
读取输入字:
|
30001
|
到
|
39999
|
1
|
到
|
125/124 1
|
0
|
到
|
9998
|
1
|
|
每个请求的位数
|
05
|
写入一个输出位:
|
1
|
到
|
9999
|
1
|
0
|
到
|
9998
|
1
|
|
每个请求 1 个字
|
06
|
写入一个保持寄存器:
|
40001
|
到
|
49999
|
1
|
0
|
到
|
9998
|
400001
|
到
|
465535
|
1
|
0
|
到
|
65524
|
1
|
|
每个请求的位数
|
15
|
写入多个输出位:
|
1
|
到
|
9999
|
2
|
到
|
1968/1960 1
|
0
|
到
|
9998
|
1
|
|
每个请求的字数
|
16
|
写入多个保持寄存器:
|
40001
|
到
|
49999
|
2
|
到
|
123/122
|
0
|
到
|
9998
|
400001
|
到
|
465534
|
2
|
到
|
123/122 1
|
0
|
到
|
65534
|
2 2
|
|
每个请求的位数
|
15
|
写入一个或多个输出位:
|
1
|
到
|
9999
|
1
|
到
|
1968/1960 1
|
0
|
到
|
9998
|
2 2
|
|
每个请求的字数
|
16
|
写入一个或多个保持寄存器:
|
40001
|
到
|
49999
|
1
|
到
|
123
|
0
|
到
|
9998
|
400001
|
到
|
465535
|
1
|
到
|
122 1
|
0
|
到
|
65534
|
11
|
此功能将忽略 Modbus_Master 的 DATA_ADDR 和 DATA_LEN 操作数。
|
11
|
读取从站通信的状态字和事件计数器。状态字表示“忙”(0 - 不忙,0xFFFF - 忙)。事件计数器随着帧的每次成功处理而递增。
|
80
|
|
每个请求 1 个字
|
08
|
使用数据诊断代码 0x0000 检查从站状态(回送测试 - 从站返回请求的回应)
|
-
|
1
|
-
|
81
|
|
每个请求 1 个字
|
08
|
利用数据诊断代码 0x000A 重新设置从站事件计数器
|
-
|
1
|
-
|
104
|
|
每个请求的字数
|
04
|
读取输入字
|
0
|
到
|
65535
|
1
|
到
|
125/124 1
|
0
|
到
|
65535
|
3 到 10,
12 到 79,
82 到 103,105 到 255
|
-
|
-
|
保留
|
1 在扩展寻址中(请参见 Extended_Adressing 参数),最大数据长度根据功能的数据类型而缩减 1 字节或 1 个字。
2 MODE 2 允许使用 Modbus 功能 15 和 16 写入 1 个或多个输出位和 1 个或多个保持寄存器。
MODE 1 使用 Modbus 功能 5 和 6 写入 1 个输出位和 1 个保持寄存器,使用 Modbus 功能 15 和 16 写入多个输出位和多个保持寄存器。
|
DATA_PTR 参数
DATA_PTR 参数指向在其中执行读取或写入的数据块或位存储器地址。如果使用数据块,则必须创建全局数据块,以便为 Modbus 从站上的读取或写入过程提供数据存储器。
说明
S7-1200/1500 - 使用 DATA_PTR 的访问的数据块必须支持直接寻址
数据块必须允许直接(绝对)寻址和符号寻址。
|
说明
使用功能代码 5
功能代码 5 用于设置或删除各个位。
设置位时,必须在通过 DATA_PTR 寻址到的 DB 或位存储区的首个字中指定值“16#FF00”。
对于 S7-1200,也可以指定值“16#0100”以设置位。
为复位某个位,必须在通过 DATA_PTR 寻址到 DB 或位存储区的首个字中指定值“16#0000”。
所有其它值通过 ERROR = TRUE 和 STATUS = 16#8384 拒绝。
|
DATA_PTR 参数的数据块结构
这些数据类型对读取 Modbus 地址范围 (DATA_PTR) 30001 到 39999、40001 到 49999 和 400001 到 465535 中的字有效,以及对写入 Modbus 地址范围(DATA_PTR 参数)40001 到 49999 和 400001 到 465535 中的字有效。
数据类型 WORD、UINT 或 INT 的标准数组
WORD、UINT 或 INT 类型的指定结构,其中每个元素都有唯一的名称和一个 16 位的数据类型。
指定的复杂结构,其中每个元素都有唯一的名称和一个 16 位或 32 位的数据类型。
用于读/写 Modbus 地址范围(DATA_PTR 参数)00001到 09999 中的位和用于读取 10001 到 19999 中的位。
布尔数据类型的标准字段。
来自明确指定的布尔变量的指定布尔结构。
给每个 Modbus_Master 指令分配各自的独立存储区并不是必须进行的操作,但我们建议进行此操作。原因是,如果多个 Modbus 指令都在同一个存储区读取和写入,那么数据损坏的可能性将大大增高。
DATA_PTR的数据区不必位于相同的全局数据块中。可以为 Modbus 读取过程创建具有多个区域的数据块,为 Modbus 写入过程创建数据块或为每个从站创建数据块。
Modbus_Slave:作为 Modbus 从站进行通信
说明
程序可利用 CM(RS422/485 或 RS232)端口,使用 Modbus_Slave 指令来作为 Modbus 从站进行通信。添加指令时,STEP 7 将自动创建背景数据块。Modbus_Comm_Load 指令的 MB_DB 参数必须连接到 Modbus_Slave 指令的(静态)MB_DB 参数。
参数
参数
|
声明
|
数据类型
|
标准
|
说明
|
S7-
1200/1500
|
S7-
300/400/
WinAC
|
MB_ADDR
|
IN
|
UInt
|
Word
|
‑
|
Modbus 从站的标准寻址:
标准寻址范围(1 到 247)
扩展寻址范围(0 到 65535)
注:0 是广播地址
|
COM_RST
|
IN/OUT
|
---
|
Bool
|
FALSE
|
Modbus_Slave 指令的初始化
将使用 TRUE 对指令进行初始化。随后会将 COM_RST 复位为 FALSE。
注:
该参数仅适用于 S7-300/400 指令。
|
MB_HOLD_REG
|
IN/OUT
|
Variant
|
Any
|
‑
|
Modbus 保持寄存器 DB 的指针:Modbus 保持寄存器可能为标志的存储区或者数据块。
自指令版本 V4.0 起:
该参数必须指向长度为 16 位以上的存储区,否则会导致出现错误消息 16#8187。这一要求对于单个元素、数组、STRUCT 和 UDT 均适用。例如,如果 Single Bool 或数组中包含的布尔元素个数小于 16,则会导致出现错误消息。
如果长度不是 16 位的倍数,则存储区末端的剩余位无法通过Modbus_Slave 指令读取或写入。
该参数可指向优化存储区。在优化存储区中,允许使用以下数据类型的单个元素或数组:Bool, Byte, Char, Word, Int, DWord, DInt, Real, USInt, UInt, UDInt, SInt, WChar。所有其它数据类型都会导致出现错误消息 16#818C。
|
NDR
|
OUT
|
Bool
|
FALSE
|
可用的新数据:
FALSE - 无新数据
TRUE – 表示新数据已由 Modbus 主站写入
如果上一个请求完成并且没有错误,NDR 位将变为 TRUE 并保持一个周期。
|
DR
|
OUT
|
Bool
|
FALSE
|
读取数据:
FALSE - 未读取数据
TRUE - 表示该指令已将 Modbus 主站接收到的数据存储在目标区域中。
如果上一个请求完成并且没有错误,DR 位将变为 TRUE 并保持一个周期。
|
ERROR
|
OUT
|
Bool
|
FALSE
|
如果上一个请求完成出错,则 ERROR 位将变为 TRUE 并保持一个周期。如果执行因错误而终止,则 STATUS 参数中的错误代码仅在 ERROR = TRUE 的周期内有效。
|
STATUS
|
OUT
|
Word
|
0
|
错误代码(请参见错误消息)
|
Modbus 通信的功能代码(1、2、4、5 和 15)可直接在 CPU 的过程映像输入和过程映像输出中读取或写入位和字。对于这些功能代码,必须将 MB_HOLD_REG 参数定义为大于一个字节的数据类型。下表显示了将 Modbus 地址分配给 CPU 中过程映像的示例。
将 Modbus 地址分配给过程映像
Modbus 功能
|
S7-1200
|
代码
|
功能
|
数据区
|
地址区
|
数据区
|
CPU 地址
|
01
|
读取位
|
输出
|
0
|
到
|
8191
|
过程映像输出
|
O0.0
|
到
|
O1023.7
|
02
|
读取位
|
输入
|
0
|
到
|
8191
|
过程映像输入
|
I0.0
|
到
|
I1023.7
|
04
|
读取字
|
输入
|
0
|
到
|
511
|
过程映像输入
|
IW0
|
到
|
IW1022
|
05
|
写入位
|
输出
|
0
|
到
|
8191
|
过程映像输出
|
O0.0
|
到
|
O1023.7
|
15
|
写入位
|
输出
|
0
|
到
|
8191
|
过程映像输出
|
O0.0
|
到
|
O1023.7
|
将 Modbus 地址分配给过程映像
Modbus 功能
|
S7-1500/S7-300/S7-400
|
功能代码
|
功能
|
数据区
|
地址区
|
数据区
|
CPU 地址
|
01
|
读取位
|
输出
|
0
|
到
|
9998
|
过程映像输出
|
O0.0
|
到
|
A1249.6
|
02
|
读取位
|
输入
|
0
|
到
|
9998
|
过程映像输入
|
I0.0
|
到
|
I1249.6
|
04
|
读取字
|
输入
|
0
|
到
|
9998
|
过程映像输入
|
IW0
|
到
|
IW19996
|
05
|
写入位
|
输出
|
0
|
到
|
9998
|
过程映像输出
|
O0.0
|
到
|
A1249.6
|
15
|
写入位
|
输出
|
0
|
到
|
9998
|
过程映像输出
|
O0.0
|
到
|
A1249.6
|
说明
可用的地址区可能更小,具体取决于 CPU 的存储器组态。
|
Modbus 通信的功能代码(3、6 和 16)使用 Modbus 保持寄存器,此寄存器是标志的存储区或者数据块中的一个地址区。保持寄存器的类型由 Modbus_Slave 指令的 MB_HOLD_REG 参数指定。
说明
S7-1200/1500 - MB_HOLD_REG 数据块的类型
具有 Modbus 保持存器的数据块必须允许直接(绝对)寻址和符号寻址。
|
诊断功能
S7-1200 Modbus_Slave 的 Modbus 诊断功能
|
功能代码
|
子功能
|
说明
|
08
|
0000H
|
输出回应测试的请求数据:Modbus_Slave 指令会将所接收数据字的回应返回到 Modbus 主站。
|
08
|
000AH
|
清除通信事件计数器:Modbus_Slave 指令将清除用于 Modbus 功能 11 的通信事件计数器。
|
11
|
调用通信事件计数器:Modbus_Slave 指令使用内部通信事件计数器来检测将发送到 Modbus 从站的成功的 Modbus 读取和 Modbus 写入数量。该计数器不随功能 8、功能 11 和广播请求而递增。它也不会随导致通信错误(例如,奇偶校验或 CRC 错误)的请求而递增。
|
Modbus_Slave 指令支持来自 Modbus 主站的广播写入请求,只要该请求包括到有效地址的访问即可。针对广播功能不支持的功能代码,Modbus_Slave 指令将生成错误代码 16#8188。
指令版本 V3.0 中 Modbus 从站的变量
下表显示了可在程序中使用的 Modbus_Slave 背景数据块中的公共静态变量。
Modbus 从站的变量
变量
|
数据类型
|
标准
|
说明
|
HR_Start_Offset
|
Word
|
0
|
为 Modbus 保持寄存器指定起始地址(默认 = 0)
|
QB_Start
|
Word
|
0
|
输出的有效可写入寻址范围起始地址(字节 0 到 65535)
注:
该变量不适用于 S7-300、S7-400 和 WinAC。
|
QB_Count
|
Word
|
0xFFFF
|
可由 Modbus 主站写入的输出字节数。
注:
该变量不适用于 S7-300、S7-400 和 WinAC。
|
Extended_Addressing
|
Bool
|
FALSE
|
扩展寻址,将从站寻址组态为单字节或双字节。
(FALSE = 单字节地址,TRUE = 双字节地址)
|
Request_Count
|
Word
|
0
|
该从站接收的所有请求的数量
|
Slave_Message_Count
|
Word
|
0
|
该特定从站接收的所有请求的数量
|
Bad_CRC_Count
|
Word
|
0
|
存在 CRC 错误的已接收请求的数量
|
Broadcast_Count
|
Word
|
0
|
已接收的广播请求的数量
|
Exception_Count
|
Word
|
0
|
使用主站的例外进行确认的 Modbus 特定错误
|
Success_Count
|
Word
|
0
|
该特定从站接收的无协议错误的请求数量
|
MB_DB
|
MB_BASE
|
-
|
Modbus_Comm_Load 指令的 MB_DB 参数必须连接到 Modbus_Master 指令的此 MB_DB 参数。
|
程序可以向 HR_Start_Offset 和 Extended_Addressing 变量中写入值来控制 Modbus 从站的操作。可以读取其它变量来监视 Modbus 状态。
|