0

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

从站返回错误:

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 错误之前几秒钟。你知道我应该去哪里调查吗?在此先感谢您的帮助!

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

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

4

2 回答 2

0

听起来您的问题可能是模拟从站使用的字节顺序。

于 2021-04-04T10:04:49.560 回答
0

不,这并不奇怪,确实可能是噪音或其他硬件问题。

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

你很可能有:

  1. 未将 GND 连接在一起
  2. 一个非常糟糕的电源
  3. 电线很乱
  4. 有大型电动机或任何其他来源或噪音的环境

我的赌注是 1:您认为 RS485 是两线制的(您只有 A 和 B 或 + 和 - 连接,对吧?)。

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

如果您想了解更多信息,可以阅读此文档。关于您的问题的一些特别多汁的段落:

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

和:

不幸的是,RS-422/485 的接地是串行通信中最容易被误解的方面之一。许多人认为 RS-422/485 不需要接地。一种说法是,加号 (+) 和减号 (-) 信号就像一个电流回路并自行完成电路。另一个神话是差分信号只是比较两个电压而不参考公共接地。但最大的罪魁祸首是没有正确接地的 RS-422/485 接线似乎可以工作。

于 2021-04-05T07:39:34.903 回答