串口最远一千多米,一条 RS485 总线也只能挂几十台设备。车间规模一大,网线才是主角。这一课讲工业以太网里的"霸主"协议——Modbus TCP:它和 RTU 什么关系、报文怎么变、怎么填坑。
>
一句话总结本课:去掉 CRC,前面加上 7 个字节的 MBAP 头,其余原封不动。
RTU 和 TCP 的本质区别,先看两张拓扑图:

| Modbus RTU | Modbus TCP | |
|---|---|---|
| 介质 | RS485 双绞线 | 网线 / 光纤 |
| 拓扑 | 一条总线,手拉手 | 星型,全部接到交换机 |
| 速率 | 9600 bps 起 | 10 Mbps ~ 1 Gbps |
| 距离 | 一千多米 | 100 m / 段,可无限级联 |
| 一主多从 | 总线只允许一个主站 | 允许多个客户端同时连接 |
硬件配置三步:设备插网线 → 接到同一个交换机 → IP 配同一个网段(比如 192.168.1.10)。没有主从站号的概念了,换成 IP 地址。
通讯走 TCP,默认端口 502——这是 Modbus TCP 的身份证号,几乎所有工业设备都认它。
对比同一件事"读 3 个寄存器"的两种报文:

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 字节 ─┘
变化就两条:
尾部的 CRC 没了
头部多了 7 个字节的 MBAP(Modbus Application Protocol)头
后面的功能码 03、起始地址 00 00、数量 00 03,和 RTU 一模一样。

| 字节 | 本例值 | 含义 |
|---|---|---|
| 1-2 | 00 01 | 事务号:像快递单号,发 00 01 就回 00 01,用来把请求和应答配对 |
| 3-4 | 00 00 | 协议号:固定 0,Modbus 协议就是 0 |
| 5-6 | 00 06 | 长度:后面还有几个字节(单元号 + PDU) |
| 7 | 01 | 单元号(Unit ID):见下 |
事务号是 TCP 模式特有的:因为允许多个客户端并发请求,没有它就分不清哪个应答对应哪个请求。
单元号是给网关用的:网关把 TCP 报文转成底下挂的 RTU 总线时,单元号决定转发给网关背后哪一台从站。如果设备本身就有网口(原生 TCP),这个字节一般填 1,或者填 255,纯粹走个形式。
为什么不要 CRC 了? 因为 TCP 协议自己带校验和、自动重传,链路层已经把可靠性做了,再算 CRC 就重复劳动。
有些"TCP 转换器"其实只是把串口透传上网,设备仍然只认 RTU 报文:

标准 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",选错模式一个字节都读不回来。这是现场联调最常见的坑之一。
和第四课同一台 SJ101CX:重量占地址 0-1 两个寄存器,精度占地址 2,读 3 个寄存器。

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 只是换了个"信封",里面的内容一点没变。
现代工厂通常是混合架构:
现场层:传感器、仪表走 RS485(RTU)——便宜、抗干扰、布线简单
中层:PLC、中控走以太网(TCP)——带宽大、可多客户端并发
RTU 设备要进以太网,用网关转换(注意单元号填谁)
连接数要看设备手册的 Max Connections,不是无限连
再对比一遍两种模式的核心差异:
| RTU | TCP | |
|---|---|---|
| 主站 | 一条总线只有一个主站 | 多个客户端可同时连接 |
| 冲突处理 | 主站轮询,一问一答 | 各连接独立,事务号配对 |
| 校验 | 应用层 CRC | TCP 自带校验重传 |
| 组网成本 | 极低 | 需要交换机 / IP 规划 |
RTU → TCP:去 CRC、加 7 字节 MBAP 头,PDU 原样保留
MBAP = 事务号(配对)+ 协议号(固定 0)+ 长度(只算后面的)+ 单元号(网关用;原生网口填 1 或 255)
长度算式:请求 1+5=6,应答 1+8=9(单元号 + PDU)
大坑:RTU over TCP 带 CRC 的 8 字节报文,别和标准 TCP 模式搞混
255600 ÷ 100 = 2556.00 kg,与串口时代完全一致
下一篇把数据送上云:MQTT。