笔者在前段时间的一个应用测试中,一天测试了多种流量积算仪/流量计算机的Modbus通信。由于测试的仪表来自于不同厂家,不同时期的产品(最早的出厂时间为2004年),故虽其标识的均为标准Modbus通信,但其中一些产品有其各自的不同”特点”,在这里聊聊供大家鉴赏。
由于一些仪表无法找到可以沟通的技术支持人员,有些特性不排除是单独测试设备的问题或是老产品的问题,故在下面的叙述中,我们均隐去仪表品牌,以免不必要的纷争。以下仪表网络测试参数均为9600波特率,8数据位,1停止位,无校验,RS-485半双工网络,Modbus RTU协议。
ModScan测试成功后,我们使用PLC直接读取以上数据,可以读到正确的数据,但是发现数值变动十分缓慢;进一步监控PLC的通信状态字,其一直在通信正常、校验错误以及无响应几种状态之间不断切换。由于我们已经读到正确的数据,故寄存器地址信息和波特率、站号等网络参数应该没有问题。
所以首先笔者对硬件接线进行了检查,由于只是在办公室内进行测试,且通信线距离只有50厘米,故测试开始时笔者未在网络两端安装120欧姆终端电阻,那么既然现在存在问题,我们就把终端电阻加上,毕竟笔者之前也遇到过某些设备在使用特定材质线缆时在短距离也无法通信的情况。然而,加上终端电阻,甚至更换了一段标准的RS485双绞屏蔽电缆后,故障依然存在。此时,把仪表的线重新接回计算机用ModScan测试,依然正常。并且,我们把PLC的数据直接用串口监控,发现其和ModScan发出的数据内容一模一样,就是速度快了一点。ModScan默认情况下一般是1秒钟发送一次数据请求,但是笔者测试的PLC主站在默认状况下,只要从站设备有回复,在3½个字符时间后,就会进行下一次数据请求。会不会是这里的问题呢?
在之前的工作中,笔者遇到过一些从站设备对通信的处理能力比较弱,或者是程序编制不完善,当485总线繁忙时,由于其处理器计算能力或者程序编制不合理,出现较总线不繁忙时通讯响应迟缓,设备动作卡顿,通讯中断,甚至设备重启等情况。仅在今年,笔者就遇到过一个特气集控器,主站03报文询问过快之后设备显示器停滞不刷新数据;某家电一线品牌的中央空调集控器,速度快后不定时通讯中断,必须重启设备才可恢复;某模拟量模块,速度快后模拟量读数失真;某压力表,速度快后直接重启。
想到这里,笔者在PLC主站的轮询逻辑中增加了100ms的延迟时间,即当主站收到从站的正确响应后,等100ms之后再发送下一条请求。验证,问题得到解决。
在标准Modbus协议中,报文的最后两个字节为CRC校验字节,在正常情况下,一般是先发CRC的低字节,然后再发CRC的高字节。如果CRC校验不对,设备可以对报文不做应答。在一般的PLC或是组态软件的标准Modbus块或者驱动中,笔者未曾见过可以修改CRC高低字节的设置,故在此情况下,我们直接用ModScan或者PLC里预制的标准Modbus块是无法和该仪表进行通信的。所以,在后续处理和这块表的通信时,笔者使用了自由协议的方式,用PLC的TX功能块直接发送报文,然后对仪表回复的报文用RX功能块接收后进行解析
D 其他
某些仪表是有Modbus RTU和ASCII的选项的。但是笔者在测试中,发现有的仪表称RTU为”寄存器模式”,ASCII为”字符模式”,这在配置仪表时需要注意。
在前文中也提到过,流量积算仪中的很多数据往往是32位的双整型数据或IEEE754单精度浮点型数据。既然是32位数据,在不同的PLC或者设备中,其高低字或高低字节的存放顺序各有不同。所以,如果通信可以通上但数据读上来是乱码,大多数情况下,对于32位双整型数据,可以交换其高低字;对于32位单精度浮点数,由于其有1234,2143,3412,4321这4中可能,可以先交换高低字,如果不正确后可以再对高低字节交换进行测试。在PLC中,除了用Move指令进行交换外,还可以使用循环移位指令对单字循环左移/右移8位以交换高低字节,或者对双字循环左移/右移16位以交换高低字。在一些流量积算仪中,也提供了此种功能,已方便用户使用。
同时需要注意的是,某些仪表的浮点数未必是标准的IEEE754格式,可能是其自定义的数值格式,如下图。这时就需要我们根据其手册,在PLC或上位机中编制对应的转换程序。
最后,附上一张凌乱的照片,看看测试现场。。。。。。