优化版本,增加3D 视觉 查看前面的记录

news2025/6/1 23:24:35

上图先

运来的超出发表上限,重新发。。。

#11:06:57Current_POS_is: X:77Y:471Z:0U:-2   C:\Log\V55.txt
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    
import os
import pyautogui
from HslCommunication import MelsecMcNet
import json  
import random
import math
import matplotlib
matplotlib.use('TkAgg')  # 设置matplotlib后端
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import numpy as np
import matplotlib.pyplot as plt  # 新增:导入matplotlib.pyplot模块
#from sklearn.linear_model import LinearRegression

# 修正后的全局变量声明
Response = 0
Offset_X = 0
Offset_Y = 0
Offset_U = 0
Ares_Sensor=None

#定义文件夹路径
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')  
# 新增格式化器,精确到毫秒
formatter = logging.Formatter(
    fmt='%(asctime)s,%(msecs)03d - %(levelname)s - %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S'
)

# 设置基础日志配置
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s,%(msecs)03d - %(levelname)s - %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S'
)

# 如果已有其他处理器(如 StreamHandler),也应设置相同格式
class TextHandler(logging.Handler):
    def __init__(self, widget):
        super().__init__()
        self.widget = widget
        self.formatter = logging.Formatter(
            fmt='%(asctime)s,%(msecs)03d - %(levelname)s - %(message)s',
            datefmt='%Y-%m-%d %H:%M:%S'
        )

    def emit(self, record):
        # 检查 widget 是否存在且未被销毁
        if self.widget and hasattr(self.widget, 'winfo_exists') and self.widget.winfo_exists():
            msg = self.formatter.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.is_engineering_mode = True  # 新增模式标志

        # 新增 CONFIG_PATH 定义
        self.CONFIG_PATH = r'C:\Log\config.json'  # 配置文件路径

        # 确保 INDUSTRIAL_COLORS 初始化在 setup_ui 调用之前
        self.INDUSTRIAL_COLORS = {
            'bg_main': '#404040',  # 主背景色
            'fg_main': '#FFFFFF',  # 主前景色
            'accent': '#FFA500',   # 强调色
        }

        self.setup_ui()  
        self.setup_logging()  
        self.app3_process = None  # 用于存储子进程的引用

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

        self.init_plc_connection()  # PLC运行

        self.run_button = None
        self.image_label = None
        self.images = []
        self.image_index = 0  # 确保在类初始化时设置默认值

        ###开启程序后自动启动项目
        self.connect_to_vision()
        self.connect_to_robot()

        ###开启程序后自动加载offset
        self.load_settings()

        # 修改窗口关闭事件处理
        self.root.protocol("WM_DELETE_WINDOW", self.on_exit)

        # 数据存储  Chart
        self.history_data = {
            'X': [],
            'Y': [],
            'U': [],
            'timestamps': []
        }
        
        # 启动定时更新
        self.update_interval = 888  # 3.888秒
        self.root.after(self.update_interval, self.update_display)

        self.update_history_chart()
        self.home_received = False  # 新增状态变量



    def update_image(self):
        # 检查图片列表是否存在且非空
        if not hasattr(self, 'images') or not self.images:
            logging.warning("No Pictures")
            self.root.after(333, self.update_image)  # 使用 after 安排下一次更新
            return

        # 检查 image_label 是否初始化
        if not hasattr(self, 'image_label') or self.image_label is None:
            logging.error("Picture Ini...")
            # 使用保存的 right_frame 重新初始化
            if hasattr(self, 'right_frame'):
                self.create_right_panel(self.right_frame)
            else:
                logging.error("无法找到 right_frame,无法重新初始化 image_label")
            self.root.after(333, self.update_image)  # 避免直接递归调用
            return

        try:
            img = self.images[self.image_index]
            self.image_label.config(image=img)
            self.image_label.image = img
            logging.debug(f"成功更新图片索引 {self.image_index}")
        except Exception as e:
            logging.error(f"更新图片失败: {str(e)}")
            self.root.after(1000, self.update_image)  # 避免直接递归调用
            return

        # 更新索引并触发下一次更新
        self.image_index = (self.image_index + 1) % len(self.images)
        self.root.after(1000, self.update_image)  # 使用 after 安排下一次更新

    def toggle_mode(self):
        self.is_engineering_mode = not self.is_engineering_mode
        if self.is_engineering_mode:
            self.mode_button.config(text="切换到运转模式")
            self.show_engineering_mode()
        else:
            self.mode_button.config(text="切换到工程模式")
            self.show_operation_mode()

    def start_run(self):
        # 运行按钮点击事件处理
        pass





    def update_history_chart(self):
        """更新历史趋势图"""
        if not self.history_data['timestamps']: 
            return 
        
        # 限制显示8个数据点 
        keep_points = 8 
        x_data = self.history_data['timestamps'][-keep_points:] 
        
        self.line_x.set_data(x_data,  self.history_data['X'][-keep_points:]) 
        self.line_y.set_data(x_data,  self.history_data['Y'][-keep_points:]) 
        self.line_u.set_data(x_data,  self.history_data['U'][-keep_points:]) 
        
        # 自动调整坐标轴 
        self.ax.relim() 
        self.ax.autoscale_view() 
        
        # 显示最新值 - 工业风格 
        if self.history_data['X']: 
            latest_x = self.history_data['X'][-1] 
            latest_y = self.history_data['Y'][-1] 
            latest_u = self.history_data['U'][-1]  
            
            # 清除之前的文本 
            for text in self.ax.texts: 
                text.remove() 
            
            # 添加新的值显示 - 工业风格 
            self.ax.text(0.02,  0.95, 
                        f"Last: X={latest_x:.3f}  Y={latest_y:.3f}  U={latest_u:.5f}",
                        transform=self.ax.transAxes, 
                        fontsize=12,  # 工业标准字号 
                        color='#FFA500',  # 工业橙色 
                        bbox=dict(facecolor='#404040', alpha=0.69, edgecolor='#333333'))  # 工业灰色背景 
                                                        # 显示在上还是曲线在上
        self.chart_canvas.draw() 



#
    def toggle_mode(self):
        self.is_engineering_mode = not self.is_engineering_mode
        if self.is_engineering_mode:
            self.mode_button.config(text="切换到运转模式")
            self.show_engineering_mode()
        else:
            self.mode_button.config(text="切换到工程模式")
            self.show_operation_mode()

    def start_run(self):
        # 运行按钮点击事件处理
        pass

    def update_display(self):
        """定时更新显示"""
        try:
            # 更新仪表盘 
            self.update_gauges() 
            # 更新趋势图 
            self.update_history_chart()
            
            # 确保图表窗口仍然存在
            if hasattr(self, 'chart_window') and self.chart_window.winfo_exists():
                # 获取当前数据点限制
                keep_points = getattr(self, 'point_limit', 8)
                
                # 限制显示的数据点数量
                x_data = self.history_data['timestamps'][-keep_points:] 
                
                # 更新X轴数据
                self.line_x.set_data(x_data, self.history_data['X'][-keep_points:]) 
                # 更新Y轴数据
                self.line_y.set_data(x_data, self.history_data['Y'][-keep_points:]) 
                # 更新U轴数据
                self.line_u.set_data(x_data, self.history_data['U'][-keep_points:]) 
                
                # 自动调整坐标轴
                ax = self.line_x.axes
                ax.relim()
                ax.autoscale_view()
                
                # 更新动态标题 - 工业风格
                if self.history_data['X']:
                    latest_x = self.history_data['X'][-1]
                    latest_y = self.history_data['Y'][-1]
                    latest_u = self.history_data['U'][-1]
                    
                    # 清除之前的文本
                    for text in ax.texts:
                        text.remove()
                   
                    # 添加新的值显示 - 工业风格
                    ax.text(0.02, 0.95, 
                           f"Last: X={latest_x:.3f}  Y={latest_y:.3f}  U={latest_u:.5f}",
                           transform=ax.transAxes, 
                           fontsize=12,
                           color='#FFA500',
                           bbox=dict(facecolor='#404040', alpha=0.69, edgecolor='#333333'))
                    
                # 重新绘制图表
                ax.figure.canvas.draw()
                
        finally:
            # 确保图表窗口仍然存在时才继续定时器
            if hasattr(self, 'chart_window') and self.chart_window.winfo_exists():
                self.root.after(1000, self.update_display)

    def update_static_chart(self):
        """更新静态图表显示"""
        try:
            # 获取数据点限制
            keep_points = 5  # 固定显示最后5个数据点
            
            # 如果没有历史数据,直接返回
            if not self.history_data or not self.history_data['timestamps']:
                return
            
            # 限制显示的数据点数量
            x_data = self.history_data['timestamps'][-keep_points:] 
            
            # 更新X轴数据
            self.line_x.set_data(x_data, self.history_data['X'][-keep_points:]) 
            # 更新Y轴数据
            self.line_y.set_data(x_data, self.history_data['Y'][-keep_points:]) 
            # 更新U轴数据
            self.line_u.set_data(x_data, self.history_data['U'][-keep_points:]) 
            
            # 自动调整坐标轴
            ax = self.line_x.axes
            ax.relim()
            ax.autoscale_view()
            
            # 更新动态标题 - 工业风格
            if self.history_data['X']:
                latest_x = self.history_data['X'][-1]
                latest_y = self.history_data['Y'][-1]
                latest_u = self.history_data['U'][-1]
                
                # 清除之前的文本
                for text in ax.texts:
                    text.remove()
                
                # 添加新的值显示 - 工业风格
                ax.text(0.02, 0.95, 
                    f"Last: X={latest_x:.3f}  Y={latest_y:.3f}  U={latest_u:.5f}",
                    transform=ax.transAxes, 
                    fontsize=12,
                    color='#FFA500',
                    bbox=dict(facecolor='#404040', alpha=0.69, edgecolor='#333333'))
                
            # 重新绘制图表
            ax.figure.canvas.draw()
            
        finally:
            # 静态数据只需更新一次,不需要定时器
            pass
        
        # 确保仪表盘也更新
        #self.update_gauges()




    def setup_history_chart(self, ax):
        """初始化历史趋势图"""
        self.line_x, = ax.plot([], [], color='#FF0000', linewidth=2, label='X_Pos', marker='o', markersize=3)
        self.line_y, = ax.plot([], [], color='#00FF00', linewidth=2, label='Y_Pos', marker='o', markersize=3)
        self.line_u, = ax.plot([], [], color='#00B0F0', linewidth=2, label='U_Pos', marker='o', markersize=3)

        # 配置坐标轴和图例 - 工业风格
        ax.set_title("XYU_Chart", fontsize=14, color='#FFFFFF', pad=20)
        ax.set_xlabel("Time", fontsize=12, color='#CCCCCC')
        ax.set_ylabel("Value(mm)", fontsize=12, color='#CCCCCC')
        ax.grid(True, color='#555555', linestyle='--', alpha=0.7)
        ax.legend(loc='upper right', fontsize=10)
        
        # 设置背景色
        ax.set_facecolor('#333333')
        ax.figure.patch.set_facecolor('#404040')
        
        # 设置刻度颜色
        ax.tick_params(axis='x', colors='#CCCCCC')
        ax.tick_params(axis='y', colors='#CCCCCC')

    def create_chart_area(self, parent=None):
        """显示为独立弹窗的工业级数据显示面板"""
        # 创建新窗口
        chart_window = tk.Toplevel(self.root)
        chart_window.title("Chart")
        
        # 设置窗口大小和位置(居中显示)
        window_width = 1000
        window_height = 600
        screen_width = chart_window.winfo_screenwidth()
        screen_height = chart_window.winfo_screenheight()
        x = (screen_width - window_width) // 2
        y = (screen_height - window_height) // 2
        chart_window.geometry(f'{window_width}x{window_height}+{x}+{y}')
        
        # 使用与show_animation相同的框架结构
        fig = Figure(figsize=(8, 4), dpi=60)
        self.ax = fig.add_subplot(111, projection='3d')  # 将 ax 改为 3D 子图
        
        # 初始化历史趋势图
        self.setup_history_chart(self.ax)
        
        # 添加炫酷多彩动画显示
        self.add_cool_animation(self.ax)
        
        # 创建控制面板
        control_frame = tk.Frame(chart_window)
        control_frame.pack(side=tk.BOTTOM, fill=tk.X, pady=5)
        
        # 添加重置按钮
        reset_button = tk.Button(control_frame, text="Reset Data", 
                          command=self.reset_chart_data, width=10)
        reset_button.pack(side=tk.LEFT, padx=5)
        
        # 添加数据点数量设置
        point_frame = tk.Frame(control_frame)
        point_frame.pack(side=tk.LEFT, padx=5)
        
        tk.Label(point_frame, text="Data Points:").pack(side=tk.LEFT)
        self.point_entry = tk.Entry(point_frame, width=5)
        self.point_entry.pack(side=tk.LEFT)
        self.point_entry.insert(0, "5")  # 默认显示5个数据点
    
        apply_point_button = tk.Button(point_frame, text="Apply", 
                                command=lambda: self.apply_point_limit_change(), width=5)
        apply_point_button.pack(side=tk.LEFT, padx=2)
        
        # 添加关闭按钮
        close_button = tk.Button(control_frame, text="Close", 
                          command=chart_window.destroy, width=10)
        close_button.pack(side=tk.RIGHT, padx=5)
        
        # 初始化历史数据存储
        self.history_data = {
            'X': [],
            'Y': [],
            'U': [],
            'timestamps': []
        }
        
        # 读取文件中的最后5条记录
        file_path = r'C:\Log\Vision_Data_Log6_11.txt'
        trajectory_data = self.read_last_n_records(file_path, 5)
        
        # 如果读取到数据,更新历史数据
        if trajectory_data:
            # 计算时间戳(假设每条记录间隔固定为1秒)
            now = time.time()
            timestamps = [now + i for i in range(len(trajectory_data))]
            
            # 更新历史数据
            for (x, y, z), t in zip(trajectory_data, timestamps):
                self.history_data['X'].append(x)
                self.history_data['Y'].append(y)
                self.history_data['U'].append(z)
                self.history_data['timestamps'].append(t)
    
        # 创建图表画布并显示
        canvas = FigureCanvasTkAgg(fig, master=chart_window)
        canvas.draw()
        canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)

        # 自动重置图表数据以显示动画效果
        self.reset_chart_data()

    def add_cool_animation(self, ax):
        """添加炫酷多彩动画效果"""
        # 导入 animation 模块
        from matplotlib import animation

        # 设置动画参数
        num_frames = 100
        colors = plt.cm.viridis(np.linspace(0, 1, num_frames))
        
        # 创建动画对象
        def update(frame):
            # 更新图表数据
            x_data = self.history_data['X'][-5:]  # 仅保留最近5次数据
            y_data = self.history_data['Y'][-5:]
            u_data = self.history_data['U'][-5:]
            
            # 清除之前的图形
            ax.clear()
            
            # 绘制多彩散点图
            ax.scatter(x_data, y_data, u_data, c=colors[frame % num_frames], s=100, alpha=0.8, edgecolors='none')
            
            # 设置坐标轴和标题
            ax.set_title("Cool Animation Chart", fontsize=14, color='#FFFFFF', pad=20)
            ax.set_xlabel("X Position", fontsize=12, color='#CCCCCC')
            ax.set_ylabel("Y Position", fontsize=12, color='#CCCCCC')
            ax.set_zlabel("U Position", fontsize=12, color='#CCCCCC')  # 添加 Z 轴标签
            ax.grid(True, color='#555555', linestyle='--', alpha=0.7)
            
            # 设置背景色
            ax.set_facecolor('#333333')
            
            # 设置刻度颜色
            ax.tick_params(axis='x', colors='#CCCCCC')
            ax.tick_params(axis='y', colors='#CCCCCC')
            ax.tick_params(axis='z', colors='#CCCCCC')  # 添加 Z 轴刻度颜色
    
        # 启动动画
        ani = animation.FuncAnimation(ax.figure, update, frames=num_frames, interval=100, blit=False)
        ax.figure.canvas.draw()

    def setup_ui(self):  
        # 主窗口背景色
        self.root.configure(bg=self.INDUSTRIAL_COLORS['bg_main'])

        self.root.title("Design by Tim")  
        self.root.geometry("1924x968")   #Display  Pix_1024 768 Windows

        # 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)  

        # 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 load_images(self):
        path = r'C:\Log\Picture'
        # 新增:检查目录是否存在并记录日志
        if not os.path.exists(path):
            logging.error(f"图片文件夹路径不存在: {path}")
            self.root.after(3000, self.load_images)  # 3秒后重试(替换递归)
            return

        if not os.path.isdir(path):
            logging.error(f"指定路径不是有效的文件夹: {path}")
            self.root.after(3000, self.load_images)  # 3秒后重试(替换递归)
            return

        # 新增:记录目录下所有文件(排查文件名问题)
        dir_files = os.listdir(path)
        logging.debug(f"目录 {path} 下的文件列表: {dir_files}")

        extensions = ['.jpg', '.jpeg', '.png', '.bmp', '.gif']
        self.images = []  # 清空旧数据
        for ext in extensions:
            for file in dir_files:  # 使用已获取的文件列表(避免重复调用os.listdir)
                if file.lower().endswith(ext):
                    img_path = os.path.join(path, file)
                    try:
                        # 新增:记录具体加载的文件
                        logging.info(f"Retry 2 Loading: {img_path}")
                        img = Image.open(img_path)
                        img.thumbnail((456, 456))  # 缩略图适配显示
                        self.images.append(ImageTk.PhotoImage(img))
                        logging.debug(f"Loading : {img_path}")
                    except Exception as e:
                        # 新增:记录具体错误(如文件被占用、格式损坏)
                        logging.error(f"Loading {file}: {str(e)} NG ")

        # 新增:记录最终加载结果
        if not self.images:
            logging.warning(f"未找到有效图片文件(共扫描 {len(dir_files)} 个文件),3秒后重新加载...")
            self.root.after(3000, self.load_images)  # 用after代替递归,避免栈溢出
        else:
            logging.info(f"Loading {len(self.images)} Pictures")

##


    def setup_history_chart(self, ax):
        """初始化历史趋势图"""
        self.line_x, = ax.plot([], [], color='#FF0000', linewidth=2, label='X_Pos', marker='o', markersize=3)
        self.line_y, = ax.plot([], [], color='#00FF00', linewidth=2, label='Y_Pos', marker='o', markersize=3)
        self.line_u, = ax.plot([], [], color='#00B0F0', linewidth=2, label='U_Pos', marker='o', markersize=3)

        # 配置坐标轴和图例 - 工业风格
        ax.set_title("XYU_Chart", fontsize=14, color='#FFFFFF', pad=20)
        ax.set_xlabel("Time", fontsize=12, color='#CCCCCC')
        ax.set_ylabel("Value(mm)", fontsize=12, color='#CCCCCC')
        ax.grid(True, color='#555555', linestyle='--', alpha=0.7)
        ax.legend(loc='upper right', fontsize=10)
        
        # 设置背景色
        ax.set_facecolor('#333333')
        ax.figure.patch.set_facecolor('#404040')
        
        # 设置刻度颜色
        ax.tick_params(axis='x', colors='#CCCCCC')
        ax.tick_params(axis='y', colors='#CCCCCC')

    def reset_chart_data(self):
        """重置图表数据并每秒刷新"""
        # 初始化历史数据存储
        self.history_data = {
            'X': [],
            'Y': [],
            'U': [],
            'timestamps': []
        }
        
        # 读取文件中的最后5条记录
        file_path = r'C:\Log\log_His.txt'
        trajectory_data = self.read_last_n_records(file_path, 5)
        
        # 如果读取到数据,更新历史数据
        if trajectory_data:
            # 计算时间戳(假设每条记录间隔固定为1秒)
            now = time.time()
            timestamps = [now + i for i in range(len(trajectory_data))]
            
            # 更新历史数据
            for (x, y, z), t in zip(trajectory_data, timestamps):
                self.history_data['X'].append(x)
                self.history_data['Y'].append(y)
                self.history_data['U'].append(z)
                self.history_data['timestamps'].append(t)
        
        # 更新静态图表
        self.update_static_chart()
        
        # 日志记录
        logging.info("Data Reset Successfully And Loading Data From File")
        
        # 启动定时刷新
        self.reset_refresh_count = 0  # 初始化刷新计数
        self.update_reset_chart()

    def update_reset_chart(self):
        """定时更新重置后的图表"""
        if hasattr(self, 'reset_refresh_count') and self.reset_refresh_count < 5:  # 最多刷新5次
            # 更新静态图表
            self.update_static_chart()
            
            # 增加刷新计数
            self.reset_refresh_count += 1
            
            # 每隔1秒刷新一次
            self.root.after(1000, self.update_reset_chart)
        else:
            # 停止刷新
            logging.info("Reset Chart Refresh Completed")

    def update_chart_style(self):
        """更新图表样式设置"""
        # 设置坐标轴和图例 - 工业风格
        self.ax.set_title("Real", fontsize=14, color='#FFFFFF', pad=20)
        self.ax.set_xlabel("Time", fontsize=12, color='#CCCCCC')
        self.ax.set_ylabel("Value(mm)", fontsize=12, color='#CCCCCC')
        self.ax.grid(True, color='#555555', linestyle='--', alpha=0.7)
        self.ax.legend(loc='upper right', fontsize=10)
        
        # 设置背景色
        self.ax.set_facecolor('#333333')
        self.fig.patch.set_facecolor('#404040')
        
        # 设置刻度颜色
        self.ax.tick_params(axis='x', colors='#CCCCCC')
        self.ax.tick_params(axis='y', colors='#CCCCCC')
        
        # 重新绘制图表
        self.ax.figure.canvas.draw()

        
        # 更新图表样式
        self.update_chart_style()


        
    def create_left_panel(self, parent):
        # 创建带滚动条的框架
        left_container = tk.Frame(parent)
        left_container.pack(fill=tk.BOTH, expand=True)
        
        canvas = tk.Canvas(left_container, bg='#FFFFFF')
        scrollbar = tk.Scrollbar(left_container, orient="vertical", command=canvas.yview)
        scrollable_frame = tk.Frame(canvas, bg='#FFFFFF')

        scrollable_frame.bind(
            "<Configure>",
            lambda e: canvas.configure(scrollregion=canvas.bbox("all"))
        )

        canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")
        canvas.configure(yscrollcommand=scrollbar.set)
        
        # 设置左面板背景
        left_frame = tk.Frame(scrollable_frame, bg='#FFFFFF')
        left_frame.pack(fill=tk.BOTH, expand=True, padx=(5, 0))  # 左移调整并减小宽度

        # MAIN标题,整体变小
        main_title = tk.Label(left_frame,
                              text="Main",
                              font=("Arial", 38, "bold"),
                              fg="black",
                              bg="#FAFAD2", 
                              anchor='center')  # 标题居中对齐
        main_title.pack(side=tk.TOP, pady=(53, 30), fill=tk.X)

        # Launch Vision 按钮
        launch_button = tk.Button(left_frame, text="Launch Vision", command=self.launch_application,
                                  bg="#F0F552",
                                  fg="black",
                                  width=18,  # 修改按钮宽度为原来的一半
                                  font=("Segoe UI", 20))
        launch_button.pack(pady=(10, 50), anchor='w', padx=30)  # 左对齐并减小间距

        # Start 按钮
        start_button = tk.Button(left_frame, text="Start", command=self.start_auto_command,
                                 bg="#32CD32",
                                 fg="white",
                                 width=18,  # 修改按钮宽度为原来的一半
                                 font=("Segoe UI", 20))
        start_button.pack(pady=(0, 30), anchor='w', padx=30)  # 左对齐并减小间距

##Tim
        start_button = tk.Button(left_frame, text="Robot POS", command=self.show_animation,
                                 bg="#EBF0EB",
                                 fg="#000A00",
                                 width=18,  # 修改按钮宽度为原来的一半
                                 font=("Segoe UI", 20))
        start_button.pack(pady=(0, 30), anchor='w', padx=30)  # 左对齐并减小间距

        start_button = tk.Button(left_frame, text="XYU", command=self.show_XYU_window,
                                 bg="#EBF0EB",
                                 fg="#000A00",
                                 width=18,  # 修改按钮宽度为原来的一半
                                 font=("Segoe UI", 20))
        start_button.pack(pady=(0, 30), anchor='w', padx=30)  # 左对齐并减小间距

##(side=tk.LEFT, anchor='center', padx=5)



