你说一个1979年搞出来的协议,到现在还没被淘汰,邪门不?我入行那会儿,觉得这玩意儿太土了。真的。帧格式简单得要命,波特率才多少?结果呢,这么多年过去,我伺候过的PLC、仪表,十有八九还在用Modbus。服了。
一、Modbus凭啥还没死?
就一个字:简单。简单到令人发指。你甚至可以用串口调试助手手搓一帧数据,直接把数采上来。什么Profinet、EtherCAT,复杂得一批,配个网都能让你怀疑人生。Modbus就不一样——主站发请求,从站回响应,一问一答,绝不多逼逼。而且它完全开放,不收你专利费,随便一个单片机都能跑。这性价比,啧啧。
但别以为简单就是没技术含量。我见过太多人栽在细节上。比如寄存器地址,规定从0开始,可很多文档写的是40001这种,你得减个40001才是真正的地址。还有字节顺序,大端小端搞反了,读出来的数能让你怀疑仪表坏了。这些坑,后面细聊。
[IMG_Modbus协议帧结构示意图]二、RTU还是TCP?选错等于给自己挖坑

当年我刚接手一个项目,现场几十个仪表,全走RS-485总线,Modbus RTU模式。布线简单,两根线一拉,手拉手串下去。通讯距离一千多米没毛病,就是轮询一圈慢得想砸电脑。后来客户要求上系统,要接入MES,我二话不说推了Modbus TCP。以太网嘛,快,还能同时连多个主站——虽然实际用的时候,同时读写设备也容易打架。
说个真事:有一次,一个从站死活不响应,我拿示波器抓波形,发现信号质量贼差,加了终端电阻,调了偏置,才勉强稳定。RS-485这玩意儿,终端电阻和偏置电阻不匹配就是噩梦。所以,选RTU,你得有心理准备;选TCP,成本高点,但省心不少。
功能码也是大坑。03读保持寄存器,04读输入寄存器,有的设备偷偷混用,你按标准写03,返回异常码02,查半天手册才发现,原来它输入寄存器也用03读——厂商抖机灵呢。
[IMG_Modbus RTU RS-485接线与终端电阻示意图]三、那些调试时骂过娘的瞬间

搞Modbus调试,没中过招的怕不是运维。我说几个血泪教训:
- 校验码错误:RTU帧尾是CRC16,这个校验码一算错,设备直接不理你。有一回我手算CRC,怼了半小时没通,最后发现多项式用的是A001(反转)而不是标准1021。服气。
- 响应超时设置:波特率9600,一个字节大概1ms,读10个寄存器请求帧8字节,响应帧5+2*10=25字节,至少奔30ms去了,但有的从站反应慢,得设100ms。设短了,超时断开;设长了,轮询一圈天荒地老。
- 多主站问题:RS-485是半双工,只能一主多从,你想上俩主站?加个网关或者用TCP吧。不然数据冲突,鬼知道会读出什么值。
问:Modbus TCP和RTU能直接互转吗?
答:当然能,弄个串口服务器或者协议网关就行。但是注意,TCP没有校验码,靠TCP/IP层的校验,而RTU有CRC。转换时网关会处理好。不过一旦出问题,排查也麻烦,因为你得两头抓包,一头看RTU帧,一头看TCP包。我一般先模拟从站测试,省得被两头坑。
问:设备寄存器地址表不对,怎么快速定位?
答:我就一招,用Modscan或自己写个脚本,从地址0开始,批量读回来,看哪个地址的值符合预期。有些仪表说明书写的40001,实际地址是0000,还有些偏移量是40001,换算要小心。千万别全信手册,信自己抓到的数据。
四、Modbus的未来:苟住就是胜利

你说Modbus会被替代吗?短期看,不会。工业现场存量太大了,而且新设备还在集成这个口。虽然OPC UA、MQTT各种吹,但现场仪表还是Modbus最便宜、最可靠。甚至有些边缘计算网关,先把Modbus数据采上来,再转发到云,Modbus成了最后一公里的王者。
不过话说回来,安全真是个隐患。Modbus设计之初没考虑安全,没有加密、认证,任何人都能发指令。所以用的时候,必须隔离在内部网络,或者上安全网关。别图省事暴露在公网,出了事就傻眼了。
最后,Modbus这东西,就像工业螺丝,看着普通,少了它机器就散架。你越是深入,越觉得它的简单蕴含着一种过硬的设计哲学。当然,如果你刚入门,建议先买个USB转485模块,几块钱的那种,自己写个Python脚本读温湿度,玩通了,就算真正理解Modbus了。
[IMG_Modbus调试工具软件界面示意图]免责声明:文章内容来自互联网,本站仅作为分享,不对其真实性负责,如有侵权等情况,请与本站联系删除。
转载请注明出处:Modbus协议:40年来工业通信的“常青树”,真不是靠运气 https://www.dachanpin.com/a/tg/66330.html