🚑 update 修复日志记录闪退bug 增加移动至此 修复复位

This commit is contained in:
FrankCV2048
2025-01-02 22:44:01 +08:00
parent bfba1c3420
commit 0500db207a
5 changed files with 122 additions and 18 deletions

View File

@ -3,6 +3,7 @@ import logging
import socket import socket
import threading import threading
import time import time
import random
import Constant import Constant
from Util.util_log import log from Util.util_log import log

View File

@ -1,5 +1,6 @@
import copy import copy
import logging import logging
import random
import threading import threading
import time import time

View File

@ -2,6 +2,7 @@ import os
Debug = True Debug = True
IO_EmergencyPoint = 2 IO_EmergencyPoint = 2
max_log_len = 100
bag_height = 10 # 一袋的高度 bag_height = 10 # 一袋的高度
position_accuracy_action = 0.1 #动作时的位置精度6 这个精度要高 必须到位置才做动作 position_accuracy_action = 0.1 #动作时的位置精度6 这个精度要高 必须到位置才做动作
position_accuracy_command = 6#命令时的位置精度 position_accuracy_command = 6#命令时的位置精度

View File

@ -1,5 +1,10 @@
import logging import logging
import queue
import threading
import time
from logging.handlers import TimedRotatingFileHandler from logging.handlers import TimedRotatingFileHandler
from PySide6.QtCore import Signal, QObject
class QTextEditLogger(logging.Handler): class QTextEditLogger(logging.Handler):
@ -15,8 +20,12 @@ class QTextEditLogger(logging.Handler):
class Logger: class Logger(QObject):
log_info_signal = Signal(str)
log_warning_signal = Signal(str)
log_error_signal = Signal(str)
def __init__(self): def __init__(self):
super().__init__()
self.logger_textEdit_info = logging.getLogger('info_logger') self.logger_textEdit_info = logging.getLogger('info_logger')
self.logger_textEdit_info.setLevel(logging.INFO) self.logger_textEdit_info.setLevel(logging.INFO)
self.logger_textEdit_warning = logging.getLogger('warning_logger') self.logger_textEdit_warning = logging.getLogger('warning_logger')
@ -24,6 +33,10 @@ class Logger:
self.logger_file_info = logging.getLogger('file_logger') self.logger_file_info = logging.getLogger('file_logger')
self.logger_file_info.setLevel(logging.INFO) self.logger_file_info.setLevel(logging.INFO)
self.pre_message = '' self.pre_message = ''
self.lock = threading.Lock() # 创建锁
self.log_queue = queue.Queue()
self.logger_thread = threading.Thread(target=self._process_logs, daemon=True)
self.logger_thread.start()
def init_log(self,textEdit_info,textEdit_warning,file_path): def init_log(self,textEdit_info,textEdit_warning,file_path):
text_edit_handler = QTextEditLogger(textEdit_info) text_edit_handler = QTextEditLogger(textEdit_info)
@ -41,27 +54,45 @@ class Logger:
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S') formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
handler.setFormatter(formatter) handler.setFormatter(formatter)
self.logger_file_info.addHandler(handler) self.logger_file_info.addHandler(handler)
def _process_logs(self):
while True:
time.sleep(0.1)
level, message = self.log_queue.get()
if level == logging.INFO:
self.log_info_signal.emit(message)
# self.logger_textEdit_info.info(message)
self.logger_file_info.info(message)
elif level == logging.ERROR:
# self.logger_textEdit_info.error(message)
self.logger_file_info.error(message)
# self.logger_textEdit_warning.error(message)
self.log_error_signal.emit(message)
elif level == logging.WARNING:
self.logger_file_info.warning(message)
self.log_warning_signal.emit(message)
def log_message(self,level,message): def log_message(self,level,message):
self.log_queue.put((level, message))
return
try: try:
if message != self.pre_message: with self.lock: # 确保线程安全
if message == self.pre_message:
return
self.pre_message = message self.pre_message = message
else:
return
if level == logging.INFO: if level == logging.INFO:
self.logger_textEdit_info.info(message) self.logger_textEdit_info.info(message)
#return
self.logger_file_info.info(message) self.logger_file_info.info(message)
if level == logging.ERROR: if level == logging.ERROR:
self.logger_textEdit_info.error(message) self.logger_textEdit_info.error(message)
self.logger_file_info.error(message)
self.logger_textEdit_warning.error(message) self.logger_textEdit_warning.error(message)
self.logger_file_info.error(message)
if level == logging.WARNING: if level == logging.WARNING:
#return
self.logger_file_info.warning(message) self.logger_file_info.warning(message)
except Exception as e: except Exception as e:

