优化版本,增加3D 视觉 查看前面的记录
上图先
运来的超出发表上限,重新发。。。
#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 = widgetself.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 = rootself.parent = parentclass 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.1self.robot_port = 2009 #2004self.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 = Noneself.last_y79_state = False # 新增状态缓存self.last_X2F_state = True # 新增状态缓存self.setup_plc()self.start_plc_monitoring()self.init_plc_connection() # PLC运行self.run_button = Noneself.image_label = Noneself.images = []self.image_index = 0 # 确保在类初始化时设置默认值###开启程序后自动启动项目self.connect_to_vision()self.connect_to_robot()###开启程序后自动加载offsetself.load_settings()# 修改窗口关闭事件处理self.root.protocol("WM_DELETE_WINDOW", self.on_exit)# 数据存储 Chartself.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) # 避免直接递归调用returntry:img = self.images[self.image_index]self.image_label.config(image=img)self.image_label.image = imglogging.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_modeif 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):# 运行按钮点击事件处理passdef 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_modeif 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):# 运行按钮点击事件处理passdef 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.axesax.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.axesax.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 = 1000window_height = 600screen_width = chart_window.winfo_screenwidth()screen_height = chart_window.winfo_screenheight()x = (screen_width - window_width) // 2y = (screen_height - window_height) // 2chart_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 = 100colors = 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秒后重试(替换递归)returnif 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) # 左对齐并减小间距##Timstart_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)# ---新---区域22blank_frame = tk.Frame(left_frame, bg='#FFFFFF', height=10) # 高度为10像素blank_frame.pack(fill=tk.X, pady=120) # 填充整个宽度并增加间距# ---新---区域33blank_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 = 800window_height = 600screen_width = new_window.winfo_screenwidth()screen_height = new_window.winfo_screenheight()x = (screen_width - window_width) // 2y = (screen_height - window_height) // 2new_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 attributestatus_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 #CCCCCCmiddle_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) # 避免直接递归调用returntry:img = self.images[self.image_index]self.image_label.config(image=img)self.image_label.image = imglogging.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}")returnimages = []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)# 统一的写入按钮 ###Timwrite_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 commandcustom_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 commandcustom_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 commandcustom_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 Truetry:float(value)return Trueexcept ValueError:return Falsedef 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") ##OutofRangdef 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 Homedef 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 Homedef 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:returntry:# 数值有效性验证float(value)except ValueError:messagebox.showerror("Error", "Pls Inpout Number")#messagebox.showerror("输入错误", "请输入有效的数字")returnif 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_statuslogging.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.533TimOKTim88888888x_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 = Trueself.start_button.config(state=tk.NORMAL)logging.info("Home position received - Start enabled")elif 'NotHome' in data:self.home_received = Falseself.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 = Responseif 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): #visionif 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_UABCDEFG=0if 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}")##Offsetdef 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) ##Timdef 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 = Noneexcept 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 = Nonedef 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_commandself.start_auto_command() ###Tim Modifyself.last_y79_state = current_stateif 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_state3else:#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 0if 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+=1print(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().IsSuccessexcept:return Falsedef 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 = Truetry:self.Recive_PLC_start_command() # 执行主流程finally:self._is_running = Falsedef _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 NoneOffset_Y = float(self.custom_command_entry6.get()) if self.custom_command_entry6.get() else NoneOffset_U = float(self.custom_command_entry7.get()) if self.custom_command_entry7.get() else Noneexcept 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 repos_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 repos_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 dataexcept 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}")returntrajectory_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 rcParamsrcParams['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 = Trueax.xaxis.pane.set_alpha(0.94)ax.yaxis.pane.fill = Trueax.yaxis.pane.set_alpha(0.90)ax.zaxis.pane.fill = Trueax.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 cmcolors = [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, traildef 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, trailfrom matplotlib.animation import FuncAnimationani = 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:returnif 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/ pyautoguiif __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_IndexFunction mainMotor OnPower HighSpeed 100 'Go Speed Tim on High ,Off Low SpeedS 2000 'MAX 2000Print "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 'NoPauseWelcomeXqt 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_212GoTo lblOpenPort
lblOpenPort:CloseNet #212Print "Waiting Servers Open ", Time$SetNet #212, "192.168.0.150", 7777, CRLF, NONE, 0OpenNet #212 As ClientWaitNet #212Print "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.005055TimDo'MemOn 18If MemSw(18) = Off ThenWait 0.6Status_212 = ChkNet(212)Print "Recive data Len/Status is ", Status_212If Status_212 > 0 And Status_212 < 62 ThenRead #212, Data_212$, Status_212Print "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 18ElseIf Status_212 > 62 ThenPrint "Recive len is so long"String msg2$, title2$Integer mFlag2s, answer2msg2$ = "Recive len is so long" + CRLFmsg2$ = msg2$ + "Press Y or N to Exit..." + CRLFmsg2$ = msg2$ + "Press N or Y to Exit..." + CRLFtitle2$ = "Recive Title"mFlag2s = MB_YESNO + MB_ICONQUESTIONMsgBox msg2$, mFlag2s, title2$, answer2If answer2 = IDNO Or answer2 = IDYES ThenQuit AllEndIfExit DoElseIf Status_212 = -3 ThenMemOff 2 'Ethernet Connect StatusPrint "Ethernet is Close,Pls Check it...", Time$GoTo lblOpenPortEndIfEndIfIf MemSw(18) = On ThenWait 0.022ParseStr 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)=PitchIf Order = 0 ThenPrint "Home Pos Send", P986Print #212, "Home Pos Send", P986Go P986 'Home_RefElseIf Order = 1 ThenPrint "Go Ref_A1"Wait 0.3P987 = RealPosPrint #212, "Go Ref_A1", P987Go P985 'A1_RefElseIf Order = 2 ThenPrint "Go Ref_A2"Wait 0.3P987 = RealPosPrint #212, "Go Ref_A2", P987Go P984 'A2_Ref EndIfWait 0.88
'CX_Here = CX(Here)CY_Here = CY(Here)CZ_Here = CZ(Here)CU_Here = CU(Here)Print "Now pos is :", HereData_212_Start$ = PData_212$(0)If Data_212_Start$ = "UP" ThenPrint "Recive UP = ", Data_212_Start$Go XY(CX(Here) + Pitch, CY(Here), CZ(Here), CU(Here))Print "Now pos is :", HereElseIf Data_212_Start$ = "LEF" ThenPrint "Recive Left = ", Data_212_Start$Go XY(CX(Here), CY(Here) + Pitch, CZ(Here), CU(Here))Print "Now pos is :", HereElseIf Data_212_Start$ = "RIGH" ThenPrint "Recive Right = ", Data_212_Start$Go XY(CX(Here), CY(Here) - Pitch, CZ(Here), CU(Here))Print "Now pos is :", HereElseIf Data_212_Start$ = "DOWN" ThenPrint "Recive Down = ", Data_212_Start$Go XY(CX(Here) - Pitch, CY(Here), CZ(Here), CU(Here))Print "Now pos is :", HereElseIf Data_212_Start$ = "CW" ThenPrint "Recive CW = ", Data_212_Start$Go XY(CX(Here), CY(Here), CZ(Here), CU(Here) - Pitch)Print "Now pos is :", HereElseIf Data_212_Start$ = "CCW" ThenPrint "Recive CCW = ", Data_212_Start$Go XY(CX(Here), CY(Here), CZ(Here), CU(Here) + Pitch)Print "Now pos is :", HereElseIf Data_212_Start$ = "SAVE" ThenPrint "Saving Aligment OK Pos ", HereString msg$, title$Integer mFlags, answermsg$ = "Save Pos" + CRLFmsg$ = msg$ + "Are U Sure?"title$ = "Setting 2 Save"mFlags = MB_YESNO + MB_ICONQUESTIONMsgBox msg$, mFlags, title$, answerIf answer = IDNO ThenQuit AllElseIf answer = IDYES ThenPLabel 988, "Aligment"Here P988Print "Save Pos ", CRLF, HerePrint #212, "Save Pos ", CRLF, HereEndIfEndIfSavePoints "rbtPoints_212.pts"Print "Eecive data OK...Start 2 Waiting Order..."MemOff 18 'CleanEndIfPrint #212, "---", Time$Print "---", Time$MemOff 18 'CleanLoopErrorHandle:'errnum = ErrPrint "ERROR", errnumQuit All
FendFunction WelcomeDoIf MemSw(2) = Off ThenPrint "Welcome 2 Use"String msg$, title$Integer mFlags, answermsg$ = "Welcome 2 Use" + CRLFmsg$ = msg$ + "Do not Press Or Press Y to Continue..." + CRLFmsg$ = msg$ + "Press N to Exit..." + CRLFtitle$ = "Robot Control Tool"mFlags = MB_YESNO + MB_ICONQUESTIONMsgBox msg$, mFlags, title$, answerIf answer = IDNO ThenQuit AllEndIfEndIf'CloseNet #212Exit DoLoop
Fend
Function Recive_lendayu62DoIf Status_212 > 62 ThenPrint "Recive len is so long"String msg$, title$Integer mFlags, answermsg$ = "Recive len is so long" + CRLFmsg$ = msg$ + "Press Y to Continue..." + CRLFmsg$ = msg$ + "Press N to Exit..." + CRLFtitle$ = "Recive Title"mFlags = MB_YESNO + MB_ICONQUESTIONMsgBox msg$, mFlags, title$, answerIf answer = IDNO Or answer = IDYES ThenQuit AllEndIfEndIfExit DoLoop
FendFunction TCP_209_AreaSensor_As_Client' 锟截憋拷锟斤拷锟斤拷锟斤拷锟紼S THENCloseNet #209Print "#209 Config Waiting Servers Open ", Time$' 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟絆pen ", Time$SetNet #209, "192.168.0.150", 5670, CRLF, NONE, 0' 锟皆客伙拷锟斤拷模式锟斤拷锟斤拷锟斤拷锟斤拷, 0OpenNet #209 As Client' 锟饺达拷锟斤拷锟斤拷锟斤拷锟接斤拷锟斤拷锟浇, 0WaitNet #209Print "#209 Config IP:192.168.0.150 Port:5678 Open at ", Time$' 锟饺达拷1锟斤拷 Wait 1Do' 锟截憋拷锟斤拷锟斤拷锟斤拷锟接斤拷锟斤拷锟浇, 0CloseNet #209Print "#209 Waiting Servers Open ", Time$' 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟?, TIME$SetNet #209, "192.168.0.150", 5670, CRLF, NONE, 0' 锟皆客伙拷锟斤拷模式锟斤拷锟斤拷锟斤拷锟斤拷E, 0OpenNet #209 As Client' 锟饺达拷锟斤拷锟斤拷锟斤拷锟接斤拷锟?29Tim90.005055Tim WaitNet #209Print "#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 ' 锟截闭碉拷锟? 'EStopOnCase "1"Print "Other command: ", Area_Sensor_$Motor OffSendEndIfIf Area_Sensor___ = -3 ThenPause ' 锟斤拷停'Motor OffString msg6_$, title_6$Integer mFlags_6, answer_6msg6_$ = "Waring" + CRLFmsg6_$ = msg6_$ + "Area Sensor !!!" + CRLFmsg6_$ = msg6_$ + "Area Sensor !!!" + CRLFmsg6_$ = msg6_$ + "Area Sensor !!!" + CRLFmsg6_$ = msg6_$ + " " + CRLFmsg6_$ = msg6_$ + "Press N to STOP !!!" + CRLFmsg6_$ = msg6_$ + "Press Y to Continue" + CRLFtitle_6$ = "Robot Control Tool"mFlags_6 = MB_YESNO + MB_ICONQUESTIONMsgBox msg6_$, mFlags_6, title_6$, answer_6If answer_6 = IDNO ThenQuit AllEndIfIf answer_6 = IDYES ThenWait 0.0001EndIfEndIfLoopFendFunction Big_TCP_212_RunmodeCloseNet #210SetNet #210, "192.168.0.1", 2009, CRLF, NONE, 0OpenNet #210 As ServerWaitNet #210Print "#210 Open at ", Time$MemOff RecvData 'CleanJump P988 LimZ (0) 'NG_Port 'Jump P988Off 9Off 8Wait 0.8Jump P999 LimZ (0) 'home_StandbyDoOff 9Off 8Wait 0.05 '<1 3 CycleIf MemSw(RecvData) = Off Thenstate211 = ChkNet(210)Print "Recived Lens: ", state211Print "For_Index:", For_LS_timIf state211 > 0 ThenIf For_LS_tim = 3 Then'cLANE 'Input #211, Data211$Print #210, Clean_Tim$Clean_Tim$ = ""Wait 2Input #210, Data210$Print Time$, " Recive data: ", Data210$ 'recive data state211 = ChkNet(210)'Input #211, Data211$'Print Time$, " Recive data: ", Data211$ 'recive data'cLANE okInput #210, Data211$Print Time$, " Recive data_Clean: ", Data211$ 'recive dataParseStr Data211$, Pdata211$(), "Tim" 'spilt dataMemOn RecvDataStart_String_211$ = Data211$'Start_Real_211 = Val(Start_String_211$) Start_Real_211 = Val(Right$(Start_String_211$, 6))Print "Start index: ", Start_Real_211ElseIf For_LS_tim = 1 Or For_LS_tim = 2 ThenInput #210, Data211$Print Time$, " Recive data_Clean: ", Data211$ 'recive dataParseStr Data211$, Pdata211$(), "Tim" 'spilt dataMemOn RecvDataStart_String_211$ = Data211$'Start_Real_211 = Val(Start_String_211$) Start_Real_211 = Val(Right$(Start_String_211$, 6))Print "Start index: ", Start_Real_211ElseIf For_LS_tim = 0 ThenInput #210, Data211$Print Time$, " Recive data: ", Data211$ 'recive dataParseStr Data211$, Pdata211$(), "Tim" 'spilt dataMemOn RecvDataStart_String_211$ = Data211$'Start_Real_211 = Val(Start_String_211$) Start_Real_211 = Val(Right$(Start_String_211$, 6))Print "Start index: ", Start_Real_211EndIfElseIf state211 = -3 ThenPrint Time$, "Ethernet NG ,Pls Connect it."Print Time$, "Ethernet NG ,Pls Connect it.."Print Time$, "Ethernet NG ,Pls Connect it..."'' DoCloseNet #210SetNet #210, "192.168.0.1", 2009, CRLF, NONE, 0OpenNet #210 As ServerWaitNet #210Print "#210 Open at ", Time$If state211 <> -3 ThenQuit AllEndIfExit DoLoop'' EndIfEndIfIf MemSw(RecvData) = On And For_LS_tim = 0 Or Start_Real_211 = 888888 Or Start_Real_211 = 666666 ThenHome_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 ThenU_Real_211_Angle = -U_Real_211ElseIf U_Real_211 < 0 ThenU_Real_211_Angle = -U_Real_211EndIf'' 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_AnglePrint "Spilt data: ", "x_Real:", X_Real_211, "y_Real:", Y_Real_211, "u_Real:", U_Real_211_AnglePrint #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 ThenP993 = 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)ElsePrint "Error 4007, Target position out of range"String msg$, title$Integer mFlags, answermsg$ = "There has An Error" + CRLFmsg$ = msg$ + "Press Y to Close and Call Tim"title$ = "Error Message From Robot"mFlags = MB_YESNO + MB_ICONQUESTIONMsgBox msg$, mFlags, title$, answerIf answer = IDNO ThenQuit AllEndIfCloseNet #210Exit DoEndIfIf U_Real_211_Angle >= 0 ThenX_Real_211 = X_Real_211 + 0Y_Real_211 = Y_Real_211 + 0U_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.302EndIf'ADD Go XY(X_Real_211, Y_Real_211, -247.387, U_Real_211_Angle) 'Down -247.387On 8 'VacuumWait 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 Put2Jump P983 'PlaceWait 3.8Off 8On 9Wait 0.6Off 9'ADDJump P999 'home_StandbyPrint "home_Pos"Print #210, "Home_Pos", "Tim", "OK", "Tim"Home_POS_Index = 1For_LS_tim = 1 + For_LS_timEndIfIf For_LS_tim = 3 ThenFor_LS_tim = 1EndIfMemOff RecvDataIf Home_POS_Index = 1 ThenWait 0.00001''Print #210, "Home"EndIfLoopFendFunction Rbt_PC216CloseNet #216OpenNet #216 As ServerWaitNet #216Print "Open #216 at ", Time$For_LS = 1Print For_LSDo'Print #216, "Send data from robot "Wait 3Print For_LSstate216 = ChkNet(216)Print "ChkNet= data", state216If state216 > 0 And For_LS = 2 Then'If state216 = 23 Or state216 = 25 ThenWait 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$, state216DataLS$ = Data$Print #216, Data$Print "ChkNet(216) Read: "Print Data$Print state216Integer fileNum2, i, jfileNum2 = FreeFileAOpen "D:\V80.txt" As #fileNum2Line Input #fileNum2, Read_file$Y_Tim_Real = Val(Read_file$)Print "Y:", Y_Tim_RealPrint "---"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_RealX_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 = TruePrint "Process_锟竭讹拷锟斤拷锟斤拷锟教筹拷锟斤拷执锟斤拷锟叫★拷锟斤拷锟斤拷"'Call Rbt_PC216Print "Process_Going 2 St_Pick Pos"'Speed 100, 100, 100Go P993'Go P992'Speed 100, 100, 5Print "Process_St_Pick Pos"'Print Here'Go XY(X_Tim_Real, Y_Tim_Real, -246.628, 5)Print HereWait 0.1On 8'Wait Sw(8) = 1'Wait 1'Go P990 'OK POS_LSGo P992 'OK POSOff 8'Wait 1Go P993'Go pick'Print "Process_Pick Pos"
'Vision_Process 'Read #216, Data$, numOfChars'numOfChars = ChkNet(216)'Print numOfCharsElseIf state216 = -3 ThenPrint "#216 Close ,Pls open #216 "ElseIf state216 = 0 ThenPrint "#216 Net no data ,Pls check it "' 锟斤拷止锟斤拷锟斤拷65536 ElseIf state216 > 0 And For_LS = 6 ThenFor_LS = 10ElseIf state216 > 0 And For_LS = 12 ThenFor_LS = 5
' 锟斤拷止锟斤拷锟斤拷65536 EndIfstate216 = 25
' If Data$ = 3.15 Then
' Select Pdata$(5)
' Case "10000"
' Print #216, "SHAKEHAND 10000"
' Case "31"
' Print #216, "SHAKEHAND 31"
' Go P999
' Send
' EndIfFor_LS = 1 + For_LSLoopFendFunction Vision_ProcessDo'Wait start_Awitch = TruePrint "Process_锟竭讹拷锟斤拷锟斤拷锟教筹拷锟斤拷执锟斤拷锟叫★拷锟斤拷锟斤拷"'Call Rbt_PC216Print "Process_Going 2 St_Pick Pos"'Speed 100, 100, 100Go S_pick'Speed 100, 100, 5Print "Process_St_Pick Pos"Print HereGo XY(X_Tim_Real, Y_Tim_Real, -216, 5)Print Here'Go pick'Print "Process_Pick Pos"Loop
Fend
Function FileDoPrint "File"Wait 2Integer fileNu, i, j' fileNum = FreeFile' WOpen "timTEST.DAT " As #fileNum' For i = 0 To 100'Print #fileNum, i'Next I'Close #fileNum'........fileNu = FreeFileROpen "timTEST88.DAT" As #fileNuFor j = 4 To 8Input #fileNu, jPrint jNext jClose #fileNuLoopFend
Function tcpip_211_1CycleCloseNet #210SetNet #210, "192.168.0.1", 2009, CRLF, NONE, 0OpenNet #210 As ServerWaitNet #210Print " #210 Open at ", Time$MemOff RecvData 'CleanFor_LS = 0DoWait 2If MemSw(RecvData) = Off Thenstate211 = ChkNet(210)Print "state211: ", state211Print "For_LS_tim", For_LS_timIf state211 > 0 And For_LS_tim = 0 ThenInput #210, Data211$Print Time$, " Recive data: ", Data211$ 'recive dataParseStr Data211$, Pdata211$(), "Tim" 'spilt dataMemOn RecvDataElseIf state211 = -3 ThenPrint "锟斤拷太锟斤拷通讯锟较匡拷锟斤拷锟斤拷锟铰达拷"EndIfEndIfIf 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_211Print #210, "x_Real:", X_Real_211, "y_Real:", Y_Real_211, "u_Real:", U_Real_211Go XY(X_Real_211, Y_Real_211, -216, U_Real_211)Wait 3Go 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
' EndIfFor_LS_tim = 2 + For_LS_timPrint "For_LS_tim222", For_LS_tim
' 锟斤拷止锟斤拷锟斤拷65536' Select Pdata211$(0)
' Case "Tim"
' Print "SHAKEHAND 10000"
' Case "31"
' Print "SHAKEHAND 31"
' SendEndIfMemOff RecvDataLoopFendFunction To_RobotPrint "To_Robot_锟斤拷始锟斤拷锟斤拷Robot 锟斤拷 PC 通讯锟斤拷锟斤拷"SetNet #205, "192.168.0.1", 2004, CRLF, NONE, 0OpenNet #205 As ServerPrint "To_Robot_锟皆凤拷锟斤拷锟斤拷锟斤拷式锟斤拷205锟剿匡拷"Print "To_Robot_锟饺达拷锟斤拷锟斤拷"WaitNet #205Print "To_Robot_锟斤拷锟接★拷锟斤拷锟斤拷"DoPrint "To_Robot_Robot 锟斤拷 PC 通讯锟斤拷锟斤拷锟斤拷锟叫★拷锟斤拷锟斤拷"Wait 1Print #205, "Robot used: ", h'Print #205, ""Print "Robot used: ", hATCLRWait 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 statustimstatustim = ChkNet(205)If statustim > 0 ThenPrint "#205 锟斤拷锟斤拷锟斤拷"Print #205, "Robot used: ", hPrint #205, ""Print "From #205 Recive data "Print #205, "send data From Robot 192.168.0.1:205"Wait .5Input #205, datattt$ElseIf statustim = -3 ThenPrint "锟斤拷太锟斤拷通讯锟较匡拷锟斤拷锟斤拷锟斤拷锟铰打开斤拷锟斤拷头'Input #205, datatt$EndIfLoop
FendFunction ProcessDoPrint "Process_锟竭讹拷锟斤拷锟斤拷锟教筹拷锟斤拷执锟斤拷锟叫★拷锟斤拷锟斤拷"Print "Process_Standby Pos"Go P999Print "Process_Pick_Standby Pos"Go S_pickPrint "Process_Pick Pos"Go pickOff 8Wait 1On 8Print "Vacuum"Print "Process_Pick_Standby Pos"Go S_pickPrint "Process_Put_Standby Pos"Go S_putPrint "Process_Put"Go PutOff 8Wait 1Print "Process_Put_Standby Pos"Go S_putWait .6On 9Off 9Print "blow"Loop
FendFunction Running_timeDoh = Time(0) '锟斤拷小时锟斤拷锟斤拷通锟斤拷时锟斤拷Print "Running_time_Robot 锟窖撅拷使锟斤拷: ", h, "小时 ", ",", " 1锟斤拷锟接回憋拷一锟斤拷"Wait 60Loop
Fend
Function Current_POSCloseNet #215Print "#215 Config Waiting Servers Open ", Time$SetNet #215, "192.168.0.150", 1122, CRLF, NONE, 0OpenNet #215 As ClientWaitNet #215Print "#215 Config IP:192.168.0.150 Port:1122 Open at ", Time$Wait 1Do' 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_HereWait 0.0003P982 = 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, UUUString ZZZ$, UUU$, XXX$, YYY$fileNum6 = FreeFileXXX = 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 #fileNum6Write #fileNum6, Time$ + "Current_POS_is: " + "X:" + "" + XXX$ + "Y:" + "" + YYY$ + "Z:" + "" + ZZZ$ + "U:" + "" + UUU$ + CRLFPrint Time$, "--- Current_POS_is: ", "X:", CX(P982), " ,", "Y:", CY(P982), " ,", "Z:", CZ(P982), " ,", "U:", CU(P982)Close #fileNum6' EndIfLoopFendFunction Current_POS_2DoWait 0.125P982 = CurPosInteger fileNum6Real XXX, YYY, ZZZ, UUU, LS_Z, LS_UString ZZZ$, UUU$, XXX$, YYY$fileNum6 = FreeFileXXX = 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 #fileNum6LS_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$ + CRLFPrint Time$, "--- Current_POS_is: ", "X:", CX(P982), " ,", "Y:", CY(P982), " ,", "Z:", CZ(P982), " ,", "U:", CU(P982)EndIfClose #fileNum6LoopFend
Function Move_Current_POSDoJump A2_Alignmnet_RefBMove XY(100, 0, -58.888, -45) '锛堝湪鏈湴鍧愭爣绯讳腑锛夊悜 X 鏂瑰悜绉诲姩 100mm)Go A1_Alignmnet_RefBGo XY(-80.88, 0, -18.888, -180) '锛堝湪鏈湴鍧愭爣绯讳腑锛夊悜 X 鏂瑰悜绉诲姩 100mm)Print "Running_"Wait 0.5Loop
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.000240271TimOKTim8888881-Tim-535.731Tim154.554Tim-0.00111218TimOKTim8888881-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.748TimOKTim8888881-Tim-516.228Tim174.815Tim-171.753TimOKTim888888
1-Tim-516.305Tim174.81Tim-171.756TimOKTim8888881-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.788TimOKTim8888881-Tim-516.958Tim174.647Tim-171.79TimOKTim8888881-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.781TimOKTim8888881-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.7662TimOKTim8888881-Tim-527.809Tim254.968Tim-36.7734TimOKTim888888