🚑 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 threading
import time
import random
import Constant
from Util.util_log import log

View File

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

View File

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

View File

@ -1,5 +1,10 @@
import logging
import queue
import threading
import time
from logging.handlers import TimedRotatingFileHandler
from PySide6.QtCore import Signal, QObject
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):
super().__init__()
self.logger_textEdit_info = logging.getLogger('info_logger')
self.logger_textEdit_info.setLevel(logging.INFO)
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.setLevel(logging.INFO)
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):
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')
handler.setFormatter(formatter)
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):
self.log_queue.put((level, message))
return
try:
if message != self.pre_message:
self.pre_message = message
else:
with self.lock: # 确保线程安全
if message == self.pre_message:
return
self.pre_message = message
if level == logging.INFO:
self.logger_textEdit_info.info(message)
#return
self.logger_file_info.info(message)
if level == logging.ERROR:
self.logger_textEdit_info.error(message)
self.logger_file_info.error(message)
self.logger_textEdit_warning.error(message)
self.logger_file_info.error(message)
if level == logging.WARNING:
#return
self.logger_file_info.warning(message)
except Exception as e:

90
main.py
View File

@ -1,8 +1,10 @@
import configparser
import copy
import json
import logging
import os
import queue
import random
import sys
import threading
from multiprocessing import Process
@ -14,7 +16,8 @@ import numpy as np
from PyQt5.uic.properties import QtWidgets
from PySide6 import QtCore
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, \
QTableWidgetItem, QWidget, QHBoxLayout, QAbstractItemView, QMessageBox, QSizePolicy, QComboBox, QMenu
from datetime import datetime
@ -326,9 +329,9 @@ class MainWindow(QMainWindow, Ui_MainWindow):
def init_table_position(self):
#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.setColumnHidden(0, True)
self.tableWidget_line_positions.setColumnHidden(9,True)
@ -340,7 +343,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
header = self.tableWidget_line_positions.horizontalHeader()
header.setSectionResizeMode(0, PySide6.QtWidgets.QHeaderView.ResizeMode.Interactive)
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)
self.tableWidget_line_positions.setContextMenuPolicy(PySide6.QtCore.Qt.ContextMenuPolicy.CustomContextMenu)
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.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):
if self.tableWidget_line_positions.currentRow()==-1:
QMessageBox.information(self, "提示", Constant.str_sys_set_position_error)
@ -469,9 +510,11 @@ class MainWindow(QMainWindow, Ui_MainWindow):
get_pos_btn.clicked.connect(
lambda _, index=row_i: self.tabel_get_position(index))
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):
self.table_position_changed = True
@ -490,9 +533,28 @@ class MainWindow(QMainWindow, Ui_MainWindow):
pass
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.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):
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)
if 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.init_position(self.robotClient.origin_position)
position_origin.status = 1
@ -1591,7 +1653,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.robotClient.add_sendQuene(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.m0 = float(x1)
@ -1601,7 +1663,15 @@ class MainWindow(QMainWindow, Ui_MainWindow):
position_instruction.m4 = float(x5)
position_instruction.m5 = float(x6)
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.instructions.append(position_instruction)
request_command = instruction_command.toString()