前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【※ ※ ※】流量积算仪Modbus通信的一些小问题

【※ ※ ※】流量积算仪Modbus通信的一些小问题

作者头像
剑指工控
发布2021-11-09 10:13:27
6050
发布2021-11-09 10:13:27
举报
文章被收录于专栏:剑指工控

JZGKCHINA

工控技术分享平台

笔者在前段时间的一个应用测试中,一天测试了多种流量积算仪/流量计算机的Modbus通信。由于测试的仪表来自于不同厂家,不同时期的产品(最早的出厂时间为2004年),故虽其标识的均为标准Modbus通信,但其中一些产品有其各自的不同”特点”,在这里聊聊供大家鉴赏。

由于一些仪表无法找到可以沟通的技术支持人员,有些特性不排除是单独测试设备的问题或是老产品的问题,故在下面的叙述中,我们均隐去仪表品牌,以免不必要的纷争。以下仪表网络测试参数均为9600波特率,8数据位,1停止位,无校验,RS-485半双工网络,Modbus RTU协议。

A

仪表说:你慢慢问,否则我要罢工了

在测试上面这个流量计算机时,通过查阅其手册,发现我们需要的数据主要放置在从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之后再发送下一条请求。验证,问题得到解决。

B

仪表说:不要一次问那么多问题

我每次只能回答一点点

在测试上面这台积算仪时,我们同样首先使用ModScan进行第一步的测试。仪表的协议和地址表如下。

根据上表,我们在ModScan中做出了如下配置,并且我们在积算仪上设置了一个数值为328的质量累积流量值,看看是否可以通信正常。不负所望,ModScan读出了从地址40003开始的连续14个字的数据,但是结果却另笔者感到困惑。如下图:

地址40003中,确实是笔者希望的328的数值,可是地址40004中竟然也是这个值。在地址表中,我们可以看到该数据应该是一个32位双字的长整型数据才对,所以如果对于数值328来说,40004中的数值应该为0才对。即使考虑了高低字交换,高低字节交换,有无符号数,地址偏移1位等因素,这个数值依然不对。笔者又进行了多次测试,发现40003和40004的数值始终相等。然后,笔者习惯性的想先测试1个数,看看能不能读上来,于是就在上图的配置中,把数据长度从14改为了1,奇怪的是,这时40003的数值竟然读不上来了。难道问题和数据长度有关?

于是,笔者又仔细看了下仪表的手册,有了点不太确定的发现(直到现在仍不太确定)。在上面的协议中,有这么一句:

这里的4-8字节莫非是指我们一次只能读取4-8字节的数据?仔细查看该表的数据,我们看到所有的数据都是4字节长的。所以,笔者就在ModScan中,把数据长度改为2,经过修改后,表里的7个数据都可以读到且正常。最后,我们在PLC中做了如下配置,分7次读取这7个数据,结果正常。

这里,笔者不能说仪表有问题,只能说其手册写得应该更明确些。

C

仪表说:

人家是标准Modbus RTU协议……………

只不过校验是反的

这块流量积算仪的问题更直接,当使用ModScan按其手册发送内容读取数据时,仪表没有数据回复。但是如果使用仪表厂家自带的一个小软件测试仪表的通信,数据是完全正常的。由于和厂家软件测试使用的物理链路完全相同,所以应该还是报文协议上出现了一些问题。这就需要我们仔细的阅读厂家手册。

经过反复研读厂家的手册,终于笔者发现了一个之前很少遇到的情况,下图是通信协议的一部分:

在标准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或上位机中编制对应的转换程序。

最后,附上一张凌乱的照片,看看测试现场。。。。。。

往期回顾

HORNER控制器和GE PLC的EGD协议通信

HORNER控制器的J1939通信

Intouch通过SRTP或MBTCP协议连接HORNER控制器

BCD码(8421)和整数互转算法的梯形图实现

UTC时间转本地时间用于PLC的校时(带程序)

姿势已摆好

就等你点啦

作者简介

张伟宁

就职于浩纳尔(天津)自动化科技有限公司,负责美国HORNER一体化控制产品的应用和支持工作,对HORNER全系产品有深入了解。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 剑指工控 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档