去年调试一个老旧PLC,那玩意儿……用的还是Modbus RTU。两根线,A和B,接错了就完蛋——当场烧了一个485芯片。我盯着那焦糊味,心里骂了句脏话。可骂完又得去翻手册,老老实实看波特率、数据位、停止位。四十多年前的东西了,为什么如今新建的工厂还在用它?

Modbus,1979年Modicon公司搞出来的。那时候没多少人听说过现场总线,更别提Profinet、EtherCAT了。它就靠着一主多从、简单问答机制活到了现在。说实话,简单到令人发指:一个报文,地址、功能码、数据、校验,没了。连个时间戳都没有。但正是这种“简陋”,反而成了它最大的优势——什么芯片都能跑,51单片机也行,最新的ARM Cortex-M7也能轻松搞定,没有复杂的协议栈,没有授权费。❗
可惜啊,成也简单,败也简单。当年设计时根本没考虑安全。谁都可以冒充主站发命令,写入线圈、修改寄存器,设备毫无反抗之力。这在以前封闭的车间里不是问题,可一旦上了云、联了网,灾难就来了。去年有个水厂被黑,攻击者就是通过Modbus TCP直接关了水泵……😡
为什么Modbus还是遍地都是?
很多人一提到工业协议就皱眉头,觉得学起来费劲。但Modbus不一样——可能半天就能上手。调试软件一大堆,Modbus Poll,Modscan,随便找个串口助手都能发指令。相比之下,PROFINET的GSD文件配置、EtherNet/IP的CIP对象模型,哪个不是要啃几周文档?简单就是生产力,尤其在现场调试那种火急火燎的时刻。
再有,设备兼容性。你去买个变频器、温控仪表、电量表,哪怕是国产山寨货,十有八九都带Modbus接口。不是因为他们多喜欢这协议,而是因为客户认,市场逼的。你做个不带Modbus的仪表,现场工程师直接打回——没法集成啊!这就是所谓的“事实标准”。💡
不过话说回来,Modbus也分好几种:RTU、ASCII、TCP。RTU和ASCII走串行线,RS-485或RS-232;TCP就是以太网,端口502。最离谱的是,有人竟然混用——用串口服务器把RTU转成TCP,结果丢包丢得一塌糊涂。为啥?因为串口半双工,TCP全双工,时序对不上,缓冲溢出。这事我遇到过,后来加了握手机制才解决。

串行Modbus的坑:485布线不是儿戏

不少电气工程师以为RS-485随便拧两根线就能通信。天真!波特率一高,线缆长度、终端电阻、偏置电阻、信号反射全出来了。曾经有个项目,9600bps跑得好好的,客户非要提升到115200bps,结果从站时断时连。查了三天,发现那根线有200多米长,还没加终端电阻,波形像锯齿。最后换成带屏蔽的双绞线,两头各接120欧电阻,才稳下来。❗血的教训:485布线必须手拉手总线拓扑,分支线尽量短,最好不超过30厘米。还有接地——两端的共模电压差大了,直接烧收发器。
问:那为什么不用CAN或RS-422替代RS-485呢?答:CAN当然更可靠,有仲裁、错误重发,成本也高一点。但很多设备就只提供Modbus RTU over 485,你让仪表厂换CAN接口?不现实。RS-422是全双工,四根线,用在点对点通信还行,总线就不如485经济了。所以,尽管485问题多,它还是工业串行通信的“普通话”。想了解更深,建议搜一下“RS-485 偏置电阻计算”。
功能码那些事儿:别再搞混03和04了

Modbus的精髓在于功能码。常见的:01读线圈(开关量输出),02读离散输入(开关量输入),03读保持寄存器(可读写的模拟量),04读输入寄存器(只读模拟量)。03和04经常被张冠李戴——仪表厂家吧,有时候把只读数据放在03区,理由是“历史遗留”。结果你按标准用04去读,返回非法功能码,当场懵掉。写入有05强置单线圈、06写单寄存器、15多线圈、16多寄存器。最坑的是,有的设备用16功能码写多个寄存器时,起始地址必须从0开始,不然报错——我在一个流量计上栽过跟头。这些细节,手册上往往写得含混不清,全靠尝试。
问:为什么有些仪表读上来的数值要除以10或100?答:那是寄存器存储的是整型,但实际值是浮点数,所以用固定倍数缩放。协议本身不传输数据类型,全靠双方约定。一些厂家用两个寄存器组合成32位浮点数,那又是另一套规则。没提前问清楚,数据处理就乱套。建议:集成前必须拿到寄存器映射表,确认数据类型和缩放因子。
安全是个大窟窿,但似乎没人关心?
前面提到安全缺失,其实业内早就知道,可到现在也没啥根本性的改进。Modbus TCP不带加密,认证为零。有人说用VPN隔离,或者上防火墙,但这都是外围修补。协议本身像一扇没锁的门。几年前有个报告,暴露在公网的Modbus设备有数万台,其中不少直接控制着电机、阀门。这就是工业4.0?数据裸奔还差不多。😰
我记得有次给一个智慧工厂做方案,老板听说要用Modbus TCP直接连到MES系统,我赶忙拦住——这跟把工厂大门钥匙挂网上有啥区别?后来在内网加了一个协议转换网关,只允许单向读数据,禁止写操作,才勉强合规。强烈建议:如果一定要用Modbus TCP,必须做网络隔离,配合深度包检测(DPI)过滤非法功能码。
看着Modbus就这么四十年如一日,有时真觉得它像块狗皮膏药,甩不掉又嫌弃。可它也确实有功啊,让不同厂家的设备能说同一种话。没有它,大规模集成的成本不知要高多少。或许再过十年,TSN和OPC UA能一统天下,到那时Modbus才会慢慢退场吧。可眼下,那些埋在地沟里的485线,依旧孜孜不倦地传着0和1。
