Modbus RTU 和 TCP 到底差在哪
Modbus RTU 和 TCP 到底差在哪

Modbus RTU 和 TCP 到底差在哪

Modbus RTU 和 TCP 到底差在哪?这次终于讲明白了

假设甲方甩来一句话:”我们要采集 200 台设备的数据,你看着用 RTU 还是 TCP。”

心里咯噔一下——这俩我都知道,但真要二选一并说出个所以然,还得回去翻资料。折腾了两天,把两者的差异从物理层到协议层捋了一遍,终于敢拍板了。

这篇就把这次搞明白的东西写下来。下次再有人问你 RTU 和 TCP 怎么选,直接甩这篇过去。

一、一张表先看全貌

对比维度Modbus RTUModbus TCP
物理介质串口线(RS-485 / RS-232)以太网线(双绞线、光纤)
通信速度较慢(通常最高 115.2 kbps)极快(100M / 1000M 起步)
数据打包紧凑二进制帧,带 CRC 校验RTU 基础上加 MBAP 头,去掉 CRC
网络架构严格主从模式(单主多从)客户端-服务器模式(支持多客户端并发)
设备数量受限(一条总线 32~247 个)理论无上限(取决于 IP 网络规模)
典型场景电表、水表、传感器、变频器等底层仪表PLC 之间、SCADA 上位机、远程监控、大数据采集

表是死的,故事是活的。下面拆着说。

二、本质:RTU 是”单车道”,TCP 是”高速公路网”

Modbus RTU:一条线上排着队说话

RTU 跑在串口上,物理层是 RS-485(少数 RS-232)。它的工作方式像一条单车道公路

  • 总线上只能有一个主设备,剩下全是从设备(地址 1~247,地址 0 是广播地址——发给 0 的指令所有从站都执行,但都不应答)。
  • 主设备发指令,从设备应答,轮询方式进行。
  • 同一时刻只有一个设备在说话,其他都闭嘴等着。

这种方式的好处是简单、可靠、抗干扰强。坏处也明显——。115.2 kbps 已经是串口的天花板了,200 台设备轮一遍,光等待时间就够喝杯咖啡。

而且 485 总线标准上最多挂 32 个节点(带中继器能扩到 247),设备一多就得分段组网,折腾。

🔧 一个很关键但很少被提起的细节:Modbus RTU 用静默时间来做帧同步——帧与帧之间必须保持至少 3.5 个字符时间的静默(在 9600 bps 下大约 3.65ms),帧内部相邻字节之间不能超过 1.5 个字符时间。超过 1.5 个字符间隔,从站就认为这帧结束了,后半截会被当新帧处理。这就是为什么串口调试时偶尔收到”不完整的回应”——不是丢数据,是帧被提前切断了。

Modbus TCP:跑在以太网上的多车道

TCP 把 Modbus 搬到了以太网上,工作模式从”主从”变成了”客户端-服务器”:

  • 设备是服务器,监听 502 端口。
  • 任何客户端都可以并发发起请求。
  • 多个控制中心能同时访问同一台设备。

这就像高速公路网——不光速度快(千兆起步),而且路口随便上下,谁要去访问哪台设备都行,不用排队。

设备数量理论上没上限,受限于 IP 网络规模。你想接 1000 台?没问题,组个局域网就行。

三、协议层:MBAP 头和消失的 CRC

这是技术上最有意思的地方。RTU 和 TCP 在协议帧上长这样(画个示意):

RTU 帧

[从站地址] [功能码] [数据] [CRC校验]

TCP 帧

[MBAP头(7字节)] [功能码] [数据]

两个变化:

1. TCP 多了个 MBAP 头

MBAP 全称 Modbus Application Protocol header,7 个字节,拆出来长这样:

字段字节数说明
事务标识符2请求/响应对应的编号,客户端自增,用于匹配”这个响应对应哪个请求”
协议标识符2固定 00 00,表示 Modbus 协议
长度2后面所有字节数(从单元标识符到数据结束)
单元标识符1相当于 RTU 的从站地址,在串口转 TCP 网关场景下用来指定目标从站

理解这个最好的方式是想一下”Modbus TCP 网关”的场景。网关一头接 485 总线,上面挂了 10 个从站(地址 1~10),另一头接以太网。上位机通过 TCP 连到网关,怎么告诉网关”我要读地址 3 那个从站”?答案就是单元标识符填 3。网关把 MBAP 头剥掉,把剩余内容当 RTU 帧从地址 3 发出去。