###新增空白区域
        # 空白区域
        blank_frame = tk.Frame(left_frame, bg='#FFFFFF', height=10)  # 高度为10像素
        blank_frame.pack(fill=tk.X, pady=256)  # 填充整个宽度并增加间距


        # 水平按钮行框架(新增)
        button_row_frame = tk.Frame(left_frame, bg='#FFFFFF')
        button_row_frame.pack(pady=10, anchor='w', padx=5)  # 整体间距

        # 3D 按钮(修改父容器为 button_row_frame)
        animation_button = tk.Button(button_row_frame, text="3D", command=self.show_animation,
                                     bg="#00B0F0",
                                     fg="white",
                                     width=8,  # 修改按钮宽度为原来的一半
                                     font=("Segoe UI", 12))
        animation_button.pack(side=tk.LEFT, padx=15)  # 水平排列

        # His Chart 按钮(修改父容器为 button_row_frame)
        chart_button = tk.Button(button_row_frame, text="XYUPOS", command=self.show_XYU_window,
                                 bg="#00B0F0",
                                 fg="white",
                                 width=8,  # 修改按钮宽度为原来的一半
                                 font=("Segoe UI", 12))
        chart_button.pack(side=tk.LEFT, padx=15)  # 水平排列

        # Log 按钮(修改父容器为 button_row_frame)
        new_window_button = tk.Button(button_row_frame, text="Log", command=self.show_new_window,
                                      bg="#00B0F0",
                                      fg="white",
                                      width=8,  # 修改按钮宽度为原来的一半
                                      font=("Segoe UI", 12))
        new_window_button.pack(side=tk.LEFT, padx=15)  # 水平排列

        # 连接按钮(Vision和Robot)
        self._create_connection_buttons(left_frame, "Vision", self.connect_to_vision, self.disconnect_from_vision)
        self._create_connection_buttons(left_frame, "Robot", self.connect_to_robot, self.disconnect_from_robot)
        
        # 备用端口按钮(PLC、Falco、Robot)
        PLC_button = tk.Button(left_frame, text="PLC Port (Backup)", command=self.start_PLC_command,
                               bg="#CDCDCD",
                               fg="gray",
                               font=("Segoe UI", 12))
        PLC_button.pack(side=tk.BOTTOM, fill=tk.X)

        Falco_button = tk.Button(left_frame, text="Falco Port (Backup)", command=self.start_Falco_command,
                                 bg="#CDCDCD",
                                 fg="gray",
                                 font=("Segoe UI", 12))
        Falco_button.pack(side=tk.BOTTOM, fill=tk.X)

        Robot_button = tk.Button(left_frame, text="Robot Port (Backup)", command=self.start_Robot_command,
                                 bg="#CDCDCD",
                                 fg="gray",
                                 font=("Segoe UI", 12))
        Robot_button.pack(side=tk.BOTTOM, fill=tk.X)

        canvas.pack(side="left", fill="both", expand=True)



        # ---新---区域22
        blank_frame = tk.Frame(left_frame, bg='#FFFFFF', height=10)  # 高度为10像素
        blank_frame.pack(fill=tk.X, pady=120)  # 填充整个宽度并增加间距
 



 
        # ---新---区域33
        blank_frame = tk.Frame(left_frame, bg='#FFFFFF', height=10)  # 高度为10像素
        blank_frame.pack(fill=tk.X, pady=120)  # 填充整个宽度并增加间距


        
        # 修改滚动条初始状态为隐藏,并绑定鼠标事件
        scrollbar.place(relx=1, rely=0, relheight=1, anchor='ne')
        scrollbar.lower()  # 初始隐藏
        left_container.bind("<Enter>", lambda _: scrollbar.lift())  # 鼠标进入时显示
        left_container.bind("<Leave>", lambda _: scrollbar.lower())  # 鼠标离开时隐藏

    def on_exit(self):
        """处理窗口关闭事件"""
        # 弹出确认对话框,确保在主线程中执行
        if messagebox.askokcancel("Quit", "Are U Sure?", parent=self.root):
            logging.info("Exit,Cleaning...")
            
            try:
                # 保存配置
                self.save_settings()
                logging.info("Automatically saved configuration")
                
                # 断开与 Vision 的连接
                if self.connected_to_vision:
                    self.disconnect_from_vision()
                    logging.info("Disconnected from Vision")
                
                # 断开与 Robot 的连接
                if self.connected_to_robot:
                    self.disconnect_from_robot()
                    logging.info("Disconnected from Robot")
                
                # 终止子进程
                if hasattr(self, 'app3_process') and self.app3_process:
                    self.terminate_application3()
                    logging.info("End the subprocess")
                
                # 清理日志处理器
                logger = logging.getLogger()
                for handler in logger.handlers[:]:
                    if isinstance(handler, TextHandler):
                        logger.removeHandler(handler)
                        logging.info("Removed TextHandler logger")
            
            except Exception as e:
                logging.error(f"退出时发生错误: {str(e)}")
                messagebox.showerror("错误", f"退出时发生错误: {str(e)}")
            
            finally:
                # 安全关闭主窗口
                self.root.destroy()
                logging.info("Closed the main window")
        else:
            logging.info("Cannel Exit!!!")

    def show_new_window(self):
        """显示一个新的弹窗"""
        new_window = tk.Toplevel(self.root)
        new_window.title("Log")
        
        # 设置窗口大小和位置(居中显示)
        window_width = 800
        window_height = 600
        screen_width = new_window.winfo_screenwidth()
        screen_height = new_window.winfo_screenheight()
        x = (screen_width - window_width) // 2
        y = (screen_height - window_height) // 2
        new_window.geometry(f'{window_width}x{window_height}+{x}+{y}')
        # 创建 Text 组件用于显示日志
        self.new_window_text = tk.Text(new_window, wrap=tk.WORD, bg='black', fg='white', font=("Helvetica", 18))
        self.new_window_text.pack(fill=tk.BOTH, expand=True)
        
        close_button = tk.Button(new_window, text="Close", command=lambda: self.close_new_window(new_window), width=10)
        close_button.pack(pady=10)

        # 获取右侧日志区域的全部内容
        log_content = self.log_text.get("1.0", tk.END).strip()
        
        # 将日志内容插入到新窗口的 Text 组件中
        if log_content:
            self.new_window_text.insert(tk.END, log_content)
            self.new_window_text.yview_moveto(1)  # 滚动到最新位置

        # 添加日志处理器
        self.new_window_handler = TextHandler(self.new_window_text)
        logger = logging.getLogger()
        logger.addHandler(self.new_window_handler)

    def close_new_window(self, window):
        """关闭新窗口并移除日志处理器"""
        if hasattr(self, 'new_window_handler'):
            logger = logging.getLogger()
            logger.removeHandler(self.new_window_handler)
        window.destroy()

    def update_new_window_log(self, record):
        """更新新窗口中的日志内容"""
        if hasattr(self, 'new_window_text') and self.new_window_text.winfo_exists():
            msg = self.formatter.format(record)
            self.new_window_text.insert(tk.END, msg + '\n')
            self.new_window_text.yview_moveto(1)

    def setup_logging(self):  
        text_handler = TextHandler(self.log_text)  
        logger = logging.getLogger()  
        logger.addHandler(text_handler)  

        # 添加新的处理程序以支持新窗口日志
        if hasattr(self, 'new_window_text'):
            new_window_handler = TextHandler(self.new_window_text)
            logger.addHandler(new_window_handler)

    def _create_connection_buttons(self, parent, label_text, connect_cmd, disconnect_cmd):
        # 创建连接按钮框架
        button_frame = tk.Frame(parent)
        button_frame.pack(pady=5)
        
        connect_button = tk.Button(button_frame, text=f"Con. {label_text}", command=connect_cmd, width=14, height=1)
        connect_button.pack(side=tk.LEFT, anchor='center', padx=5)
        
        status_indicator = tk.Frame(button_frame, 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))
        
        disconnect_button = tk.Button(button_frame, text=f"Dis. {label_text}", command=disconnect_cmd, width=14, height=1)
        disconnect_button.pack(side=tk.LEFT, anchor='center', padx=5)

    def create_middle_panel(self, parent):
        # 中间主框架
        middle_frame = tk.Frame(parent, bg='#FFFFFF')  #OLD #CCCCCC
        middle_frame.pack(fill=tk.BOTH, expand=True)

    # 修改 create_right_panel 方法中的标题和区域标识
    def create_right_panel(self, parent):
        # 保存 right_frame 作为类属性,避免重复初始化
        self.right_frame = tk.Frame(parent, bg='#FFFFFF')
        self.right_frame.pack(fill=tk.BOTH, expand=True)

        # 清除之前的 image_title(如果存在)
        if hasattr(self, 'image_title') and self.image_title:
            self.image_title.destroy()

        # 图片标题
        self.image_title = tk.Label(self.right_frame,
                               text="Picture",
                               font=("Arial", 38, "bold"),
                               fg="black",
                               bg="#FAFAD2",
                               anchor='center')
        self.image_title.pack(pady=(15, 30), fill=tk.X)

        # 创建图片显示区域
        self.image_label = tk.Label(self.right_frame, bg='white')
        self.image_label.pack(fill=tk.BOTH, expand=True, padx=328, pady=10)   #PosTimTimTim

        # 加载图片
        self.load_images()

        # 确保 image_index 初始化
        if not hasattr(self, 'image_index'):
            logging.warning("image_index not initialized, fixing...")
            self.image_index = 0

        # 开始更新图片
        self.root.after(333, self.update_image)  # 使用 after 安排首次更新

    def update_image(self):
        # 检查图片列表是否存在且非空
        if not hasattr(self, 'images') or not self.images:
            logging.warning("Ini...")
            self.root.after(333, self.update_image)
            return

        # 检查 image_label 是否初始化
        if not hasattr(self, 'image_label') or self.image_label is None:
            logging.error("Picture Ini...---")
            # 使用保存的 right_frame 重新初始化
            if hasattr(self, 'right_frame'):
                self.create_right_panel(self.right_frame)
            else:
                logging.error("无法找到 right_frame,无法重新初始化 image_label")
            self.root.after(333, self.update_image)  # 避免直接递归调用
            return

        try:
            img = self.images[self.image_index]
            self.image_label.config(image=img)
            self.image_label.image = img
            logging.debug(f"成功更新图片索引 {self.image_index}")
        except Exception as e:
            try:
                logging.error(f"更新图片失败: {str(e)}")
            except RecursionError:
                pass  # 避免日志记录引发递归错误
            self.root.after(333, self.update_image)  # 避免直接递归调用
            return

        # 更新索引并触发下一次更新
        self.image_index = (self.image_index + 1) % len(self.images)
        self.root.after(333, self.update_image)  # 使用 after 安排下一次更新


    def load_default_image111(self):
        """加载默认图片到右侧显示区域"""
        image_folder = r'C:\Log\Picture'  # 默认图片文件夹路径
        if not os.path.exists(image_folder):
            logging.warning(f"图片文件夹路径不存在: {image_folder}")
            return

        images = []
        for file in os.listdir(image_folder):
            if file.lower().endswith(('.jpg', '.jpeg', '.png', '.bmp', '.gif')):
                img_path = os.path.join(image_folder, file)
                try:
                    img = Image.open(img_path)
                    img.thumbnail((800, 600))  # 自适应缩放
                    images.append(ImageTk.PhotoImage(img))
                except Exception as e:
                    #logging.error(f"无法加载图片 {img_path}: {str(e)}")
                    logging.error(f"Loading Picture NG... {img_path}: {str(e)}")

        if images:
            if self.image_label:  # 确保 image_label 存在
                self.image_label.config(image=images[0])  # 显示第一张图片
                self.image_label.image = images[0]
            #logging.info(f"成功加载图片: {len(images)} 张")
            logging.info(f"Read: {len(images)} Pictures")
        else:
            logging.warning("未找到有效图片文件")

    def create_bottom_panel(self, parent):
        # 修改后的偏移量输入和写入按钮布局
        offset_frame = tk.Frame(parent, bg='lightgray')
        offset_frame.pack(fill=tk.X, pady=5, padx=5)

        # X输入
        tk.Label(offset_frame, text="X:", bg='lightgray', font=("Helvetica", 12)).grid(row=0, column=0, padx=2)
        self.custom_command_entry5 = tk.Entry(offset_frame, width=8, font=("Helvetica", 12))
        self.custom_command_entry5.grid(row=0, column=1, padx=2)

        # Y输入
        tk.Label(offset_frame, text="Y:", bg='lightgray', font=("Helvetica", 12)).grid(row=0, column=2, padx=2)
        self.custom_command_entry6 = tk.Entry(offset_frame, width=8, font=("Helvetica", 12))
        self.custom_command_entry6.grid(row=0, column=3, padx=2)

        # U输入
        tk.Label(offset_frame, text="U:", bg='lightgray', font=("Helvetica", 12)).grid(row=0, column=4, padx=2)
        self.custom_command_entry7 = tk.Entry(offset_frame, width=8, font=("Helvetica", 12))
        self.custom_command_entry7.grid(row=0, column=5, padx=2)

        # 统一的写入按钮  ###Tim
        write_button = tk.Button(offset_frame, text="Offset_Write", command=self.write_all_offsets,
        bg="#32CD32",
        fg="white",
        width=12, 
        font=("Segoe UI", 12)) 
        write_button.grid(row=0, column=6, padx=10)

        
#Enter 1 command
        custom_command_frame = tk.Frame(parent)  
        custom_command_frame.pack(side=tk.TOP, pady=1, fill=tk.X, expand=True)  

        custom_command_label = tk.Label(custom_command_frame, text="Enter Vision Command:", font=("Helvetica", 1))  
        custom_command_label.pack(side=tk.LEFT, padx=5)  

        self.custom_command_entry1 = tk.Entry(custom_command_frame, font=("Helvetica", 1), fg="purple")  
        self.custom_command_entry1.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=5)  

        send_command_button = tk.Button(custom_command_frame, text="Send", command=self.send_custom_command1, font=("Helvetica", 1))  
        send_command_button.pack(side=tk.LEFT, padx=5)  

        # 新增日志显示区域
        log_frame = tk.Frame(parent, bg='black')
        log_frame.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)

        # 调整日志区域高度为原来的一半
        self.log_text = tk.Text(log_frame, wrap=tk.WORD, bg='black', fg='white', font=("Helvetica", 12), height=10)
        self.log_text.pack(fill=tk.BOTH, expand=True)
#Enter 2 command
        custom_command_frame2 = tk.Frame(parent)  
        custom_command_frame2.pack(side=tk.TOP, pady=1, fill=tk.X, expand=True)  

        custom_command_label = tk.Label(custom_command_frame2, text="Enter Robot Command:", font=("Helvetica", 1))  
        custom_command_label.pack(side=tk.LEFT, padx=5)  

        self.custom_command_entry2 = tk.Entry(custom_command_frame2, font=("Helvetica", 1), fg="purple")  
        self.custom_command_entry2.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=5)  

        send_command_button2 = tk.Button(custom_command_frame2, text="Send", command=self.send_custom_command2, font=("Helvetica", 1))  
        send_command_button2.pack(side=tk.LEFT, padx=5)  
#Enter 3 command
        custom_command_frame3= tk.Frame(parent)  
        custom_command_frame3.pack(side=tk.TOP, pady=1, fill=tk.X, expand=True)  

        custom_command_label = tk.Label(custom_command_frame3, text="Enter Send To Vision Command:", font=("Helvetica", 1))  
        custom_command_label.pack(side=tk.LEFT, padx=5)  

        self.custom_command_entry3 = tk.Entry(custom_command_frame3, font=("Helvetica", 1), fg="purple")  
        self.custom_command_entry3.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=5)  

        send_command_button3 = tk.Button(custom_command_frame3, text="Send", command=self.send_custom_command3, font=("Helvetica", 1))  
        send_command_button3.pack(side=tk.LEFT, padx=5)  
        # 移除发送按钮并绑定 Enter 键事件到输入框   
        self.custom_command_entry3.bind('<Return>', lambda event: self.send_custom_command3())


    def _validate_number(self, value):
        """数值输入验证"""
        if value == "" or value == "-":
            return True
        try:
            float(value)
            return True
        except ValueError:
            return False



    def setup_logging(self):  
        text_handler = TextHandler(self.log_text)  
        logger = logging.getLogger()  
        logger.addHandler(text_handler)  

    def connect_to_vision(self):  
        try:  
            self.vision_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
            self.vision_client_socket.settimeout(65536)  
            self.vision_client_socket.connect((self.vision_ip, self.vision_port))  
            self.connected_to_vision = True  
            self.update_status_indicator(self.vision_status_indicator, 'green', "Connected to Vision")  
            logging.info(f"Connected to Vision at {self.vision_ip}:{self.vision_port}")  
            threading.Thread(target=self.receive_data, args=(self.vision_client_socket, 'vision'), daemon=True).start()  
        except Exception as e:  
            self.connected_to_vision = False  
            self.update_status_indicator(self.vision_status_indicator, 'red', f"Failed to connect to Vision: {e}")  
            logging.error(f"Failed to connect to Vision: {e}")  
            if self.vision_client_socket:  
                self.vision_client_socket.close()  

    def disconnect_from_vision(self):  
        if self.connected_to_vision:  
            self.vision_client_socket.close()  
            self.connected_to_vision = False  
            self.update_status_indicator(self.vision_status_indicator, 'red', "Disconnected from Vision")  
            logging.info("Disconnected from Vision")  

##OutofRang
    def Out_Of_Range_from_vision(self):  
        self.update_status_indicator2(self.vision_status_indicator, 'red', "Out_Of_Range_±10°")  
        logging.info("Out_Of_Range_from_vision_±10°")  

    def Out_Of_Range_from_vision2(self):  
        self.update_status_indicator2(self.vision_status_indicator, 'red', "Out_Of_Range_±90°")  
        logging.info("Out_Of_Range_from_vision_±90°")  
##OutofRang


##Robot at Home
    def Home_POS(self):  
        self.update_status_indicator2(self.vision_status_indicator, 'red', "Not Match,Pls Check and Put it Again,\n Then Connect Vision Again ")  
        logging.info("Not Match,Pls Check and Put it Again ...")  
##Robot at Home


    def ERROR_(self):  
        self.update_status_indicator2(self.robot_status_indicator, 'red', "ERROR,PLS Connect Robot\n\n Then, In Robot Software, Press Start to Run...")  
        logging.info("ERROR,PLS Connect Robot")  

    def Motor_Off(self):  
        self.update_status_indicator2(self.robot_status_indicator, 'red', "  Area Semnsor \n\n Area Semnsor \n\nArea Semnsor \n\nThen, In Robot Software, Press Start to Run...")  
        logging.info("ERROR,Area Semnsor")  


    def connect_to_robot(self):  
        try:  
            self.robot_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
            self.robot_client_socket.settimeout(65536)  
            self.robot_client_socket.connect((self.robot_ip, self.robot_port))  
            self.connected_to_robot = True  
            self.update_status_indicator(self.robot_status_indicator, 'green', "Connected to Robot")  
            logging.info(f"Connected to Robot at {self.robot_ip}:{self.robot_port}")  
            threading.Thread(target=self.receive_data, args=(self.robot_client_socket, 'robot'), daemon=True).start()  
        except Exception as e:  
            self.connected_to_robot = False  
            self.update_status_indicator(self.robot_status_indicator, 'red', f"Failed to connect to Robot: {e}")  
            logging.error(f"Failed to connect to Robot: {e}")  
            if self.robot_client_socket:  
                self.robot_client_socket.close()  

    def disconnect_from_robot(self):  
        if self.connected_to_robot:  
            self.robot_client_socket.close()  
            self.connected_to_robot = False  
            self.update_status_indicator(self.robot_status_indicator, 'red', "Disconnected from Robot")  
            logging.info("Disconnected from Robot")  

    def send_custom_command1(self):  
        command = self.custom_command_entry1.get()  
        if command:  
            logging.info(f"Send_Vision_Command2Start: {command}")  
            self.send_vision_command(command)  

            # 更新图片逻辑
            self.load_images()  # 重新加载图片
            self.update_image()  # 更新图片显示

    def send_custom_command2(self):  
        command = self.custom_command_entry2.get()  
        if command:  
            logging.info(f"send_robot_command: {command}")  
            self.send_robot_command(command)  
            #self.custom_command_entry.delete(0, tk.END)  

    def send_custom_command3(self):  
        global Response  # 使用全局变量

        if Response == 'Camera_not_Match_Picture' :  
            ##print("666",Response)
            time.sleep(0.005) 

        else:    
            #global Response  # 使用全局变量 
            #command = self.custom_command_entry2.get() 
            command = str(Response)  # 获取全局变量 RES 的值作为命令内容
            if command:  
                logging.info(f"Recive_Vision/Robot_Data_is_{command}")  
                logging.info(f"Then_Auto_send_Vision_Pos2robot")                  
                self.send_robot_command(command)

                #self.custom_command_entry.delete(0, tk.END)  

