当前位置: 首页 > news >正文

解决PLC通信会断然后报错的问题

 这里的重点是plc_connection,第一次建立client的时候,它会报错

连接失败,错误信息: b' TCP : Unreachable peer'

所以才建不了client,所以也get不了 plc data,所以才报错。

所以plc_connection一定要有重试机制!!!

import snap7
import struct
import time

PLC_IP = '192.168.10.2'

def plc_connection(PLC_IP, retry_delay=2):
    """
    尝试连接 PLC,无限重试,直到成功。
    每次失败后等待 retry_delay 秒再重试。
    """
    while True:
        try:
            PLC = snap7.client.Client()
            PLC.connect(PLC_IP, rack=0, slot=2)
            if PLC.get_connected():
                print(f"成功连接到 PLC (IP: {PLC_IP})")
                return PLC
        except Exception as e:
            print(f"连接失败,错误信息: {e}")
            time.sleep(retry_delay)  # 等待一段时间后重试

def get_plc_data(plc_obj, db):

    data = plc_obj.db_read(db_number=db, start=0, size=2)
    value = struct.unpack('!h', data)[0]
    return value


def is_connected(plc_obj):
    """
    检查 PLC 是否仍然连接。
    通过尝试读取一个 DB 块来验证连接状态。
    """
    try:
        # 尝试读取一个小型数据块(例如 2 字节)
        a=plc_obj.db_read(db_number=1200, start=0, size=2)
        return True
    except Exception as e:
        print(f"连接检测失败,错误信息: {e}")
        return False

def main():
    retry_delay = 2

    plc_obj = None  # 初始化 PLC 对象为 None

    while True:
        try:
            a=get_plc_data(plc_obj,1200)
            print(a)
            # 如果 PLC 对象不存在或连接已断开,则重新连接

            # if plc_obj is None or not is_connected(plc_obj):
            #     if plc_obj is not None:
            #         try:
            #             plc_obj.disconnect()  # 断开旧的连接(如果存在)
            #         except Exception as e:
            #             print(f"断开旧连接时出错: {e}")
            #     print("尝试重新连接 PLC...")
            #     plc_obj = plc_connection(PLC_IP, retry_delay=retry_delay)
            # print('lianjie', plc_obj.get_connected())
            # time.sleep(5)

        except Exception as e:
            print(f"发生未知错误: {e}")
            print("等待 5 秒后重试连接...")
            if plc_obj is not None:
                try:
                    plc_obj.disconnect()  # 断开旧的连接(如果存在)
                except Exception as e:
                    print(f"断开旧连接时出错: {e}")
            print("尝试重新连接 PLC...")
            plc_obj = plc_connection(PLC_IP, retry_delay=retry_delay)
            time.sleep(5)  # 等待一段时间后重新尝试连接

if __name__ == '__main__':
    main()

相关文章:

  • 金融级密码管理器——生物特征密钥绑定方案
  • python算法:leetcode二叉树相关算法题
  • 搭建Flutter开发环境 - MacOs
  • Django项目之订单管理part6(message组件和组合搜索组件)
  • 繁华 李劭卓2025.3.28
  • RWEQ 模型深度讲解:结合 Python、ArcGIS 等实现土壤风蚀归因分析
  • 【CVE-2025-30208】| Vite-漏洞分析与复现
  • DQN与PPO在算法层面的核心区别
  • Binance Wallet
  • 2024年SEVC SCI1区:进化尺度适应差分进化算法ESADE,深度解析+性能实测
  • 运维面试题(十一)
  • 可以通过哪种方式实现安卓应用生成下载链接
  • 音视频 四 看书的笔记 MediaPlayerService
  • 《非暴力沟通》第四章 “体会和表达感受” 总结
  • 快速了解ES6Module模块化
  • CLion的坑:CMake File API : no reply dir found clion
  • 【强化学习】DAPO 论文解读
  • 什么是索引下推和索引覆盖?
  • 06-SpringBoot3入门-常见注解(简介)
  • 《破局摩尔定律:AI驱动、异构集成与工具革新重构芯片效能新范式》
  • 女巫的继承者们
  • 国家统计局:4月全国城镇调查失业率为5.1%,比上月下降0.1个百分点
  • 玉林一河段出现十年最大洪水,一村民被冲走遇难
  • 解锁儿时愿望!潘展乐战胜孙杨,全国冠军赛男子400自夺冠
  • 视频丨歼-10CE首次实战大放异彩
  • 时隔三年,俄乌直接谈判重启