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号从站的温度值:
主站发送: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校验、一个地址配置,都可能让你卡上半天。多动手、多踩坑,自然就熟了。