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续集

选择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 指令

Modbus TCP续集

表格 13- 54 参数的数据类型

Modbus TCP续集

Modbus TCP续集

说明

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 功能

Modbus TCP续集

Modbus TCP续集

说明

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。

  1. 创建新的全局DB 或使用现有全局 DB 来存储 CONNECT 数据。 可使用一个 DB 存储多个 TCON_IP_v4 数据结构。 每个 Modbus TCP 客户端或服务器连接使用一个 TCON_IP_v4 数据结构。 可在 CONNECT 参数中引用连接数据。
  2. 使用有帮助的名称对 DB 和静态变量进行命名。例如,将数据块命名为“Modbus连接”,将静态变量命名为“TCPactive_1”(针对 Modbus TCP 客户端连接 1)。
  3. 在 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。

Modbus TCP续集Modbus TCP续集

修改各 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 背景数据块: 用户可访问静态变量

Modbus TCP续集

表格 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 指令

Modbus TCP续集

表格 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。

  1. 创建新的全局DB 或使用现有全局 DB 来存储 CONNECT 数据。 可使用一个 DB 存储多个 TCON_IP_v4 数据结构。 每个 Modbus TCP 客户端或服务器连接使用一个 TCON_IP_v4 数据结构。 可在 CONNECT 参数中引用连接数据。
  2. 使用有帮助的名称对 DB 和静态变量进行命名。例如,将数据块命名为“Modbus连接”,将静态变量命名为“TCPpassive_1”(针对 Modbus TCP 服务器连接 1)。
  3. 在 DB 编辑器的“数据类型”(DataType)列中为示例静态变量“TCPactive_1”分配系统数据类型“TCON_IP_v4”。
  4. 扩展 TCON_IP_v4结构,从而可以修改连接参数,如下图所示。
  5. 修改MB_SERVER 连接的 TCON_IP_v4 结构数据。
  6. 输入MB_SEVER CONNECT 参数的 DB 结构引用。 本示例中应为“Modbus 连接”.TCPpassive_1。

Modbus TCP续集Modbus TCP续集

修改各 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 的任何地址都将导致寻址错误。

Modbus TCP续集

表格 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)返回错误。