如果Modbus协议可以优化…
大家好!我是付工。
前面给大家介绍了一系列关于RS485与Modbus的知识。
终于有人把RS485说清楚了
终于有人把Modbus说明白了
通透!终于把ModbusRTU弄明白了
这样看来,ModbusTCP协议太简单了
Modbus协议作为工业物联网领域的重要协议之一,具有简单易用、可扩展性强和通用性强等优点。
今天要“倒反天罡”,谈一谈Modbus协议的一些不足之处。
读写长度限制
前面我们已经分析过ModbusRTU的报文,下面这张图是ModbusRTU协议03功能码读取保持型寄存器的报文格式:

从这张图上,我们可以看到从站返回数据中有一个选项叫做数据个数,这个数据个数就是我们之前说的字节计数,它所占用的字节数是1。
那么意味着字节计数的最大值是255,返回报文中的字节计数是读取寄存器数量的2倍,因此读取寄存器的数量最大值是255/2=127。
如果超过127个,就必须通过分组的方式来多次读取。
这个就会导致在一些数据量较大的场合,需要多次报文交互,才能完成所有的数据读取,从而导致通信效率的降低。
如果当初设计时,字节计数为2个字节,是不是意味着一次性可以读取更多的数据?
寄存器位写入
这个问题也是很多人比较头疼的。
Modbus的功能码中,是没有针对寄存器位写入的。
如果我们给寄存器中的某个位置位或复位,就会比较麻烦。
不仅是Modbus,其他很多协议也有同样的问题。
但是西门子S7协议是支持单个位写入的。
所以我们在上位机开发中,尽量避免使用寄存器的位地址来控制设备。
Modbus的寄存器存储区是以字为单位的,如果想要修改这个字中某个位的值,必须先要把该字的值读取出来,然后根据位索引来置位复位,再将修改之后的值写入到这个字地址中,因此整个过程需要进行两次报文的交互。
如果在这两次交互时间差之间,其他位的值发生了改变,那么第二次交互时会将其他恢复回第一次读取到的值,因此如果必须使用寄存器位操作,要注意变量的重要性,以免造成一些严重的后果。
不支持随机读写
下面这张图是三菱MC协议中的一段报文帧。

这段报文的含义是一次性读取出D0、T0、M100-M115、X20-X2F、D1500-D1501、 Y160-Y17F、M1111-M1142。
Modbus协议不支持这样的读取操作,如果地址比较零散,就必须分很多批,这样必然会导致通信效率的降低。
安全性
Modbus不支持数据加密,没有认证机制。
这个其实和Modbus协议的使用场景有关。
Modbus协议主要应用在设备层的一些仪表及控制层的一些PLC控制器中,所以大部分情况下都是局域网的应用,因此基本上不会出现黑客攻击或者数据篡改之类的问题。
Modbus协议作为工业现场应用,它的目的是实现数据交互,在不联网的环境下,没有攻击就没有伤害。
Modbus是一个年代久远的“工业老兵”,尽量它有一些不足之处,但并不妨碍它在工业里自动化领域中的地位。