欢迎来到老马的领地~ 这是“压风式散热底座”发明者的个人网站:) 本人QQ:80524554,用户群1:562279766
昨天同事去一个客户现场调整程序,是把原支持485通讯的真空计CX-PRN10更换为模拟量输出的PSG500,因为CX-PRN10漏气,导致设备的真空度总是上不去,10个都得换。

由于PSG500是模拟量输出,所以得加一个模拟量转485的采集器,老板买的采集器是国产4通道的,品牌没听过,"深圳好风频借力科技有限公司",型号是HF5504.

本来这事非常简单,就是把原1个站号读1个寄存器,改为1个站号读4个寄存器,完事。

然而,事情没那么简单。。。。smilie70.png

昨天同事遇到的情况是:

上位机发送指令给采集器,返回值正常;

PLC用ADPRW指令发送给原来的CX-PRN10,也正常,能读回值并放到指令所设定的D寄存器.

但是----PLC用ADPRW指令去读采集器的值时,采集器能收到正确的报文,并且也返回给了PLC,那个FX3U-485ADP模块上的RD也闪了,说明数据已经收到了-----可D寄存器中的值就是为零.smilie4.pngsmilie4.png

我昨天和同事远程沟通,没能解决此问题,同事只好先回来,我让他把PLC,采集器,传感器带一套回来,今天上午就折腾了一上午,终于搞清楚原因了-----三菱的485模块部分是严格按照MODBUS规范来的,严格到了什么程度呢,"必须要符合一切条件"才算正确的响应.

用数据来说比较直观:


发送报文:    01 04 00 00 00 01 CH CL
收到报文:    01 04 02 AA BB CH CL


以上是正常的,标准的MODBUS-RTU收发报文.

而坑就在那个采集器上,它默认的报文不是标准的16位寄存器!smilie70.png

请求1个寄存器的内容,它返回的不是16位寄存器(2字节),而是直接返回32位寄存器(4字节)!smilie70.png


发送报文:    01 04 00 00 00 01 CH CL
收到报文:    01 04 04 AA BB CC DD CH CL


之前我和同事都想当然地认为,"收到了4个字节,当然就放到两个相邻的D寄存器中".

然鹅-----三菱PLC不这么认为,必须要匹配:"请求了1个长度的内容,你就必须给我返回两个字节"!

所以就算返回的是4字节,但请求的是1个寄存器,与预期的2字节不符合,丢弃!

最后找了那采集器厂家,说还有个寄存器是存16位标准数据的,让我们读那个标准寄存器,一切就对了,擦smilie64.png

这说到头来,也是我自己大意了,MODBUS-RTU返回的报文我就根本没注意这[请求长度]与[返回长度]的对应关系!请求了1个寄存器,应该返回16位数据共两个字节的,都返回四个字节了,我咋就没注意!smilie55.pngsmilie55.png

浪费一上午时间啊.

PS:

上午还打过三菱的技术服务电话,把报文读给了那边,那边的技术服务人员也没注意这事,也是算了一下CRC发觉没问题,就得出了"你们的操作以及报文没有任何问题,我这边只能帮你到这里了"的结论,估计那小哥也一脸懵逼吧哈哈smilie55.png

此事给我提了个醒:

以后凡用到国产的产品,一定要验证其是否按标准来的!

这不是看不起国产产品,而是实际使用中真让人不省心!

你说它不能用吧,折腾折腾还是能用的;你说它能用吧,可第一次上手你总得折腾折腾smilie73.png

以上。
添加评论

昵称 *

E-mail