Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 最小,随机生成错误的crc_Python_Modbus_Minimalmodbus_Modbus Tk - Fatal编程技术网

Python 最小,随机生成错误的crc

Python 最小,随机生成错误的crc,python,modbus,minimalmodbus,modbus-tk,Python,Modbus,Minimalmodbus,Modbus Tk,我目前正在与树莓进行数据采集项目。当我启动我的请求脚本时,有时(罕见但太频繁)我的从属计算机检测到CRC错误或无效长度。我猜错误可能来自这样一个事实:由于我的脚本速度很快,在几秒钟内要求数百个寄存器,有时消息不完整,我的从属服务器将其检测为错误消息。我想知道是否有可能minimalmodbus时间不对,有时会发送错误或部分请求(不完整) 从服务器上返回的错误: invalid request: Invalid CRC in request 这是一个典型的错误,当我的主人不知道该回答什么时,我会

我目前正在与树莓进行数据采集项目。当我启动我的请求脚本时,有时(罕见但太频繁)我的从属计算机检测到CRC错误或无效长度。我猜错误可能来自这样一个事实:由于我的脚本速度很快,在几秒钟内要求数百个寄存器,有时消息不完整,我的从属服务器将其检测为错误消息。我想知道是否有可能minimalmodbus时间不对,有时会发送错误或部分请求(不完整)

从服务器上返回的错误:

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),
                    0,
                    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),
                    3, 
                    not bool(file_var[i]['varSigned'])
                ) 
由于我的第一个猜测是计时问题,我随机插入了“time.sleep”来计时我的请求,但错误仍然不断出现。它是完全随机的,有时会工作5分钟,有时在我第一次CRC错误前几秒钟。你知道我应该去哪里调查吗?提前感谢您的帮助

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


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

听起来您的问题可能是仿真从机使用的问题。

不,这并不奇怪,可能是噪声或其他硬件问题

这正是CRC存在的原因,以确保您在主机上接收到与从机发送的值相同的值

您很可能有:

  • 未将GND连接在一起
  • 极坏的电源
  • 乱七八糟的电线
  • 有大型电动机或任何其他来源或噪音的环境
  • 我打赌是1:你认为RS485是双线的(你只有A和B或+和-连接,对吗?)

    我不打算在这里详细讨论,因为你应该能够找到成千上万的参考资料和帖子,从一开始这场战争就一直在进行。只需说一句,如果您的总线上只有两根导线出现问题,您可能会通过添加第三根导线将两个设备上的GND连接在一起来解决问题。当一个或两个设备使用电池运行或具有隔离电源时,通常会出现这种情况

    如果你想知道更多,你可以阅读。关于你的问题,有一些特别有趣的段落:

    在具有良好屏蔽和接地的优质电缆上方几十英尺处运行RS-422/485可以 几乎没有错误。然而,这不是人们使用RS-422/485的目的。任何电信号 超过1000米的电线(如3300+英尺的天线)会产生噪音。差别 RS-422/485的双绞线特性有助于减少这种噪声的影响,但您必须假设 每天很少发生通信错误。这意味着只需运行长RS-422/485线路 适用于包含正确错误检测(CRC或块校验和)的协议

    以及:

    不幸的是,RS-422/485的接地是串行通信中最容易被误解的方面之一 通讯。许多人认为RS-422/485不需要接地。一个神话是 正(+)和负(-)信号的作用类似于电流回路,并完成电路 他们自己。另一个误区是,差分信号只是比较两个电压,而不需要计算 提及共同点。但最大的罪魁祸首是RS-422/485没有连接的事实 正确接地似乎有效


    也许你能更好地解释一下你的设置?如何连接PC和RPi?Modbus TCP?那么Modbus RTU安装在哪里?谁是主人,谁是奴隶?奴隶是在读东西还是只是在发送假帧?Modbus RTU或TCP上是否检测到CRC错误?太多的开放端无法提供帮助。嘿,感谢这些解释,我认为这是唯一可以解释我的随机错误的东西。问题是,我认为我的电缆没有扭曲A和B电缆,这会产生太多的噪音。。。GND接线似乎为噪音增加了安全性。但是我看到过很多rs485接线上没有任何GND的安装。我认为扭转使它非常有弹性。我只是想总结一下,我的电报是非常错误的。我会看那些文件,以防新电线发生这种情况!谢谢你的时间,不客气。我认为这真的取决于你的环境和电源。如果您在清洁的环境中,最差的电缆可能还可以。双绞线和GND应该有帮助。祝你好运