4、Modbus协议概述:Modbus起源、RTU与ASCII模式、主从架构

好,咱们今天聊聊Modbus。这玩意儿在工业通信里,尤其是嵌入式气象站这种场景,几乎是绕不开的。我最早接触Modbus是在一个野外气象数据采集项目里,当时传感器挂了一排,全是Modbus RTU接口。说实话,刚开始觉得这协议挺老的,后来用顺手了才发现——真香。

4.1 Modbus的起源:一个“老古董”为什么还活着?

Modbus是1979年由Modicon公司(就是现在的施耐德电气)发明的。你想想看,那会儿个人电脑都还没普及呢。它最初是为了让PLC(可编程逻辑控制器)之间能互相说话。为什么它能活到现在?说白了,就三个字:简单、开放、可靠

我在项目中遇到过不少工程师,一上来就想上MQTT或者HTTP,觉得Modbus太“土”。但你要知道,在工业现场,尤其是气象站这种需要长期稳定运行的场景,Modbus的轻量级和确定性是那些“花里胡哨”的协议比不了的。嗯,这里要注意,Modbus是应用层协议,它不关心你底层用的是RS-232、RS-485还是TCP/IP。

核心要点:Modbus是请求/响应模式的协议。主站发请求,从站回响应。没有主站问,从站绝不主动说话。这一点在气象站这种多传感器轮询的场景下特别合适。

4.2 RTU与ASCII模式:两种“方言”

Modbus在串行链路上有两种传输模式:RTU(远程终端单元)ASCII(美国标准信息交换码)。我个人习惯,只要硬件支持,一律用RTU。为什么?往下看。

4.2.1 RTU模式——我推荐你用它

RTU模式用二进制编码,数据紧凑,传输效率高。一个字节就是8位数据,直接发。它的帧格式是这样的:

| 地址码(1字节) | 功能码(1字节) | 数据区(N字节) | CRC校验(2字节) |

举个例子,读取气象站里风速传感器的数据,主站发:

01 03 00 00 00 02 C4 0B

拆开看:

  • 01:从站地址,风速传感器编号1
  • 03:功能码,读取保持寄存器
  • 00 00:起始寄存器地址
  • 00 02:读取2个寄存器(4字节数据)
  • C4 0B:CRC校验,保证数据没被干扰

我曾经在一个项目里,因为CRC算错了,折腾了一整天。后来发现是字节序搞反了。避坑指南:CRC校验是低字节在前,高字节在后。这个顺序千万别搞错。

我的经验:RTU模式在9600波特率下,一帧数据大概就几毫秒。气象站里几十个传感器轮询一遍,也就几百毫秒。实时性完全够用。

4.2.2 ASCII模式——什么时候用它?

ASCII模式就是把每个字节拆成两个ASCII字符发送。比如0x1A,RTU直接发一个字节,ASCII要发'1'和'A'两个字符。效率直接砍半。它的帧格式:

| 起始符':' | 地址码(2字符) | 功能码(2字符) | 数据区(N字符) | LRC校验(2字符) | 结束符CR/LF |

你想想看,同样读风速数据,ASCII模式要发这么一串:

:010300000002F1\r\n

比RTU多了起始符和结束符,数据量大了不少。那为什么还要用ASCII?我遇到过一种情况:通信链路质量很差,干扰特别大。ASCII模式的好处是,你拿个串口助手直接看打印出来的字符,肉眼就能判断数据对不对。RTU模式下全是乱码,调试起来很痛苦。

注意:ASCII模式用的是LRC校验(纵向冗余校验),不是CRC。LRC比CRC简单,但检错能力弱一些。如果你对数据可靠性要求高,还是老老实实用RTU+CRC。

4.3 主从架构:谁说了算?

Modbus的主从架构,说白了就是一主多从。一个总线上只能有一个主站,从站可以有多个(最多247个)。主站是“老板”,从站是“员工”。老板不问你,你就别吭声。

在气象站里,主站通常是数据采集器(比如一个STM32或者树莓派),从站是各种传感器:风速、风向、温湿度、气压、雨量……每个传感器有一个唯一的地址,从1到247。

通信流程是这样的:

  1. 主站发请求,指定要跟哪个从站说话(地址码)
  2. 所有从站都收到这个请求,但只有地址匹配的那个才会响应
  3. 从站处理请求,把数据打包成响应帧发回来
  4. 主站收到响应,解析数据,然后去问下一个从站

这里有个坑。我曾经在一个项目里,把两个传感器的地址都设成了1。结果主站一问,两个传感器同时响应,数据在总线上打架,全是乱码。避坑指南:上电前一定要确认每个从站的地址是唯一的。我习惯在传感器标签上贴个地址贴纸,方便排查。

主从架构的优缺点:

  • 优点:实现简单,成本低,确定性好。主站完全控制通信节奏,不会出现冲突。
  • 缺点:从站不能主动上报数据。如果某个传感器突然报警,主站必须等到轮询到它才能知道。实时性有瓶颈。

嗯,这里要注意,Modbus TCP虽然也是主从架构,但它允许多个主站同时访问同一个从站。不过那是网络层面的玩法,咱们做嵌入式串口通信,还是老老实实一主多从。

4.4 小结一下

Modbus协议,说白了就是工业通信界的“普通话”。它不花哨,但可靠。RTU模式效率高,适合大多数场景;ASCII模式调试方便,适合干扰大的环境。主从架构简单明了,但要注意地址唯一性和轮询周期。

我个人建议,刚开始做气象站项目,先用RTU模式+9600波特率。等跑通了,再考虑优化。别一上来就搞什么自适应波特率、多主站,容易把自己绕进去。记住:简单的东西,往往最可靠

下节预告:咱们会深入Modbus的功能码,看看怎么用03、06、16这些指令读写气象站的数据。到时候我会拿一个真实的风速传感器代码来演示。