Modbus RTU 与 Modbus TCP 深入指南-帧结构与报文格式
三、帧结构与报文格式
3.1 Modbus RTU 帧结构
3.1.1 帧组成
| 字段 | 长度 | 说明 |
|---|---|---|
| 起始 | ≥3.5字符静默 | 帧分隔符(非显式字节) |
| 地址域 | 1字节 | 0=广播,1-247=从站地址,248-255=保留 |
| 功能码 | 1字节 | 1-127=公共功能码,128-255=异常响应 |
| 数据域 | N字节 | 随功能码变化(寄存器地址、数量、写入值等) |
| CRC校验 | 2字节 | CRC-16,低字节在前(小端序) |
| 结束 | ≥3.5字符静默 | 帧结束标志 |
3.1.2 完整示例
请求:读1号从站,从地址0x0000开始读2个保持寄存器
01 03 00 00 00 02 C4 0B │ │ │ │ └─────┘ │ │ │ │ └── CRC: 0x0BC4(低字节0xC4,高字节0x0B) │ │ │ └── 数量: 2 (0x0002) │ │ └── 起始地址: 0x0000 │ └── 功能码: 03 (读保持寄存器) └── 地址: 1响应(假设寄存器0x0000=0x1234,0x0001=0x5678):
01 03 04 12 34 56 78 D7 2E │ │ │ │ └─────┘ │ │ │ │ └── CRC: 0x2ED7(低字节0xD7,高字节0x2E) │ │ │ └── 数据: 0x1234, 0x5678(共4字节) │ │ └── 字节数: 4 │ └── 功能码: 03 └── 地址: 13.2 Modbus TCP 帧结构
3.2.1 帧组成
| 字段 | 长度 | 说明 |
|---|---|---|
| 事务标识符 | 2字节 | 客户端生成,服务器原样返回,用于匹配请求/响应 |
| 协议标识符 | 2字节 | 必须为 0x0000(Modbus协议),非0为其他协议 |
| 长度 | 2字节 | 后续字节总数 = 1(单元ID)+ PDU长度 |
| 单元标识符 | 1字节 | 原RTU地址,用于串口子设备路由(TCP网关场景) |
| 功能码 | 1字节 | 同RTU |
| 数据域 | N字节 | 同RTU |
注意:Modbus TCP 没有 CRC 字段(由 TCP/IP 协议栈提供校验)!
3.2.2 完整示例
请求:读单元ID=1的设备,从地址0x0000读2个保持寄存器
00 01 00 00 00 06 01 03 00 00 00 02 │ │ │ │ │ │ │ └──────┘ │ │ │ │ │ │ │ └── 数据域(与RTU完全相同) │ │ │ │ │ │ └── 单元ID: 1 │ │ │ │ │ └── 长度: 6(1字节单元ID + 5字节PDU?) │ │ │ │ └── 协议标识符低位: 0 │ │ │ └── 协议标识符高位: 0 → 协议ID = 0x0000 │ │ └── 事务标识符低位: 1 │ └── 事务标识符高位: 0 → 事务ID = 0x0001 └── 事务标识符(0x0001)长度字段详解:
0x0006表示后续有6个字节(单元ID 1 + 功能码 1 + 数据域 4)。
响应:
00 01 00 00 00 05 01 03 02 12 34 │ │ │ │ │ │ │ │ │ └── 数据高位 │ │ │ │ │ │ │ │ └── 数据低位 │ │ │ │ │ │ │ └── 字节数: 2 │ │ │ │ │ │ └── 功能码: 03 │ │ │ │ │ └── 单元ID: 1 │ │ │ │ └── 长度: 5 (1+1+2+1? 重新计算) │ │ │ └── 协议ID: 0 │ │ └── 事务ID: 1长度实际计算:0x0005 = 5,后续字节数 = 单元ID(1) + 功能码(1) + 字节数(1) + 数据(2) = 5,正确。
3.3 RTU 与 TCP 帧格式对比图
RTU 帧: +--------+--------+--------+-------------+--------+--------+ | 地址 | 功能码 | 数据 | | CRC低 | CRC高 | | (1 B) | (1 B) | (N B) | | (1 B) | (1 B) | +--------+--------+--------+-------------+--------+--------+ ↑ 静默时间分隔 TCP 帧(封装在TCP段内): +--------+--------+--------+--------+--------+--------+-------------+ | 事务ID | 协议ID | 长度 | 单元ID | 功能码 | 数据 | | | (2 B) | (2 B) | (2 B) | (1 B) | (1 B) | (N B) | | +--------+--------+--------+--------+--------+--------+-------------+ ↑ MBAP 头部(7字节) ↑ PDU(协议数据单元)