使用 modbus 时,即使您使用的是高级库,手头有官方的库也总是有用的MODBUS 文档。
通过文档,您可以检查帧的每个字节的含义:
0x01 0x04 0x00 0x00 0x00 0x01 0x31 0xCA
第一个字节是设备地址(0x01)
第二个字节是功能码(0x04, Read Input Registers)
第三和第四个字节是起始位置(0x00, 0x00)
第五和第六字节是输出的数量(0x00, 0x01)
最后2个字节是CRC控制(0x31, 0xCA)
这意味着您正在要求一个(0x00, 0x01)
来自输入寄存器的寄存器(0x04)
从内存中的第一个位置开始(0x00, 0x00)
来自地址为 1 的设备(0x01)
.
帧本身是正确的,如果设备软件/固件遵循 modbus 标准,您应该有一个答案:您要求的寄存器或错误帧(0x01, 0x80, crc, crc)
.
也就是说,我们可以检查您没有从设备收到答复的原因。为此,如果您不确定您的代码/您所询问的内容/您的设备的行为方式,您可以使用外部工具来比较结果。我建议你像这样码头灯,这可以帮助您设置连接并发送/接收 modbus 帧。
我首先要检查的是连接参数:
client = ModbusClient(method='rtu', port=SERIAL, stopbits=1, bytesize=8, timeout=3, baudrate=BAUD, parity='E')
方法是正确的,因为这是您要求的协议。
端口正确,否则返回系统错误。
超时是引发错误的原因:在给定时间内没有收到响应。无论如何,问题可能不在这里,因为您设置了很高的超时值。
停止位不应干扰帧接收。
问题可能出在波特率和奇偶校验上:此处的错误可能会导致您的代码引发错误。
如果您不知道波特率和/或奇偶校验的正确值,您可以尝试使用最常见的波特率和奇偶校验值:'N', 'E', 'O', 'M', 'S'
(分别代表:无、偶数、奇数、标记、空格。默认为无)。
如果我必须打赌,我会首先将 Even parity 替换为 None (parity = 'N'
).
如果问题仍然存在,请输入设备地址(0x01
)可能是错误的。地址可以表示从 0 (0x00
) 至 255 (0xFF
).
根据协议标准,即使起始地址(0x00, 0x00
),输出数量(0x00, 0x01)
或CRC(0x31, 0xCA
)是错误的,设备应该做出一些响应,但情况并不总是这样:如果您认为自己处于这种情况,请研究设备的特定文档。
最后一种可能性是使用低级库,例如PySerial,然后您定义自己的协议。