Python Snap7库检测PLC连接状态异常问题求助
解决Snap7无法实时检测PLC连接断开的问题
snap7的get_connected()方法仅维护本地连接状态标记,不会主动检测远程PLC是否断开。要实现实时状态检测,需要主动执行一个轻量的PLC通信操作,通过是否抛出异常来判断连接有效性。
修改思路
- 替换依赖
get_connected()的逻辑,改为主动执行轻量请求(比如获取PLC信息) - 捕获Snap7通信异常,以此判断连接是否中断
- 维护一个全局变量保存实时连接状态
- 合理调整检测间隔,避免过度占用资源
修改后的代码
from tkinter import * import snap7 from snap7.exceptions import Snap7Exception IP = '192.168.1.71' Rack = 0 Slot = 1 PLC_Conectado = False plc = snap7.client.Client() tk = Tk() def check_plc_connection(): global PLC_Conectado try: # 执行轻量操作验证连接,比如获取PLC基本信息 plc.get_plc_info() # 如果之前未标记连接,更新状态 if not PLC_Conectado: PLC_Conectado = True print("Conexión establecida") except Snap7Exception: # 通信异常,标记为断开,尝试重连 if PLC_Conectado: PLC_Conectado = False plc.disconnect() print("Conexión perdida") # 尝试重新连接 try: plc.connect(IP, Rack, Slot) PLC_Conectado = True print("Reconectado exitosamente") except Snap7Exception: pass # 打印当前状态 print(f"Conexión: {PLC_Conectado}") # 1秒后再次检测(可根据需求调整间隔) tk.after(1000, check_plc_connection) check_plc_connection() tk.mainloop()
关键说明
get_plc_info()是轻量的通信操作,无需读取实际变量,适合用来验证连接- 捕获
Snap7Exception可以精准处理各类通信错误(比如网络中断、PLC断电) - 维护
PLC_Conectado全局变量,可直接用于后续业务逻辑判断连接状态 - 将检测间隔设为1000ms(1秒),平衡实时性和资源占用,可根据需求调整
内容的提问来源于stack exchange,提问作者Osvaldo Aveni
相关产品推荐
相关产品推荐

