3. Modbus TCP协议详解:物理层(以太网)、MBAP报文头格式、与RTU的映射关系
Modbus TCP协议是Modbus协议族在工业以太网环境下的实现标准,它保留了Modbus RTU/ASCII的应用层数据模型,但将物理层和数据链路层替换为TCP/IP协议栈。理解Modbus TCP的物理层特性、报文头结构以及与RTU的映射关系,是配置和调试Modbus RTU转TCP网关的理论基础。
3.1 物理层:以太网
Modbus TCP的物理层完全遵循IEEE 802.3以太网标准,使用标准的以太网硬件和布线。与RS-485总线型拓扑不同,以太网采用星型拓扑结构,通过交换机连接设备。
关键物理层参数:
- 传输介质:超五类(Cat5e)或六类(Cat6)非屏蔽双绞线(UTP),最大段长100米。
- 连接器:RJ45 8针模块化插头,采用T568A或T568B线序标准。
- 传输速率:10/100 Mbps自适应,全双工模式。
- 拓扑结构:星型,中心节点为以太网交换机。
- 最大节点数:理论上受IP地址限制(IPv4约2^32),实际受交换机端口数和网络负载限制。
厂务现场布线提示:在电磁干扰较强的厂务环境(如变频器、大功率电机附近),建议使用屏蔽型(STP)网线,并确保交换机具备工业级防护等级(IP30以上)和宽温设计(-40°C ~ 75°C)。
3.2 MBAP报文头格式
Modbus TCP协议在TCP数据段中封装了专用的报文头——MBAP(Modbus Application Protocol)报文头。MBAP头长度为7字节,位于应用数据单元(ADU)的最前端,用于标识和校验Modbus TCP会话。
| 字段 | 长度(字节) | 描述 | 取值范围 |
|---|---|---|---|
| 事务处理标识符 (Transaction Identifier) |
2 | 用于匹配请求与响应。客户端每发送一个新请求,该值递增。服务器在响应中回显相同值。 | 0x0000 ~ 0xFFFF |
| 协议标识符 (Protocol Identifier) |
2 | 固定为 0x0000,表示Modbus协议。其他值保留。 | 0x0000 |
| 长度字段 (Length) |
2 | 表示后续字节数(包括单元标识符 + PDU)。注意:不包含MBAP头自身。 | 0x0001 ~ 0xFFFF |
| 单元标识符 (Unit Identifier) |
1 | 用于路由到远程从站。在网关场景中,该字段映射为RTU的从站地址。 | 0x00 ~ 0xFF |
常见配置错误:许多初学者将MBAP头中的“长度字段”误认为是整个报文长度。实际上,长度字段的值 = 1(单元标识符)+ PDU长度。例如,一个读取保持寄存器的请求(PDU长度=4),长度字段应为 1 + 4 = 5(0x0005)。
3.3 与RTU的映射关系
Modbus RTU转TCP网关的核心功能是实现两种协议格式的透明转换。转换过程遵循以下映射规则:
- 从站地址 → 单元标识符:RTU报文中的从站地址(1字节)直接映射为MBAP头中的单元标识符。
- CRC校验 → TCP校验:RTU报文的CRC16校验码被移除,由TCP/IP协议栈的校验机制(TCP校验和)替代。
- PDU保持不变:功能码 + 数据部分(PDU)在转换过程中不做任何修改,直接透传。
- 帧定界方式:RTU依赖3.5字符时间间隔作为帧定界,TCP则依赖TCP数据流的长度字段进行帧定界。
| 协议 | 报文结构 | 校验方式 | 帧定界 |
|---|---|---|---|
| Modbus RTU | 从站地址(1) + 功能码(1) + 数据(N) + CRC16(2) | CRC16(报文级) | 3.5字符时间间隔 |
| Modbus TCP | MBAP头(7) + 功能码(1) + 数据(N) | TCP校验和(传输层) | TCP长度字段 |
网关转换示例(读取保持寄存器):
【RTU请求报文】(十六进制)
01 03 00 00 00 0A C5 CD
│ │ │ │ │
│ │ │ │ └─ CRC16校验码
│ │ │ └─ 读取数量(10个寄存器)
│ │ └─ 起始地址(0x0000)
│ └─ 功能码(03:读取保持寄存器)
└─ 从站地址(1号)
【TCP请求报文】(十六进制)
00 01 00 00 00 06 01 03 00 00 00 0A
│ │ │ │ │ │ │
│ │ │ │ │ │ └─ 读取数量
│ │ │ │ │ └─ 起始地址
│ │ │ │ └─ 功能码
│ │ │ └─ 单元标识符(映射自从站地址)
│ │ └─ 长度字段(0x0006 = 1 + 5)
│ └─ 协议标识符(0x0000)
└─ 事务处理标识符(0x0001)
厂务数据采集实践要点:
- 在配置网关时,务必确认“单元标识符”与RTU从站地址的对应关系。如果RTU设备地址为1~247,单元标识符应设置为相同值。
- 由于TCP报文移除了CRC校验,网络传输的可靠性完全依赖TCP/IP协议栈。在厂务网络中,建议使用管理型交换机并启用QoS,避免数据包丢失或乱序。
- MBAP头中的“事务处理标识符”在并发请求场景中至关重要。如果SCADA同时发送多个请求,必须确保每个请求的事务ID唯一,否则响应匹配将出现混乱。