Modbus 还能打多久?一个老工程师的碎碎念

说实话,干这行十几年,Modbus 这玩意儿就像米饭——平时不觉得多重要,可一断顿就慌。第一次碰见它是在一套老旧的 PLC 控制系统里,那会儿我还年轻,心想不就串口通讯吗,能有多难?结果呢,波特率设错、数据位对不上、寄存器地址偏移一位……崩溃的次数两只手数不过来。靠,那台设备至今还在车间角落吃灰,就因为死活读不上来一个温度值。

Modbus 协议为啥能活这么久

它没花哨的东西。1979 年诞生,到现在四十多年,技术上早该入土了。可你去任何一家工厂瞅瞅,从变频器到温控表,从电表到传感器,Modbus RTU 几乎是标配。TCP/IP 那货算是后起之秀,借着以太网的便宜杀了出来,但骨子里还是那套请求-应答模式。简单、开放、免费——这三个词儿比什么“工业4.0白皮书”都实在。我见过无数工程师吐槽它效率低、没安全机制,可一边骂一边还得用。因为人家设备就提供了这个口,你不用?那就自个儿写驱动去吧。
罗克韦尔PLC Modbus RTU通讯模块特写
罗克韦尔PLC Modbus RTU通讯模块特写
这几年物联网大火,冒出很多新协议,OPC UA、MQTT、Profinet……一个个牛气冲天。但 Modbus 愣是没死。为啥?因为工控圈最看重的不是性能,是可靠和兼容。 RS-485 那种差分布线,抗干扰真不是吹的,车间里变频器、大电机一起动,干扰大得离谱,485 照样稳定跑。我测过 9600bps 下 500 米距离,数据几乎没丢过——当然你得把终端电阻接对,不然谁也救不了你。 问:调试时设备不响应,怎么排查?
答:先别慌。我最常用的是串口助手抓原始报文,看看主站发了啥,从站回了没。没回,大概率是站号、波特率或者校验不对。很多设备默认站号是 1,人家给你发 2 当然不理你。波特率,485 常用 9600 或 19200,可有些奇葩用 38400,不看手册就掉坑。还有,RS-485 接线,A/B 线接反了也能搞死人——没短路但就是不通。记得接上终端电阻,120 欧姆,特别是长线。报文有回但数据不对?八成是寄存器地址偏移。有的设备文档写的是“40001”,实际发命令时得减 1,变成 0x0000,这坑我踩过不下十次!

Modbus TCP 来了,RTU 还能撑几年?

不好说。TCP 确实爽,用网线一插,IP 地址一设,远程访问、多主站并发都不是问题。但 RTU 有它的狠活儿:成本低、布线简单、实时性可控。 一条 485 总线上挂几十个从站,几百块钱就搞定,你换个以太网交换机试试?而且很多老设备只支持 RTU,换 TCP 意味着全换掉,老板不骂人才怪。不过现在网关便宜了,RTU 转 TCP 的模块满地都是,折衷方案倒也方便。 问:功能码怎么选?读保持寄存器是用 03 还是 04?
答:03 读保持寄存器,04 读输入寄存器。可别搞混,很多表计把瞬时值放在输入寄存器,参数设定放在保持寄存器。写操作常用 06(写单个)和 16(写多个),但注意有些设备只支持 06,你发个 16 它直接不理你,连个错都不报,能把人气死。还有离散输入的功能码 02,基本没人用,碰到过吗?我反正是从来没用过。
Modbus调试软件报错截图 时间超时
Modbus调试软件报错截图 时间超时

一堆血泪换来的三点经验

一堆血泪换来的三点经验
一堆血泪换来的三点经验
首先,轮询间隔别太短。 很多新手觉得越快越好,结果从站处理不过来,直接死机或者错误率飙升。串口设备哪跟得上你 10ms 一发啊,50ms 都算奢侈。其次,用屏蔽线,接地只在一端。 485 的共模电压问题能让你怀疑人生,地电位差大时数据乱跳,加个隔离模块比烧香管用。最后,资料永远别全信。 国产设备的手册有时候写得跟天书一样,寄存器地址表错得离谱,我就遇到过标称 40008 的温度值,读回来的却是湿度,花了三天才发现是文档印错了。 说到文档,我还有一个暴论:Modbus 协议本身没什么可优化的,想提高效率只能动上层逻辑。比如批量读取连续寄存器,别一个一个地址轮询;不同站的数据做异步处理等等。这些细节,没在车间泡过的人很难体会。 总之……哦不,这篇文章不总结。就这样吧,回头再聊 PROFIBUS 的坑,那又是一个深坑。如果觉得有用,记得先把终端电阻接好。
免责声明:市场有风险,选择需谨慎!此文仅供参考,不作买卖依据。如有侵权请联系删除。
文章名称:Modbus 还能打多久?一个老工程师的碎碎念
文章链接:https://www.zystgy.cn/a/55616