Modbus TCP续集
概述
S7-1200 CPU V4.1 版与 STEP 7 V13 SP1 一起,扩展了 Modbus TCP
的功能,可使用增强型 T 块指令。 出于这个原因,S7-1200 支持两组 PtP 指令:
- 早期ModbusTCP 指令: 这些 Modbus RTU 指令存在于 S7-1200 的 V4.0版本之前。
- ModbusTCP指令: 这些 Modbus TCP 指令提供了早期指令的全部功能。
选择Modbus TCP 指令的版本
在 STEP 7 中可使用两个版本的 Modbus TCP 指令:
- 版本0 最初在 STEP 7 Basic/Professional V13 中提供。
- 版本1 在 STEP 7 Basic/Professional V13 SP1 中提供。 可以从兼容性和移植便利性方面考虑,选择将相应的指令版本插入用户程序中。
不要在同一 CPU 程序中同时使用 3.0 和 3.1 指令版本。 用户程序的 Modbus TCP 指令必须具有相同的主版本号(1.x、2.y 或 V.z)。 主版本组内的各个指令可具有不同的次版本号 (1.x)。
单击指令树任务卡上的图标可启用指令树的标题和列。
要更改 Modbus TCP指令的版本,请从下拉列表中选择相应版本。 可以选择一组指令或分别选择各个指令。
使用指令树将 Modbus TCP 指令放入程序时,将在项目树中创建新的 FB 实例。 在项目树的“PLC_x > 程序块 > 系统块 > 程序资源”(PLC_x > Program blocks > System blocks > Program resources) 下可看到新的 FB 实例。
要确认程序中 Modbus TCP 指令的版本,必须检查项目树的属性而不是程序编辑器中显示的框的属性。 选择项目树的 Modbus TCP FB 实例,单击右键,选择“属性”(Properties),然后选择“信息”(Information) 页查看 Modbus TCP 指令的版本号。
Modbus TCP 指令
MB_CLIENT(作为 Modbus TCP 客户端使用 PROFINET 进行通信)指令
表格 13- 53 MB_CLIENT 指令
表格 13- 54 参数的数据类型
说明
CPU 固件版本要求
本手册中所述的 Modbus TCP 指令要求固件版本为 V4.1 或更高版本。
REQ 参数
FALSE = 无 Modbus 通信请求
TRUE = 请求与 Modbus TCP 服务器通信
如果 MB_CLIENT 的实例没有**且参数 DISCONNECT=0,当 REQ=1
时,将启动一个新的 Modbus 请求。 如果尚未建立连接,则建立一个新的连接。
如果在当前请求完成前 DISCONNECT=0 且 REQ=1,从而再次执行 MB_CLIENT 的同一个实例,则不会进行后续 Modbus 传送。 但是,一旦完成当前请求,如果通过 REQ=1 执行 MB_CLIENT,可处理新的请求。
完成当前 MB_CLIENT 通信请求后,DONE 位将在一个周期内保持为 TRUE。 DONE位可用作定时门,对多个 MB_CLIENT 请求进行排序。
说明
MB_CLIENT 处理期间输入数据的一致性
Modbus 客户端启动 Modbus 操作后,将在内部保存所有输入状态,然后在每次后续调用时进行比较。 比较用于确定此特定调用是否是活动客户端请求的发起者。 可使用一个公用背景数据块执行多个 MB_CLIENT 调用。
在主动处理 MB_CLIENT 操作期间应不改变输入,这一点很重要。 若不遵循此规则,MB_CLIENT 无法确定活动实例。
MB_MODE 和 MB_DATA_ADDR 参数用于选择 Modbus 通信功能
MB_CLIENT 指令使用 MB_MODE 输入而非功能代码。MB_DATA_ADDR 分配远程数据的起始 Modbus 地址。
MB_MODE 和 MB_DATA_ADDR 一起确定实际 Modbus 消息中使用的功能代码。 下表列出了参数 MB_MODE、MB_DATA_ADDR 和 Modbus 功能之间的对应关系。
表格 13- 55 Modbus 功能
说明
MB_DATA_PTR 分配一个缓冲区来存储从 Modbus TCP 服务器读取或写入到该服务器的数据 数据缓冲区可定位于标准全局 DB 或 M 存储区地址中。
对于 M 存储器中的缓冲区,使用 Any 指针格式。 具体格式为 P#“位地址” “数据类型”“长度”,例如 P#M1000.0 WORD 500。
MB_DATA_PTR 参数指定一个通信缓冲区
- MB_CLIENT通信功能:
– 从 Modbus 服务器地址(00001 到 09999)读写 1 位数据
– 从 Modbus 服务器地址(10001 到 19999)读取 1 位数据
– 从 Modbus 服务器地址(30001 到 39999)和(40001 到 49999)读取 16
位字数据
– 向 Modbus 服务器地址(40001 到 49999)写入 16 位字数据
- 向/从MB_DATA_PTR分配的 DB 或 M 储存器缓冲区传输字或位大小的数据。
- 如果通过MB_DATA_PTR分配 DB 为缓冲区,必须为所有 DB
数据元素分配数据类型。
– 1 位 Bool 数据类型代表一个 Modbus 位地址
– 16 位单字数据类型(如 WORD、UInt 和 Int)代表一个 Modbus 字地址
– 32 位双字数据类型(如 DWORD、DInt 和 Real)代表两个 Modbus 字地址
- 可以通过MB_DATA_PTR分配复杂的 DB 元素,例如
– 数组
– 指定的结构,其中每个元素都是唯一的。
– 指定的复杂结构,其中每个元素都具有唯一的名称以及 16 或 32 位数据类型。
- 不要求MB_DATA_PTR数据区位于同一个全局数据块(或 M 存储区)中。 可分配一个数据块供 Modbus 读取,分配另一个数据块供 Modbus 写入,或分配一个数据块用于各个 MB_CLIENT。
CONNECT 参数分配用于建立 PROFINET 连接的数据
必须使用全局数据块并存储所需的连接数据,然后才能在 CONNECT 参数中引用此
DB。
- 创建新的全局DB 或使用现有全局 DB 来存储 CONNECT 数据。 可使用一个 DB 存储多个 TCON_IP_v4 数据结构。 每个 Modbus TCP 客户端或服务器连接使用一个 TCON_IP_v4 数据结构。 可在 CONNECT 参数中引用连接数据。
- 使用有帮助的名称对 DB 和静态变量进行命名。例如,将数据块命名为“Modbus连接”,将静态变量命名为“TCPactive_1”(针对 Modbus TCP 客户端连接 1)。
- 在 DB 编辑器的“数据类型”(DataType)
列中为示例静态变量“TCPactive_1”分配系统数据类型“TCON_IP_v4”。
4.扩展 TCON_IP_v4结构,从而可以修改连接参数,如下图所示。
5.修改MB_CLIENT 连接的 TCON_IP_v4 结构数据。
6.输入MB_CLIENT CONNECT 参数的 DB 结构引用。 本示例中应为“Modbus 连接”.TCPactive_1。
修改各 MB_CLIENT 连接的 TCP_IP_v4 DB 数据
- InterfaceID:在设备组态窗口中单击 CPU PROFINET 端口图像。 然后单击“常规”(General) 属性选项卡并使用该处显示的硬件标识符。
- ID:输入一个介于1 和 4095 之间的连接 ID 编号。使用底层 TCON、TDISCON、TSEND 和 TRCV 指令建立 Modbus TCP 通信,用于 OUC(开放式用户通信)。
- ConnectionType:对于TCP/IP,使用默认值 16#0B(十进制数 = 11)。
- ActiveEstablished:该值必须为 1 或 TRUE。 主动连接,由 MB_CLIENT 启动
Modbus 通信。
- RemoteAddress:将目标 Modbus TCP 服务器的 IP 地址输入到四个 ADDR
数组单元中。 例如,如上图所示输入 192.168.2.241。
- RemotePort:默认值为 502。该编号为 MB_CLIENT 试图连接和通信的 Modbus
服务器的 IP 端口号。 一些第三方 Modbus 服务器要求使用其它端口号。
- LocalPort:对于 MB_CLIENT 连接,该值必须为 0。
多个客户端连接
Modbus TCP 客户端支持的并发连接数最多为 PLC 允许的开放式用户通信最大连接数。 PLC 的连接总数(包括 Modbus TCP 客户端和服务器)不得超过支持的开放式用户通信最大连接数 。
单独的并发客户端连接必须遵循以下规则:
- 各MB_CLIENT连接必须使用一个唯一的背景 DB
- 必须为各MB_CLIENT连接分配一个唯一的服务器 IP 地址
- 各MB_CLIENT连接分配一个唯一的连接 ID
- 是否需要唯一的IP端口号取决于服务器组态
每个背景 DB 必须使用不同的连接 ID。 总之,背景 DB 和连接 ID成对使用,且对每个连接必须是唯一的。
表格 13- 56 MB_CLIENT 背景数据块: 用户可访问静态变量
表格 13- 57 MB_CLIENT 协议错误
STATUS (W#16#) |
发送到 Modbus
客户端的响应代码 (B#16#) |
Modbus 协议错误 |
8381 | 01 | 不支持此功能代码 |
8382 | 03 | 数据长度错误 |
8383 | 02 | 数据地址错误或访问的数据超出 MB_HOLD_REG 地址区的界限 |
8384 | 03 | 数据值错误 |
8385 | 03 | 不支持该数据诊断代码(功能代码 08) |
表格 13- 58 MB_CLIENT 执行条件代码
STATUS (W#16#) | MB_CLIENT 参数错误 |
7001 | MB_CLIENT 正在等待 Modbus 服务器响应指定 TCP 端口处的连接或断开连接请求。 仅在第一次执行连接或断开操作时才返回此代码。 |
7002 | MB_CLIENT 正在等待 Modbus 服务器响应指定 TCP 端口处的连接或断开连接请求。 等待连接或断开操作完成时,将针对任何后续执行返回此代码。 |
7003 | 断开操作已成功完成(仅在一个 PLC 扫描周期内有效)。 |
80C8 | 服务器在指定的时间内未响应。 MB_CLIENT 必须在分配的时间内使用最初传送的事务 ID
接收响应,否则将返回此错误。 检查与 Modbus 服务器设备的连接。 尝试过重试操作(若适用)后,才返回此错误。 |
8188 | 模式无效 |
8189 | 数据地址无效 |
818A | 数据长度无效 |
818B | 指向 DATA_PTR 区的指针无效。 可以是 MB_DATA_ADDRESS 与 MB_DATA_LEN
的组合。 |
818C | 指针 DATA_PTR 指向优化的 DB 区(必须是标准 DB 区或 M 存储区) |
8200 | 端口正忙于处理现有的 Modbus 请求。 |
8380 | 接收到的 Modbus 帧不正确或接收到的字节太少。 |
8387 | 分配的连接 ID 参数和用于先前请求的 ID 不同。 只能有一个单个连接 ID 与每个
MB_CLIENT 背景数据块配合使用。 如果从一个服务器接收到的 Modbus TCP 协议 ID 不是 0,该代码也可作为内部错误返回。 |
8388 | Modbus 服务器返回一些和请求内容不同的数据。 该代码仅适用于 Modbus 功能 15 或
16。 |
除了上面列出的 MB_CLIENT 错误外,也可以从底层传输块通信指令(TCON、TDISCON、TSEND 和TRCV)返回错误。
MB_SERVER(作为 Modbus TCP 服务器通过 PROFINET 进行通信)指令
表格 13- 59 MB_SERVER 指令
表格 13- 60 参数的数据类型
参数和类型 | 数据类 型 | 说明 | |
DISCONNECT | IN | Bool | MB_SERVER 尝试与伙伴设备进行“被动”连接。 也就是说,服务器被动地侦听来自任何请求 IP 地址的 TCP 连接请求。
如果 DISCONNECT = 0 且不存在连接,则可以启动被动连接。 如果 DISCONNECT = 1 且存在连接,则启动断开操作。 该参数允许程序控制何时接受连接。 每当启用此输入时,无法尝试其它操作。 |
CONNECT | IN | Variant | 引用包含系统数据类型为“TCON_IP_v4”的连接参数的数据块结构。 |
MB_HOLD_RE G | IN_OUT | Variant | 指向 MB_SERVER Modbus 保持寄存器的指针: 保持寄存器必须是一个标准全局 DB 或 M 存储区地址。 储存区用于保存数据,允许 Modbus 客户端使用 Modbus 寄存器功能 3(读)、6(写)和 16(写)访问这些数据。 |
NDR | OUT | Bool | 新数据就绪: 0 = 没有新数据,1 = 表示 Modbus
客户端已写入新数据 |
DR | OUT | Bool | 数据读取: 0 = 没有读取数据,1 = 表示 Modbus
客户端已读取该数据。 |
参数和类型 | 数据类 型 | 说明 | |
ERROR | OUT | Bool | MB_SERVER 执行因错误而结束后,ERROR 位将在一个扫描周期时间内保持为 TRUE。 STATUS 参数中的错误代码仅在 ERROR = TRUE 的一个循环周期内有效。 |
STATUS | OUT | Word | 执行条件代码 |
说明
CPU 固件版本要求
本手册中所述的 Modbus TCP 指令要求固件版本为 V4.1 或更高版本。
CONNECT 参数分配用于建立 PROFINET 连接的数据
必须使用全局数据块并存储所需的连接数据,然后才能在 CONNECT 参数中引用此DB。
- 创建新的全局DB 或使用现有全局 DB 来存储 CONNECT 数据。 可使用一个 DB 存储多个 TCON_IP_v4 数据结构。 每个 Modbus TCP 客户端或服务器连接使用一个 TCON_IP_v4 数据结构。 可在 CONNECT 参数中引用连接数据。
- 使用有帮助的名称对 DB 和静态变量进行命名。例如,将数据块命名为“Modbus连接”,将静态变量命名为“TCPpassive_1”(针对 Modbus TCP 服务器连接 1)。
- 在 DB 编辑器的“数据类型”(DataType)列中为示例静态变量“TCPactive_1”分配系统数据类型“TCON_IP_v4”。
- 扩展 TCON_IP_v4结构,从而可以修改连接参数,如下图所示。
- 修改MB_SERVER 连接的 TCON_IP_v4 结构数据。
- 输入MB_SEVER CONNECT 参数的 DB 结构引用。 本示例中应为“Modbus 连接”.TCPpassive_1。
修改各 MB_SERVER 连接的 TCP_IP_v4 DB 数据
- InterfaceID:在设备组态窗口中单击 CPU PROFINET 端口图像。 然后单击“常规”(General) 属性选项卡并使用该处显示的硬件标识符。
- ID:为该连接输入一个介于1 和 4095 之间的唯一编号。 使用底层 TCON、TDISCON、TSEND 和 TRCV 指令建立 Modbus TCP 通信,用于 OUC(开放式用户通信)。 最多允许八个同步 OUC 连接。
- ConnectionType:对于TCP/IP,使用默认值 16#0B(十进制值 = 11)。
- ActiveEstablished:该值必须为 0 或 FALSE。 被动连接,MB_SERVER 正在等待
Modbus 客户端的通信请求。
- RemoteAddress:有两个选项。
– 使用 0.0.0.0,则 MB_CLIENT 将响应来自任何 TCP 客户端的 Modbus 请求。
– 输入目标 Modbus TCP 客户端的 IP 地址,则 MB_CLIENT 仅响应来自该客户端 IP
地址的请求。 例如,如上图所示输入 192.168.2.241。
- RemotePort:对于 MB_SERVER 连接,该值必须为 0。
- LocalPort:默认值为 502。该编号为 MB_SERVER 试图连接和通信的 Modbus
客户端的 IP 端口号。 一些第三方 Modbus 客户端要求使用其它端口号。
Modbus 和过程映像地址
MB_SERVER 允许进入的 Modbus 功能代码(1、2、4、5 和
15)在输入/输出过程映像中直接对位/字进行读/写。 对于数据传输功能代码(3、6 和
16),MB_HOLD_REG 参数必须定义为大于一个字节的数据类型。 下表显示了 Modbus
地址到 CPU 中过程映像的映射。
表格 13- 61 Modbus 地址到过程映像的映射
Modbus 功能 | S7-1200 | ||||||
代码 | 功能 | 数据区 | 地址范围 | 数据区 | CPU 地址 | ||
01 | 读位 | 输出 | 1 | 到 | 8192 | 输出过程映像 | Q0.0 到 Q1023.7 |
02 | 读位 | 输入 | 10001 | 到 | 18192 | 输入过程映像 | I0.0 到 I1023.7 |
04 | 读字 | 输入 | 30001 | 到 | 30512 | 输入过程映像 | IW0 到 IW1022 |
05 | 写位 | 输出 | 1 | 到 | 8192 | 输出过程映像 | Q0.0 到 Q1023.7 |
15 | 写位 | 输出 | 1 | 到 | 8192 | 输出过程映像 | Q0.0 到 Q1023.7 |
进入的 Modbus 消息功能代码(3、6 和 16)在 Modbus 保持寄存器中读取/写入字,该寄存器可以在 M 存储区或数据块中。 保持寄存器的类型由 MB_HOLD_REG 参数指定。
说明
MB_HOLD_REG 参数分配
Modbus 保持寄存器可以位于标准全局 DB 或 M 存储区地址中。 对于 M 存储区地址中的 Modbus 保持寄存器,使用 Any 指针格式。
其格式为P#“位地址”“数据类型”“长度”。 例如 P#M1000.0 WORD 500下表给出了 Modbus 地址到保持寄存器的映射示例,这种映射用于 Modbus 功能代码 03(读取字)、06(写入字)和 16(写入字)。 DB 地址的实际上限取决于每种 CPU 型号的最大工作存储器限值和 M 存储器限值。
表格 13- 62 Modbus 地址到 CPU 存储器地址的映射示例
Modbus 地址 | MB_HOLD_REG 参数示例 | ||
P#M100.0 Word 5 | P#DB10.DBx0.0 Word 5 | "Recipe".ingredient | |
40001 | MW100 | DB10.DBW0 | "Recipe".ingredient[1] |
40002 | MW102 | DB10.DBW2 | "Recipe".ingredient[2] |
40003 | MW104 | DB10.DBW4 | "Recipe".ingredient[3] |
40004 | MW106 | DB10.DBW6 | "Recipe".ingredient[4] |
40005 | MW108 | DB10.DBW8 | "Recipe".ingredient[5] |
多个服务器连接
可以创建多个服务器连接。 单个 PLC 可与多个 Modbus TCP 客户端建立并发连接。
Modbus TCP 服务器支持的并发连接数最多为 PLC 允许的开放式用户通信最大连接数。 PLC 的连接总数(包括 Modbus TCP 客户端和服务器)不得超过支持的开放式用户通信最大连接数 。 可在客户端和服务器类型的连接之间共享 Modbus TCP 连接。
单独的并发服务器连接必须遵循以下规则:
- 各MB_SERVER连接必须使用一个唯一的背景数据块。
- 必须为各MB_SERVER连接分配一个唯一的 IP 端口号。 每个端口只能用于 1个连接。
- 必须为各MB_SERVER连接分配一个唯一的连接 ID。
- 必须为每个连接(带有各自的背景数据块)单独调用MB_SERVER。
连接 ID 对于每个单独的连接必须是唯一的。 每个单独的背景 DB 必须使用单一的连接ID。 背景 DB 和连接 ID 成对使用,且对每个连接必须是唯一的。
表格 13- 63 Modbus 诊断功能代码
MB_SERVER Modbus 诊断功能 | ||
代码 | 子功能 | 说明 |
08 | 0x0000 | 返回查询数据回送测试: MB_SERVER 将向 Modbus 客户端回送接收到的数据字。 |
08 | 0x000A | 清除通信事件计数器: MB_SEVER 将清除用于 Modbus 功能 11
的通信事件计数器。 |
11 | 获取通信事件计数器: MB_SERVER 使用内部通信事件计数器来记录发送到 Modbus 服务器的 Modbus 成功读取和写入请求次数。 该计数器不会因任何功能 8、功能 11 请求或任何导致通信错误的请求而递增。
广播功能不能用于 Modbus TCP,因为在任何时刻仅存在一个客户端-服务器连接。 |
MB_SERVER 变量
下表给出了存储在 MB_SERVER背景数据块中的公共静态变量(可在用户程序中使用)。
表格 13- 64 MB_SERVER 公共静态变量
变量 | 数据类 型 | 默认值 | 说明 |
HR_Start_Offset | Word | 0 | 指定 Modbus 保持寄存器的起始地址 |
Request_Count | Word | 0 | 该服务器接收到的所有请求的数量。 |
Server_Message_Cou nt | Word | 0 | 该特定服务器接收到的请求的数量。 |
Xmt_Rcv_Count | Word | 0 | 出现错误的传输或接收的数量。 此外,如果接收到一条无效的 Modbus 消息,该值加 1。 |
Exception_Count | Word | 0 | 需要返回例外的 Modbus 特定错误数 |
Success_Count | Word | 0 | 该特定服务器接收到的没有协议错误的请求数量。 |
已连接 | Bool | 0 | 指示与所分配客户端的连接是已接通还是已断开: 1 =
接通,0 = 断开 |
用户程序可以将数据写入 HR_Start_Offset ,控制 Modbus 服务器操作。 可读取其它变量以监视 Modbus 的状态。
HR_Start_Offset
Modbus 保持寄存器地址从 40001 开始。 这些地址与保持寄存器的 PLC 存储器起始地址对应。 不过,可以使用“HR_Start_Offset”变量将 Modbus 保持寄存器的起始地址定义为除 40001 外的其它数字。
例如,如果保持寄存器起始于 MW100 且长度为 100 个字, 则偏移量 20 可指定保持寄存器的起始地址为 40021 而不是 40001。小于 40021 和大于 40119 的任何地址都将导致寻址错误。
表格 13- 66 MB_SERVER 执行条件代码 1
STATUS (W#16#) |
发送到 Modbus 服务器的响应
代码 (B#16#) |
Modbus 协议错误 |
7001 | MB_SERVER 正在等待 Modbus 客户端连接到指定的 TCP 端口。 仅在第一次执行连接或断开操作时才返回此代码。 | |
7002 | MB_SERVER 正在等待 Modbus 客户端连接到指定的 TCP 端口。 等待完成连接或断开操作时,将针对任何后续执行返回此代码。 | |
7003 | 断开操作已成功完成(仅在一个 PLC 扫描周期内有效)。 | |
8187 | 指向 MB_HOLD_REG 的指针无效: 区域太小 | |
818C | 指针 MB_HOLD_REG 指向优化的 DB 区(必须是标准全局 DB 区或 M
存储区)或受阻的过程超时超过 55 秒的限值。 (仅适用于 S7-1200) |
|
8381 | 01 | 不支持此功能代码 |
8382 | 03 | 数据长度错误 |
8383 | 02 | 数据地址错误或访问的数据超出 MB_HOLD_REG 地址区的界限 |
8384 | 03 | 数据值错误 |
8385 | 03 | 不支持该数据诊断代码(功能代码 08) |
除了上面列出的 MB_SERVER 错误外,也可以从底层传输块通信指令(TCON、TDISCON、TSEND 和 TRCV)返回错误。