第六课 · Modbus TCP:把报文搬上网线

2026-11-04
  • 4

第六课 · Modbus TCP:把报文搬上网线

串口最远一千多米,一条 RS485 总线也只能挂几十台设备。车间规模一大,网线才是主角。这一课讲工业以太网里的"霸主"协议——Modbus TCP:它和 RTU 什么关系、报文怎么变、怎么填坑。

>

一句话总结本课:去掉 CRC,前面加上 7 个字节的 MBAP 头,其余原封不动。

1. 从串行总线到以太网

RTU 和 TCP 的本质区别,先看两张拓扑图:

RTU 总线 vs 以太网星型


Modbus RTUModbus TCP
介质RS485 双绞线网线 / 光纤
拓扑一条总线,手拉手星型,全部接到交换机
速率9600 bps 起10 Mbps ~ 1 Gbps
距离一千多米100 m / 段,可无限级联
一主多从总线只允许一个主站允许多个客户端同时连接

硬件配置三步:设备插网线 → 接到同一个交换机 → IP 配同一个网段(比如 192.168.1.10)。没有主从站号的概念了,换成 IP 地址。

通讯走 TCP,默认端口 502——这是 Modbus TCP 的身份证号,几乎所有工业设备都认它。


2. 报文结构:去 CRC、加头

对比同一件事"读 3 个寄存器"的两种报文:

RTU vs TCP 结构对比

RTU(8 字节):01 03 00 00 00 03 05 CB
TCP(12 字节):00 01 00 00 00 06 01 03 00 00 00 03
               └──── 7 字节头 ────┘└─ 原来的 5 字节 ─┘

变化就两条:

  1. 尾部的 CRC 没了

  2. 头部多了 7 个字节的 MBAP(Modbus Application Protocol)头

后面的功能码 03、起始地址 00 00、数量 00 03,和 RTU 一模一样。


3. MBAP 头:7 个字节逐个讲

MBAP 七字节

字节本例值含义
1-200 01事务号:像快递单号,发 00 01 就回 00 01,用来把请求和应答配对
3-400 00协议号:固定 0,Modbus 协议就是 0
5-600 06长度:后面还有几个字节(单元号 + PDU)
701单元号(Unit ID):见下

事务号是 TCP 模式特有的:因为允许多个客户端并发请求,没有它就分不清哪个应答对应哪个请求。

单元号是给网关用的:网关把 TCP 报文转成底下挂的 RTU 总线时,单元号决定转发给网关背后哪一台从站。如果设备本身就有网口(原生 TCP),这个字节一般填 1,或者填 255,纯粹走个形式。

为什么不要 CRC 了? 因为 TCP 协议自己带校验和、自动重传,链路层已经把可靠性做了,再算 CRC 就重复劳动。


4. 一个大坑:RTU over TCP

有些"TCP 转换器"其实只是把串口透传上网,设备仍然只认 RTU 报文:

RTU over TCP 的坑

标准 Modbus TCP(12 字节):00 01 00 00 00 06 01 03 00 00 00 03
RTU over TCP(8 字节):    01 03 00 00 00 03 05 CB   ← 带 CRC,裸奔上网

两种模式报文长得完全不一样。配置设备时必须看清它是"Modbus TCP"还是"RTU over TCP",选错模式一个字节都读不回来。这是现场联调最常见的坑之一。


5. 实战:还是读那台变送器

和第四课同一台 SJ101CX:重量占地址 0-1 两个寄存器,精度占地址 2,读 3 个寄存器。

完整 TCP 请求

00 01  00 00  00 06  01  03 00 00 00 03
事务号  协议号  长度   单元  功能码+参数(PDU)

长度为什么是 6? 数一数它后面还有几个字节:单元号 01 + 功能码 03 + 地址 00 00 + 数量 00 03 = 1 + 5 = 6。填长度时经常有人把 MBAP 自己也算进去,记住口诀:长度字段永远不算前面,只算它后面。

发送后设备返回 15 个字节:

应答报文

00 01  00 00  00 09  01  03  06  00 03 E6 70 00 02
事务号  协议号  长度   单元  功能码 字节数  数据(重量+精度)
  • 事务号 00 01:原样带回来,和请求配对

  • 长度变成 00 09:单元号 1 字节 + 字节数 1 字节 + 数据 6 字节 = 9

  • 06:后面跟 6 个数据字节

  • 00 03 E6 70:重量 = 0x0003E670 = 255600

  • 00 02:精度 2 位

255600 ÷ 100 = 2556.00 kg

数据换算和第四课完全一样——TCP 只是换了个"信封",里面的内容一点没变。


6. RTU 与 TCP 怎么选

现代工厂通常是混合架构:

  • 现场层:传感器、仪表走 RS485(RTU)——便宜、抗干扰、布线简单

  • 中层:PLC、中控走以太网(TCP)——带宽大、可多客户端并发

  • RTU 设备要进以太网,用网关转换(注意单元号填谁)

  • 连接数要看设备手册的 Max Connections,不是无限连

再对比一遍两种模式的核心差异:


RTUTCP
主站一条总线只有一个主站多个客户端可同时连接
冲突处理主站轮询,一问一答各连接独立,事务号配对
校验应用层 CRCTCP 自带校验重传
组网成本极低需要交换机 / IP 规划

7. 本课小结

  1. RTU → TCP:去 CRC、加 7 字节 MBAP 头,PDU 原样保留

  2. MBAP = 事务号(配对)+ 协议号(固定 0)+ 长度(只算后面的)+ 单元号(网关用;原生网口填 1 或 255)

  3. 长度算式:请求 1+5=6,应答 1+8=9(单元号 + PDU)

  4. 大坑:RTU over TCP 带 CRC 的 8 字节报文,别和标准 TCP 模式搞混

  5. 255600 ÷ 100 = 2556.00 kg,与串口时代完全一致

下一篇把数据送上云:MQTT。

微信二维码

扫码添加微信