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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:50:35