我目前正在使用 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,则所有其他请求都可以。