🚑 update 修复日志记录闪退bug 增加移动至此 修复复位
This commit is contained in:
@ -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
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import copy
|
import copy
|
||||||
import logging
|
import logging
|
||||||
|
import random
|
||||||
import threading
|
import threading
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
|||||||
@ -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#命令时的位置精度
|
||||||
|
|||||||
@ -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:
|
||||||
self.pre_message = message
|
|
||||||
else:
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
self.pre_message = message
|
||||||
|
|
||||||
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
90
main.py
@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user