90
main.py
View File

@ -1,8 +1,10 @@
import configparser import configparser
import copy
import json import json
import logging import logging
import os import os
import queue import queue
import random
import sys import sys
import threading import threading
from multiprocessing import Process from multiprocessing import Process
@ -14,7 +16,8 @@ import numpy as np
from PyQt5.uic.properties import QtWidgets from PyQt5.uic.properties import QtWidgets
from PySide6 import QtCore from PySide6 import QtCore
from PySide6.QtCore import QThread, Signal, Slot, QObject, QEvent, QTimer from PySide6.QtCore import QThread, Signal, Slot, QObject, QEvent, QTimer
from PySide6.QtGui import QIntValidator, QStandardItemModel, QStandardItem, Qt, QMovie, QIcon, QCursor, QColor from PySide6.QtGui import QIntValidator, QStandardItemModel, QStandardItem, Qt, QMovie, QIcon, QCursor, QColor, \
QTextCursor
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QHeaderView, QTableWidget, \ from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QHeaderView, QTableWidget, \
QTableWidgetItem, QWidget, QHBoxLayout, QAbstractItemView, QMessageBox, QSizePolicy, QComboBox, QMenu QTableWidgetItem, QWidget, QHBoxLayout, QAbstractItemView, QMessageBox, QSizePolicy, QComboBox, QMenu
from datetime import datetime from datetime import datetime
@ -326,9 +329,9 @@ class MainWindow(QMainWindow, Ui_MainWindow):
def init_table_position(self): def init_table_position(self):
#self.tableWidget_line_positions.setRowCount(5) #self.tableWidget_line_positions.setRowCount(5)
self.tableWidget_line_positions.setColumnCount(13) self.tableWidget_line_positions.setColumnCount(14)
self.tableWidget_line_positions.setHorizontalHeaderLabels(["节段","X","Y","Z","U","V","W","运动类型","点位类型","序号","排序","线号","操作2"]) self.tableWidget_line_positions.setHorizontalHeaderLabels(["节段","X","Y","Z","U","V","W","运动类型","点位类型","序号","排序","线号","操作1","操作2"])
self.tableWidget_line_positions.setSelectionBehavior(QTableWidget.SelectRows) self.tableWidget_line_positions.setSelectionBehavior(QTableWidget.SelectRows)
self.tableWidget_line_positions.setColumnHidden(0, True) self.tableWidget_line_positions.setColumnHidden(0, True)
self.tableWidget_line_positions.setColumnHidden(9,True) self.tableWidget_line_positions.setColumnHidden(9,True)
@ -340,7 +343,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
header = self.tableWidget_line_positions.horizontalHeader() header = self.tableWidget_line_positions.horizontalHeader()
header.setSectionResizeMode(0, PySide6.QtWidgets.QHeaderView.ResizeMode.Interactive) header.setSectionResizeMode(0, PySide6.QtWidgets.QHeaderView.ResizeMode.Interactive)
self.tableWidget_line_positions.setHorizontalScrollBarPolicy(PySide6.QtCore.Qt.ScrollBarPolicy.ScrollBarAsNeeded) self.tableWidget_line_positions.setHorizontalScrollBarPolicy(PySide6.QtCore.Qt.ScrollBarPolicy.ScrollBarAsNeeded)
for i in range(13): for i in range(14):
header.setSectionResizeMode(i, PySide6.QtWidgets.QHeaderView.ResizeMode.Interactive) header.setSectionResizeMode(i, PySide6.QtWidgets.QHeaderView.ResizeMode.Interactive)
self.tableWidget_line_positions.setContextMenuPolicy(PySide6.QtCore.Qt.ContextMenuPolicy.CustomContextMenu) self.tableWidget_line_positions.setContextMenuPolicy(PySide6.QtCore.Qt.ContextMenuPolicy.CustomContextMenu)
self.tableWidget_line_positions.customContextMenuRequested.connect(self.show_positions_context_menu) self.tableWidget_line_positions.customContextMenuRequested.connect(self.show_positions_context_menu)
@ -416,6 +419,44 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.set_positionModel_to_tabel(row_i+1,position_model) self.set_positionModel_to_tabel(row_i+1,position_model)
self.table_line_changed = True self.table_line_changed = True
def tabel_move_position(self,row_i):
if self.tableWidget_line_positions.currentRow()==-1:
QMessageBox.information(self, "提示", Constant.str_sys_set_position_error)
return
row_i = self.tableWidget_line_positions.currentRow()
combox_line_type = self.tableWidget_line_positions.cellWidget(row_i, 7)
lineType = combox_line_type.currentData()
p1 = Real_Position().init_position(
float(self.tableWidget_line_positions.item(row_i, 1).text()),
float(self.tableWidget_line_positions.item(row_i, 2).text()),
float(self.tableWidget_line_positions.item(row_i, 3).text()),
float(self.tableWidget_line_positions.item(row_i, 4).text()),
float(self.tableWidget_line_positions.item(row_i, 5).text()),
float(self.tableWidget_line_positions.item(row_i, 6).text()),
)
if lineType == 0: #直线
if row_i != 0:
combox_line_type_inner = self.tableWidget_line_positions.cellWidget(row_i-1, 7)
lineType_inner = combox_line_type_inner.currentData()
if lineType_inner == 2:
p2 = Real_Position().init_position(
float(self.tableWidget_line_positions.item(row_i-1, 1).text()),
float(self.tableWidget_line_positions.item(row_i-1, 2).text()),
float(self.tableWidget_line_positions.item(row_i-1, 3).text()),
float(self.tableWidget_line_positions.item(row_i-1, 4).text()),
float(self.tableWidget_line_positions.item(row_i-1, 5).text()),
float(self.tableWidget_line_positions.item(row_i-1, 6).text()),
)
self.send_position_command(x1=p1.X, x2=p1.Y, x3=p1.Z, x4=p1.X, x5=p1.Y, x6=p1.Z, move_type=MoveType.Cure, speed=self.robotClient.debug_speed, p2=p2)
return
self.send_position_command(x1=p1.X, x2=p1.Y, x3=p1.Z, x4=p1.X, x5=p1.Y, x6=p1.Z, move_type=MoveType.WORLD,speed=self.robotClient.debug_speed)
return
if lineType == 4: # 自由路径
self.send_position_command(x1=p1.X, x2=p1.Y, x3=p1.Z, x4=p1.X, x5=p1.Y, x6=p1.Z,move_type=MoveType.AXIS,speed=self.robotClient.debug_speed)
return
def tabel_get_position(self,row_i): def tabel_get_position(self,row_i):
if self.tableWidget_line_positions.currentRow()==-1: if self.tableWidget_line_positions.currentRow()==-1:
QMessageBox.information(self, "提示", Constant.str_sys_set_position_error) QMessageBox.information(self, "提示", Constant.str_sys_set_position_error)
@ -469,9 +510,11 @@ class MainWindow(QMainWindow, Ui_MainWindow):
get_pos_btn.clicked.connect( get_pos_btn.clicked.connect(
lambda _, index=row_i: self.tabel_get_position(index)) lambda _, index=row_i: self.tabel_get_position(index))
self.tableWidget_line_positions.setCellWidget(row_i, 12, get_pos_btn) self.tableWidget_line_positions.setCellWidget(row_i, 12, get_pos_btn)
# del_pos_btn = QPushButton("删除点位")
# del_pos_btn.clicked.connect(lambda _, index=row_i: self.tabel_delete_position(index))
# self.tableWidget_line_positions.setCellWidget(row_i, 12, del_pos_btn) move_pos_btn = QPushButton("移至点位")
move_pos_btn.clicked.connect(lambda _, index=row_i: self.tabel_move_position(index))
self.tableWidget_line_positions.setCellWidget(row_i, 13, move_pos_btn)
def send_table_position_status_changed(self): def send_table_position_status_changed(self):
self.table_position_changed = True self.table_position_changed = True
@ -490,9 +533,28 @@ class MainWindow(QMainWindow, Ui_MainWindow):
pass pass
def init_log(self): def init_log(self):
log.log_info_signal.connect(self.log_info_message)
log.log_error_signal.connect(self.log_error_message)
log.log_warning_signal.connect(self.log_warning_message)
log.init_log(self.textEdit_log_info, self.textEdit_log_error, Constant.log_file_path) log.init_log(self.textEdit_log_info, self.textEdit_log_error, Constant.log_file_path)
log.log_message(logging.INFO, Constant.str_sys_start) log.log_message(logging.INFO, Constant.str_sys_start)
def log_info_message(self,message):
now = datetime.now()
formatted_time = now.strftime("%Y-%m-%d %H:%M:%S")
self.textEdit_log_info.append(f'{formatted_time}-提示: {message}')
def log_warning_message(self,message):
now = datetime.now()
formatted_time = now.strftime("%Y-%m-%d %H:%M:%S")
self.textEdit_log_info.append(f'{formatted_time}-注意: {message}')
self.textEdit_log_error.append(f'{formatted_time}-注意: {message}')
def log_error_message(self,message):
now = datetime.now()
formatted_time = now.strftime("%Y-%m-%d %H:%M:%S")
self.textEdit_log_info.append(f'{formatted_time}-报警: {message}')
self.textEdit_log_error.append(f'{formatted_time}-报警: {message}')
if self.tabWidget.currentIndex() != 1:
self.tabWidget.setCurrentIndex(1)
def init_UI(self): def init_UI(self):
self.pushButton_num1.clicked.connect(self.send_num_button_click) self.pushButton_num1.clicked.connect(self.send_num_button_click)
@ -1210,7 +1272,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
# self.send_position_command(safe_position.X, safe_position.Y, safe_position.Z, safe_position.U, safe_position.V, safe_position.W,move_type=MoveType.WORLD) # self.send_position_command(safe_position.X, safe_position.Y, safe_position.Z, safe_position.U, safe_position.V, safe_position.W,move_type=MoveType.WORLD)
if self.remain_lineName != '': if self.remain_lineName != '':
line_head = f'{Constant.feedLine_set_section}{self.remain_lineName}' line_head = f'{Constant.feedLine_set_section}{self.remain_lineName}'
return_positions = self.feedLine_dict[line_head].positions return_positions = copy.deepcopy(self.feedLine_dict[line_head].positions)
position_origin = PositionModel() position_origin = PositionModel()
position_origin.init_position(self.robotClient.origin_position) position_origin.init_position(self.robotClient.origin_position)
position_origin.status = 1 position_origin.status = 1
@ -1591,7 +1653,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.robotClient.add_sendQuene(request_command) self.robotClient.add_sendQuene(request_command)
# self.command_quene.put(request_command) # self.command_quene.put(request_command)
def send_position_command(self, x1, x2, x3, x4, x5, x6, move_type: MoveType = MoveType.WORLD): def send_position_command(self, x1, x2, x3, x4, x5, x6, move_type: MoveType = MoveType.WORLD,speed=5,p2=None):
position_instruction = Instruction() position_instruction = Instruction()
position_instruction.m0 = float(x1) position_instruction.m0 = float(x1)
@ -1601,7 +1663,15 @@ class MainWindow(QMainWindow, Ui_MainWindow):
position_instruction.m4 = float(x5) position_instruction.m4 = float(x5)
position_instruction.m5 = float(x6) position_instruction.m5 = float(x6)
position_instruction.action = move_type.value position_instruction.action = move_type.value
position_instruction.speed=self.robotClient.debug_speed position_instruction.speed = self.robotClient.debug_speed
if position_instruction.action == 17:
position_instruction.m0_p = p2.X
position_instruction.m1_p = p2.Y
position_instruction.m2_p = p2.Z
position_instruction.m3_p = p2.U
position_instruction.m4_p = p2.V
position_instruction.m5_p = p2.W
instruction_command = CMDInstructRequest() instruction_command = CMDInstructRequest()
instruction_command.instructions.append(position_instruction) instruction_command.instructions.append(position_instruction)
request_command = instruction_command.toString() request_command = instruction_command.toString()