Modbus TCP 是 Modbus 协议的一个变体,它运行在 TCP/IP 网络之上。相比于 Modbus RTU 和 Modbus ASCII 这两种基于串行通信的 Modbus 协议,Modbus TCP 支持更快的数据传输速度和更远的通信距离。由于基于 TCP/IP,Modbus TCP 可以在以太网上进行通信,使其非常适合于现代工业自动化系统。
基本概念
TCP/IP 网络 :Modbus TCP 使用 TCP/IP 协议栈进行通信,确保了数据传输的可靠性。
端口号 :Modbus TCP 通常使用 502 号 TCP 端口。
MBAP 头 :Modbus Application Protocol 头是 Modbus TCP 特有的,用于封装传统 Modbus 请求和响应报文,以便在 TCP/IP 网络上传输。
MBAP 头结构
MBAP 头由以下几部分组成:
事务标识符 (2 字节):用于同步请求和响应之间的消息。
协议标识符 (2 字节):用于 Modbus 协议,固定为 0x0000。
长度字段 (2 字节):标识后续字段的长度(包括单元标识符、功能码、数据)。
单元标识符 (1 字节):标识远程服务器,对于 Modbus TCP 通常设置为 0xFF。
功能码
Modbus TCP 支持的功能码与 Modbus RTU 相同,包括但不限于:
读线圈(01)
读离散输入(02)
读保持寄存器(03)
读输入寄存器(04)
写单个线圈(05)
写单个寄存器(06)
写多个线圈(15)
写多个寄存器(16)
通信示例
假设有一个操作要求读取从设备的保持寄存器,从寄存器地址 100 开始,读 3 个寄存器。
读取保持寄存器请求
MBAP 头 + PDU(协议数据单元)
请求示例(十六进制):00 01 00 00 00 06 01 03 00 64 00 03
00 01:事务标识符。
00 00:协议标识符。
00 06:长度(6 字节,不包括 MBAP 头的长度)。
01:单元标识符。
03:功能码,表示读保持寄存器。
00 64:起始寄存器地址(100)。
00 03:读取的寄存器数量(3 个)。
读取保持寄存器响应
MBAP 头 + PDU(协议数据单元)
响应示例(十六进制):00 01 00 00 00 09 01 03 06 02 2B 00 00 00 64
00 01:事务标识符(与请求相匹配)。
00 00:协议标识符。
00 09:长度(9 字节,不包括 MBAP 头的长度)。
01:单元标识符。
03:功能码。
06:字节计数(3 个寄存器×2 字节 / 寄存器 = 6 字节)。
02 2B:第一个寄存器的值。
00 00:第二个寄存器的值。
00 64:第三个寄存器的值。
报文规则
Modbus TCP 的报文规则确保了在 TCP/IP 网络上可靠地传输 Modbus 命令。事务标识符允许同步请求与响应,即使在异步通信环境中也能匹配。长度字段确保接收方能够正确地解析后续的 PDU 部分。通过单元标识符,可以在同一网络上与多个远程设备通信,尽管在大多数实现中,此字段通常被设置为 0xFF。
Modbus TCP 使得 Modbus 协议能够在现代的网络环境中使用,扩展了其在工业自动化领域的应用范围。