处理从属寄存器的异常响应-制造商​​添加了额外的'FF'

时间:2019-06-17 15:21:51

标签: python python-3.x modbus minimalmodbus

我正在通过RS485(通过Windows COM端口通过USB转RS485适配器)成功与微控制器通信。我已经用minimalmodbus编写了一个小程序来处理Modbus RTU通信,并且运行良好。

我与ALSO通信的微控制器具有TTL引脚,制造商做了一些非常奇怪的事情。他们在单元响应之前添加十六进制('FF')x 3。可以想像,这使我在尝试如何处理响应时头痛不已。我正在修改minimalmodbus库的各个部分(本地开发安装的副本),试图强制其接受完整的答案,然后去除前三个'FF'十六进制字符以获取正确的有效负载。到目前为止,我没有成功。我认为该制造商已这样做是为了将3 x 'FF'用作计时机制,他们提供了一个USB密钥,该USB密钥具有此'FF'过滤器作为选项。我的程序将通过此键使用此FF过滤器工作。但是,我希望使用自己的设备和minimalmodbus库,所以我想知道如何剥离这些前导'FF'字符。有人有什么想法吗? @jonasberg

我正在尝试修改安装在pip3``开发下的分叉minimalmodbus库的各个部分。到目前为止,我得到的最好成绩是一个奇怪的回应,但值得一提。我发送了一个read_register的{​​{1}}询问,并返回了2500的十进制值。同样,如果我执行hex(225),我也返回了2000并发送了hex(220)给了我2400作为响应。我以为该设备可能正在响应询问,所以我现在正在尝试有关hex(224)中的回声忽略功能的选项,但到目前为止没有成功。

我的代码在正确使用时可以正常工作,因此在这种情况下我认为这没有帮助。我真的需要通过修改minimalmodbus包来去除前三个'FF'(十六进制)值。

根据我所做的修改,我会遇到各种错误。原始错误是校验和错误:

minimalmodbus

我从'Checksum error in {} mode: {!r} instead of {!r} . The response is: {!r} (plain response: {!r})' 库中注释了此部分,作为开始尝试解决我的问题的开始。显然,有一种更好的方法可以解决此问题,希望其他人以前曾遇到过此问题。

1 个答案:

答案 0 :(得分:0)

您的问题在我看来似乎有些混乱,所以也许我误解了您的设备在做什么。

回顾一下:您的微型计算机有两个端口,在RS485上一切正常,但是在另一个具有TTL电平的UART上,您看到三个主字节0xFF附加到所有Modbus响应中(尽管您正在使用常规Modbus进行查询,您正在发送的帧没有前导0xFF字节。

到目前为止,我希望如此。现在,我不清楚您想做什么。您是否要使用相同的minimalmodbus库与这两个端口进行通信,还是只为每个端口使用两个独立的库?

前者可能会涉及更多(您必须使用简单的过滤器来区分消息)。后者看起来更容易,但是我没有任何方法可以测试它,因此考虑它只是在黑暗中拍摄。

我宁愿直接对从串行端口上的从站读取响应的库部分采取行动(以避免您已经经历的事情:必须重新计算CRC)。

这就是我要做的:从原始的minimalmodbus库更改行909(在函数_communicate下)读取:

        answer = self.serial.read(number_of_bytes_to_read)[3:]

如果我误解了,而这根本不是你所追求的,请写评论,然后我会戴上帽子。