2、Modbus协议基础(上):Modbus历史与变种、物理层与电气特性、主从架构与通信模型

各位同学,咱们今天聊聊Modbus。说实话,这玩意儿在暖通自控圈子里,就跟水电工手里的螺丝刀一样——看着不起眼,但没它真不行。

我最早接触Modbus是在一个大型商业综合体的冷站项目上。当时甲方要求把十几台冷水机组、几十台水泵的数据全部集成到BA系统里。厂家给的接口清一色都是Modbus RTU。嗯,从那天起,我就跟这个协议杠上了。

2.1 Modbus的诞生与演变

Modbus是1979年由Modicon公司(就是现在的施耐德电气)发明的。说白了,它就是为了解决工业现场设备之间怎么“说话”的问题。

那个年代,PLC(可编程逻辑控制器)刚出来不久,各家设备各说各话,互不兼容。Modbus的出现,相当于给工业通信定了个“普通话”标准。

我个人习惯把Modbus的发展分成三个阶段:

  • 1979年:Modbus RTU/ASCII诞生,基于串口通信
  • 1999年:Modbus TCP出现,拥抱以太网
  • 2007年:成为国家标准GB/T 19582

你想想看,一个协议能活40多年,这在IT领域简直是个奇迹。为什么?因为它足够简单、足够可靠。

2.2 Modbus的三种变种

Modbus主要有三种“方言”:RTU、ASCII和TCP。我在项目中遇到过不少工程师搞混它们,这里我帮你理清楚。

2.2.1 Modbus RTU

这是最常用的串口版本。数据用二进制传输,效率高。一个报文里,数据是紧凑排列的,没有多余的空格或字符。

关键特点:

  • 数据格式:8位二进制
  • 校验方式:CRC循环冗余校验
  • 波特率:常用9600、19200、38400 bps
  • 典型应用:楼宇自控、工业现场

举个例子,读取一个寄存器值的RTU报文是这样的:

01 03 00 00 00 01 84 0A
|   |   |   |   |   |
|   |   |   |   |   +-- CRC校验(低字节)
|   |   |   |   +------ CRC校验(高字节)
|   |   |   +---------- 数据长度(1个寄存器)
|   |   +-------------- 起始地址(0x0000)
|   +------------------ 功能码(03:读保持寄存器)
+---------------------- 从站地址(01号设备)

我曾经在一个项目上,就因为CRC校验算错了,折腾了整整一个下午。后来发现是计算时高低字节顺序搞反了。嗯,这里要提醒你:CRC校验是Modbus RTU的命根子,算错一个字节,整个报文就废了

2.2.2 Modbus ASCII

这个版本现在用得少了,但老设备上还能见到。它把每个字节拆成两个ASCII字符发送,可读性强,但效率低。

比如上面那个RTU报文,用ASCII表示就是:

:01030000000184\r\n

看到了吗?每个字节都变成了两个字符,报文长度翻倍。而且ASCII模式用LRC校验,比CRC简单,但可靠性也差一些。

我的建议:除非你遇到的是20年以上的老设备,否则尽量别用ASCII。RTU效率高、可靠性好,是暖通自控的首选。

2.2.3 Modbus TCP

这是Modbus的“现代化”版本。它把串口通信搬到了以太网上,用TCP/IP协议栈传输。

Modbus TCP的报文结构跟RTU很像,但去掉了CRC校验——因为TCP/IP底层已经保证了数据的可靠性。它多了一个MBAP报文头,用来标识事务。

事务标识符(2字节) | 协议标识符(2字节) | 长度(2字节) | 单元标识符(1字节) | 功能码(1字节) | 数据(N字节)

说白了,Modbus TCP就是把RTU报文“打包”进TCP包里,通过网线传输。我最近做的几个智慧园区项目,基本都是用Modbus TCP,因为布线方便,传输距离远。

2.3 物理层与电气特性

协议是“软件”,物理层是“硬件”。两者缺一不可。咱们重点说说RS-485和RS-232。

2.3.1 RS-232

RS-232是早期的串口标准,你电脑上那个9针的DB9接口就是它。

特性 RS-232
传输方式 单端传输
最大距离 约15米
最大节点数 1对1
信号电压 ±3V ~ ±15V
抗干扰能力

RS-232在暖通自控里基本被淘汰了。为什么?距离短、只能点对点、抗干扰差。我见过一个项目,用RS-232接了50米线,结果数据全是乱码。嗯,这就是典型的“省钱省出问题”。

2.3.2 RS-485

RS-485才是暖通自控的“主力军”。它采用差分信号传输,抗干扰能力强,传输距离远。

特性 RS-485
传输方式 差分传输
最大距离 约1200米
最大节点数 32个(标准),可扩展至256个
信号电压 ±1.5V ~ ±6V
抗干扰能力

避坑指南:我曾经在一个冷冻站项目上,RS-485总线接了40多个设备,结果通信时断时续。查了半天,发现是终端电阻没加。记住:RS-485总线两端必须加120Ω终端电阻,否则信号反射会让你怀疑人生。

另外,RS-485的A/B线不能接反。A接A,B接B,这是铁律。我见过有人把A和B接反了,设备死活通信不上,还以为是设备坏了。

2.4 主从架构与通信模型

Modbus的通信模型非常简单:一主多从

什么意思?就是总线上只有一个“老大”(主站),其他都是“小弟”(从站)。老大不发话,小弟不能主动说话。

通信流程是这样的:

  1. 主站发送请求报文(指定从站地址、功能码、数据)
  2. 所有从站都收到这个报文,但只有地址匹配的那个从站才会响应
  3. 从站处理请求,返回响应报文
  4. 主站收到响应,完成一次通信

举个例子,主站要读取1号从站的温度值:

主站发送:01 03 00 00 00 01 84 0A
从站响应:01 03 02 00 1A 79 84

响应报文里,00 1A就是温度值(十六进制),换算成十进制是26,代表26°C。

你想想看,这种一问一答的模式,是不是很像老师点名?老师叫到谁,谁就站起来回答。其他学生只能听着,不能插嘴。

这种架构的好处是简单、可靠、容易实现。但缺点也很明显——效率低。如果总线上有30个设备,主站要轮询一遍,每个设备问一次,那周期就长了。

我的经验:在暖通自控项目中,轮询周期一般设置在1~5秒。如果设备太多,可以分组轮询,或者把不重要的数据降低采样频率。比如温度可以5秒采一次,但报警信号必须1秒内响应。

2.5 小结

好了,这一章的内容就这些。咱们回顾一下重点:

  • Modbus有三种变种:RTU(高效)、ASCII(可读)、TCP(网络化)
  • 物理层以RS-485为主,注意终端电阻和接线
  • 主从架构,一问一答,简单可靠

下一章咱们会深入Modbus的功能码和数据模型,到时候你会知道怎么用Modbus读取温度、控制阀门、设定参数。这些东西在实战中非常有用。

记住一句话:Modbus不难,但细节决定成败。一个终端电阻、一个CRC校验、一个地址配置,都可能让你卡上半天。多动手、多踩坑,自然就熟了。