AttributeError:'ModbusIOException'对象无'bits'属性问题求助
解决pymodbus中AttributeError: 'ModbusIOException' object has no attribute 'bits'问题
这个报错的核心原因是read_coils请求失败,返回的不是正常的响应对象,而是ModbusIOException异常实例,所以没有bits属性。你怀疑的版本差异确实是关键因素——pymodbus 2.x和3.x的错误处理逻辑有明显区别。
处理方案
根据你安装的pymodbus版本,选择对应的修改方式:
情况1:pymodbus 2.x及更早版本
旧版本中请求失败不会直接抛出异常,而是返回ModbusIOException对象,需要先判断返回结果是否为异常:
from pymodbus.client import ModbusTcpClient from pymodbus.exceptions import ModbusIOException PLC_IP = '192.168.0.200' PLC_PORT = 502 client = ModbusTcpClient(PLC_IP, PLC_PORT) status = client.connect() print(status) result = client.read_coils(1,5) # 先检查请求是否失败 if isinstance(result, ModbusIOException): print(f"请求失败:{result}") elif result.bits[0]: print("Hello world") client.close()
也可以用内置的isError()方法判断:
# 替代上面的判断逻辑 if not result.isError(): if result.bits[0]: print("Hello world") else: print(f"请求错误:{result}")
情况2:pymodbus 3.x及以上版本
新版本中请求失败会直接抛出异常,需要用try-except块捕获:
from pymodbus.client import ModbusTcpClient from pymodbus.exceptions import ModbusIOException PLC_IP = '192.168.0.200' PLC_PORT = 502 client = ModbusTcpClient(PLC_IP, PLC_PORT) status = client.connect() print(status) try: result = client.read_coils(1,5) # 请求成功后再访问bits属性 if result.bits[0]: print("Hello world") except ModbusIOException as e: print(f"请求失败:{e}") finally: client.close()
额外排查建议
- 先确认当前pymodbus版本:执行
pip show pymodbus查看版本号 - 检查PLC连接有效性:确认IP、端口正确,PLC处于运行状态,本地防火墙未拦截502端口
- 如果需要保持版本兼容,建议统一使用3.x的
try-except模式,逻辑更严谨
内容的提问来源于stack exchange,提问作者Lee Kang Ki
相关产品推荐
相关产品推荐

