Minimalmodbus,随机生成错误的crc

问题描述

我目前正在使用 RaspberryPi 进行数据采集项目。当我启动我的请求脚本时,有时(很少但经常)我的从站(计算机)检测到 CRC 错误或无效长度。我猜这个错误可能来自这样一个事实,因为我的脚本速度很快并且在几秒钟内要求数百个注册,有时消息不完整,我的奴隶将其检测为错误消息。我想知道是否有可能 minimodbus 的时间不正确,有时会发送错误或部分请求(不完整)。

从站返回错误:

invalid request: Invalid CRC in request

当奴隶不知道该回答什么时,这是我在主人身上遇到的典型错误:

  error = SLAVE_ERRORS[str(e)]
KeyError: "Checksum error in rtu mode: '\\x8aÿ' instead of '\\x8fF' . The response is: '4ÿ\\x07$Ê\\x8aÿ' (plain response: '4ÿ\\x07$Ê\\x8aÿ')"**

我在从站上使用 modbus_tk 来模拟 modbus 从站。接下来通常是我的代码的一部分,从依赖于值的类型请求值。

    try:
        try:
            var_register = file_var[i]['varRegister']
            var_type = file_var[i]['varType']
            var_use = file_var[i]["varUse"]
            var_name = file_var[i]["varName"].strip()

            if '#' in var_register:
                continue
            elif var_type=='U16' or var_type=='I16' or var_type=='S16':

                value = inst.read_register(
                    int(var_register),3,not bool(file_var[i]['varSigned'])
                ) 

            elif var_type=='U32' or var_type=='I32' or var_type=='S32':

                value = inst.read_long(
                    int(var_register),not bool(file_var[i]['varSigned'])
                ) 

因为我的第一个猜测是时间问题,我随机插入了“time.sleep”来为我的请求计时,但错误仍然出现。而且它是完全随机的,有时它会在我的第一个 CRC 错误之前工作 5 分钟,有时仅几秒钟。你知道我应该去哪里调查吗?预先感谢您的帮助!

编辑:我的 PC 充当从站,具有模拟多个从站的 modbus_tk 脚本。 RPI 是请求寄存器及其值的主机。从设备都配置为在这些特定寄存器中具有值,以避免 IllegalAddress 错误。物理连接是 USB 到 RS485 转换器,RPI 配备了处理 RS485 输入/输出的 HAT。所以它实际上是一种 ModBus RTU 通信。当请求进来时,从设备循环并发送应答。

EDIT2:所以我进一步调查了一下,发现了一些有趣的东西。我收到一个错误(这次是在主站上),从站显然发送了错误的校验和......在查看它时,我发现 modbus_tk 生成的校验和很好,但主站收到的答案不一样。看起来有些字节在路上发生了变化,这很奇怪。那可能是从哪里来的?硬件问题?仅在轮询多个寄存器时才会出现此错误(一次超过 2 个)。如果要求的寄存器数量为 1 或 2,则所有其他请求都可以。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)