Modbus TCP 与 RTU 协议的报文差异
Modbus 协议是工业自动化领域最通用的通信语言。在实际项目中,混淆 Modbus TCP 与 Modbus RTU 的报文结构是导致通信失败的最常见原因。两者虽然应用层功能一致,但在数据传输的封装格式、校验方式和物理连接上存在本质区别。本指南将直接拆解报文差异,并提供可执行的配置与排查步骤。
物理链路与端口差异
区分 物理连接方式是判断协议类型的第一步。不同的物理介质决定了报文底部的传输特性。
- 识别 物理接口类型。
- 若设备使用
RJ45网口,通常对应Modbus TCP。 - 若设备使用
DB9串口或端子排(A/B线),通常对应Modbus RTU。
- 若设备使用
- 确认 默认端口号。
Modbus TCP默认监听端口为502。Modbus RTU没有端口号概念,依赖串口参数(波特率、数据位、停止位、校验位)。
- 检查 接线逻辑。
TCP遵循以太网标准,支持交换机级联。RTU遵循RS485手拉手拓扑,严禁星形连接。
报文结构核心对比
Modbus 报文由“地址/头信息”、“功能码”、“数据”和“校验”四部分组成。TCP 协议增加了网络传输所需的头信息,并去除了串口通信必需的循环冗余校验。
下表详细列出了两种协议在报文字节排列上的具体差异:
| 组成部分 | Modbus RTU (串口) | Modbus TCP (以太网) | 差异说明 |
|---|---|---|---|
| 头部标识 | 无(静默间隔 > 3.5 字符) | 事务标识符 (2 字节) |
TCP 需要匹配请求与响应 |
| 协议标识 | 无 | 协议标识符 (2 字节,恒为 0) |
用于区分 Modbus 与其他协议 |
| 长度字段 | 无 | 长度字段 (2 字节) |
指示后续字节数 |
| 单元标识 | 从机地址 (1 字节) |
单元标识符 (1 字节) |
TCP 中常用于区分网关下的串口从机 |
| 功能码 | 功能码 (1 字节) |
功能码 (1 字节) |
两者完全一致,如 03 读寄存器 |
| 数据内容 | 数据 (N 字节) |
数据 (N 字节) |
两者完全一致 |
| 校验方式 | CRC16 (2 字节) |
无 (依赖 TCP 栈校验) | RTU 必须计算,TCP 无需计算 |
在 Modbus RTU 中,报文起始前和结束后必须保持至少 3.5 个字符时间的静默间隔,用于帧分隔。而 Modbus TCP 依赖以太网帧结构,无需静默间隔,但必须在应用层增加 6 字节的 MBAP 头。
理解 单元标识符(Unit ID)的特殊性。在 RTU 中,第一个字节就是从机地址,范围 1-247。在 TCP 中,MBAP 头后的第 7 个字节也是单元标识符。若通过以太网转串口网关通信,TCP 的单元标识符必须与网关下挂的 RTU 从机地址一致,否则网关无法转发。
校验机制与计算方法
校验是确保数据完整性的关键。RTU 协议必须手动计算校验码,而 TCP 协议则由操作系统网络栈保证可靠性。
- 掌握
CRC16校验范围。- 在
RTU报文中,校验码覆盖从“从机地址”开始到“数据结束”的所有字节。 - 校验码本身不参与计算。
- 在
- 执行 校验码放置规则。
- 计算出的
2字节校验码,低字节在前,高字节在后。 - 例如:计算结果为
0x1234,报文中先发送0x34,再发送0x12。
- 计算出的
- 忽略
TCP报文尾部的校验。- 在
TCP抓包分析时,若发现报文末尾没有2字节校验码,属于正常现象。 - 强行在
TCP报文后添加CRC会导致从机解析长度错误,引发通信超时。
- 在
软件配置实操步骤
使用调试工具(如 Modbus Poll、QModMaster 或自行编写代码)时,必须严格匹配协议参数。以下步骤以通用调试软件为例。
- 选择 通信模式。
- 在软件主界面 点击
Connection或连接菜单。 - 勾选
Modbus TCP或Modbus RTU单选框。 - 注意 两者不可同时启用,切换模式会重置参数。
- 在软件主界面 点击
- 配置
RTU串口参数。- 输入 端口号(如
COM1)。 - 设置 波特率为
9600(需与设备铭牌一致)。 - 设置 数据位为
8,停止位为1。 - 设置 校验位为
None或Even(常见为无校验)。 - 输入 从机地址(Slave ID),范围
1-247。
- 输入 端口号(如
- 配置
TCP网络参数。- 输入 设备
IP地址(如192.168.1.100)。 - 输入 端口号,默认为
502。 - 输入 单元标识符(Unit ID),通常填
1或与下挂串口设备地址一致。 - 设置 超时时间(Timeout),建议设为
1000毫秒。
- 输入 设备
- 建立 连接测试。
- 点击
Connect或连接按钮。 - 观察 状态栏,若显示
Connected或绿色指示灯,表示物理链路通畅。 - 查看 通信计数,
Tx(发送)与Rx(接收)数值应同步增加。
- 点击
常见通信故障排查
当通信失败时,通过报文差异分析可快速定位问题。以下场景覆盖了 90% 的调试障碍。
- 检查 超时错误(Timeout)。
- 若
TCP连接超时,检查 防火墙是否放行502端口。 - 若
RTU连接超时,检查A/B线是否接反,或波特率不匹配。 - 验证 网线或串口线物理连通性,更换 已知良好的线缆测试。
- 若
- 分析 异常响应码(Exception Code)。
- 若收到功能码高位为
1的响应(如发送03收到83),表示从机拒绝请求。 - 错误码
01:确认 功能码是否支持,部分设备不支持写操作。 - 错误码
02:检查 寄存器地址是否超出范围,地址通常从0或1开始计数。 - 错误码
03:核实 读取的数据长度,单次读取寄存器数量不建议超过125个。
- 若收到功能码高位为
- 核对 地址偏移量。
- 设备手册标注地址为
40001时,协议报文中的地址通常为0或1。 - 计算 实际报文地址:若手册为
40001,报文地址填0;若手册为40000,报文地址填0。 - 尝试 将地址减
1重新发送,这是最常见的地址映射错误。
- 设备手册标注地址为
- 监控 报文长度字段。
- 在
TCP模式下,抓取 网络包查看Length字段。 Length值应等于单元标识符 (1) + 功能码 (1) + 数据长度 (N)。- 若
Length值与实际报文不符,检查 主站软件是否错误地包含了CRC校验位。
- 在
- 排查 网关透传问题。
- 若使用
以太网转串口网关,确认TCP报文中的Unit ID是否等于后端RTU设备的Slave ID。 - 部分网关要求
Unit ID固定为0或255,查阅 网关说明书进行特殊配置。 - 禁用 网关内部的
Modbus解析功能,确保其工作在纯透传模式,避免双重封装。
- 若使用

暂无评论,快来抢沙发吧!