RTU 不需要 MBAP,因为串口总线一次只有一个主站在说话,不会串。

2. TCP 把 CRC-16 去掉了

RTU 帧末尾带 2 字节 CRC-16(不是 CRC-32,那个更大更慢),用来验证数据完整。算法是 CRC-16-IBM(多项式 0x8005),对从站地址到数据末的所有字节计算。

TCP 为什么不要了?因为跑在以太网上,底下有 TCP/IP 协议栈层层把关——链路层有 FCS 校验,TCP 层有校验和。数据坏了,TCP 层自己重传,到不了应用层。

CRC 在 TCP 里是冗余的,去掉它反让帧更紧凑。这就是工程上的”别做底下已经做过的事”。

四、Modicon 是谁?插一段历史

聊 Modbus 绕不开 Modicon 这个名字。

Modicon(莫迪康)是个工业自动化品牌,和 Modbus 是父子关系——”Modbus” 这个词就是 Modicon + Bus(总线)拼出来的,字面意思是”莫迪康公司发明的总线协议”。

时间线是这样的:

  • 1968 年,Modicon 公司造出世界上第一台 PLC。
  • 1979 年,为了让自家 PLC 之间能通信,推出了 Modbus 协议。
  • 后来 Modicon 被施耐德电气收购,现在 Modicon 还是施耐德旗下的 PLC 系列名(M580、M340 那些)。

有意思的是,Modbus 协议本身是开放、免费的,谁都能用。这反而是它后来能成为工业通信”普通话”的关键——要是施耐德捂着收授权费,早被踢出局了。

所以一句话:Modicon 是”爸爸”(品牌),Modbus 是它生的”孩子”(协议),RTU 和 TCP 是这孩子长大后穿的两套”衣服”——串口时代的旧衣服,和以太网时代的新衣服。

五、怎么选?三个判断标准

回到开头那个问题——200 台设备该用 RTU 还是 TCP?我的判断逻辑是这三条:

1. 设备本身支持什么?

这是硬约束。底层仪表(电表、水表、传感器)绝大多数只支持 RTU,因为它们成本低、没网口。高端 PLC、网关、SCADA 系统基本都支持 TCP。

200 台底层设备,如果都是 RS-485 接口,那只能用 RTU——除非你在中间加协议转换网关。

2. 速度要求高不高?

RTU 的 115.2 kbps 在轮询场景下确实吃力。如果你要毫秒级采集,或者数据量大,TCP 是唯一选择。

3. 是不是多点访问?

RTU 是单主模式,同一时刻只能一个主站问。如果两个 SCADA 系统都要读同一批设备,RTU 就抓瞎了,TCP 的多客户端并发正好解决这个。

开头那个假设的案例最后的方案是:底层设备用 RTU 串成几条 485 总线,每条总线接一个网关转 Modbus TCP,再统一接到上位的 SCADA。这样既保留了 485 的布线优势,又享受了 TCP 的并发和速度。这是工业现场最常见的”混合打法”。

🔧 调试小贴士

  • RTU 抓包:用逻辑分析仪或带抓包功能的 USB 转 485 模块(有些 FT232 方案的软件支持)。实时看总线上的原始十六进制帧,地址、功能码、CRC 一目了然。
  • TCP 抓包:直接用 Wireshark,显示过滤器填 tcp.port == 502,就能看到所有 Modbus TCP 请求和响应。Wireshark 内置了解析器,会自动把 MBAP 头、功能码、数据段拆好,比自己手动看省事多了。

六、收个尾

RTU 和 TCP 不是替代关系,是互补关系。

RTU 守着底层——便宜、抗造、布线省,传感器和仪表的天下。TCP 占着上层——快、能并发、能远传,PLC 和 SCADA 的主场。中间用网关把两边连起来,这就是现代工业网络的典型架构。

下次再有人问你”用 RTU 还是 TCP”,别急着二选一,先问一句——你这设备在网络的哪一层?


这是 Modbus 系列的最后一篇。整个系列从地址、功能码、串口到 RTU/TCP,把 Modbus 调试里最常踩的坑都过了一遍。希望对你有帮助——哪怕只是让你少走两天弯路,我写这些也就值了。

系列文章: 1. Modbus地址的那个”5位数密码” 2. 8个功能码,干完90%的Modbus活儿 3. RS485凭什么在工厂里横着走 4. Modbus RTU 和 TCP 到底差在哪(本文)