优化版本,增加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
相关文章:

优化版本,增加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 date…...
写作-- 复合句练习
文章目录 练习 11. 家庭的支持和老师的指导对学生的学术成功有积极影响。2. 缺乏准备和未能适应通常会导致在挑战性情境中的糟糕表现。3. 吃垃圾食品和忽视锻炼可能导致严重的健康问题,因此人们应注重保持均衡的生活方式。4. 昨天的大雨导致街道洪水泛滥,因此居民们迁往高地以…...

WWW22-可解释推荐|用于推荐的神经符号描述性规则学习
论文来源:WWW 2022 论文链接:https://web.archive.org/web/20220504023001id_/https://dl.acm.org/doi/pdf/10.1145/3485447.3512042 最近读到一篇神经符号集成的论文24年底TOIS的,神经符号集成是人工智能领域中,将符号推理与深…...

Linux:shell脚本常用命令
一、设置主机名称 1、查看主机名称 2、用文件的方式更改主机名称 重启后: 3、 通过命令修改主机名 重启后: 二、网络管理命令 1、查看网卡 2、设置网卡 (1)网卡未被设置过时 (2)当网卡被设定,…...
专业课复习笔记 11
从今天开始每天下午复习专业课。慢慢复习专业课。目标至少考一个一百分吧。毕竟专业课还是比较难的。要是考不到一百分,我感觉自己就废掉了呢。下面稍微复习一下计组。 复习指令格式和数据通路设计。完全看不懂,真是可恶啊。计组感觉就是死记硬背&#…...

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

