昌晖仪表在一个应用测试中测试了多个品牌流量积算仪MODBUS通信。由于测试的流量积算仪来自于不同厂家,不同时期的产品(最早的出厂时间为2004年),故虽其标识的均为标准Modbus通信,但其中一些流量积算通讯有其各自的不同“特点”,在这里和大家聊聊。
由于一些流量积算仪无法找到可以沟通的技术支持人员,有些特性不排除是单独测试设备的问题或是老产品的问题,故在下面的叙述中,昌晖仪表均隐去流量积算仪品牌,以免不必要的纷争。以下流量积算仪网络测试参数均为9600波特率,8数据位,1停止位,无校验,RS485半双工网络,Modbus RTU协议。
1、流量积算仪MODBUS通讯:你慢慢问,否则我要罢工了
在测试上面这个流量积算仪时,通过查阅其手册,发现我们需要的数据主要放置在从40001到40014(或者说从保持型寄存器0x00到0x0D)这14个连续寄存器中。
在使用PLC或者组态软件测试之前,昌晖仪表习惯用ModScan测试软件进行简单测试。ModScan测试结果正常,能读取到我们需要的7个数据。ModScan配置如下:
ModScan测试成功后,我们使用PLC直接读取以上数据,可以读到正确的数据,但是发现数值变动十分缓慢;进一步监控PLC的通信状态字,其一直在通信正常、校验错误以及无响应几种状态之间不断切换。由于我们已经读到正确的数据,故寄存器地址信息和波特率、站号等网络参数应该没有问题。
所以首先昌晖仪表工程师对硬件接线进行了检查,由于只是在办公室内进行测试,且通信线距离只有50厘米,故测试开始时昌晖仪表未在网络两端安装120欧姆终端电阻,那么既然现在存在问题,我们就把终端电阻加上,毕竟昌晖仪表之前也遇到过某些设备在使用特定材质线缆时在短距离也无法通信的情况。然而,加上终端电阻,甚至更换了一段标准的RS485双绞屏蔽电缆后,故障依然存在。此时,把仪表的线重新接回计算机用ModScan测试,依然正常。并且,我们把PLC的数据直接用串口监控,发现其和ModScan发出的数据内容一模一样,就是速度快了一点。ModScan默认情况下一般是1秒钟发送一次数据请求,但是昌晖仪表测试的PLC主站在默认状况下,只要从站设备有回复,在3½个字符时间后,就会进行下一次数据请求。会不会是这里的问题呢?
在之前的工作中,昌晖仪表工程师遇到过一些从站设备对通信的处理能力比较弱,或者是程序编制不完善,当485总线繁忙时,由于其处理器计算能力或者程序编制不合理,出现较总线不繁忙时通讯响应迟缓,设备动作卡顿,通讯中断,甚至设备重启等情况。仅在今年,昌晖仪表就遇到过一个集控器,主站03报文询问过快之后设备显示器停滞不刷新数据;某家电一线品牌的中央空调集控器,速度快但不定时通讯中断,必须重启设备才可恢复;某模拟量模块,速度快后模拟量读数失真;某压力表,速度快后直接重启。
想到这里,昌晖仪表在PLC主站的轮询逻辑中增加了100ms的延迟时间,即当主站收到从站的正确响应后,等100ms之后再发送下一条请求。验证,问题得到解决。
2、流量积算仪MODBUS通讯:不要一次问那么多问题,我每次只能回答一点点
在测试上面这台流量积算仪时,我们同样首先使用ModScan进行第一步的测试。仪表的协议和地址表如下。
◆读当前数据
计算机→FC6000(4-8bytes):$,03H,XXXX,CRC
根据上表,我们在ModScan中做出了如下配置,并且我们在流量积算仪上设置了一个数值为328的质量累积流量值,看看是否可以通信正常。不负所望,ModScan读出了从地址40003开始的连续14个字的数据,但是结果却另昌晖仪表感到困惑。如下图:
地址40003中,确实是昌晖仪表希望的328的数值,可是地址40004中竟然也是这个值。在地址表中,我们可以看到该数据应该是一个32位双字的长整型数据才对,所以如果对于数值328来说,40004中的数值应该为0才对。即使考虑了高低字交换,高低字节交换,有无符号数,地址偏移1位等因素,这个数值依然不对。昌晖仪表又进行了多次测试,发现40003和40004的数值始终相等。然后,昌晖仪表习惯性的想先测试1个数,看看能不能读上来,于是就在上图的配置中,把数据长度从14改为了1,奇怪的是,这时40003的数值竟然读不上来了。难道问题和数据长度有关?
于是,昌晖仪表工程师又仔细看了下该厂家流量积算仪手册,有了点不太确定的发现(直到现在仍不太确定)。在上面的协议中,有这么一句:
◆读当前数据
计算机→FC6000(4-8bytes):$,03H,XXXX,CRC
这里的4-8字节莫非是指我们一次只能读取4-8字节的数据?仔细查看该表的数据,我们看到所有的数据都是4字节长的。所以,昌晖仪表就在ModScan中,把数据长度改为2,经过修改后,表里的7个数据都可以读到且正常。最后,我们在PLC中做了如下配置,分7次读取这7个数据,结果正常。
这里,昌晖仪表不能说仪表有问题,只能说其手册写得应该更明确些。
3、流量积算仪MODBUS通讯:人家是标准Modbus RTU协议……只不过校验是反的
这块流量积算仪的问题更直接,当使用ModScan按其手册发送内容读取数据时,仪表没有数据回复。但是如果使用流量积算仪厂家自带的一个小软件测试仪表的通信,数据是完全正常的。由于和厂家软件测试使用的物理链路完全相同,所以应该还是报文协议上出现了一些问题。这就需要我们仔细的阅读厂家手册。
经过反复研读厂家的手册,终于昌晖仪表发现了一个之前很少遇到的情况,下图是通信协议的一部分:
6、通讯命令:
功能代码03-用来读取显示数据
发送01;地址回应01;地址
03;功能码03;功能码
00;寄存器地址高04;;字节个数
01;寄存器地址低(显示地址)80;数据1
00;寄存器个数高04;数据2
04;寄存器个数低80;数据3
CRCH;CRC校验码高80;数据4
CRCL;CRC校验码低CRCH;CRC校验码高
CRCL;CRC校验码低
说明:地址=仪表号;寄存器地址=显示项目编号;回应字节个数=(发送)寄存器个数低(1-63)
在标准Modbus协议中,报文的最后两个字节为CRC校验字节,在正常情况下,一般是先发CRC的低字节,然后再发CRC的高字节。如果CRC校验不对,设备可以对报文不做应答。在一般的PLC或是组态软件的标准Modbus块或者驱动中,昌晖仪表未曾见过可以修改CRC高低字节的设置,故在此情况下,我们直接用ModScan或者PLC里预制的标准Modbus块是无法和该仪表进行通信的。所以,在后续处理和这块表的通信时,昌晖仪表使用了自由协议的方式,用PLC的TX功能块直接发送报文,然后对仪表回复的报文用RX功能块接收后进行解析。
4、其他
某些流量积算仪是有Modbus RTU和ASCII的选项的。但是昌晖仪表在测试中,发现有的流量积算仪称RTU为”寄存器模式”,ASCII为”字符模式”,这在配置流量积算仪时需要注意。
在前文中也提到过,流量积算仪中的很多数据往往是32位的双整型数据或IEEE754单精度浮点型数据。既然是32位数据,在不同的PLC或者设备中,其高低字或高低字节的存放顺序各有不同。所以,如果通信可以通上但数据读上来是乱码,大多数情况下,对于32位双整型数据,可以交换其高低字;对于32位单精度浮点数,由于其有1234,2143,3412,4321这4中可能,可以先交换高低字,如果不正确后可以再对高低字节交换进行测试。在PLC中,除了用Move指令进行交换外,还可以使用循环移位指令对单字循环左移/右移8位以交换高低字节,或者对双字循环左移/右移16位以交换高低字。在一些流量积算仪中,也提供了此种功能,已方便用户使用。
同时需要注意的是,某些流量积算仪的浮点数未必是标准的IEEE754格式,可能是其自定义的数值格式,如下图。这时就需要我们根据其手册,在PLC或上位机中编制对应的转换程序。
作者:张伟宁
推荐阅读
数显表与PLC串口通信调试的步骤和方法
昌晖数显仪表与组态王工控软件通信组态实例
共有访客发表了评论
网友评论