如何为Pymodbus中特定设备ID不匹配场景创建异常处理?
问题与解决方案
问题场景
我使用的设备有一个识别真实ID的命令:需要向设备地址250发送消息,设备返回的报文会包含它的真实ID(本次场景中真实ID为1)。
- 发送报文:
FA | 03 | 00 66 | 00 01 | 71 93 - 接收报文:
01 | 03 | 02 | 00 01 | 79 84
实际交互符合预期,但Pymodbus会因为单元ID不匹配抛出错误,需要针对这个场景做异常处理。
解决方案代码
from pymodbus.exceptions import ModbusIOException # 判断是否为预期的单元ID不匹配异常 def is_unit_id_mismatch_error(exc: ModbusIOException, expected_id: int, actual_id: int) -> bool: return ( "Unit ID mismatch" in str(exc) and f"expected {expected_id}" in str(exc) and f"got {actual_id}" in str(exc) ) # 读取寄存器的异常处理逻辑 try: # 向地址250发送读取请求 read_result = client.read_holding_registers(address=66, count=1, slave=250) except ModbusIOException as exc: # 检查是否是预先知道的250→1的ID不匹配场景 if is_unit_id_mismatch_error(exc, expected_id=250, actual_id=1): print("忽略预期的单元ID不匹配(期望250,实际1),继续执行...") # 可选:如果需要用真实ID重新操作,加下面这行 # read_result = client.read_holding_registers(address=66, count=1, slave=1) else: # 其他ModbusIO异常,正常抛出不处理 raise
逻辑说明
- 精准异常识别:通过
is_unit_id_mismatch_error函数,解析异常信息中的关键字段,只处理我们明确预期的ID不匹配情况,不会误吞其他类型的Modbus通信异常。 - 灵活处理流程:捕获到目标异常后,可以选择直接跳过(如打印提示后继续),也可以补充后续逻辑——比如用设备返回的真实ID1重新发起读取请求,适配设备的特殊交互逻辑。
内容的提问来源于stack exchange,提问作者RePotato
相关产品推荐
相关产品推荐

