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

Handling unusual response from slave register - Extra 'FF' added by manufacturer

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

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

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

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

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

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

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

我觉得你的问题有点令人费解,所以我可能误解了你的设备在做什么。

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

我希望到目前为止一切顺利。现在,我不清楚你想做什么。您想使用相同的 minimalmodbus 库与两个端口进行通信,还是您想要的只是两个单独的库一个用于每个端口。

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

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

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

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

如果我误解了这根本不是你想要的,请发表评论,我会吃掉我的帽子。