STM32高级物联网通信之以太网通讯
目录 以太网通讯基础知识 什么是以太网 互联网和以太网的区别 1)概念与范围 (1)互联网 (2)以太网 2)技术特点 (1)互联网 (2)以太网 3)应…...
从Java的Jvm的角度解释一下为什么String不可变?
从Java的Jvm的角度解释一下为什么String不可变? 从 JVM 的角度看,Java 中 String 的不可变性是由多层次的机制共同保障的,这些设计涉及内存管理、性能优化和安全保障: 1. JVM 内存模型与字符串常量池 字符串常量池(St…...
从零开始的数据结构教程(四) 图论基础与算法实战
🌐 标题一:图的表示——六度空间理论如何用代码实现? 核心需求 图(Graph)是用于表达实体间关系的强大数据结构,比如社交网络中的好友关系,或者城市路网的交叉路口连接。关键在于如何高效存储和…...

历年西安交通大学计算机保研上机真题
2025西安交通大学计算机保研上机真题 2024西安交通大学计算机保研上机真题 2023西安交通大学计算机保研上机真题 在线测评链接:https://pgcode.cn/school 计算圆周率近似值 题目描述 根据公式 π / 4 1 − 1 / 3 1 / 5 − 1 / 7 … \pi / 4 1 - 1/3 1/5 - …...
可视化与动画:构建沉浸式Vue应用的进阶实践
在现代Web应用中,高性能可视化和流畅动画已成为提升用户体验的核心要素。本节将深入探索Vue生态中的可视化与动画技术,分享专业级解决方案与最佳实践。 一、 Canvas高性能渲染体系 01、Konva.js流程图引擎深度优化 <template><div class"…...
Python |GIF 解析与构建(3):简单哈希压缩256色算法
Python |GIF 解析与构建(3):简单哈希压缩256色算法 目录 Python |GIF 解析与构建(3):简单哈希压缩256色算法 一、算法性能表现 二、算法核心原理与实现 (一…...
蓝桥杯2114 李白打酒加强版
问题描述 话说大诗人李白, 一生好饮。幸好他从不开车。 一天, 他提着酒显, 从家里出来, 酒显中有酒 2 斗。他边走边唱: 无事街上走,提显去打酒。 逢店加一倍, 遇花喝一斗。 这一路上, 他一共遇到店 N 次, 遇到花 M 次。已知最后一次遇到的是花, 他正好把酒喝光了。…...

基本数据指针的解读-C++
1、引言 笔者认为对于学习指针要弄清楚如下问题基本可以应付大部分的场景: ① 指针是什么? ② 指针的类型是什么? ③ 指针指向的类型是什么? ④ 指针指向了哪里? 2、如何使用指针 使用时的步骤如下: ① …...
Android Studio里的BLE数据接收策略
#本人是初次接触Android蓝牙开发,若有不对地方,欢迎指出。 #由于是讲接收数据策略(其中还包含数据发送的部分策略),因此其他问题部分不会讲述,只描述数据接收。 简介(对于客户端---手机端) 博主在处理数据接收的时候࿰…...
【Office】Excel两列数据比较方法总结
在Excel中,比较两列数据是否相等有多种方法,以下是常用的几种方式: 方法1:使用公式(返回TRUE/FALSE) 在空白列(如C列)输入公式,向下填充即可逐行比较两列(如…...

基于多模态脑电、音频与视觉信号的情感识别算法【Nature核心期刊,EAV:EEG-音频-视频数据集】
简述 理解情感状态对于开发下一代人机交互界面至关重要。社交互动中的人类行为会引发受感知输入影响的心理生理过程。因此,探索大脑功能与人类行为的努力或将推动具有类人特质人工智能模型的发展。这里原作者推出一个多模态情感数据集,包含42名参与者的3…...

【QueryServer】dbeaver使用phoenix连接Hbase(轻客户端方式)
一、轻客户端连接方式 (推荐) 演示无认证配置方式, 有认证填入下方有认证参数即可 1, 新建连接 → Hadoop/大数据 → Apache Phoenix 2, 手动配置QueryServer驱动: 填入: “类名”, “URL模版”(注意区分有无认证), “端口号”, (勾选无认证) 类名: org.apache.phoenix…...
数据湖 (特点+与数据仓库和数据沼泽的对比讲解)
数据湖就像一个“数据水库”,把企业所有原始数据(结构化的表格、半结构化的日志、非结构化的图片/视频)原样存储,供后续按需分析。 对比传统数据仓库: 数据仓库数据湖数据清洗后的结构化数据(如Excel表格&…...
深入链表剖析:从原理到 C 语言实现,涵盖单向、双向及循环链表全解析
1 引言 在数据结构的学习中,链表是一种基础且极为重要的线性数据结构。与数组不同,链表通过指针将一系列节点连接起来,每个节点包含数据域和指向下一个节点的指针域。这种动态的存储方式使得链表在插入、删除等操作上具有独特的优势。本文将深…...
编码总结如下
VS2019一般的编码是UTF-8编码, win11操作系统的编码可能为GB2312,VS整个工程中使用的都是UTF-8编码,但是在系统内生成的其他文件夹的名字则是系统的编码 如何选择? Qt 项目:优先用 QString 和 QByteArray(…...
《算力觉醒!ONNX Runtime + DirectML如何点燃Windows ARM设备的AI引擎》
ONNX Runtime是一个跨平台的高性能推理引擎,它就像是一位精通多种语言的翻译官,能够无缝运行来自不同深度学习框架转化为ONNX格式的模型。这种兼容性打破了框架之间的隔阂,让开发者可以将更多的精力投入到模型的优化和应用中。 从内部机制来…...

[9-1] USART串口协议 江协科技学习笔记(13个知识点)
1 2 3 4全双工就是两个数据线,半双工就是一个数据线 5 6 7 8 9 10 TTL(Transistor-Transistor Logic)电平是一种数字电路中常用的电平标准,它使用晶体管来表示逻辑状态。TTL电平通常指的是5V逻辑电平,其中:…...

Oracle基础知识(五)——ROWID ROWNUM
目录 一、ROWID 伪列 二、ROWNUM——限制查询结果集行数 1.ROWNUM使用介绍 2.使用ROWNUM进行分页查询 3.使用ROWNUM查看薪资前五位的员工 4.查询指定条数直接的数据 三、ROWNUM与ROWID不同 一、ROWID 伪列 表中的每一行在数据文件中都有一个物理地址,ROWID…...
简述synchronized和java.util.concurrent.locks.Lock的异同 ?
主要相同点: Lock能完成synchronized所实现的所有功能。 主要不同点: Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放Lock还有更强大…...
OpenCV CUDA模块直方图计算------在 GPU 上计算图像直方图的函数calcHist()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 OpenCV 的 CUDA 模块 中用于在 GPU 上计算图像直方图的一个函数。 计算单通道 8-bit 图像的灰度直方图(Histogram)。 该函…...

EMS只是快递那个EMS吗?它跟能源有什么关系?
在刚刚落幕的深圳人工智能终端展上,不少企业展示了与数字能源相关的技术和服务,其中一项关键系统——EMS(Energy Management System,能量管理系统)频频亮相。这个看似低调的名字,实际上正悄然成为未来能源管…...

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

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

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