我目前正在使用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ÿ')"**我在从机上使用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输入/输出的帽子。因此,它实际上是一个ModBus的RTU通信。当请求传入时,从服务器循环并发送答复。
EDIT2:所以我做了进一步的研究,发现了一些有趣的东西。我收到了一个错误(这次是在主人身上)奴隶显然发送了错误的校验和..。在研究它时,我发现modbus_tk生成的校验和很好,但是主人收到的答案并不相同。看起来有些字节在路上变了,这很奇怪。那是从哪来的?硬件问题?只有在轮询多个寄存器(一次超过两个)时才会发生此错误。如果请求的寄存器数量为1或2,则所有其他请求都是可以的。
发布于 2021-04-05 07:39:34
不,这并不奇怪,可能是噪音或其他硬件问题。
这正是CRC存在的原因,以确保您在主服务器上接收到从服务器发送的相同值。
你很有可能:
我打赌是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似乎有效。
发布于 2021-04-04 10:04:49
听起来你的问题可能是模拟奴隶使用的字节顺序。
https://stackoverflow.com/questions/66905927
复制相似问题