##
    def send_custom_command6_Offset(self):  
        command = self.custom_command_entry5.get()  
        if command:  
            logging.info(f"send_robot_command_X_Offset: {command}")  
            self.send_robot_command_Offset(command)  
            #self.custom_command_entry.delete(0, tk.END)  
        command = self.custom_command_entry6.get()  
        if command:  
            logging.info(f"send_robot_command_Y_Offset: {command}")  
            self.send_robot_command_Offset(command)  
            #self.custom_command_entry.delete(0, tk.END)  
        command = self.custom_command_entry7.get()  
        if command:  
            logging.info(f"send_robot_command_Z_Offset: {command}")  
            self.send_robot_command_Offset(command)  
            #self.custom_command_entry.delete(0, tk.END)  


    def send_x_offset(self):
        self._send_offset("X", self.custom_command_entry5.get())

    def send_y_offset(self):
        self._send_offset("Y", self.custom_command_entry6.get())

    def send_u_offset(self):
        self._send_offset("U", self.custom_command_entry7.get())

    def _send_offset(self, axis_type, value):
        if not value:
            return
            
        try:
            # 数值有效性验证
            float(value)
        except ValueError:
            messagebox.showerror("Error", "Pls Inpout Number")
            #messagebox.showerror("输入错误", "请输入有效的数字")
            return

        if self.connected_to_robot:
            try:
                cmd_template = {
                    "X": "Tim{}Tim0Tim0TimOKTim666666\r\n",
                    "Y": "Tim0Tim{}Tim0TimOKTim666666\r\n",
                    "U": "Tim0Tim0Tim{}TimOKTim666666\r\n"
                }
                command = cmd_template[axis_type].format(value)
                self.robot_client_socket.sendall(command.encode('utf-8'))
                logging.info(f"Sent {axis_type}_Offset: {command.strip()}")
            except Exception as e:

                #logging.error(f"发送{axis_type}偏移失败: {str(e)}")
                #self.update_status_indicator2(self.robot_status
                logging.error(f"Sent {axis_type}Fail,Message is: {str(e)}")
                self.update_status_indicator2(self.robot_status_indicator, 'red', f"Sent Fail: {str(e)}")
        else:
            messagebox.showwarning("Connect Error", "Can not Connected Robot")

    def receive_data(self, client_socket, source):  
        global Response  # 使用全局变量 
        while client_socket and client_socket.fileno() >= 0:  
            try:  
                data = client_socket.recv(1024).decode('utf-8')  
                Response=data  
                ##print (Response)
                if not data:  
                    break  



                # 加载图片
            #    self.load_images()

                # 启动图片更新定时器
            #    self.update_image()




                current_time = datetime.now().strftime("%H:%M:%S")  
                ##print(current_time)
                log_entry = f"[{current_time}]  {data}\n"  

                # Append to log file  
                with open(r"c:\Log\log_His.txt", "a") as log_file:  
                    log_file.write(log_entry)  
                
                # Append to log file  
                with open(r"c:\Log\log_His_BK.txt", "a") as log_file:  
                    log_file.write(log_entry)  
            
                # Update the appropriate text widget  
                if source == 'vision':  
                    data66=data
                    #print(data66)
                    if data66 == 'Out_Of_Range_CW10_CCW10Out_Of_Range_CW90_CCW90' or  data66 == 'Out_Of_Range_CW10_CCW10' :  #Out_Of_Range_CW10_CCW10
                        #self.disconnect_from_vision() 
                        #print("111") 
                        self.Out_Of_Range_from_vision() 
                    #print("---111") 
                    if data66 == 'Out_Of_Range_CW90_CCW90':  
                        #self.disconnect_from_vision() 
                        self.Out_Of_Range_from_vision2() 

                    if data66 == 'Camera_not_Match_Picture' :  
                        #self.disconnect_from_vision() 
                        ##print("666",data66)
                        #self.Home_POS() 
                        self.root.after(200, lambda: self.Home_POS())
                                    
                    #print("11111111111")
                    # 解析数据并记录需格式调整 Chart   17:11:35  Tim-692.003Tim233.098Tim-177.533TimOKTim88888888
                    x_val = float(data66.split('Tim')[1].split('Tim')[0])
                    #print("22222222222")
                    y_val = float(data.split('Tim')[2])
                    #print("333")
                    u_val = float(data.split('Tim')[3])
                    #print("555")
                    #print(x_val)
                    #print(x_val,y_val,u_val)
                    self.history_data['X'].append(x_val)
                    self.history_data['Y'].append(y_val)
                    self.history_data['U'].append(u_val)
                    self.history_data['timestamps'].append(time.time())                       


                ##    self.vision_data_text.insert(tk.END, f"\n«Vision»  -Raw data1- \n\n{current_time}  {data}\n")  
                    #Response=data  
                    #print (Response)
                    time.sleep(0.01)
                ##    self.vision_data_text.yview_moveto(1)
                    data2=data                             #data = "-801.226XX218.608YY-13.962YY"
                    x_value = data2.split('X')[0].strip()       #将字符串按 X 分割,取第一个部分,即 -801.226,并去除可能的前后空白字符。
                    start_y = data2.rfind('-') 
                    y_valueLS = data2[start_y:] 
                    y_value =   y_valueLS[:-2]
                ##   self.vision_char_text.insert(tk.END, f"\n«Vision»  -Split data2- \n\n{current_time}  Received: {x_val}  {y_val}  {u_val}  \n")  
                    #self.vision_char_text.insert(tk.END, f"\n«Vision»  -Split data- \n\n{current_time}  x:{x_value}  y:{y_value} \n")  

                ##    self.vision_char_text.yview_moveto(1)  

                    parts = data.split('Tim') 
                    if len(parts) >= 4:  # Ensure we have X, Y, U values 
                        x_val = float(parts[1])
                        y_val = float(parts[2])
                        u_val = float(parts[3])
                        
                        self.history_data['X'].append(x_val) 
                        self.history_data['Y'].append(y_val) 
                        self.history_data['U'].append(u_val) 
                        self.history_data['timestamps'].append(time.time()) 

                elif source == 'robot':  
                    data666666 = str(Response).strip()  # 去除前后空白
                    Real_Data=repr(Response)
                    ##print("111 repr Real Data:", repr(Response))  # 显示原始字符串

                    #data666666=data
                    #data666666 = str(Response) 
                    #print("111",Response)
                    #print("222",data666666)

                    if data666666 == 'Shot' or data666666 == 'Shot2':  
                        #self.disconnect_from_vision() 
                        #print("333",data666666)
                        #self.Home_POS() 
                        self.root.after(200, lambda: self.Ali_Comand())

                    if data666666 == 'ERROR_' :  
                        #self.disconnect_from_vision() 
                        #print("333",data666666)
                        #self.Home_POS() 
                        self.root.after(200, lambda: self.ERROR_())

                    if data666666 == 'Motor_Off' :  
                        self.root.after(200, lambda: self.Motor_Off())

                    # 在接收数据时检查Home信号
                    if 'Home1' in data:
                        self.home_received = True
                        self.start_button.config(state=tk.NORMAL)
                        logging.info("Home position received - Start enabled")
                    elif 'NotHome' in data:
                        self.home_received = False
                        self.start_button.config(state=tk.DISABLED)
                        logging.info("Not in Home position - Start disabled")



                ##    self.robot_data_text.insert(tk.END, f"\n«Robot_data1»\n{current_time}  {data}  Real_Data is {Real_Data}\n")  
                ##    self.robot_data_text.yview_moveto(1)  
                ##    self.robot_char_text.insert(tk.END, f"\n«Robot_data2»\n{current_time}  {data}  Data is {data666666}\n")  
                ##    self.robot_char_text.yview_moveto(1)  


                # Log the data to the log area  
            ##    self.log_text.insert(tk.END, log_entry)  
            ##   self.log_text.yview_moveto(1)  
                # 自动发送接收到的数据作为命令   
                self.send_custom_command3()

            except Exception as e:  
                logging.error(f"Error receiving data: {e}")  
                logging.error(f"Data parsing error: {str(e)}")
                break  
        if client_socket == self.vision_client_socket:  
            self.disconnect_from_vision()  
        elif client_socket == self.robot_client_socket:  
            self.disconnect_from_robot()  

    def send_custom_command(self, command=None):  
        global RES # 使用全局变量
        # 如果没有提供命令,则使用全局变量 RES 的值
        if command is None:
            command = Response

        if command:  
            logging.info(f"Auto_Custom command entered: {command}")  
            self.send_robot_command3(command)  
            self.custom_command_entry3.delete(0, tk.END)  

    def send_vision_command(self, command):    #vision
        if self.connect_to_vision and self.vision_client_socket:  
            try:  
                self.vision_client_socket.sendall(command.encode('utf-8'))  
               ## logging.info(f"Command vision sent to vision: {command}")  
            except Exception as e:  
                logging.error(f"Failed to send command to vision: {e}")  


    def send_robot_command_Area_Sensor(self, command):   
        if self.connected_to_robot and self.robot_client_socket:  
            command345="Motor_Off"
            try:  
                self.robot_client_socket.sendall(command345.encode('utf-8'))
              #  logging.info(f"Command sent to Robot: {command345.strip()}")
                print("55555555555")
            except Exception as e:  
                logging.error(f"Failed to send command to Robot: {e}")  


    def send_robot_command(self, command):
        global Offset_X, Offset_Y, Offset_U
        ABCDEFG=0
        if self.connected_to_robot and self.robot_client_socket:
            try:

                # 解析原始命令并应用偏移量
                parts = command.split('Tim')
                if len(parts) >= 4:
                    x = float(parts[1]) + (Offset_X if Offset_X else 0)
                    y = float(parts[2]) + (Offset_Y if Offset_Y else 0)
                    u = float(parts[3]) + (Offset_U if Offset_U else 0)
                    command = f"Tim{x}Tim{y}Tim{u}TimOKTim666666\r\n"
                    
                    # 分开记录日志
                    logging.info(f"Applied offsets - X: {Offset_X}, Y: {Offset_Y}, U: {Offset_U}")
                
                self.robot_client_socket.sendall(command.encode('utf-8'))

                logging.info(f"1、Send_Vision_Pos2robot  2、Robot_X_Y_U_Move_Data  3、 From_robot_command: {command.strip()}")


            except Exception as e:
                logging.error(f"Failed to send command to Robot: {e}")



##Offset
    def send_robot_command_Offset(self, command):  
        if self.connect_to_vision and self.robot_client_socket:  
            try:    #Tim-495.047Tim86.1133Tim-0.284364TimOKTim88888888  "Tim"(command)TimcommandTimcommandTimOKTim88888888"
                send_robot_command_Offset=("Tim"+(command)+"Tim"+(command)+"Tim"+(command)+"Tim"+"OK"+"Tim"+"88888888"+"\r\n")
                ##print(send_robot_command_Offset)

                send_robot_command_Offset66=((command)+"\r\n")
                self.robot_client_socket.sendall(send_robot_command_Offset66.encode('utf-8'))  
                logging.info(f"Command robot sent to Robot66: {command}")  
            except Exception as e:  
                logging.error(f"Failed to send command to Robot: {e}")  
##Offset                
    def show_XYU_window(self):   
        app_path6 = r"C:/Users/Administrator/AppData/Local/Programs/Python/Python312/python.exe C:\Log\XYU.py"
        try:  
            subprocess.Popen(app_path6)  
            logging.info("Launched XYU application successfully.")  
        except Exception as e:  
            messagebox.showerror("Error", f"Failed to launch XYU application: {e}")  
            logging.error(f"Failed to launch XYU application: {e}")  


    def launch_application(self):  
        #Demo app_path = r"C:\Users\ShineTek\Desktop\V1\Public_Release\v1.exe"  
        app_path = r"C:\Log\V5\Public_Release\V5.exe"
        #app_path = r"C:\Study\Case\V5\Public_Release\V5.exe"
        try:  
            subprocess.Popen(app_path)  
            logging.info("Launched application successfully.")  
        except Exception as e:  
            messagebox.showerror("Error", f"Failed to launch application: {e}")  
            logging.error(f"Failed to launch application: {e}")  


    def launch_application3(self):
        app_path = r"C:\Users\ShineTek\AppData\Local\Programs\Python\Python37\Python.exe E:\Tim_Study\Python_Code\Ali_Show_Picture666.py"
        #app_path = r"C:\Users\ShineTek\Desktop\大视野\V1_Big_OK_250219_AddCode\Ali_Show_Picture666.exe"
        #app_path = r"C:\Users\ShineTek\AppData\Local\Programs\Python\Python37\Python.exe C:\Log\Ali_Show_Picture666.py"
  
     ###   app_path = r"C:\Users\ShineTek\AppData\Local\Programs\Python\Python37\Python.exe E:\EpsonRC70\Projects\V999_1Cycle_\Show_Picture222.py"
        try:
            # 启动新进程并保存引用
            self.app3_process = subprocess.Popen(app_path)
            logging.info("Launched application successfully3.")
        except Exception as e:
            messagebox.showerror("Error", f"Failed to launch application3: {e}")
            logging.error(f"Failed to launch application3: {e}")

    def terminate_application3(self):
        if self.app3_process and self.app3_process.poll() is None:
            # 尝试终止进程
            try:
                self.app3_process.terminate()
                self.app3_process.wait()
                logging.info("Terminated application3 successfully.")
            except Exception as e:
                logging.error(f"Failed to terminate application3: {e}")
        self.app3_process = None  # 重置进程引用


    def update_status_indicator(self, indicator, color, message):  
        indicator.config(bg=color)  
        self.root.update_idletasks()  
        messagebox.showinfo("Status", message)  

    def update_status_indicator2(self, indicator, color, message):  
        indicator.config(bg=color)  
        self.root.update_idletasks()  
        messagebox.showinfo("Waring", message)  

##Tim
    def update_status_indicator6(self, indicator, color, message):  
        indicator.config(bg=color)  
        self.root.update_idletasks()  
        messagebox.showinfo("ERROR", message)  
        self.update_status_indicator(self._status_indicator6, 'green', "Center") 
        self.update_status_indicator(self._status_indicator6, 'red', f"not Center") 


    def Auto_send(self):     
        # 等待3秒,以便用户将焦点切换到目标输入框 
        time.sleep(3) 
         
        # 在指定位置输入XXX 
        x1, y1 = map(int, input("请输入要输入XXX的位置坐标(以空格分隔,例如:100 200):").split()) 
        pyautogui.click(x1, y1) 
        pyautogui.typewrite('XXX') 
         
        # 在指定位置输入YYY 
        x2, y2 = map(int, input("请输入要输入YYY的位置坐标(以空格分隔,例如:300 400):").split()) 
        pyautogui.click(x2, y2) 
        pyautogui.typewrite('YYY') 
         
        # 找到send按钮的位置(这里假设已经知道send按钮的位置,假设为x_send, y_send) 
        x_send, y_send = map(int, input("请输入send按钮的位置坐标(以空格分隔,例如:500 600):").split()) 
         
        # 点击send按钮 
        pyautogui.click(x_send, y_send) 
        time.sleep(0.5) 
        pyautogui.click(x_send, y_send)       

    def start_auto_command(self):
        if self.connect_to_vision and self.vision_client_socket:  

            #self.connect_to_vision()
            #self.connect_to_robot()

            #self.root.after(200, lambda: self.connect_to_vision())
            print("1111111111111")
            #time.sleep(100)

            self.custom_command_entry1.delete(0, tk.END)
            self.custom_command_entry1.insert(0, "1st_Camera")
            self.send_custom_command1()

            # 先终止可能正在运行的进程
            self.terminate_application3()
            
            # 再启动新进程
            self.root.after(200, lambda: self.launch_application3())


    def Recive_PLC_start_command(self):  #PC Start yeshi zouzheli
        ##print(Response)
        data_Tim = str(Response).strip()  # 去除前后空白
        if data_Tim=="1NO_Home_Pos":
        #if not data_Tim=="Home_Pos":
            time.sleep(0.005) 
            self.root.after(200, lambda: self.Home_POS())
        else: 
     
            if self.connect_to_vision and self.vision_client_socket:  

                #self.connect_to_vision()
                #self.connect_to_robot()

                #self.root.after(200, lambda: self.connect_to_vision())
                #print("2222222222")
                #time.sleep(100)


                self.custom_command_entry1.delete(0, tk.END)
                self.custom_command_entry1.insert(0, "1st_Camera")
                self.send_custom_command1()
                
                # 先终止可能正在运行的进程
                self.terminate_application3()
                
                # 再启动新进程
                ##self.root.after(200, lambda: self.launch_application3())
                
                
                # 更新图片逻辑
                self.root.after(5000, lambda: self.load_images())
                self.root.after(500, lambda: self.update_image())

                self.load_images()  # 重新加载图片
                self.update_image()  # 更新图片显示
 
