Modbus 诊断功能下表列出了 Modbus 诊断功能的描述。 代码 子功能 说明 08 0x0000回送测试:“MB_SERVER”指令接收数据字并按原样返回 Modbus 主站。 08 0x000A复位事件计数器:“MB_SERVER”指令用于复位 Modbus 功能 11 所使用的通信事件计 数器。 11 -获取通信事件计数器:“MB_SERVER”指令使用一个通信的内部事件计数器,记录发送 到 Modbus 服务器上成功执行的读写请求数。在功能 8、11 或进行广播请求时,事件计数器不会递增。这种情况同样适用于导致 通信错误的请求(例如,奇偶校验错误或 CRC错误)。Modbus TCP 不适用于广播功 能,这是因为同一时间只能有一个客户端/服务器连接。 该指令的静态变量下表列出了在程序中使用的“MB_SERVER”指令背景数据块的静态变量。可以写入 HR_Start_Offset变量。可以读取其它变量来监视 Modbus 状态。 变量 数据类型 起始值 说明 HR_Start_Offset WORD 0 指定Modbus 保持性寄存器的起始地址。 Request_Count WORD 0 服务器接收的请求总数。Server_Message_ Count WORD 0 相关服务器接收的报警的总数。 Xmt_Rcv_Count WORD 0在发生错误时统计传输数的计数器。接收到无效 Modbus 报警 时,该计数器也会递增。 Exception_Count WORD 0专门统计 Modbus 发生意外错误数量的计数器。 Success_Count WORD 0 检测传输协议中无错误请求数量的计数器。Connected BOOL 0 指示是否已建立与所指定客户端的连接:1 = 已连接,0 = 未连接。 示例:通过静态变量HR_Start_Offset 进行寻址 Modbus 保持性寄存器的起始地址为 0(MB_CLIENT 为40.001)。在保持性寄存器中,这 些地址与 CPU 存储区的地址区域相对应。也可通过定义 HR_Start_Offset 变量,将Modbus 保持性寄存器的起始地址设置为不为 0。
示例:保持性寄存器的起始地址为 MW100,长度为 100 WORD。HR_Start_Offset 参数中的偏移值表示,保持性寄存器的起始地址从 0 变为 20。在低于 20 还是高于 119 的地址对保持性寄存器进行寻址时,将导致错误发生。MB_HOLD_REG 参数 (S7-1200) 说明 参数 MB_HOLD_REG是一个指向数据缓冲区的指针,该缓冲区用于存储从 Modbus 服务器 读取或写入 Modbus服务器的数据。作为数据缓冲区,可使用全局数据块或存储区域 (M)。 • 数据块 (D) 中地址的Zui大数量取决于 CPU的Zui大工作存储器。 • 位存储器 (M) 中地址的Zui大数量取决于 CPU 存储区的大小。 下表举例说明了将 Modbus 地址映射到Modbus 功能 3(读取 WORD)、6(写入 WORD)、 16(写入多个 WORD)和23(写入和读取多个字)的保持性寄存器。参数 STATUS (S7-1200) 参数 STATUS(常规状态信息)(库版本 V2.1)STATUS* (W#16#) 说明 0000 指令已执行,且无任何错误。 7000 未激活任何调用 (REQ=0)。 7001首次调用时,REQ=1:开始执行;BUSY 的值为 1。 7002 中间调用(REQ 不相关)。已激活执行;BUSY 的值为 1。7003 正在终止连接。 * 在程序编辑器中,错误代码可显示为整数或十六进制值。有关切换显示格式的信息,请参见“另请参见”。 参数STATUS(常规状态信息)(库版本 V3.x) STATUS* (W#16#) 说明 0000 指令已执行,且无任何错误。 0001连接已建立。 0003 连接已终止。 7000 未激活任何调用 (REQ=0)。 7001 首次调用。已触发连接建立操作。 7002中间调用。正在建立连接。 7003 正在终止连接。 7005 正在发送数据。 7006 正在接收数据。 *在程序编辑器中,状态代码可显示为整数或十六进制值。有关切换显示格式的信息,请参见“另请参见”。参数 STATUS(协议错误)STATUS* (W#16#) “MB_SERVER” 应答中的错误代 码 (B#16#) 说明 8380 - 接收到的 Modbus帧格式错误或字节数过少。 8381 01 不支持功能代码。 8382 03 数据长度错误 8383 02 数据地址错误或访问区域超出MB_HOLD_REG (页 6263) 的地址区域。 8384 03 数据值错误(功能 5) 8385 03诊断代码不支持 * 在程序编辑器中,状态代码可显示为整数或十六进制值。有关切换显示格式的信息,请参见“另请参见”。 参数STATUS(参数错误) STATUS* (W#16#) 说明 80BB ACTIVE_EST参数值无效(建立此类连接的标识符,请参见“T_CON_PARAM”): • 只允许对服务器建立被动连接 (ACTIVE_EST =FALSE)。 • 只允许对客户端建立主动连接 (ACTIVE_EST = TRUE)。 8187 参数 MB_HOLD_REG中的指针无效。数据区过小。 818C • 参数 MB_HOLD_REG 引用一个已优化的数据块。既可以使用一个具有标准访问权限的数据块,也可以使用一个存储区。 • 因执行超时出错(超过 55 秒)。 *在程序编辑器中,错误代码可显示为整数或十六进制值。有关切换显示格式的信息,请参见“另请参见”。 说明 内部使用的通信指令的错误代码。对于“MB_SERVER”指令,除了会发生表中列出的错误外,还会发生由该指令所使用的通信指令(“TCON”、“TDISCON”、“TSEND”和“TRCV”)所引起的错误。错误代码通过“MB_SERVER”指令的背景数据块来指定。相应指令的错误代码会显示在 Static 部分中的 STATUS 下。错误代码的含义在相应通信指令文档中提供。示例 (S7-1200) MB_CLIENT 示例 1: 通过 TCP 连接发送多个请求(S7-1200) 说明 通过一个 TCP 连接,发送多个 Modbus 客户端请求。 为此,需使用相同的背景数据块、相 同的连接ID 和相同的端口号。 每次只能激活一个客户端。 处理完一个客户端后,再继续处理下一个。 必须在程序中定义 执行顺序。在下列样本程序中,还将复制 STATUS 输出参数的值。 程序段 1: Modbus 功能 1 - 16个读取输出位MB_CLIENT 示例 2: 通过多个 TCP 连接发送多个请求 (S7-1200) 说明 通过不同的 TCP连接,发送多个 Modbus 客户端请求。 为此,则需使用不同的背景数据块 和不同的连接 ID。 如果连接指向相同的 Modbus服务器,则使用不同的端口号。如果连接指向不同的 Modbus 服务器,则可以任意指定端口号。 程序段 1: Modbus 功能 4 -读取输入(WORD)MB_CLIENT 示例 3: 协调多个请求 (S7-1200) 说明 确保执行了所有的 Modbus 请求。可以通过程序协调各请求。 在以下示例中,演示了如何 使用该指令协调第一客户端和第二个客户端请求的输出参数。MB_SERVER 示例:多个 TCP 连接 (S7-1200) 说明 可以使用多个 Modbus TCP 服务器连接。为此,每个连接都必须单独调用“MB_SERVER”指 令。 每个连接都需要下列数据: • 指令的一个独立背景数据块 • 唯一的连接ID • 单独的 IP 端口(在 S7-1200 上,每个 IP 端口只允许一个连接)为了优化性能,每个连接的每个程序循环中都应执行“MB_SERVER”指令。 程序段 1: 带有相关 IP 端口连接 ID和背景数据块的连接 #1S7-1200 CPU 的库版本 V4.0 及以上版本和 S7-1500 CPU 的库版本 V3.x及以上版本,支持 MODBUS (TCP) (S7-1200, S7-1500) MB_CLIENT: 作为 Modbus TCP客户端通过 PROFINET 通信 (S7-1200, S7-1500) MB_CLIENT 介绍 (S7-1200,S7-1500) 说明 “MB_CLIENT”指令作为 Modbus TCP 客户端通过 PROFINET连接进行通信。通过“MB_CLIENT” 指令,可以在客户端和服务器之间建立连接、发送 Modbus 请求、接收响应并控制Modbus TCP 客户端的连接终端。 S7-1200 固件版本 V4.0 支持“MB_CLIENT”指令和Zui高 V3.1版本的库。S7-1200 固件版本 V4.1 及更高版本和 S7-1500,支持“MB_CLIENT”指令的所有库版本。 可通过CPU 或 CM/CP 的本地接口建立连接。 使用该指令时,无需其它任何硬件模块。 自指令版本 V6.0 起,可以使用 Modbus功能 23。该功能用于将数据写入 Modbus 服务器, 并在一个作业中从 Modbus 服务器读取数据。 请参见“Modbus 功能23 (页 6280)” 多个客户端连接 Modbus TCP 客户端可以支持多个 TCP连接,连接的Zui大数目取决于所使用的 CPU。一个 CPU 的总连接数,包括 Modbus TCP客户端和服务器的连接数,不能超过所支持的Zui大连接数。 Modbus TCP连接还可由“MB_CLIENT”和/或“MB_SERVER”实例共用。