通信网络
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 |
选择奇偶校验: 0 – 无 1 – 奇校验 2 – 偶校验 |
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 |
断路检测 以下内容有效: 0 = 断路检测已禁用 1 = 断路检测已激活 |
EN_DIAG_ALARM | Bool | 0 |
激活诊断中断: 0 - 未激活 1 - 已激活 |
|
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 状态。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !