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)。
Modbus TCP 以太网物理层拓扑结构 Modbus TCP 以太网星型拓扑结构 以太网交换机 (工业级 / 管理型) PLC 控制器 RTU→TCP 网关 SCADA 服务器 HMI 触摸屏 说明:所有设备通过网线连接至中心交换机,形成星型拓扑。网关负责将RS-485总线上的RTU设备映射为TCP节点。

3.2 MBAP报文头格式

Modbus TCP协议在TCP数据段中封装了专用的报文头——MBAP(Modbus Application Protocol)报文头。MBAP头长度为7字节,位于应用数据单元(ADU)的最前端,用于标识和校验Modbus TCP会话。

MBAP报文头字段详解
字段 长度(字节) 描述 取值范围
事务处理标识符
(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)。
MBAP报文头结构 MBAP报文头结构(7字节) 事务处理标识符 2 字节 协议标识符 2 字节 (0x0000) 长度字段 2 字节 单元标识符 1 字节 字段说明: 事务处理标识符:匹配请求/响应;协议标识符:固定0x0000; 长度字段:单元标识符(1) + PDU长度;单元标识符:映射RTU从站地址。

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 与 Modbus 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)
Modbus RTU 转 TCP 映射关系 Modbus RTU 转 TCP 映射关系 Modbus RTU 报文 从站地址(1B) 功能码(1B) 数据(N字节) CRC16(2B) 网关转换 Modbus TCP 报文 MBAP头(7B) 功能码(1B) 数据(N字节) 映射规则: ① 从站地址 → 单元标识符(MBAP头第7字节) ② CRC16 → 移除(由TCP校验和替代) ③ 功能码 + 数据(PDU)→ 完全透传,不做修改
厂务数据采集实践要点:
  • 在配置网关时,务必确认“单元标识符”与RTU从站地址的对应关系。如果RTU设备地址为1~247,单元标识符应设置为相同值。
  • 由于TCP报文移除了CRC校验,网络传输的可靠性完全依赖TCP/IP协议栈。在厂务网络中,建议使用管理型交换机并启用QoS,避免数据包丢失或乱序。
  • MBAP头中的“事务处理标识符”在并发请求场景中至关重要。如果SCADA同时发送多个请求,必须确保每个请求的事务ID唯一,否则响应匹配将出现混乱。