本帖最后由 fzyiye 于 2021-4-23 01:16 编辑

MODBUS作为一种事实上的工业现场标准通讯协议被广泛的应用于各种控制器,驱动器间的信息传递。虽然随着技术的发展,也出现了不少可靠性更强的通讯方式,但是MODBUS以其简单的配置,架设,通用性等优势,依然活跃在各种工业场景中。就在我以为MODBUS的应用已然成熟,没有什么特别之时,“三哥”用实力告诉我,要坑你,没商量。
事情是这样的,某客户现场使用了一个某品牌的PLC通过MODBUS通讯,控制3个变频器。三个变频器通过MODBUS通讯将实时的变频器运行状态传递给PLC,PLC将其中客户比较关心的数据显示在HMI上。
通讯连接.png
图1
此设备在现场正常运行2年之后,出问题了——设备出现接地故障,报警停机,报警停机状态下HMI上显示2号变频器的运行电流为3A(设备故障停机了,HMI上确显示设备还有运行电流)
一开始大家的第一反应是电流检测电路被干扰了(同样是设备停止状态下,显示电流不为零的问题之前也遇到过,是因为接地环路导致的,这个以后有机会再与大家分享),但是通过对现场情况进行了一番了解之后,还是不得要领。因为PLC部分的控制系统是我们设计的,所以为了调查清楚原因(分清责任),我们让现场在PLC与VSD的通讯总线上并联了一个4G DTU,将总线上的报文实时上传至云上。
   故障前.PNG
图2
如上图如示:故障前PLC正常从2#变频器读取自首地址“0F 3B”之后的7个地址的数据,这7个数据包含变频器目标运行频率(地址:0F 3E)和当前运行电流(地址:0F 3F)。
而当设备发生故障时,设备故障时,控制器按正常停机逻辑给变频器写目标运行频率(数值逐渐减少,至设备完全停止时为0)变频器的目标运行频率地址为“0F 3E”,我们一般认为变频器会根据PLC指令逐渐降低运行频率,并最终停止。
写入数据错误.PNG
图3 故障停机时,PLC向2#变频器发送目标频率“00 0F”
但事实上是变频器一旦收到设备故障的信息,将会按自己的停机逻辑运行,直至停机。同时变频器将所有对目标运行频率的非0写入均定义为非法,并通过通讯报文回传给控制器。一直到这里都还是可以理解的,接下来的“骚操作”开始了。
控制器在收到写入非法的报文后,判断为此地址故障,此后不再对此地址进行读、写操作。最终导致包含读电流、变频器运行频率的通讯指令不再发送,数据也不再更新。
故障后.png
图4
通过与PLC厂商的沟通,我们了解到这个PLC的底层程序是“三哥”供工的,遂联系“三哥”,“三哥”对此的解释是,当发生写入非法时,为提高通讯效率,把这部分地址的访问权限去掉。好吧,你开心就好。