#self.root.after(200, lambda: self.Ali_Comand())
    def Ali_Comand(self):
        self.custom_command_entry1.delete(0, tk.END)
        self.custom_command_entry1.insert(0, "2nd_Camera")
        self.send_custom_command1()
        
        # 先终止可能正在运行的进程
        #self.terminate_application3()
        
        # 再启动新进程
        ###self.root.after(200, lambda: self.launch_application3())

 
    def continue_auto_command(self): 
        self.custom_command_entry1.delete(0, tk.END) 
        self.custom_command_entry1.insert(0, "YYY")
        self.send_custom_command1() 
        self.root.after(200, lambda: self.continue_auto_command_U())


    def continue_auto_command_U(self): 
        self.custom_command_entry1.delete(0, tk.END) 
        self.custom_command_entry1.insert(0, "UUU")
        self.send_custom_command1() 


    def init_plc_connection(self):
        """增强型工业连接协议"""
        try:
            self.plc = MelsecMcNet("192.168.0.11", 1028)
            conn = self.plc.ConnectServer()
            
            if conn.IsSuccess:
                #self.status_bar.config(text="PLC已连接 | 协议版本6.2", fg="green")
                logging.info(f"Connected to PLC at IP:192.168.0.11  Port:1028 ") 
            else:
                #self.status_bar.config(text=f"连接失败: {conn.Message}", fg="red")
                logging.info(f"PLC Connect NG at [{datetime.now().strftime('%H:%M:%S')}]")
                self.plc = None
        except Exception as e:
            #self.status_bar.config(text=f"初始化异常: {str(e)}", fg="orange")
            logging.info(f"PLC Connect NG at [{datetime.now().strftime('%H:%M:%S')}]")

    def setup_plc(self):
        # PLC连接配置
        self.plc = MelsecMcNet("192.168.0.11", 1028)
        connect_result = self.plc.ConnectServer()
        if not connect_result.IsSuccess:
            print("PLC Connect NG:", connect_result.Message)
            self.plc = None

    def start_plc_monitoring(self):
        """智能重连监控系统"""
        if self.plc and self._check_connection():
            self._monitor_y79()
        else:
            self.parent.after(2000, self.start_plc_monitoring)

    def _monitor_y79(self):
        """修正地址并增强监测"""
        try:
            # 使用八进制地址Y117(十进制79)
            #read_result = self.plc.ReadBool("Y79")
            read_result = self.plc.ReadBool("L801")
            read_result3 = self.plc.ReadBool("X2F")
            #self._log(f"Y79读取结果: 成功={read_result.IsSuccess} 状态={read_result.Content}")
            #logging.info(f"Y79读取结果: 成功={read_result.IsSuccess} 状态={read_result.Content}")
            #logging.info(f"成功读取到Y79状态:{read_result.Content}")
            
            #logging.info(f"[{datetime.now().strftime('%H:%M:%S')}],Recive PLC Y79 Status is:{read_result.IsSuccess}")
            Time_Tim=datetime.now().strftime('%H:%M:%S')
            if read_result.Content is False:
                print("Content is False")    
                #logging.info(f"[{datetime.now().strftime('%H:%M:%S')}],PLC No Command")
            if read_result.Content is True:
                time.sleep(0.005)
                #print("Content is True")
                #logging.info(f"[{Time_Tim}] Content is True")
                #log_entry = f"[{Time_Tim}] Content is True\n"
                #logging.info(f"[{datetime.now().strftime('%H:%M:%S')}],Recive PLC Start Command")                

            if read_result.IsSuccess:
                current_state = read_result.Content
                # 精确的上升沿检测
                if current_state and not self.last_y79_state:
                    #self._log("检测到Y79上升沿,触发自动命令")
                    logging.info(f"Check PLC Start Command,UI Start")
                    #self.start_auto_command
                    #self.Recive_PLC_start_command
                    self.start_auto_command()  ###Tim Modify
                self.last_y79_state = current_state


            if read_result3.Content is False:
                time.sleep(0.00001)
               # print("Content3 is False,Area Sensor On")    
               # global Ares_Sensor  # 使用全局变量
               # Ares_Sensor = 1
               # print(Ares_Sensor)

            if read_result3.Content is True:
                time.sleep(0.005) 
                #print("222Content3 is False,Area Sensor On")      

       #     if read_result3.IsSuccess:
       #         print("333Content3 is False,Area Sensor On") 
       #         current_state3 = read_result.Content3
       #         # 精确的上升沿检测
       #         if current_state3 and not self.last_X2F_state:
       #             #self._log("检测到Y79上升沿,触发自动命令")
       #             logging.info(f"Check PLC Area Sensor  Command,UI Start")
       #             print("444Content3 is False,Area Sensor On") 
       #             self.send_robot_command_Area_Sensor()  ########
       #         self.last_X2F_state = current_state3


            else:
                #self._log(f"通信失败: {read_result.Message}")
              #  logging.info(f"Recived PLC Area Sensor ...")
              #  print("Content PLC OK ,Area Sensor is On")    
                
              #  SERVER_IP = "192.168.0.150"   #192.168.0.1
              #  SERVER_PORT = 5670  
                # 创建TCP服务器
              #  server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
              #  server.bind((SERVER_IP, SERVER_PORT))
              #  server.listen(1)
              #  print(f"Server OK,Waiting Robot Connect...")
                # 接受EPSON控制器连接
              #  conn, addr = server.accept()
              #  print(f"Robot Connected: {addr}")


                global Ares_Sensor  # 使用全局变量
                Ares_Sensor = 0                          ##3Area Sensor On  1   off  0
                if Ares_Sensor == 1:
                    #print(Ares_Sensor)
                    try: 
                        # 创建TCP服务器 
                        server = socket.socket(socket.AF_INET,  socket.SOCK_STREAM) 
                        # 绑定IP和端口 
                        server.bind((SERVER_IP,  SERVER_PORT)) 
                        # 开始监听,最大连接数为1 
                        server.listen(1)  
                        print(f"Server OK,Waiting Robot Connect...") 
 
                        # 接受客户端连接 
                        conn, addr = server.accept()  
                        print(f"Robot Connected: {addr}") 
 
                        # 使用全局变量 
                        Ares_Sensor = 1 
                        if Ares_Sensor == 1: 
                            print(Ares_Sensor) 
                            # 定义命令列表 
                            commands222 = [ 
                                "STOP",    # 紧急停止  
                                "PAUSE",   # 暂停运行 
                                "RESUME",  # 恢复运行 
                                "STATUS",  # 请求状态反馈 
                                "RESET"    # 复位错误 
                            ] 
 
                            commands3333 = [ 
                                "STOP" ,1  # 紧急停止  
                            ] 
                            # 要发送的命令列表 
                            #commands = ["STOP", "PAUSE", "RESUME"] 
                            commands = ["PAUSE"] 
                            index = 0 
                            #while True: 
                            for aaaa in range(1):    
                                # 获取当前要发送的命令 
                                cmd = commands[index % len(commands)] + "\n" 
                                try: 
                                    # 发送命令 
                                    conn.sendall(cmd.encode('utf-8'))   #  t66=((cmd)+"\r\n")
                                    #conn.sendall((cmd)+"\n".encode())  
                                    #conn.sendall((cmd)+"\r\n".encode('utf-8'))  
                                    print(f"[{time.strftime('%H:%M:%S')}]  Send OK。。。。。。 {cmd}") 

                                except socket.error  as e: 
                                    print(f"Send error: {e}") 
                                    break 
                                index += 1 
                                aaaa+=1
                                print(aaaa)
                                # 暂停一段时间 
                                time.sleep(0.0001)  # 修复括号未关闭的问题
                    except socket.error  as e: 
                        print(f"Socket error: {e}") 
                    finally: 
                        # 关闭服务器和连接 
                        if 'server' in locals(): 
                            server.close()  
                        if 'conn' in locals(): 
                            conn.close()  

                        time.sleep(0.0001)                  
        except Exception as e:
            #self._log(f"监测异常: {str(e)}")
            logging.info(f"Error to PLC,Message is : {str(e)}")
        finally:
            self.parent.after(333, self._monitor_y79)

    def _check_connection(self):
        """工业级连接状态验证"""
        try:
            return self.plc.ConnectServer().IsSuccess
        except:
            return False

    def start_auto_command(self):
        """修正后的自动控制流程,确保仅运行一次"""
        logging.info("Start button triggered, running command sequence...")
        time.sleep(0.00006)

        # 确保仅执行一次流程
        if not hasattr(self, '_is_running') or not self._is_running:
            self._is_running = True
            try:
                self.Recive_PLC_start_command()  # 执行主流程
            finally:
                self._is_running = False

    def _safe_write(self, address, value, data_type):
        """通用安全写入模板"""
        try:
            if data_type == 'float':
                result = self.plc.WriteFloat(address, value)
            elif data_type == 'int32':
                result = self.plc.WriteInt32(address, value)
            elif data_type == 'bool':
                result = self.plc.Write(address, [value])
            
            if not result.IsSuccess:
                print(f"Write {address} NG: {result.Message}")
        except Exception as e:
            print(f"Write NG,Message is : {str(e)}")



    def check_y79_status(self):
        try:
            if self.plc:
                # 读取Y79状态(注意地址格式需要根据实际PLC配置调整)
                read_result = self.plc.ReadBool("Y79")
                if read_result.IsSuccess and read_result.Content:
                    self.start_auto_command()
        finally:
            # 持续监控
            self.parent.after(500, self.check_y79_status)

    def start_Robot_command(self):
        """2025版自动控制流程"""  #StartTim1Tim000Tim111Tim222Tim888Tim
        ##print("Running Command ...")
        time.sleep (0.00006)
        app_path = r"C:\Users\ShineTek\AppData\Local\Programs\Python\Python37\Python.exe E:\Tim_Study\Python_Code\V5_20250312_Robot_Client_UI_Control.py"
        try:
            # 启动新进程并保存引用
            self.app3_process = subprocess.Popen(app_path)
            logging.info("Launched start_Robot_command application successfully.")
        except Exception as e:
            messagebox.showerror("Error", f"Failed to launch start_Robot_command application: {e}")
            logging.error(f"Failed to launch start_Robot_command application: {e}")  

    def start_Falco_command(self):
        """2025版自动控制流程"""
        ##print("Running Command ...")
        time.sleep (0.00006)
        #self.Recive_PLC_start_command()  ###Tim Modify
        # 保持原有写入逻辑
        #self._safe_write("D390", 7777.888, 'float')
        #self._safe_write("D397", 55, 'int32')
        #self._safe_write("M260", True, 'bool')

    def start_PLC_command(self):
        """2025版自动控制流程"""
        ##print("Running PLC Command ...")
        app_path = r"C:\Users\ShineTek\AppData\Local\Programs\Python\Python37\Python.exe E:\Tim_Study\Python_Code\V6_PLC_BaseOn_Ali_Show_Picture666.py"
        try:
            # 启动新进程并保存引用
            self.app3_process = subprocess.Popen(app_path)
            logging.info("Launched start_PLC_command application successfully.")
        except Exception as e:
            messagebox.showerror("Error", f"Failed to launch start_PLC_command application: {e}")
            logging.error(f"Failed to launch start_PLC_command application: {e}")  

    def save_settings(self):
        """增强型配置保存方法"""
        config = {
            'version': 1.0,
            'offsets': {
                'x': self.custom_command_entry5.get(),
                'y': self.custom_command_entry6.get(),
                'u': self.custom_command_entry7.get()
            }
        }
        try:
            # 确保目录存在
            os.makedirs(os.path.dirname(self.CONFIG_PATH), exist_ok=True)
            with open(self.CONFIG_PATH, 'w') as f:
                json.dump(config, f, indent=2)
            #logging.info("配置保存成功")
            logging.info("Config Save")
        except Exception as e:
            logging.error(f"Save Config FAil,Message is: {str(e)}")
            messagebox.showerror("Error", f"Can not Save Config:\n{str(e)}")

            #logging.error(f"保存配置失败: {str(e)}")
            #messagebox.showerror("错误", f"无法保存配置:\n{str(e)}")

    def load_settings(self):
        """增强型配置加载方法"""
        try:
            if os.path.exists(self.CONFIG_PATH):
                with open(self.CONFIG_PATH, 'r') as f:
                    config = json.load(f)
                
                # 处理旧版本配置文件
                if 'offsets' in config:  # 新版本结构
                    offsets = config['offsets']
                else:  # 兼容旧版本
                    offsets = config
                
                # 设置输入框值(带空值保护)
                self.custom_command_entry5.delete(0, tk.END)
                self.custom_command_entry5.insert(0, offsets.get('x', ''))
                
                self.custom_command_entry6.delete(0, tk.END)
                self.custom_command_entry6.insert(0, offsets.get('y', ''))
                
                self.custom_command_entry7.delete(0, tk.END)
                self.custom_command_entry7.insert(0, offsets.get('u', ''))
                
        except json.JSONDecodeError:
            #logging.warning("配置文件格式错误,已重置")
            logging.warning("Config Format Error,Loading Def Config File")
            self._create_default_config()
        except Exception as e:
            #logging.error(f"加载配置失败: {str(e)}")
            #messagebox.showwarning("警告", "配置加载失败,已恢复默认值")    

            logging.error(f"Loading Config Fail,Message is: {str(e)}")
            messagebox.showwarning("Waring", "Loading Config Fail,Loading Def Config File")    

    def _create_default_config(self):
        """创建默认配置文件"""
        default_config = {
            'version': 1.0,
            'offsets': {
                'x': "0.0",
                'y': "0.0",
                'u': "0.0"
            }
        }
        try:
            with open(self.CONFIG_PATH, 'w') as f:
                json.dump(default_config, f, indent=2)
        except Exception as e:
            logging.error(f"Great Def Config Fail,Message is: {str(e)}")




    def update_gauges(self):
        # 从实际数据源获取值
        speed = random.randint(0,100)
        temp = random.randint(0,100)
        #self.speed_gauge.update_value(speed)
        #self.temp_gauge.update_value(temp)
        self.root.after(1000, self.update_gauges)

    def apply_point_limit_change(self):
        """应用数据点数量限制的变更"""
        try:
            new_limit = int(self.point_entry.get())
            if new_limit > 0:
                self.point_limit = new_limit
                # 立即更新显示
                self.update_display()
            else:
                messagebox.showwarning("输入无效", "数据点数量必须大于0")
        except ValueError:
            messagebox.showerror("输入错误", "请输入有效的整数")

    def write_all_offsets(self):
        global Offset_X, Offset_Y, Offset_U
        
        # 获取输入值并验证
        try:
            Offset_X = float(self.custom_command_entry5.get()) if self.custom_command_entry5.get() else None
            Offset_Y = float(self.custom_command_entry6.get()) if self.custom_command_entry6.get() else None
            Offset_U = float(self.custom_command_entry7.get()) if self.custom_command_entry7.get() else None
        except ValueError:
            messagebox.showerror("错误", "请输入有效的数字")
            return

        # 写入日志
        log_msg = f"Offset updated - X: {Offset_X}, Y: {Offset_Y}, U: {Offset_U}"
        logging.info(log_msg)
        
        # 更新界面
    ##    self.robot_data_text.yview_moveto(1)
    ##    self.robot_char_text.insert(tk.END, f"{datetime.now().strftime('%H:%M:%S')} {log_msg}\n")
    ##    self.robot_char_text.yview_moveto(1)

    def read_last_n_records(self, file_path, n=5):
        """读取文件中最后n条有效数据记录"""
        data = []
        try:
            with open(file_path, 'r') as f:
                # 读取所有行
                lines = f.readlines()
                
                # 倒序查找有效数据,最多检查最后20行
                for line in reversed(lines[-20:]):
                    if "Tim" in line:
                        try:
                            # 使用正则表达式提取数值
                            import re
                            pos_match = re.search(r'Tim([-\d.]+)Tim([-\d.]+)Tim([-\d.]+)Tim', line)
                            if pos_match:
                                x, y, z = map(float, pos_match.groups())
                                data.append((x, y, z))
                                if len(data) >= n:
                                    break  # 达到所需数据量后停止搜索
                        except Exception as e:
                            logging.error(f"解析行失败: {str(e)}")
            # 返回按时间顺序排列的数据
            return data[::-1]
        except FileNotFoundError:
            logging.error("轨迹文件未找到,请确认路径是否正确")
            return []
        except Exception as e:
            logging.error(f"读取文件时发生错误: {str(e)}")
            return []

    def read_trajectory_data(self, file_path):
        """使用正则表达式增强版轨迹读取"""
        data = []
        try:
            with open(file_path, 'r') as f:
                for line in f:
                    if "Current_POS_is:" in line:
                        try:
                            import re
                            pos_match = re.search(r'X:([\-0-9.]+)Y:([\-0-9.]+)Z:([\-0-9.]+)U:([\-0-9.]+)', line)
                            if pos_match:
                                x, y, z, u = map(float, pos_match.groups())
                                data.append((x, y, z, u))
                        except Exception as e:
                            logging.error(f"解析行失败: {str(e)}")
            return data
        except FileNotFoundError:
            logging.error("轨迹文件未找到,请确认路径是否正确")
            return []

    def show_animation(self):
        """显示动态3D动画"""
        # 修复 toggle_btn 未定义的问题
        toggle_btn = tk.Button(self.right_frame, text="Toggle Animation", bg="#00B0F0", fg="white")
        toggle_btn.pack(side=tk.TOP, pady=10)
        toggle_btn.config(command=self.toggle_animation)

    def show_animation(self):
        """显示高科技风格的3D轨迹动画"""
        file_path = r'C:\Log\Robot_POS8.txt'
        
        # 验证文件路径
        if not os.path.exists(file_path):
            messagebox.showerror("文件错误", f"轨迹文件未找到\n路径: {file_path}")
            logging.error(f"轨迹文件不存在: {file_path}")
            return

        trajectory_data = self.read_trajectory_data(file_path)
        if not trajectory_data:
            logging.warning("没有读取到有效轨迹数据")
            return

        # 创建新窗口用于显示动画
        animation_window = tk.Toplevel(self.root)
        animation_window.title("Robot Trajectory Animation")
        
        fig = Figure(figsize=(6, 4), dpi=100)
        
        # 设置中文字体和负号显示
        from matplotlib import rcParams
        rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体以支持中文
        rcParams['axes.unicode_minus'] = False  # 正常显示负号
    
        ax = fig.add_subplot(111, projection='3d')  # 启用3D绘图
        ax.set_title("3D")
        ax.set_xlabel("X Position")
        ax.set_ylabel("Y Position")
        ax.set_zlabel("Z Position")  # 添加Z轴标签
        ax.grid(True)
        ax.set_facecolor('#f0f0f0')
    
        # 修正后的坐标轴背景颜色设置
        ax.xaxis.pane.fill = True
        ax.xaxis.pane.set_alpha(0.94)
        ax.yaxis.pane.fill = True
        ax.yaxis.pane.set_alpha(0.90)
        ax.zaxis.pane.fill = True
        ax.zaxis.pane.set_alpha(0.85)
    
        # 设置坐标轴面板颜色渐变
        ax.xaxis.pane.set_facecolor((0.94, 0.94, 0.94))
        ax.yaxis.pane.set_facecolor((0.90, 0.90, 0.90))
        ax.zaxis.pane.set_facecolor((0.85, 0.85, 0.85))

        canvas = FigureCanvasTkAgg(fig, master=animation_window)
        canvas.draw()
        canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)

        # 使用颜色映射来表示时间进程
        from matplotlib import cm
        colors = [cm.viridis(i / len(trajectory_data)) for i in range(len(trajectory_data))]

        # 创建轨迹线对象
        line, = ax.plot([], [], [], lw=2, label='')  # 初始化3D线条  实时轨迹
        yellow_line, = ax.plot([], [], [], c='gold', lw=2, label='His')  # 历史路径标签
        # 创建当前点标记
        current_point, = ax.plot([], [], [], 'ro', markersize=10, label='Cur')  # 当前位置标签
        # 创建轨迹尾迹
        trail, = ax.plot([], [], [], c='blue', alpha=0.3, lw=2, label='...')  # 轨迹尾迹标签
    
        # 添加图例说明
        ax.legend(loc='upper left', fontsize=12, bbox_to_anchor=(0.0, 0.9))

        def init():
            xs = [d[0] for d in trajectory_data]
            ys = [d[1] for d in trajectory_data]
            zs = [d[2] for d in trajectory_data]
        
            min_range = 20  # 最小显示范围
            ax.set_xlim(min(xs) - 5, max(xs) + 5 if max(xs)-min(xs) > min_range else min(xs) + min_range)
            ax.set_ylim(min(ys) - 5, max(ys) + 5 if max(ys)-min(ys) > min_range else min(ys) + min_range)
            ax.set_zlim(min(zs) - 5, max(zs) + 5 if max(zs)-min(zs) > min_range else min(zs) + min_range)
            ax.view_init(elev=30, azim=-60)  # 调整为最佳视角
            return line, yellow_line, current_point, trail

        def update(frame):
            # 提取当前帧前的所有X、Y、Z值
            x_values = [d[0] for d in trajectory_data[:frame+1]]
            y_values = [d[1] for d in trajectory_data[:frame+1]]
            z_values = [d[2] for d in trajectory_data[:frame+1]]  # 提取Z值

            # 更新轨迹线
            line.set_data(x_values, y_values)
            line.set_3d_properties(z_values)
            line.set_color(colors[frame])  # 设置当前线段的颜色

            # 更新黄色轨迹线(现为历史路径)
            yellow_x = x_values[:max(0, frame-10)]
            yellow_y = y_values[:max(0, frame-10)]
            yellow_z = z_values[:max(0, frame-10)]
            yellow_line.set_data(yellow_x, yellow_y)
            yellow_line.set_3d_properties(yellow_z)

            # 更新当前点标记
            current_point.set_data([x_values[-1]], [y_values[-1]])
            current_point.set_3d_properties([z_values[-1]])

            # 更新轨迹尾迹(仅显示最近的20个点)
            trail_start = max(0, frame-5)
            trail.set_data(x_values[trail_start:], y_values[trail_start:])
            trail.set_3d_properties(z_values[trail_start:])
            trail.set_alpha(np.linspace(0.2, 0.8, frame - trail_start + 1)[-1])

            # 动态更新标题显示当前帧信息
            ax.set_title(f"3D")

            # 每50帧自动调整视角
            if frame % 50 == 0:
                ax.view_init(elev=30, azim=-60 + frame//10)

            return line, yellow_line, current_point, trail

        from matplotlib.animation import FuncAnimation
        ani = FuncAnimation(fig, update, frames=len(trajectory_data), init_func=init,
                      blit=True, interval=500, repeat=False)  # 运行速度降为原始速度的 1/5  (250) 运行速度
        ani._start()  # 使用TkAgg推荐的启动方式

        # 添加动画控制面板
        control_frame = tk.Frame(animation_window)
        control_frame.pack(side=tk.BOTTOM, fill=tk.X)

        # 添加动画控制按钮
        btn_frame = tk.Frame(control_frame)
        btn_frame.pack(pady=10)

        def toggle_animation():
            if ani.event_source is None:
                return
            if ani.event_source.is_running():
                ani.event_source.stop()
                toggle_btn.config(text="Play")
            else:
                ani.event_source.start()
                toggle_btn.config(text="Pause")

        toggle_btn.config(command=toggle_animation)

        def reset_animation():
            ani.event_source.stop()
            init()
            toggle_btn.config(text="Play")

        reset_btn = tk.Button(btn_frame, text="Reset", command=reset_animation,
                       bg="#FFA500", fg="white", width=6, font=("Segoe UI", 10))
        reset_btn.pack(side=tk.LEFT, padx=5)

        close_btn = tk.Button(btn_frame, text="Close", command=animation_window.destroy,
                        bg="#C0C0C0", fg="black", width=6, font=("Segoe UI", 10))
        close_btn.pack(side=tk.RIGHT, padx=5)
            
#C:\Users\SKD\AppData\Local\Programs\Python\Python311\Scripts\pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ pyautogui

if __name__ == "__main__":  
    root = tk.Tk()  
    app = TCPClientApp(root)  
    root.mainloop()




---------------

' 
'Design By Tim  main.prg
' 
Global Integer h, InData, OutData, start_Awitch, Long_Tim, For_LS, fileNum, RecvData, For_LS_tim
Global Real CX_Here, X_Tim_Real, Y_Tim_Real, U_Tim_Real
Global Real CY_Here
Global Real CZ_Here
Global Real CU_Here
Global String datattt$, Data$, DataLS$, Response$, X_Tim_string$, Y_Tim_String$, Data_Client$, send_Data$, Read_file$, Data211$, X_String_211$, Y_String_211$, U_String_211$, Start_String_211$, Clean_Tim$, Data210$
Global String Pdata_x$(100), Pdata_y$(100), Pdata$(100), Pdata211$(100)
Global Real state216, state21666, numOfChars, state_client, state211, X_Real_211, Y_Real_211, U_Real_211, U_Real_211_Angle, Start_Real_211
Global Real state212, Pitch, Area_Sensor___, III, Check_215
Global String Data_212$, PData_212$(100), Data_212_Start$, Off_String_211$, Area_Sensor_$, Area_Sensor___$
Global Integer errnum, Data_212_Read, Status_212, Index, Order, Home_POS_Index

Function main
	Motor On
	Power High
	Speed 100  'Go Speed Tim on High ,Off Low	
	SpeedS 2000 'MAX 2000
	Print "Program Runing at: ", Time$
	Print "The current control device is:", CtrlDev, "  Remark锟斤拷21 PC锟斤拷22 Remote I/O锟斤拷26 Remote Ethernet锟斤拷29 Remote RS232C"
	Print "Waiting... "



''
	Xqt Big_TCP_212_Runmode, Normal 'Big_Vison
''	

	Xqt Current_POS_2, Normal  'NoPause	
	Xqt Welcome, Normal  'NoPauseWelcome
	Xqt Recive_lendayu62, Normal  'Recive data Lens>62 Alarm
	
	
	'Xqt TCP_209_AreaSensor_As_Client, Normal 'Big_AreaSensor
	'Xqt To_Robot, Normal	
	'Xqt tcpip_208_Jog, Normal
	'Xqt tcpip_211_1Cycle, Normal
	'Xqt Rbt_PC216, Normal
	'Xqt Vision_Process, Normal
	'Xqt Process, Normal
	'Xqt Running_time, NoPause
	'Xqt Current_POS, Normal  'NoPause
	'Xqt Move_Current_POS, Normal  'NoPause	
	'Xqt Alignment_TCP_212, Normal  'Aligenmnet
	'Xqt Welcome, Normal
	'Xqt Recive_lendayu62, Normal
	'Xqt File, Normal	
	
	
Fend


---------------
' 
'Design By Tim  Process.prg
' 

Function Alignment_TCP_212
	GoTo lblOpenPort
lblOpenPort:
	CloseNet #212
	Print "Waiting Servers Open ", Time$
	SetNet #212, "192.168.0.150", 7777, CRLF, NONE, 0
	OpenNet #212 As Client
	WaitNet #212
	Print "IP:192.168.0.150 Port:7777 Open at ", Time$
	MemOff 18  'Clean
	
''14:28:13  Tim-682.789Tim289.271Tim89.7095TimOKTim888888

	'Recive data  DOWNTimNoneAUOTim11.999Tim1061.1652Tim1612.829Tim90.005055Tim
	Do
		'MemOn 18
        If MemSw(18) = Off Then
        	Wait 0.6
			Status_212 = ChkNet(212)
			Print "Recive data Len/Status is ", Status_212
			If Status_212 > 0 And Status_212 < 62 Then
				Read #212, Data_212$, Status_212
				Print "Recive data1 ", Status_212, "Recive data2 ", Data_212$, "Recive data3 ", Data_212_Read
				'ParseStr Data_212$, PData_212$(), "Tim"  '锟街革拷锟街凤拷
				'Print "Recive data sp is ", PData_212$(0), PData_212$(1), PData_212$(2)
				MemOn 18
			
			ElseIf Status_212 > 62 Then
				Print "Recive len is so long"

				String msg2$, title2$
				Integer mFlag2s, answer2
				msg2$ = "Recive len is so long" + CRLF
				msg2$ = msg2$ + "Press Y or N to Exit..." + CRLF
				msg2$ = msg2$ + "Press N or Y to Exit..." + CRLF
				title2$ = "Recive Title"
				mFlag2s = MB_YESNO + MB_ICONQUESTION
				MsgBox msg2$, mFlag2s, title2$, answer2
				If answer2 = IDNO Or answer2 = IDYES Then
					Quit All
				EndIf
				Exit Do
			ElseIf Status_212 = -3 Then
				MemOff 2 'Ethernet Connect Status
				Print "Ethernet is Close,Pls Check it...", Time$
				GoTo lblOpenPort
			EndIf
		EndIf
		
		If MemSw(18) = On Then
			Wait 0.022

			ParseStr Data_212$, PData_212$(), "Tim"  '锟街革拷锟街凤拷
			'Print "Recive data sp is ", PData_212$(0), PData_212$(1), PData_212$(2), PData_212$(3), PData_212$(4), PData_212$(5)
			''Order:1=Ref_A1 2=Ref_A2 3=Ref_A3 4=Ref_A4 5=Start Index:888888	
			Order = Val(PData_212$(1))
			'Index = Val(PData_212$(5))
			Pitch = Val(PData_212$(2))
			
			''RIGHTTim2Tim11.999Tim1061.1652Tim1612.829Tim90.005055Tim  
			''if Pdate 0 1 2 = None, No Action  
			''Data_212_Start$ = PData_212$(0)=LEFRUPDOWNSAVE   
			''Data_212_Start$ = PData_212$(1)=Order    
			''Data_212_Start$ = PData_212$(2)=Pitch
			
			If Order = 0 Then
				Print "Home Pos Send", P986
				Print #212, "Home Pos Send", P986
				Go P986 'Home_Ref
			ElseIf Order = 1 Then
				Print "Go Ref_A1"
				Wait 0.3
				P987 = RealPos
				Print #212, "Go Ref_A1", P987
				Go P985 'A1_Ref
			ElseIf Order = 2 Then
				Print "Go Ref_A2"
				Wait 0.3
				P987 = RealPos
				Print #212, "Go Ref_A2", P987
				Go P984 'A2_Ref		
			EndIf
			Wait 0.88
'
			CX_Here = CX(Here)
			CY_Here = CY(Here)
			CZ_Here = CZ(Here)
			CU_Here = CU(Here)
			Print "Now pos is :", Here
			Data_212_Start$ = PData_212$(0)
			If Data_212_Start$ = "UP" Then
				Print "Recive UP = ", Data_212_Start$
				Go XY(CX(Here) + Pitch, CY(Here), CZ(Here), CU(Here))
				Print "Now pos is :", Here
			ElseIf Data_212_Start$ = "LEF" Then
				Print "Recive Left = ", Data_212_Start$
				Go XY(CX(Here), CY(Here) + Pitch, CZ(Here), CU(Here))
				Print "Now pos is :", Here
			ElseIf Data_212_Start$ = "RIGH" Then
				Print "Recive Right = ", Data_212_Start$
				Go XY(CX(Here), CY(Here) - Pitch, CZ(Here), CU(Here))
				Print "Now pos is :", Here
			ElseIf Data_212_Start$ = "DOWN" Then
				Print "Recive Down = ", Data_212_Start$
				Go XY(CX(Here) - Pitch, CY(Here), CZ(Here), CU(Here))
				Print "Now pos is :", Here
			ElseIf Data_212_Start$ = "CW" Then
				Print "Recive CW = ", Data_212_Start$
				Go XY(CX(Here), CY(Here), CZ(Here), CU(Here) - Pitch)
				Print "Now pos is :", Here
			ElseIf Data_212_Start$ = "CCW" Then
				Print "Recive CCW = ", Data_212_Start$
				Go XY(CX(Here), CY(Here), CZ(Here), CU(Here) + Pitch)
				Print "Now pos is :", Here
			ElseIf Data_212_Start$ = "SAVE" Then
				Print "Saving Aligment OK Pos ", Here
				String msg$, title$
				Integer mFlags, answer
				msg$ = "Save Pos" + CRLF
				msg$ = msg$ + "Are U Sure?"
				title$ = "Setting 2 Save"
				mFlags = MB_YESNO + MB_ICONQUESTION
				MsgBox msg$, mFlags, title$, answer
				If answer = IDNO Then
					Quit All
				ElseIf answer = IDYES Then
					
					PLabel 988, "Aligment"
					Here P988
                    Print "Save Pos ", CRLF, Here
                    Print #212, "Save Pos ", CRLF, Here
				EndIf

			EndIf
			SavePoints "rbtPoints_212.pts"
			Print "Eecive data OK...Start 2 Waiting Order..."
			MemOff 18  'Clean
		EndIf
		
		Print #212, "---", Time$
		Print "---", Time$
		MemOff 18  'Clean

	Loop

	ErrorHandle:
	'errnum = Err
	Print "ERROR", errnum
	Quit All
Fend

Function Welcome
	Do
		If MemSw(2) = Off Then
			Print "Welcome 2 Use"

			String msg$, title$
			Integer mFlags, answer
			msg$ = "Welcome 2 Use" + CRLF
			msg$ = msg$ + "Do not Press Or Press Y to Continue..." + CRLF
			msg$ = msg$ + "Press N to Exit..." + CRLF
			title$ = "Robot Control Tool"
			mFlags = MB_YESNO + MB_ICONQUESTION
			MsgBox msg$, mFlags, title$, answer
			If answer = IDNO Then
				Quit All
			EndIf
		EndIf
				
		'CloseNet #212
		Exit Do


	Loop
Fend
Function Recive_lendayu62
	Do
		If Status_212 > 62 Then
			Print "Recive len is so long"

			String msg$, title$
			Integer mFlags, answer
			msg$ = "Recive len is so long" + CRLF
			msg$ = msg$ + "Press Y to Continue..." + CRLF
			msg$ = msg$ + "Press N to Exit..." + CRLF
			title$ = "Recive Title"
			mFlags = MB_YESNO + MB_ICONQUESTION
			MsgBox msg$, mFlags, title$, answer
			If answer = IDNO Or answer = IDYES Then
				Quit All
			EndIf
		EndIf
		Exit Do


	Loop
Fend

Function TCP_209_AreaSensor_As_Client

    ' 锟截憋拷锟斤拷锟斤拷锟斤拷锟紼S THEN
    CloseNet #209
    Print "#209 Config Waiting Servers Open ", Time$
 
    ' 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟絆pen ", Time$
    SetNet #209, "192.168.0.150", 5670, CRLF, NONE, 0
 
    ' 锟皆客伙拷锟斤拷模式锟斤拷锟斤拷锟斤拷锟斤拷, 0
    OpenNet #209 As Client
 
    ' 锟饺达拷锟斤拷锟斤拷锟斤拷锟接斤拷锟斤拷锟浇, 0
    WaitNet #209
    Print "#209 Config IP:192.168.0.150 Port:5678 Open at ", Time$
 
    ' 锟饺达拷1锟斤拷 
    Wait 1
 
    Do
    ' 锟截憋拷锟斤拷锟斤拷锟斤拷锟接斤拷锟斤拷锟浇, 0
    	CloseNet #209
    	Print "#209  Waiting Servers Open ", Time$
 
    ' 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟?, TIME$
   		SetNet #209, "192.168.0.150", 5670, CRLF, NONE, 0
 
    ' 锟皆客伙拷锟斤拷模式锟斤拷锟斤拷锟斤拷锟斤拷E, 0
  	  OpenNet #209 As Client
 
    ' 锟饺达拷锟斤拷锟斤拷锟斤拷锟接斤拷锟?29Tim90.005055Tim  
  	  WaitNet #209
  	  Print "#209  IP:192.168.0.150 Port:5678 Open at ", Time$
 
        ' 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟捷筹拷锟絠me$
        Area_Sensor___ = ChkNet(209)
        Print "#209 Recived Lens: ", Area_Sensor___
 
        ' 锟斤拷锟斤拷锟斤拷锟斤拷萁锟斤拷锟?
        If ChkNet(209) > 0 Then
            ' 锟斤拷取一锟斤拷锟斤拷锟斤拷 
            ''Line Input #209, Area_Sensor_$
            Read #209, Area_Sensor_$, Area_Sensor___
            Print "data is : ", Area_Sensor_$
            ' 锟斤拷锟斤拷锟斤拷盏锟斤拷锟斤拷锟斤拷锟?
            Select Case UCase$(Trim$(Area_Sensor_$))
                Case "PAUSE"
                    Print "Pause"
                    Pause ' 锟斤拷停 
                Case "RESET"
                    Print "RESUME"
                    Reset ' 锟斤拷锟斤拷锟斤拷锟阶刺?锟斤拷位锟斤拷锟斤拷 
                Case "STOP"
                    Print "Motor_Off"
                    Motor Off ' 锟截闭碉拷锟?
                Case "ESTOPON"
                    Print "ESTOPON"
                    'SafeguardOn ' 锟截闭碉拷锟?             
                    'EStopOn
                Case "1"
                    Print "Other command: ", Area_Sensor_$
                    Motor Off
			Send

		EndIf
		
		

		If Area_Sensor___ = -3 Then
			Pause ' 锟斤拷停
			'Motor Off
			String msg6_$, title_6$
			Integer mFlags_6, answer_6
			msg6_$ = "Waring" + CRLF
			msg6_$ = msg6_$ + "Area Sensor !!!" + CRLF
			msg6_$ = msg6_$ + "Area Sensor !!!" + CRLF
			msg6_$ = msg6_$ + "Area Sensor !!!" + CRLF
			msg6_$ = msg6_$ + " " + CRLF
			msg6_$ = msg6_$ + "Press N to STOP !!!" + CRLF
			msg6_$ = msg6_$ + "Press Y to Continue" + CRLF
			title_6$ = "Robot Control Tool"
			mFlags_6 = MB_YESNO + MB_ICONQUESTION
			MsgBox msg6_$, mFlags_6, title_6$, answer_6
			If answer_6 = IDNO Then
				Quit All
			EndIf
			If answer_6 = IDYES Then
				Wait 0.0001
			EndIf
			
		EndIf
        
	Loop

Fend


Function Big_TCP_212_Runmode

	CloseNet #210
	SetNet #210, "192.168.0.1", 2009, CRLF, NONE, 0
	OpenNet #210 As Server
	WaitNet #210
	Print "#210 Open at ", Time$
	MemOff RecvData  'Clean
	
	Jump P988 LimZ (0) 'NG_Port	
	'Jump P988
	Off 9
	Off 8
	Wait 0.8
	Jump P999 LimZ (0) 'home_Standby
	
	Do

		Off 9
		Off 8
		Wait 0.05  '<1 3 Cycle
        If MemSw(RecvData) = Off Then
			state211 = ChkNet(210)
			Print "Recived Lens: ", state211
			
			Print "For_Index:", For_LS_tim
			If state211 > 0 Then
				If For_LS_tim = 3 Then
	   				'cLANE 	 
					'Input #211, Data211$
					Print #210, Clean_Tim$
					Clean_Tim$ = ""
					Wait 2
					Input #210, Data210$
					Print Time$, " Recive data:  ", Data210$   'recive data				
					state211 = ChkNet(210)
					'Input #211, Data211$
					'Print Time$, " Recive data:  ", Data211$   'recive data
				    'cLANE  ok
				    
					Input #210, Data211$
					Print Time$, " Recive data_Clean:  ", Data211$   'recive data
					ParseStr Data211$, Pdata211$(), "Tim"  'spilt data
					MemOn RecvData
				
					Start_String_211$ = Data211$
					'Start_Real_211 = Val(Start_String_211$) 
					Start_Real_211 = Val(Right$(Start_String_211$, 6))
					Print "Start index:  ", Start_Real_211
				ElseIf For_LS_tim = 1 Or For_LS_tim = 2 Then
					Input #210, Data211$
					Print Time$, " Recive data_Clean:  ", Data211$   'recive data
					ParseStr Data211$, Pdata211$(), "Tim"  'spilt data
					MemOn RecvData
				
					Start_String_211$ = Data211$
					'Start_Real_211 = Val(Start_String_211$) 
					Start_Real_211 = Val(Right$(Start_String_211$, 6))
					Print "Start index:  ", Start_Real_211
				ElseIf For_LS_tim = 0 Then
					Input #210, Data211$
					Print Time$, " Recive data:  ", Data211$   'recive data
					ParseStr Data211$, Pdata211$(), "Tim"  'spilt data
					MemOn RecvData
				
					Start_String_211$ = Data211$
					'Start_Real_211 = Val(Start_String_211$) 
					Start_Real_211 = Val(Right$(Start_String_211$, 6))
				
					Print "Start index:  ", Start_Real_211

				EndIf
				
				
			ElseIf state211 = -3 Then

				Print Time$, "Ethernet NG ,Pls Connect it."
				Print Time$, "Ethernet NG ,Pls Connect it.."
				Print Time$, "Ethernet NG ,Pls Connect it..."
				
			''	
				Do
					CloseNet #210
					SetNet #210, "192.168.0.1", 2009, CRLF, NONE, 0
					OpenNet #210 As Server
					WaitNet #210
					Print "#210 Open at ", Time$
					If state211 <> -3 Then
						Quit All
					EndIf
					Exit Do
				Loop

			''	
			EndIf
		EndIf
		If MemSw(RecvData) = On And For_LS_tim = 0 Or Start_Real_211 = 888888 Or Start_Real_211 = 666666 Then

			Home_POS_Index = 0
			'Print "x:", Pdata211$(0), "y:", Pdata211$(1), "u:", Pdata211$(2)
			X_String_211$ = Pdata211$(0)
			X_Real_211 = Val(X_String_211$)
			Y_String_211$ = Pdata211$(1)
			Y_Real_211 = Val(Y_String_211$)
			U_String_211$ = Pdata211$(2)
			U_Real_211 = Val(U_String_211$)
			If U_Real_211 > 0 Then
				U_Real_211_Angle = -U_Real_211
			ElseIf U_Real_211 < 0 Then
				U_Real_211_Angle = -U_Real_211
			EndIf
			
		''	Off_String_211$ = Pdata211$(3)
		''	Print "Off_String_211$", (Off_String_211$)
		''	If Off_String_211$ = "Motor_off" Then
		''		Print #210, "Motor_Off"
		''		Print "Off"
		''   	Motor Off
		''	EndIf
			
			
			'Print U_Real_211_Angle
			Print "Spilt data:  ", "x_Real:", X_Real_211, "y_Real:", Y_Real_211, "u_Real:", U_Real_211_Angle
			Print #210, "x_Real:", X_Real_211, "y_Real:", Y_Real_211, "u_Real:", U_Real_211_Angle
''		
'			X_Max = 542.666  -386 -372       -355
'			X_Min = -990.222 -915            -805
'			Y_Max = 836.666  217  206  286   310
'			Y_Min = -122.222  -400  -400     -124 
			If X_Real_211 >= -805 And X_Real_211 <= -355 And Y_Real_211 >= -124 And Y_Real_211 <= 310 Then
				P993 = XY(X_Real_211, Y_Real_211, -6.6666, U_Real_211_Angle)
				Jump P993  'Vision_Pre
				''Go XY(X_Real_211 + 20, Y_Real_211, -1.666, U_Real_211_Angle)
			Else
             Print "Error 4007, Target position out of range"

				String msg$, title$
				Integer mFlags, answer
				msg$ = "There has An Error" + CRLF
				msg$ = msg$ + "Press Y to Close and Call Tim"
				title$ = "Error Message From Robot"
				mFlags = MB_YESNO + MB_ICONQUESTION
				MsgBox msg$, mFlags, title$, answer
				If answer = IDNO Then
					Quit All
				EndIf
				
				CloseNet #210
				Exit Do
			EndIf
			
			
			If U_Real_211_Angle >= 0 Then
				X_Real_211 = X_Real_211 + 0
				Y_Real_211 = Y_Real_211 + 0
				U_Real_211_Angle = U_Real_211_Angle + 0
''			ElseIf U_Real_211_Angle >= -16 And U_Real_211_Angle <= 45 Then
''				X_Real_211 = X_Real_211 + 21.237
''				Y_Real_211 = Y_Real_211 + -6.463
''				U_Real_211_Angle = U_Real_211_Angle + -3.065
''			ElseIf U_Real_211_Angle >= -46 And U_Real_211_Angle <= 75 Then
''				X_Real_211 = X_Real_211 + 24.166
''				Y_Real_211 = Y_Real_211 + -10.672
''				U_Real_211_Angle = U_Real_211_Angle + -2.829
''			ElseIf U_Real_211_Angle >= -76 And U_Real_211_Angle <= 105 Then
''				X_Real_211 = X_Real_211 + 25.630
''				Y_Real_211 = Y_Real_211 + -14.882
''				U_Real_211_Angle = U_Real_211_Angle + -2.592
''			ElseIf U_Real_211_Angle >= -106 And U_Real_211_Angle <= 135 Then
''				X_Real_211 = X_Real_211 + 20.834
''				Y_Real_211 = Y_Real_211 + -13.221
''				U_Real_211_Angle = U_Real_211_Angle + -2.728
''			ElseIf U_Real_211_Angle >= -136 And U_Real_211_Angle <= 165 Then
''				X_Real_211 = X_Real_211 + 16.037
''				Y_Real_211 = Y_Real_211 + -11.559
''				U_Real_211_Angle = U_Real_211_Angle + -2.864
''			ElseIf U_Real_211_Angle >= -166 And U_Real_211_Angle <= 195 Then
''				X_Real_211 = X_Real_211 + 11.241
''				Y_Real_211 = Y_Real_211 + -10.063
''				U_Real_211_Angle = U_Real_211_Angle + -2.728
''			ElseIf U_Real_211_Angle >= -196 And U_Real_211_Angle <= 225 Then
''				X_Real_211 = X_Real_211 + 12.060
''				Y_Real_211 = Y_Real_211 + -7.852
''				U_Real_211_Angle = U_Real_211_Angle + -2.852
''			ElseIf U_Real_211_Angle >= -226 And U_Real_211_Angle <= 255 Then
''				X_Real_211 = X_Real_211 + 12.880
''				Y_Real_211 = Y_Real_211 + -5.641
''				U_Real_211_Angle = U_Real_211_Angle + -2.976
''			ElseIf U_Real_211_Angle >= -256 And U_Real_211_Angle <= 285 Then
''				X_Real_211 = X_Real_211 + 13.699
''				Y_Real_211 = Y_Real_211 + 2.791
''				U_Real_211_Angle = U_Real_211_Angle + -2.976
''			ElseIf U_Real_211_Angle >= -286 And U_Real_211_Angle <= 315 Then
''				X_Real_211 = X_Real_211 + 16.212
''				Y_Real_211 = Y_Real_211 + -0.529
''				U_Real_211_Angle = U_Real_211_Angle + -3.102
''			ElseIf U_Real_211_Angle >= -316 And U_Real_211_Angle <= 345 Then
''				X_Real_211 = X_Real_211 + 18.724
''				Y_Real_211 = Y_Real_211 + -3.849
''				U_Real_211_Angle = U_Real_211_Angle + -3.228
''			ElseIf U_Real_211_Angle >= -346 And U_Real_211_Angle <= -15 Then
''				X_Real_211 = X_Real_211 + +20.082
''				Y_Real_211 = Y_Real_211 + 0.812
''				U_Real_211_Angle = U_Real_211_Angle + -3.302
			EndIf
		'ADD	
			Go XY(X_Real_211, Y_Real_211, -247.387, U_Real_211_Angle) 'Down   -247.387
			On 8												  'Vacuum
			Wait 3.8
            ''锟斤拷Go XY(X_Real_211, Y_Real_211, -116, U_Real_211_Angle) 'Up
			'Jump S_put
			'Go Put
			'Wait 1.8
			''Jump Put2
			Jump P983 'Place
			Wait 3.8
			Off 8
			On 9
			Wait 0.6
			Off 9
		'ADD
		
			
			Jump P999 'home_Standby
			Print "home_Pos"
			Print #210, "Home_Pos", "Tim", "OK", "Tim"
			Home_POS_Index = 1
			
		For_LS_tim = 1 + For_LS_tim
		EndIf
		If For_LS_tim = 3 Then
			For_LS_tim = 1
		EndIf

		MemOff RecvData
		
		If Home_POS_Index = 1 Then
			Wait 0.00001
			''Print #210, "Home"
		EndIf
	Loop

Fend



































Function Rbt_PC216
	
	CloseNet #216
	OpenNet #216 As Server
	WaitNet #216
	Print "Open #216 at ", Time$
	For_LS = 1
	Print For_LS


	Do

		'Print #216, "Send data from robot "
		Wait 3
		Print For_LS
		

		state216 = ChkNet(216)
		Print "ChkNet= data", state216
		If state216 > 0 And For_LS = 2 Then
		'If state216 = 23 Or state216 = 25 Then
	
			Wait 0.01
			'Print "Send data XXX"
			'send_Data$ = "XXXYYUUU"
			'Print #216, send_Data$
			'Print #216, "ABCC"
			'Input #216, Response$
			'Print "ChkNet(216) Line Input: "
			'Print Response$
			
			Print "Has data"
			Read #216, Data$, state216
			DataLS$ = Data$
			Print #216, Data$
			Print "ChkNet(216) Read: "
			Print Data$
			Print state216

			Integer fileNum2, i, j
			fileNum2 = FreeFile
			AOpen "D:\V80.txt" As #fileNum2
			Line Input #fileNum2, Read_file$
			Y_Tim_Real = Val(Read_file$)
			Print "Y:", Y_Tim_Real
			Print "---"
			Close #fileNum2

		


			
			'Input #216, Data$
			'Print "Receive data: ", Data$, Time$

			'ParseStr Data$, Pdata_x$(), "XX"
			'X_Tim_Real = Val(Pdata_x$)
			'Print "X:", X_Tim_Real
			
			X_Tim_Real = Val(Left$(Data$, 8))
			Print "X:", X_Tim_Real,
			
			
			ParseStr DataLS$, Pdata_x$(), "YYY"
			Y_Tim_Real = Val(Pdata_x$)
			Print "Y:", Y_Tim_Real,
			
			U_Tim_Real = Val(Right$(DataLS$, 13))
			Print "U:", U_Tim_Real
			
			
'Vision_Process			
		'Wait start_Awitch = True
			Print "Process_锟竭讹拷锟斤拷锟斤拷锟教筹拷锟斤拷执锟斤拷锟叫★拷锟斤拷锟斤拷"
		'Call Rbt_PC216
			Print "Process_Going 2 St_Pick Pos"
		'Speed 100, 100, 100
			Go P993
			'Go P992
		'Speed 100, 100, 5
			Print "Process_St_Pick Pos"

		'Print Here
			'Go XY(X_Tim_Real, Y_Tim_Real, -246.628, 5)
			
			Print Here
			Wait 0.1
			On 8
			'Wait Sw(8) = 1
			'Wait 1
			'Go P990    'OK POS_LS
			Go P992   'OK POS
			Off 8
			'Wait 1
			Go P993
			

		'Go pick
		'Print "Process_Pick Pos"			
'Vision_Process					

			'Read #216, Data$, numOfChars
			'numOfChars = ChkNet(216)
			'Print numOfChars
			
		ElseIf state216 = -3 Then
			Print "#216 Close ,Pls open #216 "
			
		ElseIf state216 = 0 Then
			Print "#216 Net no data ,Pls check it "
			
' 锟斤拷止锟斤拷锟斤拷65536		
		ElseIf state216 > 0 And For_LS = 6 Then
			For_LS = 10
		ElseIf state216 > 0 And For_LS = 12 Then
			For_LS = 5
' 锟斤拷止锟斤拷锟斤拷65536	

		EndIf
		state216 = 25
'		If Data$ = 3.15 Then
'			Select Pdata$(5)
'				Case "10000"
'					Print #216, "SHAKEHAND 10000"
'				Case "31"
'					Print #216, "SHAKEHAND 31"
'					Go P999
'			Send
'		EndIf
		
		
		For_LS = 1 + For_LS
		
	Loop

Fend

Function Vision_Process
	Do
		'Wait start_Awitch = True
		Print "Process_锟竭讹拷锟斤拷锟斤拷锟教筹拷锟斤拷执锟斤拷锟叫★拷锟斤拷锟斤拷"
		'Call Rbt_PC216
		Print "Process_Going 2 St_Pick Pos"
		'Speed 100, 100, 100
		Go S_pick
		'Speed 100, 100, 5
		Print "Process_St_Pick Pos"

		Print Here
		Go XY(X_Tim_Real, Y_Tim_Real, -216, 5)
		Print Here
		
		'Go pick
		'Print "Process_Pick Pos"

	Loop
Fend
Function File
 	
	Do
		Print "File"
		Wait 2
		Integer fileNu, i, j
	'	fileNum = FreeFile
	'	WOpen "timTEST.DAT " As #fileNum
	'	For i = 0 To 100
			'Print #fileNum, i
		'Next I
		'Close #fileNum
		'........
		fileNu = FreeFile
		ROpen "timTEST88.DAT" As #fileNu
		For j = 4 To 8
			Input #fileNu, j
		Print j
		Next j
		Close #fileNu
		
		
	Loop

Fend
Function tcpip_211_1Cycle

	CloseNet #210
	SetNet #210, "192.168.0.1", 2009, CRLF, NONE, 0
	OpenNet #210 As Server
	WaitNet #210
	Print "  #210 Open at ", Time$
	MemOff RecvData  'Clean
	For_LS = 0
	
	Do
		Wait 2
        If MemSw(RecvData) = Off Then
			state211 = ChkNet(210)
			Print "state211: ", state211
			Print "For_LS_tim", For_LS_tim
			If state211 > 0 And For_LS_tim = 0 Then
				Input #210, Data211$
				Print Time$, " Recive data:  ", Data211$   'recive data
				ParseStr Data211$, Pdata211$(), "Tim"  'spilt data
				MemOn RecvData
			ElseIf state211 = -3 Then

				Print "锟斤拷太锟斤拷通讯锟较匡拷锟斤拷锟斤拷锟铰达拷"

			EndIf
		EndIf
		

		If MemSw(RecvData) = On And For_LS_tim = 0 Then
			'Print "x:", Pdata211$(0), "y:", Pdata211$(1), "u:", Pdata211$(2)
			X_String_211$ = Pdata211$(0)
			X_Real_211 = Val(X_String_211$)
			Y_String_211$ = Pdata211$(1)
			Y_Real_211 = Val(Y_String_211$)
			U_String_211$ = Pdata211$(2)
			U_Real_211 = Val(U_String_211$)
			Print " Spilt data:  ", "x_Real:", X_Real_211, "y_Real:", Y_Real_211, "u_Real:", U_Real_211
			Print #210, "x_Real:", X_Real_211, "y_Real:", Y_Real_211, "u_Real:", U_Real_211
			Go XY(X_Real_211, Y_Real_211, -216, U_Real_211)
			Wait 3
			Go P993
			
' 锟斤拷止锟斤拷锟斤拷65536		
'			If state211 > 0 And For_LS = 6 Then
'				For_LS_tim = 10
'			ElseIf state211 > 0 And For_LS = 12 Then
'				For_LS_tim = 5
'			EndIf
		For_LS_tim = 2 + For_LS_tim
		Print "For_LS_tim222", For_LS_tim
' 锟斤拷止锟斤拷锟斤拷65536













'			Select Pdata211$(0)
'				Case "Tim"
'					Print "SHAKEHAND 10000"
'				Case "31"
'					Print "SHAKEHAND 31"
'			Send
			
		EndIf

		MemOff RecvData
	Loop

Fend

Function To_Robot
	Print "To_Robot_锟斤拷始锟斤拷锟斤拷Robot 锟斤拷 PC 通讯锟斤拷锟斤拷"
	SetNet #205, "192.168.0.1", 2004, CRLF, NONE, 0
	OpenNet #205 As Server
	Print "To_Robot_锟皆凤拷锟斤拷锟斤拷锟斤拷式锟斤拷205锟剿匡拷"
	Print "To_Robot_锟饺达拷锟斤拷锟斤拷"
	WaitNet #205
	Print "To_Robot_锟斤拷锟接★拷锟斤拷锟斤拷"
	Do
		Print "To_Robot_Robot 锟斤拷 PC 通讯锟斤拷锟斤拷锟斤拷锟叫★拷锟斤拷锟斤拷"
		Wait 1

		Print #205, "Robot used: ", h
		'Print #205, ""
		Print "Robot used: ", h
		ATCLR
		Wait 1
		'Print #205, "Axis Runing Status not 0 is OK : ", "X=", ATRQ(1), "/", "Y=", ATRQ(2), "/", "Z=", ATRQ(3), "/", "U=", ATRQ(4)   'Send Tor data2	
			
		Real statustim
		statustim = ChkNet(205)
		
		If statustim > 0 Then
			Print "#205 锟斤拷锟斤拷锟斤拷"
			Print #205, "Robot used: ", h
			Print #205, ""
			Print "From #205 Recive data  "
			Print #205, "send data From Robot 192.168.0.1:205"
			Wait .5
			Input #205, datattt$
		ElseIf statustim = -3 Then
			Print "锟斤拷太锟斤拷通讯锟较匡拷锟斤拷锟斤拷锟斤拷锟铰打开斤拷锟斤拷头
			'Input #205, datatt$
		EndIf
		

	Loop
Fend


Function Process
	Do
		Print "Process_锟竭讹拷锟斤拷锟斤拷锟教筹拷锟斤拷执锟斤拷锟叫★拷锟斤拷锟斤拷"
		Print "Process_Standby Pos"
		Go P999
		Print "Process_Pick_Standby Pos"
		Go S_pick
		Print "Process_Pick Pos"
		Go pick
		Off 8
		Wait 1
		On 8
		Print "Vacuum"
		Print "Process_Pick_Standby Pos"
		Go S_pick
		Print "Process_Put_Standby Pos"
		Go S_put
		Print "Process_Put"
		Go Put
		Off 8
		Wait 1
		Print "Process_Put_Standby Pos"
		Go S_put
		Wait .6
		On 9
		Off 9
		Print "blow"
	Loop
Fend

Function Running_time
	Do
		h = Time(0) '锟斤拷小时锟斤拷锟斤拷通锟斤拷时锟斤拷
		Print "Running_time_Robot 锟窖撅拷使锟斤拷: ", h, "小时 ", ",", " 1锟斤拷锟接回憋拷一锟斤拷"
		Wait 60

	Loop
Fend
Function Current_POS

	CloseNet #215
	Print "#215 Config Waiting Servers Open ", Time$
	SetNet #215, "192.168.0.150", 1122, CRLF, NONE, 0
	OpenNet #215 As Client
	WaitNet #215
	Print "#215 Config IP:192.168.0.150 Port:1122 Open at ", Time$
	Wait 1
	Do
    	
    '	CloseNet #215
    '	Print "#215  Waiting Servers Open ", Time$
   	'	SetNet #215, "192.168.0.150", 1122, CRLF, NONE, 0
  	'    OpenNet #215 As Client
  	'    WaitNet #215
  	'    Print "#215  IP:192.168.0.150 Port:1122 Open at ", Time$
        Check_215 = ChkNet(215)
    '    Print "#215  Recived Lens: ", Check_215
       ' If ChkNet(215) > 0 Then
			'Print Time$, " Current_POS_is: ", "X:", CX_Here, " ,", "Y:", CY_Here, " ,", "Z:", CZ_Here, " ,", "U:", CU_Here
			Wait 0.0003
			P982 = CurPos
			''Print CX(P982), CY(P982), CY(P982), CY(P982)
			Print #215, Time$, " Current_POS_is: ", "X:", CX(P982), " ,", "Y:", CY(P982), " ,", "Z:", CZ(P982), " ,", "U:", CU(P982)
			Print Time$, " Current_POS_is: ", "X:", CX(P982), " ,", "Y:", CY(P982), " ,", "Z:", CZ(P982), " ,", "U:", CU(P982)
			
			Integer fileNum6, XXX, YYY, ZZZ, UUU
			String ZZZ$, UUU$, XXX$, YYY$
			fileNum6 = FreeFile
			XXX = CX(P982)
			XXX$ = Str$(XXX)
			YYY = CY(P982)
			YYY$ = Str$(YYY)
			ZZZ = CZ(P982)
			ZZZ$ = Str$(ZZZ)
			UUU = CU(P982)
			UUU$ = Str$(UUU)
			AOpen "C:\log\Robot_POS.txt" As #fileNum6
			Write #fileNum6, Time$ + "Current_POS_is: " + "X:" + "" + XXX$ + "Y:" + "" + YYY$ + "Z:" + "" + ZZZ$ + "U:" + "" + UUU$ + CRLF
			Print Time$, "--- Current_POS_is: ", "X:", CX(P982), " ,", "Y:", CY(P982), " ,", "Z:", CZ(P982), " ,", "U:", CU(P982)
			Close #fileNum6
		
	'	EndIf
	Loop
	
Fend


Function Current_POS_2
	Do
		Wait 0.125
		P982 = CurPos
		Integer fileNum6
		Real XXX, YYY, ZZZ, UUU, LS_Z, LS_U
		String ZZZ$, UUU$, XXX$, YYY$
		fileNum6 = FreeFile
		XXX = CX(P982)
		XXX$ = Str$(XXX)
		YYY = CY(P982)
		YYY$ = Str$(YYY)
		ZZZ = CZ(P982)
		ZZZ$ = Str$(ZZZ)
		UUU = CU(P982)
		UUU$ = Str$(UUU)
		AOpen "C:\log\Robot_POS8.txt" As #fileNum6
		LS_U = Val(Left$(Str$(CU(P982)), 6))
		LS_Z = Val(Left$(Str$(CZ(P982)), 6))
		
		If LS_U <> CU(P999) And LS_Z <> CZ(P999) Then  ''ZU			
			Print Time$, "Save POS Data", LS_U, LS_Z, "VS", CU(P999), CZ(P999)
			Write #fileNum6, Time$ + "Current_POS_is: " + "X:" + "" + XXX$ + "Y:" + "" + YYY$ + "Z:" + "" + ZZZ$ + "U:" + "" + UUU$ + CRLF
			Print Time$, "--- Current_POS_is: ", "X:", CX(P982), " ,", "Y:", CY(P982), " ,", "Z:", CZ(P982), " ,", "U:", CU(P982)
		EndIf

		Close #fileNum6
		
			
	Loop
	
Fend
Function Move_Current_POS
	Do
			
		Jump A2_Alignmnet_Ref
		BMove XY(100, 0, -58.888, -45) '锛堝湪鏈湴鍧愭爣绯讳腑锛夊悜 X 鏂瑰悜绉诲姩 100mm)
		Go A1_Alignmnet_Ref
		BGo XY(-80.88, 0, -18.888, -180) '锛堝湪鏈湴鍧愭爣绯讳腑锛夊悜 X 鏂瑰悜绉诲姩 100mm)
		
		
		Print "Running_"
		Wait 0.5

	Loop
Fend


----------------


XML



<?xml version="1.0" encoding="UTF-8"?>
<CalibInfo>
    <CalibInputParam>
        <CalibParam ParamName="CreateCalibTime" DataType="string">
            <ParamValue>2025-05-28 15:15:50</ParamValue>
        </CalibParam>
        <CalibParam ParamName="CalibType" DataType="string">
            <ParamValue>NPointCalib</ParamValue>
        </CalibParam>
        <CalibParam ParamName="TransNum" DataType="int">
            <ParamValue>9</ParamValue>
        </CalibParam>
        <CalibParam ParamName="RotNum" DataType="int">
            <ParamValue>0</ParamValue>
        </CalibParam>
        <CalibParam ParamName="CalibErrStatus" DataType="int">
            <ParamValue>0</ParamValue>
        </CalibParam>
        <CalibParam ParamName="TransError" DataType="float">
            <ParamValue>0.63482422</ParamValue>
        </CalibParam>
        <CalibParam ParamName="RotError" DataType="float">
            <ParamValue>-999</ParamValue>
        </CalibParam>
        <CalibParam ParamName="TransWorldError" DataType="float">
            <ParamValue>0.14751892</ParamValue>
        </CalibParam>
        <CalibParam ParamName="RotWorldError" DataType="float">
            <ParamValue>-999</ParamValue>
        </CalibParam>
        <CalibParam ParamName="PixelPrecisionX" DataType="float">
            <ParamValue>0.23190695</ParamValue>
        </CalibParam>
        <CalibParam ParamName="PixelPrecisionY" DataType="float">
            <ParamValue>0.2328483</ParamValue>
        </CalibParam>
        <CalibParam ParamName="PixelPrecision" DataType="float">
            <ParamValue>0.23237759</ParamValue>
        </CalibParam>
        <CalibPointFListParam ParamName="ImagePointLst" DataType="CalibPointList">
            <PointF>
                <X>1327.212</X>
                <Y>1867.099</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>1499.212</X>
                <Y>1867.099</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>1671.212</X>
                <Y>1867.099</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>1671.212</X>
                <Y>2039.99</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>1499.212</X>
                <Y>2039.99</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>1327.212</X>
                <Y>2039.99</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>1327.212</X>
                <Y>2212.1089</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>1499.212</X>
                <Y>2212.1089</Y>
                <R>0</R>
            </PointF>
            <PointF>
                <X>1671.212</X>
                <Y>2212.1089</Y>
                <R>0</R>
            </PointF>
        </CalibPointFListParam>
        <CalibPointFListParam ParamName="WorldPointLst" DataType="CalibPointList">
            <PointF>
                <X>-617.96002</X>
                <Y>210.513</Y>
                <R>-0.0572</R>
            </PointF>
            <PointF>
                <X>-617.96002</X>
                <Y>171.04201</Y>
                <R>-0.0502</R>
            </PointF>
            <PointF>
                <X>-617.96002</X>
                <Y>130.737</Y>
                <R>0.36719999</R>
            </PointF>
            <PointF>
                <X>-658.18103</X>
                <Y>130.737</Y>
                <R>-0.033399999</R>
            </PointF>
            <PointF>
                <X>-658.18103</X>
                <Y>171.04201</Y>
                <R>0.62330002</R>
            </PointF>
            <PointF>
                <X>-658.18103</X>
                <Y>210.513</Y>
                <R>-0.0502</R>
            </PointF>
            <PointF>
                <X>-698.29498</X>
                <Y>210.513</Y>
                <R>-0.044100001</R>
            </PointF>
            <PointF>
                <X>-698.29498</X>
                <Y>171.04201</Y>
                <R>-0.0502</R>
            </PointF>
            <PointF>
                <X>-698.29498</X>
                <Y>130.737</Y>
                <R>-0.050299998</R>
            </PointF>
        </CalibPointFListParam>
    </CalibInputParam>
    <CalibOutputParam>
        <CalibParam ParamName="RotDirectionState" DataType="int">
            <ParamValue>-999</ParamValue>
        </CalibParam>
        <CalibParam ParamName="IsRightCoorA" DataType="int">
            <ParamValue>1</ParamValue>
        </CalibParam>
        <PointF ParamName="RotCenterImagePoint" DataType="CalibPointF">
            <RotCenterImagePointX>0</RotCenterImagePointX>
            <RotCenterImagePointY>0</RotCenterImagePointY>
            <RotCenterImageR>-999</RotCenterImageR>
        </PointF>
        <PointF ParamName="RotCenterWorldPoint" DataType="CalibPointF">
            <RotCenterWorldPointX>0</RotCenterWorldPointX>
            <RotCenterWorldPointY>0</RotCenterWorldPointY>
            <RotCenterWorldR>-999</RotCenterWorldR>
        </PointF>
        <CalibFloatListParam ParamName="CalibMatrix" DataType="FloatList">
            <ParamValue>1.0378213e-008</ParamValue>
            <ParamValue>-0.2328483</ParamValue>
            <ParamValue>-183.20914</ParamValue>
            <ParamValue>-0.23190695</ParamValue>
            <ParamValue>1.3837616e-008</ParamValue>
            <ParamValue>518.30267</ParamValue>
            <ParamValue>0</ParamValue>
            <ParamValue>0</ParamValue>
            <ParamValue>1</ParamValue>
        </CalibFloatListParam>
    </CalibOutputParam>
</CalibInfo>


-------
Log

------

Robot_POS8.txt

------

16:23:02Current_POS_is: X:-314.753Y:616.983Z:-1.15851U:-46.6661
16:23:02Current_POS_is: X:-314.753Y:616.983Z:0U:-46.6661
16:23:02Current_POS_is: X:-315.445Y:616.573Z:0U:-46.6983
16:23:03Current_POS_is: X:-319.421Y:614.2Z:0U:-46.8835
16:23:03Current_POS_is: X:-328.906Y:608.389Z:0U:-47.3288
16:23:03Current_POS_is: X:-345.089Y:597.978Z:0U:-48.1002
16:23:03Current_POS_is: X:-367.301Y:582.605Z:0U:-49.1855
16:23:03Current_POS_is: X:-395.091Y:561.452Z:0U:-50.5927
16:23:03Current_POS_is: X:-427.586Y:533.66Z:0U:-52.322
16:23:04Current_POS_is: X:-464.631Y:497.217Z:0U:-54.4331
16:23:04Current_POS_is: X:-503.256Y:452.411Z:0U:-56.8494
16:23:04Current_POS_is: X:-541.461Y:398.722Z:0U:-59.5577
16:23:04Current_POS_is: X:-577.462Y:335.023Z:0U:-62.5859
16:23:04Current_POS_is: X:-608.746Y:260.713Z:0U:-65.9493
16:23:04Current_POS_is: X:-631.353Y:180.161Z:0U:-69.4695
16:23:04Current_POS_is: X:-643.63Y:95.3661Z:0U:-73.1071
16:23:05Current_POS_is: X:-644.804Y:13.7472Z:0U:-76.6043
16:23:05Current_POS_is: X:-636.519Y:-62.0863Z:0U:-79.9011
16:23:05Current_POS_is: X:-622.029Y:-126.618Z:0U:-82.7823
16:23:05Current_POS_is: X:-603.36Y:-182.898Z:0U:-85.3841
16:23:05Current_POS_is: X:-583.247Y:-229.421Z:0U:-87.6224
16:23:05Current_POS_is: X:-563.904Y:-266.375Z:0U:-89.4745
16:23:05Current_POS_is: X:-546.334Y:-295.469Z:0U:-90.9905
16:23:06Current_POS_is: X:-532.143Y:-316.599Z:0U:-92.13
16:23:06Current_POS_is: X:-521.884Y:-330.779Z:0U:-92.9156
16:23:06Current_POS_is: X:-515.96Y:-338.595Z:0U:-93.3565
16:23:06Current_POS_is: X:-513.74Y:-341.458Z:0U:-93.5195
16:23:06Current_POS_is: X:-513.506Y:-341.759Z:-0.0185186U:-93.5367
16:23:06Current_POS_is: X:-513.506Y:-341.759Z:-5.56465U:-93.5367
16:23:06Current_POS_is: X:-513.506Y:-341.759Z:-27.1635U:-93.5367
16:23:07Current_POS_is: X:-513.506Y:-341.759Z:-65.796U:-93.5367
16:23:07Current_POS_is: X:-513.506Y:-341.759Z:-119.245U:-93.5367
16:23:07Current_POS_is: X:-513.506Y:-341.759Z:-174.16U:-93.5367
16:23:07Current_POS_is: X:-513.506Y:-341.759Z:-214.787U:-93.5367
16:23:07Current_POS_is: X:-513.506Y:-341.759Z:-239.044U:-93.5367
16:23:07Current_POS_is: X:-513.506Y:-341.759Z:-246.737U:-93.5367
16:23:08Current_POS_is: X:-513.506Y:-341.759Z:-246.857U:-93.5367
16:23:08Current_POS_is: X:-513.506Y:-341.759Z:-246.857U:-93.5367
16:23:08Current_POS_is: X:-513.506Y:-341.759Z:-246.857U:-93.5367
16:23:08Current_POS_is: X:-513.506Y:-341.759Z:-246.857U:-93.5367
16:23:08Current_POS_is: X:-513.506Y:-341.759Z:-246.857U:-93.5367
16:23:08Current_POS_is: X:-513.506Y:-341.759Z:-246.816U:-93.5367
16:23:08Current_POS_is: X:-513.506Y:-341.759Z:-240.434U:-93.5367
16:23:09Current_POS_is: X:-513.506Y:-341.759Z:-218.177U:-93.5367
16:23:09Current_POS_is: X:-513.506Y:-341.759Z:-179.337U:-93.5367
16:23:09Current_POS_is: X:-513.506Y:-341.759Z:-125.482U:-93.5367
16:23:09Current_POS_is: X:-513.506Y:-341.759Z:-71.5614U:-93.5367
16:23:09Current_POS_is: X:-513.506Y:-341.759Z:-30.8904U:-93.5367
16:23:09Current_POS_is: X:-513.506Y:-341.759Z:-7.4557U:-93.5367
16:23:09Current_POS_is: X:-513.506Y:-341.759Z:-0.0955524U:-93.5367
16:23:10Current_POS_is: X:-513.661Y:-341.56Z:0U:-93.5253
16:23:10Current_POS_is: X:-515.567Y:-339.105Z:0U:-93.3855
16:23:10Current_POS_is: X:-521.14Y:-331.775Z:0U:-92.9714
16:23:10Current_POS_is: X:-530.998Y:-318.225Z:0U:-92.2191
16:23:10Current_POS_is: X:-545.059Y:-297.446Z:0U:-91.0957
16:23:10Current_POS_is: X:-562.163Y:-269.426Z:0U:-89.6308
16:23:11Current_POS_is: X:-581.644Y:-232.727Z:0U:-87.7851
16:23:11Current_POS_is: X:-601.517Y:-187.629Z:0U:-85.6077
16:23:11Current_POS_is: X:-620.181Y:-133.083Z:0U:-83.0763
16:23:11Current_POS_is: X:-635.531Y:-67.7324Z:0U:-80.1498
16:23:11Current_POS_is: X:-644.461Y:7.39738Z:0U:-76.8779
16:23:11Current_POS_is: X:-644.12Y:88.6258Z:0U:-73.3953
16:23:11Current_POS_is: X:-632.743Y:173.456Z:0U:-69.7588
16:23:12Current_POS_is: X:-610.915Y:254.427Z:0U:-66.2278
16:23:12Current_POS_is: X:-580.191Y:329.441Z:0U:-62.8439
16:23:12Current_POS_is: X:-543.981Y:394.755Z:0U:-59.7514
16:23:12Current_POS_is: X:-505.846Y:449.104Z:0U:-57.0215
16:23:12Current_POS_is: X:-467.15Y:494.527Z:0U:-54.5832
16:23:12Current_POS_is: X:-430.854Y:530.664Z:0U:-52.5016
16:23:12Current_POS_is: X:-397.555Y:559.466Z:0U:-50.7205
16:23:13Current_POS_is: X:-369.348Y:581.122Z:0U:-49.2872
16:23:13Current_POS_is: X:-346.394Y:597.11Z:0U:-48.1631
16:23:13Current_POS_is: X:-329.951Y:607.736Z:0U:-47.3782
16:23:13Current_POS_is: X:-319.96Y:613.875Z:0U:-46.9087
16:23:13Current_POS_is: X:-315.579Y:616.494Z:0U:-46.7046
16:23:13Current_POS_is: X:-314.754Y:616.982Z:0U:-46.6662
16:23:13Current_POS_is: X:-314.753Y:616.983Z:-0.992399U:-46.6661
16:23:14Current_POS_is: X:-314.753Y:616.983Z:-1.0916U:-46.6661
16:23:14Current_POS_is: X:-314.753Y:616.982Z:0U:-46.6657
16:23:14Current_POS_is: X:-315.535Y:616.3Z:0U:-46.2606
16:23:14Current_POS_is: X:-319.688Y:612.635Z:0U:-44.0954
16:23:14Current_POS_is: X:-328.958Y:604.215Z:0U:-39.1842
16:23:15Current_POS_is: X:-343.071Y:590.732Z:0U:-31.4865
16:23:15Current_POS_is: X:-361.537Y:571.748Z:0U:-20.9546
16:23:15Current_POS_is: X:-383.86Y:546.456Z:0U:-7.3885
16:23:15Current_POS_is: X:-408.368Y:515.08Z:0U:8.8501
16:23:15Current_POS_is: X:-434.353Y:476.38Z:0U:28.1956
16:23:15Current_POS_is: X:-459.27Y:431.653Z:0U:49.8868
16:23:16Current_POS_is: X:-481.25Y:381.955Z:0U:73.4594
16:23:16Current_POS_is: X:-497.629Y:332.754Z:0U:96.5273
16:23:16Current_POS_is: X:-508.205Y:287.801Z:0U:117.585
16:23:16Current_POS_is: X:-513.869Y:250.819Z:0U:135.029
16:23:16Current_POS_is: X:-516.437Y:221.392Z:0U:149.064
16:23:16Current_POS_is: X:-517.232Y:199.379Z:0U:159.689
16:23:16Current_POS_is: X:-517.216Y:184.436Z:0U:166.978
16:23:17Current_POS_is: X:-517.031Y:176.738Z:0U:170.76
16:23:17Current_POS_is: X:-516.961Y:174.687Z:0U:171.771
16:23:17Current_POS_is: X:-516.96Y:174.649Z:-0.729116U:171.79
16:23:17Current_POS_is: X:-516.96Y:174.649Z:-5.13782U:171.79
16:23:17Current_POS_is: X:-516.96Y:174.649Z:-6.66726U:171.79
16:23:17Current_POS_is: X:-516.96Y:174.649Z:-10.1453U:171.79
16:23:17Current_POS_is: X:-516.96Y:174.649Z:-28.8608U:171.79
16:23:18Current_POS_is: X:-516.96Y:174.649Z:-63.6448U:171.79
16:23:18Current_POS_is: X:-516.96Y:174.649Z:-115.632U:171.79
16:23:18Current_POS_is: X:-516.96Y:174.649Z:-171.785U:171.79
16:23:18Current_POS_is: X:-516.96Y:174.649Z:-214.051U:171.79
16:23:18Current_POS_is: X:-516.96Y:174.649Z:-238.851U:171.79
16:23:18Current_POS_is: X:-516.96Y:174.649Z:-247.221U:171.79
16:23:19Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:19Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:19Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:19Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:19Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:19Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:19Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:20Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:20Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:20Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:20Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:20Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:20Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:20Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:21Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:21Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:21Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:21Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:21Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:21Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:22Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:22Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:22Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:22Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:22Current_POS_is: X:-516.96Y:174.649Z:-247.388U:171.79
16:23:22Current_POS_is: X:-516.96Y:174.649Z:-247.378U:171.79
16:23:22Current_POS_is: X:-516.96Y:174.649Z:-242.061U:171.79
16:23:23Current_POS_is: X:-516.96Y:174.649Z:-220.449U:171.79
16:23:23Current_POS_is: X:-516.96Y:174.649Z:-182.062U:171.79
16:23:23Current_POS_is: X:-516.96Y:174.649Z:-127.285U:171.79
16:23:23Current_POS_is: X:-516.96Y:174.649Z:-72.5291U:171.79
16:23:23Current_POS_is: X:-516.96Y:174.649Z:-31.1693U:171.79
16:23:23Current_POS_is: X:-516.96Y:174.649Z:-7.42308U:171.79
16:23:23Current_POS_is: X:-516.96Y:174.649Z:-0.0832066U:171.79
16:23:24Current_POS_is: X:-517.327Y:174.648Z:0U:171.661
16:23:24Current_POS_is: X:-521.594Y:174.636Z:0U:170.163
16:23:24Current_POS_is: X:-532.681Y:174.548Z:0U:166.25
16:23:24Current_POS_is: X:-551.186Y:174.224Z:0U:159.649
16:23:24Current_POS_is: X:-576.315Y:173.417Z:0U:150.536
16:23:24Current_POS_is: X:-607.816Y:171.777Z:0U:138.841
16:23:24Current_POS_is: X:-645.537Y:168.829Z:0U:124.376
16:23:25Current_POS_is: X:-686.309Y:164.324Z:0U:108.066
16:23:25Current_POS_is: X:-726.314Y:158.405Z:0U:91.2227
16:23:25Current_POS_is: X:-762.695Y:151.545Z:0U:75.0015
16:23:25Current_POS_is: X:-794.618Y:144.174Z:0U:59.8732
16:23:25Current_POS_is: X:-820.994Y:136.966Z:0U:46.5806
16:23:25Current_POS_is: X:-842.98Y:130.047Z:0U:34.8176
16:23:26Current_POS_is: X:-860.503Y:123.84Z:0U:24.8979
16:23:26Current_POS_is: X:-874.503Y:118.368Z:0U:16.5535
16:23:26Current_POS_is: X:-885.006Y:113.922Z:0U:10.007
16:23:26Current_POS_is: X:-892.626Y:110.491Z:0U:5.08139
16:23:26Current_POS_is: X:-897.409Y:108.242Z:0U:1.9061
16:23:26Current_POS_is: X:-899.803Y:107.086Z:0U:0.289951
16:23:26Current_POS_is: X:-900.467Y:106.762Z:0U:-0.161026
16:23:27Current_POS_is: X:-900.491Y:106.751Z:-0.465809U:-0.177498
16:23:27Current_POS_is: X:-900.491Y:106.751Z:-10.0702U:-0.177498
16:23:27Current_POS_is: X:-900.491Y:106.751Z:-34.2614U:-0.177498
16:23:27Current_POS_is: X:-900.491Y:106.751Z:-73.8897U:-0.177498
16:23:27Current_POS_is: X:-900.491Y:106.751Z:-126.684U:-0.177498
16:23:27Current_POS_is: X:-900.491Y:106.751Z:-179.424U:-0.177498
16:23:27Current_POS_is: X:-900.491Y:106.751Z:-217.71U:-0.177498
16:23:28Current_POS_is: X:-900.491Y:106.751Z:-240.995U:-0.177498
16:23:28Current_POS_is: X:-900.491Y:106.751Z:-248.962U:-0.177498
16:23:28Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:28Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:28Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:28Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:29Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:29Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:29Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:29Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:29Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:29Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:29Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:30Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:30Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:30Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:30Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:30Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:30Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:30Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:31Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:31Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:31Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:31Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:31Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:31Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:31Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:32Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:32Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:32Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:32Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:23:32Current_POS_is: X:-900.491Y:106.751Z:-249.203U:-0.177498
16:23:32Current_POS_is: X:-900.491Y:106.751Z:-245.335U:-0.177498
16:23:33Current_POS_is: X:-900.491Y:106.751Z:-227.333U:-0.177498
16:23:33Current_POS_is: X:-900.491Y:106.751Z:-193.708U:-0.177498
16:23:33Current_POS_is: X:-900.491Y:106.751Z:-146.311U:-0.177498
16:23:33Current_POS_is: X:-900.491Y:106.751Z:-90.8966U:-0.177498
16:23:33Current_POS_is: X:-900.491Y:106.751Z:-46.1309U:-0.177498
16:23:33Current_POS_is: X:-900.491Y:106.751Z:-16.2019U:-0.177498
16:23:33Current_POS_is: X:-900.491Y:106.751Z:-1.97661U:-0.177498
16:23:34Current_POS_is: X:-900.49Y:106.752Z:0U:-0.177566
16:23:34Current_POS_is: X:-900.327Y:107.292Z:0U:-0.206978
16:23:34Current_POS_is: X:-899.45Y:110.158Z:0U:-0.363266
16:23:34Current_POS_is: X:-897.327Y:116.938Z:0U:-0.733913
16:23:34Current_POS_is: X:-893.548Y:128.511Z:0U:-1.37
16:23:34Current_POS_is: X:-887.814Y:145.007Z:0U:-2.28441
16:23:34Current_POS_is: X:-879.805Y:166.265Z:0U:-3.47748
16:23:35Current_POS_is: X:-869.119Y:192.052Z:0U:-4.94919
16:23:35Current_POS_is: X:-855.691Y:221.199Z:0U:-6.64923
16:23:35Current_POS_is: X:-837.999Y:255.371Z:0U:-8.69962
16:23:35Current_POS_is: X:-816.885Y:291.368Z:0U:-10.9385
16:23:35Current_POS_is: X:-790.397Y:330.939Z:0U:-13.5136
16:23:35Current_POS_is: X:-758.937Y:371.764Z:0U:-16.3268
16:23:36Current_POS_is: X:-721.865Y:413.22Z:0U:-19.3946
16:23:36Current_POS_is: X:-678.904Y:454.177Z:0U:-22.7082
16:23:36Current_POS_is: X:-632.953Y:491.188Z:0U:-26.045
16:23:36Current_POS_is: X:-583.407Y:524.558Z:0U:-29.4705
16:23:36Current_POS_is: X:-535.068Y:551.494Z:0U:-32.6888
16:23:36Current_POS_is: X:-489.903Y:572.198Z:0U:-35.6177
16:23:36Current_POS_is: X:-449.341Y:587.418Z:0U:-38.2039
16:23:37Current_POS_is: X:-413.436Y:598.377Z:0U:-40.4704
16:23:37Current_POS_is: X:-383.406Y:605.799Z:0U:-42.3569
16:23:37Current_POS_is: X:-358.575Y:610.765Z:0U:-43.9142
16:23:37Current_POS_is: X:-339.878Y:613.813Z:0U:-45.0871
16:23:37Current_POS_is: X:-326.299Y:615.658Z:0U:-45.9399
16:23:37Current_POS_is: X:-318.421Y:616.586Z:0U:-46.4353
16:23:37Current_POS_is: X:-315.213Y:616.934Z:0U:-46.6372
16:23:38Current_POS_is: X:-314.753Y:616.983Z:0U:-46.6661
16:23:38Current_POS_is: X:-314.753Y:616.983Z:-1.41928U:-46.6661
16:25:19Current_POS_is: X:-314.753Y:616.983Z:-1.44926U:-46.6661
16:25:19Current_POS_is: X:-314.753Y:616.983Z:-6.93581E-005U:-46.6661
16:25:19Current_POS_is: X:-315.267Y:616.534Z:0U:-46.3996
16:25:19Current_POS_is: X:-318.695Y:613.517Z:0U:-44.6149
16:25:19Current_POS_is: X:-327.122Y:605.912Z:0U:-40.1668
16:25:20Current_POS_is: X:-340.469Y:593.289Z:0U:-32.9301
16:25:20Current_POS_is: X:-358.547Y:574.946Z:0U:-22.7042
16:25:20Current_POS_is: X:-380.401Y:550.584Z:0U:-9.56747
16:25:20Current_POS_is: X:-404.964Y:519.734Z:0U:6.48009
16:25:20Current_POS_is: X:-430.544Y:482.532Z:0U:25.1653
16:25:20Current_POS_is: X:-456.054Y:438.06Z:0U:46.8166
16:25:20Current_POS_is: X:-478.356Y:389.423Z:0U:69.9434
16:25:21Current_POS_is: X:-495.621Y:339.916Z:0U:93.1768
16:25:21Current_POS_is: X:-507.059Y:293.985Z:0U:114.681
16:25:21Current_POS_is: X:-513.33Y:255.867Z:0U:132.634
16:25:21Current_POS_is: X:-516.275Y:225.312Z:0U:147.179
16:25:21Current_POS_is: X:-517.264Y:202.46Z:0U:158.187
16:25:21Current_POS_is: X:-517.332Y:186.33Z:0U:166.042
16:25:21Current_POS_is: X:-517.144Y:177.442Z:0U:170.404
16:25:22Current_POS_is: X:-517.054Y:174.728Z:0U:171.741
16:25:22Current_POS_is: X:-517.05Y:174.618Z:-0.380476U:171.795
16:25:22Current_POS_is: X:-517.05Y:174.618Z:-4.55121U:171.795
16:25:22Current_POS_is: X:-517.05Y:174.618Z:-6.66719U:171.795
16:25:22Current_POS_is: X:-517.05Y:174.618Z:-8.95037U:171.795
16:25:22Current_POS_is: X:-517.05Y:174.618Z:-25.3682U:171.795
16:25:23Current_POS_is: X:-517.05Y:174.618Z:-58.4717U:171.795
16:25:23Current_POS_is: X:-517.05Y:174.618Z:-108.738U:171.795
16:25:23Current_POS_is: X:-517.05Y:174.618Z:-164.866U:171.795
16:25:23Current_POS_is: X:-517.05Y:174.618Z:-208.929U:171.795
16:25:23Current_POS_is: X:-517.05Y:174.618Z:-236.226U:171.795
16:25:23Current_POS_is: X:-517.05Y:174.618Z:-246.861U:171.795
16:25:23Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:24Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:24Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:24Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:24Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:24Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:24Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:24Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:25Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:25Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:25Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:25Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:25Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:25Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:25Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:26Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:26Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:26Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:26Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:26Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:26Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:27Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:27Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:27Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:27Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:27Current_POS_is: X:-517.05Y:174.618Z:-247.388U:171.795
16:25:27Current_POS_is: X:-517.05Y:174.618Z:-243.767U:171.795
16:25:27Current_POS_is: X:-517.05Y:174.618Z:-225.077U:171.795
16:25:28Current_POS_is: X:-517.05Y:174.618Z:-189.439U:171.795
16:25:28Current_POS_is: X:-517.05Y:174.618Z:-136.74U:171.795
16:25:28Current_POS_is: X:-517.05Y:174.618Z:-80.0531U:171.795
16:25:28Current_POS_is: X:-517.05Y:174.618Z:-36.1483U:171.795
16:25:28Current_POS_is: X:-517.05Y:174.618Z:-9.88192U:171.795
16:25:28Current_POS_is: X:-517.05Y:174.618Z:-0.305338U:171.795
16:25:28Current_POS_is: X:-517.236Y:174.618Z:0U:171.73
16:25:29Current_POS_is: X:-520.652Y:174.609Z:0U:170.531
16:25:29Current_POS_is: X:-530.664Y:174.539Z:0U:167
16:25:29Current_POS_is: X:-548.11Y:174.263Z:0U:160.787
16:25:29Current_POS_is: X:-572.617Y:173.533Z:0U:151.922
16:25:29Current_POS_is: X:-603.284Y:172.028Z:0U:140.574
16:25:29Current_POS_is: X:-639.764Y:169.326Z:0U:126.653
16:25:30Current_POS_is: X:-680.81Y:164.992Z:0U:110.336
16:25:30Current_POS_is: X:-721.139Y:159.239Z:0U:93.4755
16:25:30Current_POS_is: X:-758.095Y:152.478Z:0U:77.1242
16:25:30Current_POS_is: X:-790.711Y:145.135Z:0U:61.7902
16:25:30Current_POS_is: X:-817.75Y:137.9Z:0U:48.271
16:25:30Current_POS_is: X:-840.335Y:130.918Z:0U:36.2782
16:25:30Current_POS_is: X:-858.601Y:124.539Z:0U:26.0066
16:25:31Current_POS_is: X:-873.028Y:118.963Z:0U:17.4563
16:25:31Current_POS_is: X:-883.907Y:114.399Z:0U:10.707
16:25:31Current_POS_is: X:-891.874Y:110.837Z:0U:5.57627
16:25:31Current_POS_is: X:-896.971Y:108.451Z:0U:2.20024
16:25:31Current_POS_is: X:-899.607Y:107.181Z:0U:0.422924
16:25:31Current_POS_is: X:-900.441Y:106.775Z:0U:-0.143543
16:25:31Current_POS_is: X:-900.491Y:106.751Z:-0.190573U:-0.177498
16:25:32Current_POS_is: X:-900.491Y:106.751Z:-7.93466U:-0.177498
16:25:32Current_POS_is: X:-900.491Y:106.751Z:-30.5308U:-0.177498
16:25:32Current_POS_is: X:-900.491Y:106.751Z:-68.3361U:-0.177498
16:25:32Current_POS_is: X:-900.491Y:106.751Z:-120.008U:-0.177498
16:25:32Current_POS_is: X:-900.491Y:106.751Z:-173.814U:-0.177498
16:25:32Current_POS_is: X:-900.491Y:106.751Z:-213.922U:-0.177498
16:25:32Current_POS_is: X:-900.491Y:106.751Z:-239.055U:-0.177498
16:25:33Current_POS_is: X:-900.491Y:106.751Z:-248.688U:-0.177498
16:25:33Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:33Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:33Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:33Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:33Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:34Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:34Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:34Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:34Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:34Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:34Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:34Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:35Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:35Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:35Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:35Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:35Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:35Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:35Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:36Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:36Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:36Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:36Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:36Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:36Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:37Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:37Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:37Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:37Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:37Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:25:37Current_POS_is: X:-900.491Y:106.751Z:-246.446U:-0.177498
16:25:37Current_POS_is: X:-900.491Y:106.751Z:-230.636U:-0.177498
16:25:38Current_POS_is: X:-900.491Y:106.751Z:-199.094U:-0.177498
16:25:38Current_POS_is: X:-900.491Y:106.751Z:-152.107U:-0.177498
16:25:38Current_POS_is: X:-900.491Y:106.751Z:-96.5659U:-0.177498
16:25:38Current_POS_is: X:-900.491Y:106.751Z:-49.7213U:-0.177498
16:25:38Current_POS_is: X:-900.491Y:106.751Z:-18.3343U:-0.177498
16:25:38Current_POS_is: X:-900.491Y:106.751Z:-2.56833U:-0.177498
16:25:38Current_POS_is: X:-900.491Y:106.751Z:0U:-0.177505
16:25:39Current_POS_is: X:-900.363Y:107.172Z:0U:-0.200443
16:25:39Current_POS_is: X:-899.594Y:109.689Z:0U:-0.337677
16:25:39Current_POS_is: X:-897.59Y:116.11Z:0U:-0.688557
16:25:39Current_POS_is: X:-894.099Y:126.86Z:0U:-1.27899
16:25:39Current_POS_is: X:-888.702Y:142.528Z:0U:-2.1464
16:25:39Current_POS_is: X:-881.137Y:162.857Z:0U:-3.28506
16:25:40Current_POS_is: X:-870.872Y:187.997Z:0U:-4.71592
16:25:40Current_POS_is: X:-857.725Y:216.983Z:0U:-6.40074
16:25:40Current_POS_is: X:-840.817Y:250.203Z:0U:-8.38516
16:25:40Current_POS_is: X:-820.037Y:286.274Z:0U:-10.6162
16:25:40Current_POS_is: X:-794.231Y:325.538Z:0U:-13.1541
16:25:40Current_POS_is: X:-763.967Y:365.622Z:0U:-15.8917
16:25:40Current_POS_is: X:-726.67Y:408.197Z:0U:-19.0093
16:25:41Current_POS_is: X:-684.912Y:448.848Z:0U:-22.2574
16:25:41Current_POS_is: X:-638.14Y:487.322Z:0U:-25.6771
16:25:41Current_POS_is: X:-589.384Y:520.857Z:0U:-29.0649
16:25:41Current_POS_is: X:-541.463Y:548.224Z:0U:-32.2686
16:25:41Current_POS_is: X:-495.165Y:569.995Z:0U:-35.2795
16:25:41Current_POS_is: X:-454.008Y:585.823Z:0U:-37.9079
16:25:41Current_POS_is: X:-417.91Y:597.136Z:0U:-40.1889
16:25:42Current_POS_is: X:-387.145Y:604.96Z:0U:-42.1222
16:25:42Current_POS_is: X:-361.557Y:610.224Z:0U:-43.7271
16:25:42Current_POS_is: X:-341.663Y:613.548Z:0U:-44.9751
16:25:42Current_POS_is: X:-327.476Y:615.51Z:0U:-45.866
16:25:42Current_POS_is: X:-319.021Y:616.519Z:0U:-46.3975
16:25:42Current_POS_is: X:-315.379Y:616.917Z:0U:-46.6267
16:25:42Current_POS_is: X:-314.753Y:616.983Z:0U:-46.6661
16:25:43Current_POS_is: X:-314.753Y:616.983Z:-1.15939U:-46.6661
16:31:26Current_POS_is: X:-314.753Y:616.983Z:-2.2067U:-46.6661
16:31:26Current_POS_is: X:-314.753Y:616.983Z:-0.49242U:-46.6661
16:31:27Current_POS_is: X:-314.787Y:616.953Z:0U:-46.6483
16:31:27Current_POS_is: X:-316.225Y:615.696Z:0U:-45.9024
16:31:27Current_POS_is: X:-321.534Y:610.987Z:0U:-43.1269
16:31:27Current_POS_is: X:-332.13Y:601.266Z:0U:-37.4812
16:31:27Current_POS_is: X:-347.425Y:586.417Z:0U:-29.0583
16:31:27Current_POS_is: X:-367.177Y:565.649Z:0U:-17.6305
16:31:27Current_POS_is: X:-390.298Y:538.668Z:0U:-3.29213
16:31:28Current_POS_is: X:-415.261Y:505.512Z:0U:13.7076
16:31:28Current_POS_is: X:-440.595Y:466.129Z:0U:33.2355
16:31:28Current_POS_is: X:-465.293Y:419.436Z:0U:55.7378
16:31:28Current_POS_is: X:-485.601Y:370.58Z:0U:78.8228
16:31:28Current_POS_is: X:-500.793Y:321.463Z:0U:101.825
16:31:28Current_POS_is: X:-509.983Y:278.731Z:0U:121.862
16:31:28Current_POS_is: X:-514.864Y:243.052Z:0U:138.728
16:31:29Current_POS_is: X:-516.91Y:215.428Z:0U:151.939
16:31:29Current_POS_is: X:-517.445Y:194.945Z:0U:161.851
16:31:29Current_POS_is: X:-517.343Y:181.828Z:0U:168.261
16:31:29Current_POS_is: X:-517.179Y:175.791Z:0U:171.23
16:31:29Current_POS_is: X:-517.139Y:174.642Z:0U:171.796
16:31:29Current_POS_is: X:-517.139Y:174.641Z:-1.57371U:171.797
16:31:29Current_POS_is: X:-517.139Y:174.641Z:-6.00313U:171.797
16:31:30Current_POS_is: X:-517.139Y:174.641Z:-6.7021U:171.797
16:31:30Current_POS_is: X:-517.139Y:174.641Z:-12.8751U:171.797
16:31:30Current_POS_is: X:-517.139Y:174.641Z:-35.0846U:171.797
16:31:30Current_POS_is: X:-517.139Y:174.641Z:-74.7296U:171.797
16:31:30Current_POS_is: X:-517.139Y:174.641Z:-128.806U:171.797
16:31:30Current_POS_is: X:-517.139Y:174.641Z:-182.867U:171.797
16:31:31Current_POS_is: X:-517.139Y:174.641Z:-220.832U:171.797
16:31:31Current_POS_is: X:-517.139Y:174.641Z:-242.174U:171.797
16:31:31Current_POS_is: X:-517.139Y:174.641Z:-247.38U:171.797
16:31:31Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:31Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:31Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:31Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:32Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:32Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:32Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:32Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:32Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:32Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:32Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:33Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:33Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:33Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:33Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:33Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:33Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:34Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:34Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:34Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:34Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:34Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:34Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:34Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:35Current_POS_is: X:-517.139Y:174.641Z:-247.388U:171.797
16:31:35Current_POS_is: X:-517.139Y:174.641Z:-247.229U:171.797
16:31:35Current_POS_is: X:-517.139Y:174.641Z:-238.912U:171.797
16:31:35Current_POS_is: X:-517.139Y:174.641Z:-214.039U:171.797
16:31:35Current_POS_is: X:-517.139Y:174.641Z:-171.54U:171.797
16:31:35Current_POS_is: X:-517.139Y:174.641Z:-115.431U:171.797
16:31:35Current_POS_is: X:-517.139Y:174.641Z:-61.6348U:171.797
16:31:36Current_POS_is: X:-517.139Y:174.641Z:-24.6034U:171.797
16:31:36Current_POS_is: X:-517.139Y:174.641Z:-4.51928U:171.797
16:31:36Current_POS_is: X:-517.139Y:174.641Z:-0.000716701U:171.797
16:31:36Current_POS_is: X:-517.929Y:174.64Z:0U:171.52
16:31:36Current_POS_is: X:-523.552Y:174.618Z:0U:169.543
16:31:36Current_POS_is: X:-536.19Y:174.496Z:0U:165.072
16:31:36Current_POS_is: X:-556.21Y:174.089Z:0U:157.905
16:31:37Current_POS_is: X:-582.747Y:173.132Z:0U:148.234
16:31:37Current_POS_is: X:-615.532Y:171.256Z:0U:135.981
16:31:37Current_POS_is: X:-653.747Y:168.03Z:0U:121.202
16:31:37Current_POS_is: X:-695.258Y:163.129Z:0U:104.419
16:31:37Current_POS_is: X:-734.617Y:156.966Z:0U:87.6397
16:31:37Current_POS_is: X:-770.452Y:149.874Z:0U:71.4393
16:31:38Current_POS_is: X:-800.415Y:142.679Z:0U:57.0427
16:31:38Current_POS_is: X:-826.106Y:135.433Z:0U:43.9243
16:31:38Current_POS_is: X:-846.881Y:128.72Z:0U:32.6679
16:31:38Current_POS_is: X:-863.815Y:122.587Z:0U:22.9691
16:31:38Current_POS_is: X:-876.904Y:117.378Z:0U:15.0867
16:31:38Current_POS_is: X:-886.777Y:113.14Z:0U:8.8801
16:31:38Current_POS_is: X:-893.816Y:109.938Z:0U:4.29939
16:31:39Current_POS_is: X:-898.073Y:107.924Z:0U:1.46041
16:31:39Current_POS_is: X:-900.044Y:106.969Z:0U:0.126427
16:31:39Current_POS_is: X:-900.485Y:106.753Z:0U:-0.17376
16:31:39Current_POS_is: X:-900.491Y:106.751Z:-1.24311U:-0.177498
16:31:39Current_POS_is: X:-900.491Y:106.751Z:-13.3227U:-0.177498
16:31:39Current_POS_is: X:-900.491Y:106.751Z:-41.1147U:-0.177498
16:31:39Current_POS_is: X:-900.491Y:106.751Z:-83.8271U:-0.177498
16:31:40Current_POS_is: X:-900.491Y:106.751Z:-138.745U:-0.177498
16:31:40Current_POS_is: X:-900.491Y:106.751Z:-187.895U:-0.177498
16:31:40Current_POS_is: X:-900.491Y:106.751Z:-223.656U:-0.177498
16:31:40Current_POS_is: X:-900.491Y:106.751Z:-243.629U:-0.177498
16:31:40Current_POS_is: X:-900.491Y:106.751Z:-249.173U:-0.177498
16:31:40Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:41Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:41Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:41Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:41Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:41Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:41Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:41Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:42Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:42Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:42Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:42Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:42Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:42Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:42Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:43Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:43Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:43Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:43Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:43Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:43Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:44Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:44Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:44Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:44Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:44Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:44Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:44Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:45Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:31:45Current_POS_is: X:-900.491Y:106.751Z:-249.144U:-0.177498
16:31:45Current_POS_is: X:-900.491Y:106.751Z:-243.16U:-0.177498
16:31:45Current_POS_is: X:-900.491Y:106.751Z:-222.242U:-0.177498
16:31:45Current_POS_is: X:-900.491Y:106.751Z:-185.702U:-0.177498
16:31:45Current_POS_is: X:-900.491Y:106.751Z:-135.211U:-0.177498
16:31:45Current_POS_is: X:-900.491Y:106.751Z:-81.3111U:-0.177498
16:31:46Current_POS_is: X:-900.491Y:106.751Z:-39.8239U:-0.177498
16:31:46Current_POS_is: X:-900.491Y:106.751Z:-12.6029U:-0.177498
16:31:46Current_POS_is: X:-900.491Y:106.751Z:-1.00493U:-0.177498
16:31:46Current_POS_is: X:-900.487Y:106.763Z:0U:-0.178184
16:31:46Current_POS_is: X:-900.249Y:107.547Z:0U:-0.220856
16:31:46Current_POS_is: X:-899.206Y:110.948Z:0U:-0.406323
16:31:46Current_POS_is: X:-896.885Y:118.325Z:0U:-0.80991
16:31:47Current_POS_is: X:-892.836Y:130.626Z:0U:-1.48669
16:31:47Current_POS_is: X:-886.885Y:147.57Z:0U:-2.42741
16:31:47Current_POS_is: X:-878.545Y:169.447Z:0U:-3.65762
16:31:47Current_POS_is: X:-867.635Y:195.436Z:0U:-5.14451
16:31:47Current_POS_is: X:-853.378Y:225.914Z:0U:-6.9283
16:31:47Current_POS_is: X:-835.626Y:259.653Z:0U:-8.96138
16:31:48Current_POS_is: X:-813.318Y:297.024Z:0U:-11.2987
16:31:48Current_POS_is: X:-786.864Y:335.828Z:0U:-13.8413
16:31:48Current_POS_is: X:-754.256Y:377.362Z:0U:-16.7273
16:31:48Current_POS_is: X:-715.885Y:419.34Z:0U:-19.8695
16:31:48Current_POS_is: X:-672.817Y:459.453Z:0U:-23.161
16:31:48Current_POS_is: X:-625.12Y:496.888Z:0U:-26.5971
16:31:48Current_POS_is: X:-576.113Y:528.96Z:0U:-29.9629
16:31:49Current_POS_is: X:-527.474Y:555.265Z:0U:-33.1858
16:31:49Current_POS_is: X:-482.994Y:575.01Z:0U:-36.0607
16:31:49Current_POS_is: X:-442.732Y:589.609Z:0U:-38.6223
16:31:49Current_POS_is: X:-408.198Y:599.784Z:0U:-40.8
16:31:49Current_POS_is: X:-378.695Y:606.822Z:0U:-42.6524
16:31:49Current_POS_is: X:-355.13Y:611.371Z:0U:-44.1302
16:31:49Current_POS_is: X:-336.91Y:614.243Z:0U:-45.2734
16:31:50Current_POS_is: X:-324.525Y:615.876Z:0U:-46.0514
16:31:50Current_POS_is: X:-317.563Y:616.681Z:0U:-46.4893
16:31:50Current_POS_is: X:-315.023Y:616.954Z:0U:-46.6491
16:31:50Current_POS_is: X:-314.753Y:616.983Z:-0.0191428U:-46.6661
16:31:50Current_POS_is: X:-314.753Y:616.983Z:-1.75074U:-46.6661
16:31:51Current_POS_is: X:-314.753Y:616.983Z:-2.2218U:-46.6661
16:31:51Current_POS_is: X:-314.753Y:616.983Z:-0.708077U:-46.6661
16:31:51Current_POS_is: X:-314.765Y:616.975Z:0U:-46.6696
16:31:51Current_POS_is: X:-315.891Y:616.263Z:0U:-46.9819
16:31:52Current_POS_is: X:-320.713Y:613.179Z:0U:-48.3243
16:31:52Current_POS_is: X:-330.217Y:606.93Z:0U:-50.9948
16:31:52Current_POS_is: X:-344.908Y:596.816Z:0U:-55.1908
16:31:52Current_POS_is: X:-363.979Y:582.81Z:0U:-60.7733
16:31:52Current_POS_is: X:-387.49Y:564.069Z:0U:-67.8933
16:31:52Current_POS_is: X:-414.212Y:540.558Z:0U:-76.3609
16:31:52Current_POS_is: X:-444.06Y:511.076Z:0U:-86.397
16:31:53Current_POS_is: X:-474.774Y:476.449Z:0U:-97.5402
16:31:53Current_POS_is: X:-504.699Y:437.385Z:0U:-109.471
16:31:53Current_POS_is: X:-530.89Y:397.424Z:0U:-121.138
16:31:53Current_POS_is: X:-551.872Y:359.995Z:0U:-131.689
16:31:53Current_POS_is: X:-567.386Y:327.928Z:0U:-140.501
16:31:53Current_POS_is: X:-579.148Y:300.087Z:0U:-148.016
16:31:54Current_POS_is: X:-587.407Y:278.007Z:0U:-153.902
16:31:54Current_POS_is: X:-593.052Y:261.303Z:0U:-158.319
16:31:54Current_POS_is: X:-596.418Y:250.546Z:0U:-161.15
16:31:54Current_POS_is: X:-597.966Y:245.363Z:0U:-162.51
16:31:54Current_POS_is: X:-598.3Y:244.223Z:0U:-162.809
16:31:54Current_POS_is: X:-598.302Y:244.216Z:-1.10915U:-162.811
16:31:54Current_POS_is: X:-598.302Y:244.216Z:-5.54273U:-162.811
16:31:55Current_POS_is: X:-598.302Y:244.216Z:-6.66851U:-162.811
16:31:55Current_POS_is: X:-598.302Y:244.216Z:-11.133U:-162.811
16:31:55Current_POS_is: X:-598.302Y:244.216Z:-30.6134U:-162.811
16:31:55Current_POS_is: X:-598.302Y:244.216Z:-66.9884U:-162.811
16:31:55Current_POS_is: X:-598.302Y:244.216Z:-118.335U:-162.811
16:31:55Current_POS_is: X:-598.302Y:244.216Z:-173.395U:-162.811
16:31:55Current_POS_is: X:-598.302Y:244.216Z:-214.181U:-162.811
16:31:56Current_POS_is: X:-598.302Y:244.216Z:-238.671U:-162.811
16:31:56Current_POS_is: X:-598.302Y:244.216Z:-247.132U:-162.811
16:31:56Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:56Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:56Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:56Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:57Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:57Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:57Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:57Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:57Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:57Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:57Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:58Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:58Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:58Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:58Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:58Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:58Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:58Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:59Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:59Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:59Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:59Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:59Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:59Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:31:59Current_POS_is: X:-598.302Y:244.216Z:-247.388U:-162.811
16:32:00Current_POS_is: X:-598.302Y:244.216Z:-247.387U:-162.811
16:32:00Current_POS_is: X:-598.302Y:244.216Z:-242.912U:-162.811
16:32:00Current_POS_is: X:-598.302Y:244.216Z:-223.312U:-162.811
16:32:00Current_POS_is: X:-598.302Y:244.216Z:-186.663U:-162.811
16:32:00Current_POS_is: X:-598.302Y:244.216Z:-134.775U:-162.811
16:32:00Current_POS_is: X:-598.302Y:244.216Z:-78.3869U:-162.811
16:32:01Current_POS_is: X:-598.302Y:244.216Z:-35.5499U:-162.811
16:32:01Current_POS_is: X:-598.302Y:244.216Z:-9.60328U:-162.811
16:32:01Current_POS_is: X:-598.302Y:244.216Z:-0.303766U:-162.811
16:32:01Current_POS_is: X:-598.418Y:244.199Z:0U:-162.761
16:32:01Current_POS_is: X:-600.608Y:243.87Z:0U:-161.819
16:32:01Current_POS_is: X:-607.361Y:242.812Z:0U:-158.904
16:32:01Current_POS_is: X:-619.26Y:240.788Z:0U:-153.728
16:32:02Current_POS_is: X:-635.642Y:237.657Z:0U:-146.514
16:32:02Current_POS_is: X:-657.162Y:232.915Z:0U:-136.865
16:32:02Current_POS_is: X:-682.715Y:226.306Z:0U:-125.122
16:32:02Current_POS_is: X:-712.398Y:217.193Z:0U:-111.032
16:32:02Current_POS_is: X:-743.592Y:205.788Z:0U:-95.5986
16:32:02Current_POS_is: X:-774.182Y:192.557Z:0U:-79.7037
16:32:02Current_POS_is: X:-801.446Y:178.805Z:0U:-64.751
16:32:03Current_POS_is: X:-825.209Y:165.073Z:0U:-50.9674
16:32:03Current_POS_is: X:-844.997Y:152.19Z:0U:-38.8297
16:32:03Current_POS_is: X:-861.178Y:140.52Z:0U:-28.3623
16:32:03Current_POS_is: X:-873.972Y:130.458Z:0U:-19.6715
16:32:03Current_POS_is: X:-884.052Y:121.94Z:0U:-12.5224
16:32:03Current_POS_is: X:-891.417Y:115.349Z:0U:-7.10554
16:32:04Current_POS_is: X:-896.483Y:110.617Z:0U:-3.27459
16:32:04Current_POS_is: X:-899.296Y:107.915Z:0U:-1.10705
16:32:04Current_POS_is: X:-900.354Y:106.884Z:0U:-0.2841
16:32:04Current_POS_is: X:-900.491Y:106.751Z:-0.00404589U:-0.177498
16:32:04Current_POS_is: X:-900.491Y:106.751Z:-4.24964U:-0.177498
16:32:04Current_POS_is: X:-900.491Y:106.751Z:-22.8185U:-0.177498
16:32:04Current_POS_is: X:-900.491Y:106.751Z:-56.4516U:-0.177498
16:32:05Current_POS_is: X:-900.491Y:106.751Z:-105.624U:-0.177498
16:32:05Current_POS_is: X:-900.491Y:106.751Z:-160.207U:-0.177498
16:32:05Current_POS_is: X:-900.491Y:106.751Z:-204.927U:-0.177498
16:32:05Current_POS_is: X:-900.491Y:106.751Z:-234.081U:-0.177498
16:32:05Current_POS_is: X:-900.491Y:106.751Z:-247.548U:-0.177498
16:32:05Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:05Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:06Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:06Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:06Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:06Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:06Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:06Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:06Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:07Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:07Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:07Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:07Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:07Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:07Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:08Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:08Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:08Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:08Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:08Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:08Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:08Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:09Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:09Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:09Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:09Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:09Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:09Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:09Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:10Current_POS_is: X:-900.491Y:106.751Z:-249.204U:-0.177498
16:32:10Current_POS_is: X:-900.491Y:106.751Z:-248.272U:-0.177498
16:32:10Current_POS_is: X:-900.491Y:106.751Z:-236.925U:-0.177498
16:32:10Current_POS_is: X:-900.491Y:106.751Z:-209.966U:-0.177498
16:32:10Current_POS_is: X:-900.491Y:106.751Z:-168.066U:-0.177498
16:32:10Current_POS_is: X:-900.491Y:106.751Z:-113.439U:-0.177498
16:32:11Current_POS_is: X:-900.491Y:106.751Z:-63.0648U:-0.177498
16:32:11Current_POS_is: X:-900.491Y:106.751Z:-27.0607U:-0.177498
16:32:11Current_POS_is: X:-900.491Y:106.751Z:-6.26584U:-0.177498
16:32:11Current_POS_is: X:-900.491Y:106.751Z:-0.0623298U:-0.177498
16:32:11Current_POS_is: X:-900.449Y:106.888Z:0U:-0.184944
16:32:11Current_POS_is: X:-899.96Y:108.495Z:0U:-0.272572
16:32:11Current_POS_is: X:-898.473Y:113.304Z:0U:-0.53508
16:32:12Current_POS_is: X:-895.487Y:122.649Z:0U:-1.04726
16:32:12Current_POS_is: X:-890.828Y:136.483Z:0U:-1.81072
16:32:12Current_POS_is: X:-884.064Y:155.195Z:0U:-2.85409
16:32:12Current_POS_is: X:-874.896Y:178.438Z:0U:-4.1687
16:32:12Current_POS_is: X:-862.717Y:206.348Z:0U:-5.77787
16:32:12Current_POS_is: X:-847.355Y:237.828Z:0U:-7.63866
16:32:12Current_POS_is: X:-828.127Y:272.77Z:0U:-9.77071
16:32:13Current_POS_is: X:-804.109Y:311.135Z:0U:-12.2084
16:32:13Current_POS_is: X:-775.36Y:351.189Z:0U:-14.8866
16:32:13Current_POS_is: X:-741.1Y:392.508Z:0U:-17.8313
16:32:13Current_POS_is: X:-701.297Y:433.679Z:0U:-21.0085
16:32:13Current_POS_is: X:-656.659Y:472.889Z:0U:-24.3462
16:32:13Current_POS_is: X:-608.639Y:508.345Z:0U:-27.745
16:32:13Current_POS_is: X:-558.983Y:538.817Z:0U:-31.1093
16:32:14Current_POS_is: X:-512.578Y:562.317Z:0U:-34.155
16:32:14Current_POS_is: X:-469.006Y:580.424Z:0U:-36.9543
16:32:14Current_POS_is: X:-430.953Y:593.318Z:0U:-39.3667
16:32:14Current_POS_is: X:-397.741Y:602.451Z:0U:-41.4571
16:32:14Current_POS_is: X:-370.446Y:608.522Z:0U:-43.1698
16:32:14Current_POS_is: X:-348.423Y:612.493Z:0U:-44.551
16:32:15Current_POS_is: X:-332.285Y:614.883Z:0U:-45.5638
16:32:15Current_POS_is: X:-321.589Y:616.225Z:0U:-46.236
16:32:15Current_POS_is: X:-316.257Y:616.823Z:0U:-46.5714
16:32:15Current_POS_is: X:-314.804Y:616.977Z:0U:-46.6629
16:32:15Current_POS_is: X:-314.753Y:616.983Z:-0.336503U:-46.6661
16:32:15Current_POS_is: X:-314.753Y:616.983Z:-2.16601U:-46.6661
16:32:59Current_POS_is: X:-314.753Y:616.983Z:-2.17345U:-46.6661
16:32:59Current_POS_is: X:-314.753Y:616.983Z:-0.377586U:-46.6661
16:32:59Current_POS_is: X:-314.806Y:616.946Z:0U:-46.6454
16:32:59Current_POS_is: X:-316.384Y:615.839Z:0U:-46.0324
16:32:59Current_POS_is: X:-322.072Y:611.793Z:0U:-43.81
16:33:00Current_POS_is: X:-332.952Y:603.802Z:0U:-39.5032
16:33:00Current_POS_is: X:-348.86Y:591.492Z:0U:-33.0634
16:33:00Current_POS_is: X:-369.05Y:574.717Z:0U:-24.6189
16:33:00Current_POS_is: X:-393.104Y:552.863Z:0U:-14.0978
16:33:00Current_POS_is: X:-420.628Y:524.983Z:0U:-1.31568
16:33:00Current_POS_is: X:-449.868Y:491.297Z:0U:13.374
16:33:00Current_POS_is: X:-479.506Y:451.668Z:0U:29.847
16:33:01Current_POS_is: X:-507.424Y:407.389Z:0U:47.482
16:33:01Current_POS_is: X:-530.844Y:362.519Z:0U:64.7481
16:33:01Current_POS_is: X:-548.607Y:321.006Z:0U:80.3364
16:33:01Current_POS_is: X:-561.201Y:285.04Z:0U:93.6339
16:33:01Current_POS_is: X:-569.704Y:255.524Z:0U:104.45
16:33:01Current_POS_is: X:-575.366Y:231.876Z:0U:113.076
16:33:02Current_POS_is: X:-578.828Y:214.828Z:0U:119.283
16:33:02Current_POS_is: X:-580.768Y:203.957Z:0U:123.239
16:33:02Current_POS_is: X:-581.539Y:199.277Z:0U:124.941
16:33:02Current_POS_is: X:-581.671Y:198.457Z:0U:125.24
16:33:02Current_POS_is: X:-581.671Y:198.457Z:-1.81436U:125.24
16:33:02Current_POS_is: X:-581.671Y:198.457Z:-6.12062U:125.24
16:33:02Current_POS_is: X:-581.671Y:198.457Z:-6.74707U:125.24
16:33:03Current_POS_is: X:-581.671Y:198.457Z:-13.6557U:125.24
16:33:03Current_POS_is: X:-581.671Y:198.457Z:-36.8856U:125.24
16:33:03Current_POS_is: X:-581.671Y:198.457Z:-76.3716U:125.24
16:33:03Current_POS_is: X:-581.671Y:198.457Z:-130.194U:125.24
16:33:03Current_POS_is: X:-581.671Y:198.457Z:-182.89U:125.24
16:33:03Current_POS_is: X:-581.671Y:198.457Z:-220.942U:125.24
16:33:03Current_POS_is: X:-581.671Y:198.457Z:-241.92U:125.24
16:33:04Current_POS_is: X:-581.671Y:198.457Z:-247.376U:125.24
16:33:04Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:04Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:04Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:04Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:04Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:05Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:05Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:05Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:05Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:05Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:05Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:05Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:06Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:06Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:06Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:06Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:06Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:06Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:06Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:07Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:07Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:07Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:07Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:07Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:07Current_POS_is: X:-581.671Y:198.457Z:-247.388U:125.24
16:33:07Current_POS_is: X:-581.671Y:198.457Z:-247.251U:125.24
16:33:08Current_POS_is: X:-581.671Y:198.457Z:-239.561U:125.24
16:33:08Current_POS_is: X:-581.671Y:198.457Z:-215.704U:125.24
10:59:58Current_POS_is: X:-784.596Y:338.923Z:0U:-14.0501
10:59:58Current_POS_is: X:-734.946Y:399.312Z:0U:-18.3377
10:59:59Current_POS_is: X:-672.786Y:459.48Z:0U:-23.1633
10:59:59Current_POS_is: X:-602.999Y:512.106Z:0U:-28.1339
10:59:59Current_POS_is: X:-530.989Y:553.534Z:0U:-32.956
10:59:59Current_POS_is: X:-466.884Y:581.214Z:0U:-37.0895
10:59:59Current_POS_is: X:-412.64Y:598.594Z:0U:-40.5205
10:59:59Current_POS_is: X:-370.692Y:608.473Z:0U:-43.1543
11:00:00Current_POS_is: X:-340.279Y:613.754Z:0U:-45.062
11:00:00Current_POS_is: X:-322.278Y:616.145Z:0U:-46.1927
11:00:00Current_POS_is: X:-315.366Y:616.918Z:0U:-46.6275
11:00:00Current_POS_is: X:-314.753Y:616.983Z:-0.155224U:-46.6661



-----
"C:\Log\Vision_Data_Log6_11.txt"
-----



1-Tim-585.745Tim247.592Tim0.000240271TimOKTim888888

1-Tim-535.731Tim154.554Tim-0.00111218TimOKTim888888



1-Tim-536.127Tim154.257Tim-0.994027TimOKTim888888
1-Tim-536.117Tim154.257Tim-0.997661TimOKTim888888
1-Tim-534.097Tim153.661Tim0.00269292TimOKTim888888
1-Tim-515.64Tim175.138Tim-171.722TimOKTim888888
1-Tim-515.691Tim175.035Tim-171.728TimOKTim888888
1-Tim-515.811Tim174.853Tim-171.732TimOKTim888888
1-Tim-515.912Tim174.851Tim-171.741TimOKTim888888
1-Tim-515.979Tim174.901Tim-171.739TimOKTim888888
1-Tim-516.059Tim174.9Tim-171.742TimOKTim888888
1-Tim-516.145Tim174.873Tim-171.748TimOKTim888888

1-Tim-516.228Tim174.815Tim-171.753TimOKTim888888
1-Tim-516.305Tim174.81Tim-171.756TimOKTim888888


1-Tim-516.414Tim174.754Tim-171.761TimOKTim888888
1-Tim-516.498Tim174.773Tim-171.766TimOKTim888888
1-Tim-516.586Tim174.746Tim-171.77TimOKTim888888
1-Tim-516.661Tim174.759Tim-171.773TimOKTim888888
1-Tim-516.755Tim174.688Tim-171.778TimOKTim888888
1-Tim-516.835Tim174.701Tim-171.78TimOKTim888888
1-Tim-516.94Tim174.688Tim-171.788TimOKTim888888

1-Tim-516.958Tim174.647Tim-171.79TimOKTim888888

1-Tim-517.049Tim174.616Tim-171.795TimOKTim888888
1-Tim-517.138Tim174.639Tim-171.797TimOKTim888888
1-Tim-598.301Tim244.214Tim162.811TimOKTim888888
1-Tim-581.669Tim198.453Tim-125.24TimOKTim888888
1-Tim-581.722Tim198.492Tim-125.249TimOKTim888888
1-Tim-581.79Tim198.538Tim-125.257TimOKTim888888
1-Tim-560.69Tim185.038Tim-148.774TimOKTim888888
1-Tim-560.797Tim185.046Tim-148.781TimOKTim888888

1-Tim-560.875Tim185.06Tim-148.787TimOKTim888888
1-Tim-560.977Tim185.062Tim-148.796TimOKTim888888
1-Tim-561.075Tim185.073Tim-148.802TimOKTim888888
1-Tim-561.177Tim185.099Tim-148.809TimOKTim888888
1-Tim-547.9Tim173.03Tim-151.873TimOKTim888888
1-Tim-548.016Tim173.011Tim-151.879TimOKTim888888
1-Tim-565.581Tim226.013Tim148.683TimOKTim888888
1-Tim-558.79Tim249.687Tim52.4978TimOKTim888888
1-Tim-558.744Tim249.661Tim52.4903TimOKTim888888
1-Tim-558.724Tim249.631Tim52.4909TimOKTim888888
1-Tim-558.658Tim249.616Tim52.4947TimOKTim888888
1-Tim-558.653Tim249.567Tim52.4948TimOKTim888888
1-Tim-558.578Tim249.552Tim52.4899TimOKTim888888
1-Tim-558.544Tim249.517Tim52.4838TimOKTim888888
1-Tim-538.038Tim256.187Tim8.6388TimOKTim888888
1-Tim-527.814Tim254.896Tim-36.7662TimOKTim888888

1-Tim-527.809Tim254.968Tim-36.7734TimOKTim888888

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2393062.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WWW22-可解释推荐|用于推荐的神经符号描述性规则学习

论文来源&#xff1a;WWW 2022 论文链接&#xff1a;https://web.archive.org/web/20220504023001id_/https://dl.acm.org/doi/pdf/10.1145/3485447.3512042 最近读到一篇神经符号集成的论文24年底TOIS的&#xff0c;神经符号集成是人工智能领域中&#xff0c;将符号推理与深…

Linux:shell脚本常用命令

一、设置主机名称 1、查看主机名称 2、用文件的方式更改主机名称 重启后&#xff1a; 3、 通过命令修改主机名 重启后&#xff1a; 二、网络管理命令 1、查看网卡 2、设置网卡 &#xff08;1&#xff09;网卡未被设置过时 &#xff08;2&#xff09;当网卡被设定&#xff0c…

OpenTelemetry × Elastic Observability 系列(一):整体架构介绍

本文是 OpenTelemetry Elastic Observability 系列的第一篇&#xff0c;将介绍 OpenTelemetry Demo 的整体架构&#xff0c;以及如何集成 Elastic 来采集和可视化可观测性数据。后续文章将分别针对不同编程语言&#xff0c;深入讲解 OpenTelemetry 的集成实践。 程序架构 Op…

STM32高级物联网通信之以太网通讯

目录 以太网通讯基础知识 什么是以太网 互联网和以太网的区别 1&#xff09;概念与范围 &#xff08;1&#xff09;互联网 &#xff08;2&#xff09;以太网 2&#xff09;技术特点 &#xff08;1&#xff09;互联网 &#xff08;2&#xff09;以太网 3&#xff09;应…

历年西安交通大学计算机保研上机真题

2025西安交通大学计算机保研上机真题 2024西安交通大学计算机保研上机真题 2023西安交通大学计算机保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/school 计算圆周率近似值 题目描述 根据公式 π / 4 1 − 1 / 3 1 / 5 − 1 / 7 … \pi / 4 1 - 1/3 1/5 - …

基本数据指针的解读-C++

1、引言 笔者认为对于学习指针要弄清楚如下问题基本可以应付大部分的场景&#xff1a; ① 指针是什么&#xff1f; ② 指针的类型是什么&#xff1f; ③ 指针指向的类型是什么&#xff1f; ④ 指针指向了哪里&#xff1f; 2、如何使用指针 使用时的步骤如下&#xff1a; ① …

基于多模态脑电、音频与视觉信号的情感识别算法【Nature核心期刊,EAV:EEG-音频-视频数据集】

简述 理解情感状态对于开发下一代人机交互界面至关重要。社交互动中的人类行为会引发受感知输入影响的心理生理过程。因此&#xff0c;探索大脑功能与人类行为的努力或将推动具有类人特质人工智能模型的发展。这里原作者推出一个多模态情感数据集&#xff0c;包含42名参与者的3…

【QueryServer】dbeaver使用phoenix连接Hbase(轻客户端方式)

一、轻客户端连接方式 (推荐) 演示无认证配置方式, 有认证填入下方有认证参数即可 1, 新建连接 → Hadoop/大数据 → Apache Phoenix 2, 手动配置QueryServer驱动: 填入: “类名”, “URL模版”(注意区分有无认证), “端口号”, (勾选无认证) 类名: org.apache.phoenix…

[9-1] USART串口协议 江协科技学习笔记(13个知识点)

1 2 3 4全双工就是两个数据线&#xff0c;半双工就是一个数据线 5 6 7 8 9 10 TTL&#xff08;Transistor-Transistor Logic&#xff09;电平是一种数字电路中常用的电平标准&#xff0c;它使用晶体管来表示逻辑状态。TTL电平通常指的是5V逻辑电平&#xff0c;其中&#xff1a;…

Oracle基础知识(五)——ROWID ROWNUM

目录 一、ROWID 伪列 二、ROWNUM——限制查询结果集行数 1.ROWNUM使用介绍 2.使用ROWNUM进行分页查询 3.使用ROWNUM查看薪资前五位的员工 4.查询指定条数直接的数据 三、ROWNUM与ROWID不同 一、ROWID 伪列 表中的每一行在数据文件中都有一个物理地址&#xff0c;ROWID…

EMS只是快递那个EMS吗?它跟能源有什么关系?

在刚刚落幕的深圳人工智能终端展上&#xff0c;不少企业展示了与数字能源相关的技术和服务&#xff0c;其中一项关键系统——EMS&#xff08;Energy Management System&#xff0c;能量管理系统&#xff09;频频亮相。这个看似低调的名字&#xff0c;实际上正悄然成为未来能源管…

日志技术-LogBack、Logback快速入门、Logback配置文件、Logback日志级别

一. 日志技术 1. 程序中的日志&#xff0c;是用来记录应用程序的运行信息、状态信息、错误信息等。 2. JUL&#xff1a;(java.util.logging)这是JavaSE平台提供的官方日志框架&#xff0c;也被称为JUL。配置相对简单&#xff0c;但不够灵活&#xff0c;性能较差。 3.Logs4j&…

修改Cinnamon主题

~/.themes/Brunnera-Dark/cinnamon/cinnamon.css 1.修改 Tooltip 圆角大小&#xff0c;边框颜色&#xff0c;背景透明度 #Tooltip { border-radius: 10px; color: rgba(255, 255, 255, 0.8); border: 1px solid rgba(255, 255, 255, 0.6); background-color: rgba(0,…

91.评论日记

2025年5月30日20:27:06 AI画减速器图纸&#xff1f; 呜呜为什么读到机械博士毕业了才有啊 | 新迪数字2025新品发布会 | AI工业软件 | 三维CAD | 国产自主_哔哩哔哩_bilibili

HTML5实现简洁的端午节节日网站源码

HTML5实现简洁的端午节节日网站源码 前言一、设计来源1.1 网站首页界面1.2 端午由来界面1.3 节日活动界面1.4 传统美食界面1.5 民俗文化界面1.6 登录界面1.7 注册界面 二、效果和源码2.1 动态效果2.2 源代码 结束语 HTML5实现简洁的端午节节日网站源码&#xff0c;酷炫的大气简…

Window10+ 安装 go环境

一、 下载 golang 源码&#xff1a; 去官网下载&#xff1a; https://go.dev/dl/ &#xff0c;当前时间&#xff08;2025-05&#xff09;最新版本如下: 二、 首先在指定的磁盘下创建几个文件夹 比如在 E盘创建 software 文件夹 E:\SoftWare,然后在创建如下几个文件夹 E:\S…

一、Sqoop历史发展及原理

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月30日 专栏&#xff1a;Sqoop教程 在大数据时代&#xff0c;数据往往分散存储在各种不同类型的系统中。其中&#xff0c;传统的关系型数据库 (RDBMS) 如 MySQL, Oracle, PostgreSQL 等&#xff0c;仍然承载着大量的关键业务…

React 编译器 RC

&#x1f916; 作者简介&#xff1a;水煮白菜王&#xff0c;一位前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧和知识归纳总结✍。 感谢支持&#x1f495;&#x1f495;&#…

关于表连接

目录 1.左连接 2.右连接 3.内连接 4.全外连接 5.笛卡尔积 -- 创建表A CREATE TABLE A(PNO VARCHAR2(10) PRIMARY KEY, PAMT NUMBER, A_DATE DATE);-- 向表A插入数据 INSERT INTO A VALUES (01001, 100, TO_DATE(2005-01-01, YYYY-MM-DD)); INSERT INTO A VALUES (010…

【计算机网络】fork()+exec()创建新进程(僵尸进程及孤儿进程)

文章目录 一、基本概念1. fork() 系统调用2. exec() 系列函数 二、典型使用场景1. 创建子进程执行新程序2. 父子进程执行不同代码 三、核心区别与注意事项四、组合使用技巧1. 重定向子进程的输入/输出2. 创建多级子进程 五、常见问题与解决方案僵尸进程&#xff08;Zombie Proc…