我目前正在使用RaspberryPi进行数据采集项目。当我启动请求脚本时,有时(很少但太频繁(我的从属计算机检测到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ÿ')"**
我在slave上使用modbus_tk来模拟modbus slave。接下来是我的代码的一部分,它从从属服务器请求值,这取决于值的类型。
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是请求寄存器及其值的主机。从机都被配置为在那些特定寄存器中具有值,以避免IllegalAddress错误。物理连接是一个USB到RS485转换器,RPI配备了一个处理RS485输入/输出的HAT。所以它实际上是一个ModBus RTU通信。当请求进入时,从机循环并发送应答。
第二版:所以我进一步调查了一下,发现了一些有趣的东西。我收到一个错误(这次是在主机上(,从机显然发送了错误的校验和。。。在查看时,我发现modbustk生成的校验和很好,但master收到的答案不一样。看起来有些字节在路上发生了变化,这很奇怪。这是从哪里来的?硬件问题?不过,只有在轮询多个寄存器(一次轮询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没有适当的接地似乎起作用。
听起来您的问题可能是模拟从属设备使用的字节顺序。