2025版自动控制流程_工业级连接_智能重连监控系统_增强型工业连接协议 ‘s Vision+Robot EPSON

发布于:2025-02-26 ⋅ 阅读:(102) ⋅ 点赞:(0)

import time
import tkinter as tk  
from tkinter import messagebox  
from PIL import Image, ImageTk  
import socket  
import threading  
from datetime import datetime  
import logging  
import subprocess  # 确保导入 subprocess 库  
import os
import pyautogui
from HslCommunication import MelsecMcNet
Response=0
#定义文件夹路径
folder_path = r'c:\Log'  #C:\v5\Public_Release
 
# 检查文件夹是否存在,如果不存在则创建
if not os.path.exists(folder_path):
    os.makedirs(folder_path)

# 设置日志配置  
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')  

class TextHandler(logging.Handler):  
    def __init__(self, widget):  
        super().__init__()  
        self.widget = widget  

    def emit(self, record):  
        msg = self.format(record)  
        self.widget.insert(tk.END, msg + '\n')  
        self.widget.yview_moveto(1)  

class MyClass(tk.Frame):
    def __init__(self, root, parent):
        super().__init__(parent)  # 关键:初始化父类
        self.root = root
        self.parent = parent

class TCPClientApp:  
    def __init__(self, root, parent=None):  
        self.root = root  
        self.vision_client_socket = None  
        self.robot_client_socket = None  
        self.connected_to_vision = False  
        self.connected_to_robot = False  
        self.vision_ip = "127.0.0.1"  
        self.vision_port = 8888  
        self.robot_ip = "192.168.0.1"    #192.168.0.1
        self.robot_port = 2009           #2004
        self.setup_ui()  
        self.setup_logging()  
        self.app3_process = None  # 用于存储子进程的引用

        self.parent = parent or root  # 自动降级处理
        self.plc = None
        self.last_y79_state = False  # 新增状态缓存
        self.setup_plc()
        self.start_plc_monitoring()

        self.init_plc_connection()
        self.start_plc_monitoring()


    def setup_ui(self):  
        self.root.title("Design by Tim")  
        self.root.geometry("800x600")  

        # Grid weights for resizing behavior  
        self.root.grid_columnconfigure(0, weight=1)  
        self.root.grid_columnconfigure(1, weight=2)  
        self.root.grid_columnconfigure(2, weight=1)  
        self.root.grid_rowconfigure(0, weight=1)  
        self.root.grid_rowconfigure(1, weight=1)  

        # Left Frame  
        left_frame = tk.Frame(self.root)  
        left_frame.grid(row=0, column=0, padx=5, pady=5, sticky="nsew")  
        self.create_left_panel(left_frame)  

        # Middle Frame  
        middle_frame = tk.Frame(self.root)  
        middle_frame.grid(row=0, column=1, padx=5, pady=5, sticky="nsew")  
        self.create_middle_panel(middle_frame)  

        # Right Frame  
        right_frame = tk.Frame(self.root)  
        right_frame.grid(row=0, column=2, padx=5, pady=5, sticky="nsew")  
        self.create_right_panel(right_frame)  

        # Bottom Frame  
        bottom_frame = tk.Frame(self.root, bg='lightgray')  
        bottom_frame.grid(row=1, column=0, columnspan=3, padx=5, pady=5, sticky="nsew")  
        self.create_bottom_panel(bottom_frame)  

    def create_left_panel(self, parent): 
        self.plc = MelsecMcNet("192.168.0.11", 1028)
        conn = self.plc.ConnectServer() 
        if conn.IsSuccess:
            #status_bar = tk.Label(parent, text="PLC Connected...", fg="gray",bg='green')
            status_bar = tk.Label(parent, text="PLC Connected...", fg="green")
            status_bar.pack(side=tk.BOTTOM, fill=tk.X)
            logging.info(f"[{datetime.now().strftime('%H:%M:%S')}],PLC No Command")
        else:
            #status_bar = tk.Label(parent, text="PLC is not connect...", fg="gray",bg='red')
            status_bar = tk.Label(parent, text="PLC is not connect...", fg="gray")
            status_bar.pack(side=tk.BOTTOM, fill=tk.X)
            logging.info(f"[{datetime.now().strftime('%H:%M:%S')}],Recive PLC Start Command")                

        main_label = tk.Label(parent, text="", font=("Helvetica", 14))  
        main_label.pack(pady=(10, 5))  
        main_label = tk.Label(parent, text="Main", font=("Helvetica", 26))  
        main_label.pack(pady=(10, 50))  

        launch_button = tk.Button(parent, text="Launch Vision", command=self.launch_application)  
        launch_button.pack(pady=(10,30))  

        start_button = tk.Button(parent, text="Start",command=self.start_auto_command,
            bg="#32CD32",
            fg="white",
            font=("Segoe UI", 12)) 
        start_button.pack(pady=(0, 30)) 

        vision_control_and_label_frame = tk.Frame(parent)  
        vision_control_and_label_frame.pack(anchor='center', pady=(10, 0), expand=True)  
        self.create_connection_buttons(vision_control_and_label_frame, "Vision", self.connect_to_vision, self.disconnect_from_vision)  

        robot_control_and_label_frame = tk.Frame(parent)  
        robot_control_and_label_frame.pack(anchor='center', pady=(10, 0), expand=True)  
        self.create_connection_buttons(robot_control_and_label_frame, "Robot", self.connect_to_robot, self.disconnect_from_robot)  

    def create_connection_buttons(self, parent, label_text, connect_cmd, disconnect_cmd):  
        connect_button = tk.Button(parent, text=f"Connect {label_text}", command=connect_cmd, width=10, height=2)  
        connect_button.pack(side=tk.LEFT, anchor='center', padx=5)  

        disconnect_button = tk.Button(parent, text=f"Disconnect {label_text}", command=disconnect_cmd, width=10, height=2)  
        disconnect_button.pack(side=tk.LEFT, anchor='center', padx=5)  

        status_indicator = tk.Frame(parent, width=20, height=20, bg='red')  
        setattr(self, f"{label_text.lower()}_status_indicator", status_indicator)  # Store as attribute  
        status_indicator.pack(side=tk.LEFT, anchor='center', padx=(0, 5))  

    def create_middle_panel(self, parent):  


        # Vision Recive  
        vision_frame = tk.Frame(parent, width=100, height=100)  
        vision_frame.pack(side=tk.LEFT, padx=5, pady=5)  

        log_label = tk.Label(vision_frame, text="", font=("Helvetica", 14))  
        log_label.pack(pady=(1,1))  
        log_label = tk.Label(vision_frame, text="Vision", font=("Helvetica", 26))  
        log_label.pack(pady=(10, 50))  
                                                                    # 3F 11 Fab 8
        self.vision_data_text = tk.Text(vision_frame, wrap=tk.WORD, height=8, width=35, font=("Helvetica", 12), fg="purple")  
        self.vision_data_text.pack(padx=10, pady=10)  

        self.vision_char_text = tk.Text(vision_frame, wrap=tk.WORD, height=8, width=35, font=("Helvetica", 12), fg="orange")  
        self.vision_char_text.pack(padx=10, pady=10)  

        # Robot Recive