1

我正在通过 RS485(Windows COM 端口上的 USB 到 RS485 适配器)成功地与微控制器通信。我编写了一个小程序minimalmodbus来处理 modbus RTU 通信,它运行良好。

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

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

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

根据我修改的内容,我会收到各种错误。原始错误是校验和错误:

'Checksum error in {} mode: {!r} instead of {!r} . The response is: {!r} (plain response: {!r})'

我从图书馆评论了这一部分,minimalmodbus作为尝试解决我的问题的开始。显然,有一个更好的方法可以克服这个问题,希望其他人以前也遇到过这个问题。

4

1 回答 1

0

你的问题在我看来有点令人费解,所以也许我误解了你的设备在做什么。

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

到目前为止一切顺利,我希望。现在,我不清楚你想做什么。您是否想使用相同的最小modbus 库与两个端口进行通信,或者您想要的只是为每个端口提供两个独立的库。

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

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

这就是我要做的:从原来的minimummodbus库更改行909(在 function 下_communicate)阅读:

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

如果我误解了并且这根本不是您所追求的,请写评论,我会吃掉我的帽子。

于 2019-06-17T16:33:29.213 回答