使用pymodbus读取EX-PS 5080线圈时CRC缺失及计算异常问题
问题分析与解决
CRC计算异常的原因
你调用computeCRC时错误传入了包含CRC字节的完整发送报文,但Modbus CRC的计算对象是报文主体(从站地址、功能码、数据字段),不包含CRC本身。
你的发送报文0x00 0x01 0x01 0x92 0x00 0x01 0x5c 0x0a中,最后两个字节0x5c 0x0a是CRC值,计算时应该只取前6个报文主体字节:
from pymodbus.utilities import computeCRC # 仅传入报文主体,移除末尾的CRC字节 crc = computeCRC(b'\x00\x01\x01\x92\x00\x01') print(hex(crc)) # 输出为0x5c0a,与发送报文中的CRC一致
对于设备的完整回复0x00 0x01 0x02 0x00 0x00 0x84 0x3c,计算CRC时取前5个字节0x00\x01\x02\x00\x00,得到的CRC是0x3c84,对应回复中的0x84 0x3c(Modbus CRC采用小端字节序,低字节在前)。
接收报文缺失字节的解决建议
- 移除无效参数
你的read_coils调用中bit=2000是pymodbus不支持的参数,会被忽略,建议删除以避免潜在问题:
output = COM.read_coils(address=402, count=1, slave=0)
- 排查串口接收完整性问题
- 确认设备从站地址:部分Modbus设备不响应广播地址(地址0),可尝试将
slave设为1(常见默认地址)测试; - 调整超时时间:增大
timeout值(比如设为10),确保设备有足够时间返回完整报文; - 启用严格帧校验:初始化客户端时添加
strict=True,让pymodbus严格校验CRC和帧长度:COM = ModbusSerialClient(method='rtu', port='com4', baudrate=9600, timeout=10, parity='N', stopbits=1, bytesize=8, strict=True) - 手动验证串口数据:如果问题持续,可直接用
serial库读取串口数据,确认是否能收到完整回复,排除pymodbus帧解析的问题。
内容的提问来源于stack exchange,提问作者user23229772
相关产品推荐
相关产品推荐

