使用Pymodbus读取保持寄存器时触发IllegalValue异常求助
解决Pymodbus RTU IllegalValue异常的方法
核心问题分析
你遇到的Pymodbus :: RTU :: Exception Response(131, 3, IllegalValue)错误,本质是读保持寄存器的参数传递冲突:
- 在
read_holding_registers方法中,slave和unit是同一参数的别名(均用于指定从站ID),同时传入slave=1和unit=0会导致从站ID参数混乱,设备无法识别合法请求,返回非法值异常。 - 需额外确认寄存器地址规则:部分设备使用1-based地址(如MODscan显示的3020),而Pymodbus默认采用0-based地址,若MODscan能直接读取3020,要确认设备是否需要地址偏移。
修正后的代码
from pymodbus.client import ModbusSerialClient # 初始化客户端,参数与MODscan完全对齐 client = ModbusSerialClient( port='COM3', method='rtu', baudrate=19200, bytesize=8, parity="N", stopbits=1, timeout=0.3 ) connect = client.connect() if connect: print('Connected') # 移除冲突的unit参数,仅保留正确的从站ID slave=1 # 若MODscan中3020是1-based地址,此处需改为address=3019(转0-based),否则保持3020 response = client.read_holding_registers(address=3020, count=5, slave=1) # 增加响应校验,避免直接打印异常对象 if not response.isError(): print("寄存器数据:", response.registers) else: print("错误响应:", response)
额外排查步骤
- 确认RS485-USB转换器的A/B线与设备对应端口正确连接,不要接反。
- 核对MODscan使用的所有参数(波特率、奇偶校验、从站ID、地址)与代码完全一致,重点确认从站ID和地址编号规则。
- 若修正参数后仍报错,可尝试调大
timeout值(如改为1.0),避免因超时导致的异常。
内容的提问来源于stack exchange,提问作者Rohit Chaudhari
相关产品推荐
相关产品推荐

