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

解决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()


http://www.kler.cn/a/613462.html

相关文章:

  • 相对位置2d矩阵和kron运算的思考
  • MFC中的窗口线程安全性与CWnd类
  • 从 YOLO11 模型格式导出到TF.js 模型格式 ,环境爬坑,依赖关系已经贴出来了
  • 智慧养老时代:老年人慢性病预防与生活方式优化
  • 【今日EDA行业分析】2025年3月28日
  • 基于扩散模型的光照编辑新突破:IC-Light方法解析与优化
  • DeepSeek大模型应用开发新模式
  • 智能舵机:AI融合下的自动化新纪元
  • ADZS-ICE-2000和AD-ICE2000仿真器在线升级固件
  • Error:Flash Download failed
  • AIGC-广告助手创作智能体完整指令(DeepSeek,豆包,千问,Kimi,GPT)
  • Ubuntu与CentOS操作指令的主要区别详解
  • 【力扣hot100题】(004)盛水最多的容器
  • 【go微服务】如何快速掌握grpc开发
  • 计算机二级WPS Office第十二套WPS演示
  • ETL中数据转换的三种处理方式
  • 职场新人面对不懂的问题应该如何寻求帮助?
  • 基于Dockerfile以docker运行java(可快速替换jar包实现工程更新)
  • 2007-2019年各省地方财政一般公共服务支出数据
  • Proxmox配置显卡直通