协议解析 · 2024-10-14

如果Modbus协议可以优化…

大家好!我是付工。

前面给大家介绍了一系列关于RS485与Modbus的知识。

终于有人把RS485说清楚了

终于有人把Modbus说明白了

通透!终于把ModbusRTU弄明白了

这样看来,ModbusTCP协议太简单了

Modbus协议作为工业物联网领域的重要协议之一,具有简单易用、可扩展性强和通用性强等优点。

今天要“倒反天罡”,谈一谈Modbus协议的一些不足之处。

读写长度限制

前面我们已经分析过ModbusRTU的报文,下面这张图是ModbusRTU协议03功能码读取保持型寄存器的报文格式:

原文配图 1

从这张图上,我们可以看到从站返回数据中有一个选项叫做数据个数,这个数据个数就是我们之前说的字节计数,它所占用的字节数是1。

那么意味着字节计数的最大值是255,返回报文中的字节计数是读取寄存器数量的2倍,因此读取寄存器的数量最大值是255/2=127。

如果超过127个,就必须通过分组的方式来多次读取。

这个就会导致在一些数据量较大的场合,需要多次报文交互,才能完成所有的数据读取,从而导致通信效率的降低。

如果当初设计时,字节计数为2个字节,是不是意味着一次性可以读取更多的数据?

寄存器位写入

这个问题也是很多人比较头疼的。

Modbus的功能码中,是没有针对寄存器位写入的。

如果我们给寄存器中的某个位置位或复位,就会比较麻烦。

不仅是Modbus,其他很多协议也有同样的问题。

但是西门子S7协议是支持单个位写入的。

所以我们在上位机开发中,尽量避免使用寄存器的位地址来控制设备。

Modbus的寄存器存储区是以字为单位的,如果想要修改这个字中某个位的值,必须先要把该字的值读取出来,然后根据位索引来置位复位,再将修改之后的值写入到这个字地址中,因此整个过程需要进行两次报文的交互。

如果在这两次交互时间差之间,其他位的值发生了改变,那么第二次交互时会将其他恢复回第一次读取到的值,因此如果必须使用寄存器位操作,要注意变量的重要性,以免造成一些严重的后果。

不支持随机读写

下面这张图是三菱MC协议中的一段报文帧。

原文配图 2

这段报文的含义是一次性读取出D0、T0、M100-M115、X20-X2F、D1500-D1501、 Y160-Y17F、M1111-M1142。

Modbus协议不支持这样的读取操作,如果地址比较零散,就必须分很多批,这样必然会导致通信效率的降低。

安全性

Modbus不支持数据加密,没有认证机制。

这个其实和Modbus协议的使用场景有关。

Modbus协议主要应用在设备层的一些仪表及控制层的一些PLC控制器中,所以大部分情况下都是局域网的应用,因此基本上不会出现黑客攻击或者数据篡改之类的问题。

Modbus协议作为工业现场应用,它的目的是实现数据交互,在不联网的环境下,没有攻击就没有伤害。

Modbus是一个年代久远的“工业老兵”,尽量它有一些不足之处,但并不妨碍它在工业里自动化领域中的地位。

本文为原文文字快照,已收录 2 张技术配图;二维码与推广图未收录。
标签:#Modbus #协议优化