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。

  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。

修改各 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 协议错误
838101不支持此功能代码
838203数据长度错误
838302数据地址错误或访问的数据超出 MB_HOLD_REG 地址区的界限
838403数据值错误
838503不支持该数据诊断代码(功能代码 08)

表格 13- 58 MB_CLIENT 执行条件代码

STATUS (W#16#)MB_CLIENT 参数错误
7001MB_CLIENT 正在等待 Modbus 服务器响应指定 TCP 端口处的连接或断开连接请求。 仅在第一次执行连接或断开操作时才返回此代码。
7002MB_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,该代码也可作为内部错误返回。

8388Modbus 服务器返回一些和请求内容不同的数据。 该代码仅适用于 Modbus 功能 15 或

 

16。

除了上面列出的 MB_CLIENT 错误外,也可以从底层传输块通信指令(TCON、TDISCON、TSEND 和TRCV)返回错误。

MB_SERVER(作为 Modbus TCP 服务器通过 PROFINET 进行通信)指令

表格 13- 59 MB_SERVER 指令

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

参数和类型数据类 说明
DISCONNECTINBoolMB_SERVER 尝试与伙伴设备进行“被动”连接。 也就是说,服务器被动地侦听来自任何请求 IP 地址的 TCP 连接请求。

 

如果 DISCONNECT = 0 且不存在连接,则可以启动被动连接。 如果 DISCONNECT = 1 且存在连接,则启动断开操作。 该参数允许程序控制何时接受连接。 每当启用此输入时,无法尝试其它操作。

CONNECTINVariant引用包含系统数据类型为“TCON_IP_v4”的连接参数的数据块结构。
MB_HOLD_RE GIN_OUTVariant指向 MB_SERVER Modbus 保持寄存器的指针: 保持寄存器必须是一个标准全局 DB 或 M 存储区地址。 储存区用于保存数据,允许 Modbus 客户端使用 Modbus 寄存器功能 3(读)、6(写)和 16(写)访问这些数据。
NDROUTBool新数据就绪: 0 = 没有新数据,1 = 表示 Modbus

 

客户端已写入新数据

DROUTBool数据读取: 0 = 没有读取数据,1 = 表示 Modbus

 

客户端已读取该数据。

参数和类型数据类 说明
ERROROUTBoolMB_SERVER 执行因错误而结束后,ERROR 位将在一个扫描周期时间内保持为 TRUE。 STATUS 参数中的错误代码仅在 ERROR = TRUE 的一个循环周期内有效。
STATUSOUTWord执行条件代码

说明

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。

修改各 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读位输出18192输出过程映像Q0.0 到 Q1023.7
02读位输入1000118192输入过程映像I0.0 到 I1023.7
04读字输入3000130512输入过程映像IW0 到 IW1022
05写位输出18192输出过程映像Q0.0 到 Q1023.7
15写位输出18192输出过程映像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 5P#DB10.DBx0.0 Word 5"Recipe".ingredient
40001MW100DB10.DBW0"Recipe".ingredient[1]
40002MW102DB10.DBW2"Recipe".ingredient[2]
40003MW104DB10.DBW4"Recipe".ingredient[3]
40004MW106DB10.DBW6"Recipe".ingredient[4]
40005MW108DB10.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 诊断功能
代码子功能说明
080x0000返回查询数据回送测试: MB_SERVER 将向 Modbus 客户端回送接收到的数据字。
080x000A清除通信事件计数器: MB_SEVER 将清除用于 Modbus 功能 11

 

的通信事件计数器。

11 获取通信事件计数器: MB_SERVER 使用内部通信事件计数器来记录发送到 Modbus 服务器的 Modbus 成功读取和写入请求次数。 该计数器不会因任何功能 8、功能 11 请求或任何导致通信错误的请求而递增。

 

广播功能不能用于 Modbus TCP,因为在任何时刻仅存在一个客户端-服务器连接。

MB_SERVER 变量

下表给出了存储在 MB_SERVER背景数据块中的公共静态变量(可在用户程序中使用)。

表格 13- 64 MB_SERVER 公共静态变量

变量数据类 默认值说明
HR_Start_OffsetWord0指定 Modbus 保持寄存器的起始地址
Request_CountWord0该服务器接收到的所有请求的数量。
Server_Message_Cou ntWord0该特定服务器接收到的请求的数量。
Xmt_Rcv_CountWord0出现错误的传输或接收的数量。 此外,如果接收到一条无效的 Modbus 消息,该值加 1。
Exception_CountWord0需要返回例外的 Modbus 特定错误数
Success_CountWord0该特定服务器接收到的没有协议错误的请求数量。
已连接Bool0指示与所分配客户端的连接是已接通还是已断开: 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)

838101不支持此功能代码
838203数据长度错误
838302数据地址错误或访问的数据超出 MB_HOLD_REG 地址区的界限
838403数据值错误
838503不支持该数据诊断代码(功能代码 08)

除了上面列出的 MB_SERVER 错误外,也可以从底层传输块通信指令(TCON、TDISCON、TSEND 和 TRCV)返回错误。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


版权声明:本文为A_little_happiness原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。