问题描述
我目前正在使用 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 (将#修改为@)