You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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采用小端字节序,低字节在前)。

接收报文缺失字节的解决建议

  1. 移除无效参数
    你的read_coils调用中bit=2000是pymodbus不支持的参数,会被忽略,建议删除以避免潜在问题:
output = COM.read_coils(address=402, count=1, slave=0)
  1. 排查串口接收完整性问题
  • 确认设备从站地址:部分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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 09:43:20