第一章:Modbus协议基础

1.1 Modbus的起源——一个老协议的前世今生

说起Modbus,我得先聊聊它的出身。1979年,Modicon公司为了配合自家的PLC,搞出了这个通信协议。你想想看,那是四十多年前的事了!那时候我还没入行呢,但这协议居然活到了现在,而且活得挺好。

为什么它能活这么久?说白了,就一个字——。Modbus的设计哲学就是「够用就好」。它不搞花里胡哨的东西,就是主从问答,一问一答,干净利落。我在现场调试过不少设备,从温控器到变频器,从流量计到智能电表,十有八九都支持Modbus。

核心要点:Modbus是一个应用层协议,它定义了设备之间如何「对话」。主设备发请求,从设备回响应,就这么简单。

1.2 RTU与ASCII模式——两种「方言」的区别

Modbus有两种传输模式:RTU和ASCII。嗯,这里要注意,它们不是两个协议,而是同一种协议的不同编码方式。

RTU模式

RTU模式用的是二进制编码,数据紧凑,传输效率高。我个人的习惯是,只要硬件支持,优先选RTU。为什么?

  • 效率高:同样一条指令,RTU可能只要8个字节,ASCII得翻一倍
  • 校验强:CRC校验比LRC校验靠谱得多
  • 速度快:同样的波特率,RTU能传更多数据

但RTU有个坑——帧间隔时间。我记得有一次调试一个项目,设备老是丢包,查了半天发现是主站发的太快,从站还没处理完上一帧,下一帧就到了。后来我强制加了3.5个字符的静默时间,问题就解决了。

避坑指南:我曾经在一条485总线上挂了32个设备,结果发现有些老设备对帧间隔特别敏感。后来我统一把主站的发送间隔设为20ms以上,再也没出过问题。

ASCII模式

ASCII模式就是把每个字节拆成两个ASCII字符发送。比如0x1A,RTU直接发1A,ASCII得发'1'和'A'两个字符。

ASCII的好处是肉眼可读,调试方便。但说实话,现在谁还用串口调试助手看原始数据啊?所以我的建议是:除非设备只支持ASCII,否则一律用RTU

对比项 RTU模式 ASCII模式
编码方式 二进制 ASCII字符
数据密度 低(约2倍)
校验方式 CRC-16 LRC
帧间隔 3.5字符时间 1秒
适用场景 绝大多数工业现场 老旧设备、调试阶段

1.3 TCP/IP协议栈映射——Modbus上「高速路」

Modbus RTU/ASCII走的是串口,速度有限。后来大家发现,如果能用TCP/IP网络来跑Modbus,那速度就上去了。于是就有了Modbus TCP。

说白了,Modbus TCP就是把RTU的报文直接塞进TCP包里。去掉CRC校验(TCP自己会校验),加上一个MBAP头(7个字节),完事。

小技巧:Modbus TCP的默认端口是502。我在配置防火墙时,经常遇到IT部门问「502是啥端口?」——你就说「工业设备的HTTP」,他们秒懂。

这里有个关键点:Modbus TCP是「一对多」还是「多对一」? 答案是都可以。因为TCP是点对点的,每个连接都是独立的。一台PLC可以同时跟多台设备通信,只要端口不冲突就行。

我画了一张图,帮你理清这几种模式的关系:

Modbus协议栈映射关系 应用层:Modbus协议(功能码 + 数据) 传输层:RTU/ASCII(串口) 传输层:TCP/IP(网络) 物理层:RS-232 / RS-485 物理层:以太网(RJ45/光纤) 注:RTU/ASCII走串口,TCP走网络,应用层协议完全一致

你看这张图就明白了:不管底层是串口还是网口,上面跑的Modbus应用层是一样的。这就是为什么你可以用同一个上位机软件,既通过串口连老设备,又通过网口连新设备。

1.4 我的实战建议

做了这么多年项目,我总结了几条经验:

  1. 新项目优先选Modbus TCP——布线方便,速度快,调试简单
  2. 老设备改造用RTU——兼容性好,成本低
  3. 别碰ASCII——除非设备手册明确写了只支持ASCII
  4. 注意波特率匹配——9600、19200、38400是常见值,115200要看设备支不支持

一句话总结:Modbus是个「老古董」,但老有老的好处——稳定、简单、遍地都是。你只要搞懂了RTU和TCP的区别,就掌握了80%的Modbus知识。


专注资料整理