Modbus协议你必须知道的十件事情
—— 看似简单的协议,其实一点都不简单
1 它比很多程序员都老
Modbus协议是1979年由Modicon公司搞出来的,那时候还没有互联网,更别说什么5G了。它是工业通信界的“爷爷辈”,但至今还在坚强服役,活跃在PLC、电表、温湿度传感器等各类设备中。
2 RTU 和 TCP,不是一个味儿
Modbus RTU 是串口协议(用RS485或232线连的),Modbus TCP 是以太网协议(网口的)。它俩“长得像”,但“走的路不一样”。别想着一个驱动搞定两种,直接套用只会调不通。
3 它不主动发消息,得你先问
Modbus是个“社恐协议”,自己不说话,全靠主设备一个个轮着问:“你那边数据有了吗?”它不支持MQTT那种“我有消息就推给你”的玩法,所以实时性差点意思。
4 常用功能码没你想象的多
Modbus指令多?其实常用的就这几个:
01:读开关量(线圈)
03:读模拟量(保持寄存器)
05:写一个开关
06:写一个数值
15/16:一次写多个开关/寄存器
其他功能码?大部分人一辈子都用不上。
5 没加密,数据是“裸奔”的
Modbus的数据是明文传输的,谁在网络中“蹲守”,都能看到你采集了什么值。想安全点,就得靠VPN、TLS等方式“穿件衣服”,否则很容易被“偷听”甚至被“改数”。
6 最多只能带247个设备
Modbus RTU里,从设备的地址范围是1~247。理论上可以接247个从站,但现实里你挂太多设备,主机轮询就忙不过来,通信速度越来越慢,掉线、超时的情况说来就来。
7 03和04,有时候压根没区别
标准上说:
03:读“保持寄存器”
04:读“输入寄存器”
但很多设备厂家懒得分这两个区域,直接都放在一个地方了——你用03或04,拿到的数据可能一样,只不过名字不一样,别太认真。
8 地址40001,其实是0
文档里写40001,你要是真在程序里填40001,就惨了。从设备可能直接懵了:“这是谁?”因为实际发送的地址是从0开始的,40001 = 0,40002 = 1,以此类推。Modbus这个“地址系统”,经常让人脑袋打结。
9 RTU里那个CRC校验,小小一个却至关重要机
你发的每一条Modbus RTU指令,最后两个字节都是校验码,确保传输没出错。如果CRC不对,从设备压根不理你。很多时候设备“装死”,问题就出在这。
10 不同厂家的Modbus ≠ 相同的Modbus
Modbus虽然是标准协议,但每家厂商的实现都不一样,有的从0开始,有的从1开始;有的高字节在前,有的低字节在前;有的用整数,有的用浮点……通用驱动?听起来很美,真用起来——小心翻车。
深圳市钡铼技术有限公司提供全系列 Modbus协议转换网关与解决方案,可实现 Modbus 与多种工业协议之间的灵活互通,包括: