import configparser import copy import json import logging import os import queue import random import sys import threading from multiprocessing import Process import traceback import PySide6 import cv2 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, QTextCursor, ) from PySide6.QtWidgets import ( QApplication, QMainWindow, QPushButton, QLabel, QHeaderView, QTableWidget, QTableWidgetItem, QWidget, QHBoxLayout, QAbstractItemView, QMessageBox, QSizePolicy, QComboBox, QMenu, ) from datetime import datetime from click import clear import Util.util_pic from Model.FeedModel import LineModel, PositionModel from Util.util_ini import writeFeedLine_to_ini import Constant from CU.Command import FeedCommand from CU.Feeding import ( FeedLine, FeedingConfig, Feeding, FeedStatus, FeedMidStatus, ResetStatus, ) from Util.util_log import QTextEditLogger from Util.util_time import CRisOrFall # from Vision.camera_coordinate_dete import Detection from COM.COM_Robot import RobotClient from Expection import Error_Code from queue import Queue from Model.RobotModel import * import time from queue import Queue from Model.Position import Real_Position, Detection_Position from threading import Thread from CU.Command import Status from Util.util_log import log # from Vision.detect_person import DetectionPerson from ui_MainWin import Ui_MainWindow from view.ResetView import StopDialog from EMV.EMV import RelayController # from view.ResetView import StopDialog class MainWindow(QMainWindow, Ui_MainWindow): updateUI_seting = Signal() def __init__(self): super(MainWindow, self).__init__() self.setupUi(self) # 传感器继电器加入变量 self.relay_controller = RelayController() self.sensor_thread = None self.sensor2_thread = None self.last_status_printed = None self.last_pause_printed = None # 传感器加入变量结束 # self.setWindowFlags(Qt.WindowType.FramelessWindowHint) self.thread_signal = True self.init_qss() self.init_UI() self.init_Run() self.init_robot_info() self.init_IOPanel() self.start_Runing() self.init_log() self.init_FeedLine() self.init_table_lines() self.init_table_position() self.table_line_changed = False self.table_position_changed = False self.selected_line_section = "" def init_IOPanel(self): self.dirt_io_points = {} self.dirt_io_points.setdefault("y1", self.widget_y1) self.dirt_io_points.setdefault("y2", self.widget_y2) self.dirt_io_points.setdefault("y3", self.widget_y3) self.dirt_io_points.setdefault("y4", self.widget_y4) self.dirt_io_points.setdefault("y5", self.widget_y5) self.dirt_io_points.setdefault("y6", self.widget_y6) self.dirt_io_points.setdefault("y7", self.widget_y7) self.dirt_io_points.setdefault("y8", self.widget_y8) self.dirt_io_points.setdefault("y9", self.widget_y9) self.dirt_io_points.setdefault("y10", self.widget_y10) self.dirt_io_points.setdefault("y11", self.widget_y11) self.dirt_io_points.setdefault("y12", self.widget_y12) self.dirt_io_points.setdefault("y13", self.widget_y13) self.dirt_io_points.setdefault("y14", self.widget_y14) self.dirt_io_points.setdefault("y15", self.widget_y15) self.dirt_io_points.setdefault("y16", self.widget_y16) self.dirt_io_points.setdefault("y17", self.widget_y17) self.dirt_io_points.setdefault("y18", self.widget_y18) self.dirt_io_points.setdefault("y19", self.widget_y19) self.dirt_io_points.setdefault("y20", self.widget_y20) self.dirt_io_points.setdefault("y21", self.widget_y21) self.dirt_io_points.setdefault("y22", self.widget_y22) self.dirt_io_points.setdefault("y23", self.widget_y23) self.dirt_io_points.setdefault("y24", self.widget_y24) self.dirt_io_points.setdefault("y25", self.widget_y25) self.dirt_io_points.setdefault("y26", self.widget_y26) self.dirt_io_points.setdefault("y27", self.widget_y27) self.dirt_io_points.setdefault("y28", self.widget_y28) self.dirt_io_points.setdefault("y29", self.widget_y29) self.dirt_io_points.setdefault("y30", self.widget_y30) self.dirt_io_points.setdefault("y31", self.widget_y31) self.dirt_io_points.setdefault("y32", self.widget_y32) self.widget_y1.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y1.index = 1 self.widget_y2.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y2.index = 2 self.widget_y3.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y3.index = 3 self.widget_y4.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y4.index = 4 self.widget_y5.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y5.index = 5 self.widget_y6.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y6.index = 6 self.widget_y7.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y7.index = 7 self.widget_y8.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y8.index = 8 self.widget_y9.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y9.index = 9 self.widget_y10.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y10.index = 10 self.widget_y11.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y11.index = 11 self.widget_y12.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y12.index = 12 self.widget_y13.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y13.index = 13 self.widget_y14.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y14.index = 14 self.widget_y15.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y15.index = 15 self.widget_y16.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y16.index = 16 self.widget_y17.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y17.index = 17 self.widget_y18.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y18.index = 18 self.widget_y19.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y19.index = 19 self.widget_y20.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y20.index = 20 self.widget_y21.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y21.index = 21 self.widget_y22.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y22.index = 22 self.widget_y23.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y23.index = 23 self.widget_y24.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y24.index = 24 self.widget_y25.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y25.index = 25 self.widget_y26.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y26.index = 26 self.widget_y27.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y27.index = 27 self.widget_y28.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y28.index = 28 self.widget_y29.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y29.index = 29 self.widget_y30.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y30.index = 30 self.widget_y31.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y31.index = 31 self.widget_y32.clicked.connect(self.send_IO_Point_OpenOrClose) self.widget_y32.index = 32 # region 战线,点位表格初始化 def init_table_lines(self): self.tableWidget_lines.setColumnCount(4) self.tableWidget_lines.horizontalHeader().setStyleSheet( f"background-color: {QColor(44,44,44).name()};" ) self.tableWidget_lines.verticalHeader().setStyleSheet( f"background-color: {QColor(44,44,44).name()};" ) self.tableWidget_lines.verticalHeader().hide() self.tableWidget_lines.setHorizontalHeaderLabels(["节名", "线名", "id", "操作"]) self.tableWidget_lines.setSelectionBehavior(QTableWidget.SelectRows) self.tableWidget_lines.setAutoScroll(True) self.tableWidget_lines.setColumnHidden(0, True) self.tableWidget_lines.setColumnHidden(2, True) # 自动调整列宽 header = self.tableWidget_lines.horizontalHeader() header.setSectionResizeMode(0, PySide6.QtWidgets.QHeaderView.ResizeMode.Stretch) header.setSectionResizeMode(1, PySide6.QtWidgets.QHeaderView.ResizeMode.Stretch) header.setSectionResizeMode(2, PySide6.QtWidgets.QHeaderView.ResizeMode.Stretch) self.tableWidget_lines.setContextMenuPolicy( PySide6.QtCore.Qt.ContextMenuPolicy.CustomContextMenu ) self.tableWidget_lines.customContextMenuRequested.connect( self.show_lines_context_menu ) self.tableWidget_lines.cellChanged.connect(self.send_table_lines_cell_changed) self.init_table_lines_data() self.pushButton_savePosition.clicked.connect(self.send_save_lines_data) def send_table_line_position_cell_changed(self): self.table_position_changed = True def send_table_lines_cell_changed(self): self.table_line_changed = True def send_save_lines_data(self): if self.table_position_changed or self.table_line_changed: section = self.selected_line_section for row_i in range(self.tableWidget_lines.rowCount()): if self.tableWidget_lines.item(row_i, 0).text() == section: line_model = LineModel() if len( self.get_table_positions() ) == 0 and self.feedLine_dict.keys().__contains__(section): line_model = self.feedLine_dict[section] line_model.name = self.tableWidget_lines.item(row_i, 1).text() else: line_model.section = section line_model.name = self.tableWidget_lines.item(row_i, 1).text() line_model.id = int( self.tableWidget_lines.item(row_i, 2).text() ) line_model.positions = self.get_table_positions() config_reader = configparser.ConfigParser() config_reader.read(Constant.feedLine_set_file, encoding="utf-8") if ( len(self.get_table_positions()) != 0 and line_model.id != self.get_table_positions()[0].lineId ): return line_model.save_line_model(config_reader) config_reader.write( open(Constant.feedLine_set_file, "w", encoding="utf-8") ) self.init_FeedLine() break self.init_table_lines_data() self.table_line_changed = False self.table_position_changed = False def get_table_positions(self): position_models = [] for row_i in range(self.tableWidget_line_positions.rowCount()): section = self.tableWidget_line_positions.item(row_i, 0).text() position_model = PositionModel(index=row_i) position_model.section = section position_model.X = float( self.tableWidget_line_positions.item(row_i, 1).text() ) position_model.Y = float( self.tableWidget_line_positions.item(row_i, 2).text() ) position_model.Z = float( self.tableWidget_line_positions.item(row_i, 3).text() ) position_model.U = float( self.tableWidget_line_positions.item(row_i, 4).text() ) position_model.V = float( self.tableWidget_line_positions.item(row_i, 5).text() ) position_model.W = float( self.tableWidget_line_positions.item(row_i, 6).text() ) combox_line_type = self.tableWidget_line_positions.cellWidget(row_i, 7) position_model.lineType = combox_line_type.currentData() combox_status = self.tableWidget_line_positions.cellWidget(row_i, 8) position_model.status = combox_status.currentData() position_model.id = int( self.tableWidget_line_positions.item(row_i, 9).text() ) position_model.order = row_i position_model.lineId = int( self.tableWidget_line_positions.item(row_i, 11).text() ) position_models.append(position_model) return position_models def init_table_lines_data(self): # self.tableWidget_lines.setItem(0, 0, QTableWidgetItem("线1")) # self.tableWidget_lines.setItem(1, 0, QTableWidgetItem("线2")) # self.tableWidget_lines.setItem() self.tableWidget_lines.blockSignals(True) self.selected_line_section = "" self.table_line_changed = False self.table_position_changed = False self.tableWidget_lines.setRowCount(0) for key, value in self.feedLine_dict.items(): self.tableWidget_lines.insertRow(self.tableWidget_lines.rowCount()) self.tableWidget_lines.setItem( self.tableWidget_lines.rowCount() - 1, 0, QTableWidgetItem(key) ) self.tableWidget_lines.setItem( self.tableWidget_lines.rowCount() - 1, 1, QTableWidgetItem(value.name) ) self.tableWidget_lines.setItem( self.tableWidget_lines.rowCount() - 1, 2, QTableWidgetItem(str(value.id)), ) show_pos_btn = QPushButton("显示路径") show_pos_btn.clicked.connect( lambda _, index=self.tableWidget_lines.rowCount() - 1: self.show_lines_pos_data( index ) ) self.tableWidget_lines.setCellWidget( self.tableWidget_lines.rowCount() - 1, 3, show_pos_btn ) self.selected_line_section = "" self.tableWidget_line_positions.setRowCount(0) self.tableWidget_lines.blockSignals(False) def show_lines_context_menu(self): menu = QMenu(self) action_add = menu.addAction("添加投料线") action_del = menu.addAction("删除投料线") action = menu.exec(QCursor.pos()) if action == action_add: self.add_new_line() elif action == action_del: self.del_line() def del_line(self): if self.tableWidget_lines.rowCount() == 0: return if self.tableWidget_lines.currentRow() == -1: return self.tableWidget_lines.removeRow(self.tableWidget_lines.currentRow()) self.table_line_changed = True def add_new_line(self): add_section = f"{Constant.feedLine_set_section}{1}" for i in range(1, Constant.MAX_Line_num): if not self.feedLine_dict.get(f"{Constant.feedLine_set_section}{i}"): add_section = f"{Constant.feedLine_set_section}{i}" break self.tableWidget_lines.insertRow(self.tableWidget_lines.rowCount()) self.tableWidget_lines.setItem( self.tableWidget_lines.rowCount() - 1, 0, QTableWidgetItem(add_section) ) self.tableWidget_lines.setItem( self.tableWidget_lines.rowCount() - 1, 1, QTableWidgetItem("线" + str(self.tableWidget_lines.rowCount())), ) self.tableWidget_lines.setItem( self.tableWidget_lines.rowCount() - 1, 2, QTableWidgetItem(str(i)) ) show_pos_btn = QPushButton("显示路径") show_pos_btn.clicked.connect( lambda _, index=self.tableWidget_lines.rowCount() - 1: self.show_lines_pos_data( index ) ) self.tableWidget_lines.setCellWidget( self.tableWidget_lines.rowCount() - 1, 3, show_pos_btn ) self.table_position_changed = True self.feedLine_dict[add_section] = LineModel(i) def show_lines_pos_data(self, line_index): if ( self.selected_line_section != "" and self.selected_line_section != self.tableWidget_lines.item(line_index, 0).text() ): if self.table_position_changed or self.table_line_changed: msgBox = QMessageBox() msgBox.setText("已修改的数据,是否保存?") msgBox.setStandardButtons(QMessageBox.Yes | QMessageBox.No) result = msgBox.exec() if result == QMessageBox.StandardButton.Ok: self.send_save_lines_data() return else: # 重新初始化· self.init_table_lines_data() self.table_line_changed = False self.table_position_changed = False line_name = self.tableWidget_lines.item(line_index, 0).text() line_model = self.feedLine_dict.get(line_name) self.init_table_positions_data(line_model.positions) self.selected_line_section = line_name self.label_table_line_position_title.setText(line_model.name) def init_table_position(self): # self.tableWidget_line_positions.setRowCount(5) self.tableWidget_line_positions.setColumnCount(14) 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) self.tableWidget_line_positions.setColumnHidden(10, True) self.tableWidget_line_positions.setColumnHidden(11, True) self.tableWidget_line_positions.setAutoScroll(True) self.tableWidget_line_positions.verticalHeader().hide() # 自动调整列宽 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(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 ) self.tableWidget_line_positions.cellChanged.connect( self.send_table_line_position_cell_changed ) def init_table_positions_data(self, position_list): self.tableWidget_line_positions.blockSignals(True) self.tableWidget_line_positions.setRowCount(0) for index, position_model in enumerate(position_list): self.tableWidget_line_positions.insertRow( self.tableWidget_line_positions.rowCount() ) self.set_positionModel_to_tabel(index, position_model) self.tableWidget_line_positions.blockSignals(False) def show_positions_context_menu(self): menu = QMenu(self) action_add = menu.addAction("添加位置节点") action_del = menu.addAction("删除位置节点") action = menu.exec(QCursor.pos()) if action == action_add: self.add_new_position() elif action == action_del: self.del_position() def del_position(self): if self.tableWidget_line_positions.rowCount() == 0: return if self.tableWidget_line_positions.currentRow() == -1: return section = self.tableWidget_line_positions.item( self.tableWidget_line_positions.currentRow(), 0 ).text() id = int( self.tableWidget_line_positions.item( self.tableWidget_line_positions.currentRow(), 9 ).text() ) line_model = self.feedLine_dict.get(self.selected_line_section) for pos_model in line_model.positions: if pos_model.id == id: line_model.positions.remove(pos_model) break self.tableWidget_line_positions.removeRow( self.tableWidget_line_positions.currentRow() ) config_writer = configparser.ConfigParser() config_writer.read(Constant.feedLine_set_file, encoding="utf-8") config_writer.remove_section(section) config_writer.write(open(Constant.feedLine_set_file, "w", encoding="utf-8")) self.table_position_changed = True def add_new_position(self): # 选中添加 if self.selected_line_section == "": return config_reader = configparser.ConfigParser() config_reader.read(Constant.feedLine_set_file, encoding="utf-8") position_model = PositionModel(999) ids = [] for j in range(self.tableWidget_line_positions.rowCount()): ids.append(int(self.tableWidget_line_positions.item(j, 9).text())) for i in range(1, Constant.MAX_Position_num): if not config_reader.has_section(f"{Constant.position_set_section}{i}"): if ids.__contains__(i): continue position_model = PositionModel(i) break if self.tableWidget_line_positions.currentRow() == -1: row_i = self.tableWidget_line_positions.rowCount() else: row_i = self.tableWidget_line_positions.currentRow() # self.tableWidget_line_positions.setRowCount(self.tableWidget_line_positions.rowCount()+1) self.tableWidget_line_positions.insertRow(row_i + 1) position_model.order = 0 position_model.status = 1 line_model = self.feedLine_dict.get(self.selected_line_section) line_id = line_model.id position_model.lineId = line_id 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.U, x5=p1.V, x6=p1.W, 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.U, x5=p1.V, x6=p1.W, 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.U, x5=p1.V, x6=p1.W, 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) return row_i = self.tableWidget_line_positions.currentRow() combox_line_type = self.tableWidget_line_positions.cellWidget(row_i, 7) lineType = combox_line_type.currentData() if lineType == 4: self.set_position_tabel(row_i, self.status_address.getAnglePosition()) else: self.set_position_tabel(row_i, self.status_address.getRealPosition()) self.table_line_changed = True def tabel_delete_position(self, row_i): self.tableWidget_line_positions.removeRow(row_i) self.table_line_changed = True def set_positionModel_to_tabel(self, row_i, position_model: PositionModel): self.tableWidget_line_positions.setItem( row_i, 0, QTableWidgetItem(str(position_model.section)) ) self.set_position_tabel(row_i, position_model.get_position()) combox_lineType = QComboBox() combox_lineType.addItem("直线", 0) combox_lineType.addItem("曲线中间点", 2) combox_lineType.addItem("曲线终点", 3) combox_lineType.addItem("自由路径", 4) combox_lineType.setCurrentIndex( combox_lineType.findData(position_model.lineType) ) combox_lineType.currentIndexChanged.connect( self.send_table_position_status_changed ) self.tableWidget_line_positions.setCellWidget(row_i, 7, combox_lineType) combox = QComboBox() combox.addItem("初始化点", 2) combox.addItem("中间点", 3) combox.addItem("相机/待抓点", 4) combox.addItem("抓取前点", 3) combox.addItem("抓取", 5) combox.addItem("抓取后点", 3) combox.addItem("破带点1", 6) combox.addItem("破带点2", 7) combox.addItem("震动点", 8) combox.addItem("扔带点", 9) combox.setCurrentIndex(combox.findData(position_model.status)) combox.currentIndexChanged.connect(self.send_table_position_status_changed) self.tableWidget_line_positions.setCellWidget(row_i, 8, combox) # self.tableWidget_line_positions.setItem(row_i, 7, QTableWidgetItem(str(position_model.status))) self.tableWidget_line_positions.setItem( row_i, 9, QTableWidgetItem(str(position_model.id)) ) self.tableWidget_line_positions.setItem( row_i, 10, QTableWidgetItem(str(position_model.order)) ) self.tableWidget_line_positions.setItem( row_i, 11, QTableWidgetItem(str(position_model.lineId)) ) get_pos_btn = QPushButton("获取点位") 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) 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 def set_position_tabel(self, row_i, position): self.tableWidget_line_positions.setItem( row_i, 1, QTableWidgetItem(str(position.X)) ) self.tableWidget_line_positions.setItem( row_i, 2, QTableWidgetItem(str(position.Y)) ) self.tableWidget_line_positions.setItem( row_i, 3, QTableWidgetItem(str(position.Z)) ) self.tableWidget_line_positions.setItem( row_i, 4, QTableWidgetItem(str(position.U)) ) self.tableWidget_line_positions.setItem( row_i, 5, QTableWidgetItem(str(position.V)) ) self.tableWidget_line_positions.setItem( row_i, 6, QTableWidgetItem(str(position.W)) ) # endregion def init_qss(self): 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) self.pushButton_num2.clicked.connect(self.send_num_button_click) self.pushButton_num3.clicked.connect(self.send_num_button_click) self.pushButton_num4.clicked.connect(self.send_num_button_click) self.pushButton_num5.clicked.connect(self.send_num_button_click) self.pushButton_num6.clicked.connect(self.send_num_button_click) self.pushButton_AddNum.clicked.connect(self.send_addNum_button_click) self.pushButton_SubNum.clicked.connect(self.send_subNum_button_click) self.lineEdit_j1.returnPressed.connect(self.send_position_returnPressed) self.lineEdit_j2.returnPressed.connect(self.send_position_returnPressed) self.lineEdit_j3.returnPressed.connect(self.send_position_returnPressed) self.lineEdit_j4.returnPressed.connect(self.send_position_returnPressed) self.lineEdit_j5.returnPressed.connect(self.send_position_returnPressed) self.lineEdit_j6.returnPressed.connect(self.send_position_returnPressed) self.pushButton_sendMove.clicked.connect(self.send_position_returnPressed) self.pushButton_j1_sub.clicked.connect(self.send_subOneAsix_button_click) self.pushButton_j2_sub.clicked.connect(self.send_subOneAsix_button_click) self.pushButton_j3_sub.clicked.connect(self.send_subOneAsix_button_click) self.pushButton_j4_sub.clicked.connect(self.send_subOneAsix_button_click) self.pushButton_j5_sub.clicked.connect(self.send_subOneAsix_button_click) self.pushButton_j6_sub.clicked.connect(self.send_subOneAsix_button_click) self.pushButton_j1_add.clicked.connect(self.send_addOneAsix_button_click) self.pushButton_j2_add.clicked.connect(self.send_addOneAsix_button_click) self.pushButton_j3_add.clicked.connect(self.send_addOneAsix_button_click) self.pushButton_j4_add.clicked.connect(self.send_addOneAsix_button_click) self.pushButton_j5_add.clicked.connect(self.send_addOneAsix_button_click) self.pushButton_j6_add.clicked.connect(self.send_addOneAsix_button_click) self.pushButton_stopFeed.clicked.connect(self.send_stopFeed_button_click) self.pushButton_pauseFeed.clicked.connect(self.send_pauseFeed_button_click) self.pushButton_get_p1.clicked.connect(self.get_p1_button_click) self.pushButton_get_p2.clicked.connect(self.get_p2_button_click) self.pushButton_get_p3.clicked.connect(self.get_p3_button_click) self.pushButton_get_p4.clicked.connect(self.get_p4_button_click) self.pushButton_get_p5.clicked.connect(self.get_p5_button_click) self.pushButton_get_origin.clicked.connect(self.get_origin_button_click) self.pushButton_set_p1.clicked.connect(self.set_p1_button_click) self.pushButton_set_p2.clicked.connect(self.set_p2_button_click) self.pushButton_set_p3.clicked.connect(self.set_p3_button_click) self.pushButton_set_p4.clicked.connect(self.set_p4_button_click) self.pushButton_set_p5.clicked.connect(self.set_p5_button_click) self.pushButton_set_origin.clicked.connect(self.set_origin_button_click) self.pushButton_clearAlarm.clicked.connect(self.send_clear_alarm_command) self.pushButton_emergency.clicked.connect(self.send_emergency_alarm_command) self.pushButton_reset.clicked.connect(self.send_reset_button_click) self.pushButton_saveSeting.clicked.connect(self.send_setSpeed_clicked) self.pushButton_num_confirm.clicked.connect(self.send_custom_num_returnPressed) # self.tabWidget_control.currentChanged.connect(self.send_tabWidget_control_change) self.frame_sys_seting.setVisible(False) self.pushButton_sysseting.clicked.connect(self.send_click_sysmeuExpand) self.pushButton_leftmenu_produce.clicked.connect( lambda _, index=0: self.send_click_change_stackView(index) ) self.pushButton_leftmenu_robot_seting.clicked.connect( lambda _, index=2: self.send_click_change_stackView(index) ) self.pushButton_leftmenu_IO.clicked.connect( lambda _, index=1: self.send_click_change_stackView(index) ) self.pushButton_leftmenu_position.clicked.connect( lambda _, index=5: self.send_click_change_stackView(index) ) self.pushButton_leftmenu_baseSeting.clicked.connect( lambda _, index=3: self.send_click_change_stackView(index) ) self.pushButton_leftmenu_posDebug.clicked.connect( lambda _, index=4: self.send_click_change_stackView(index) ) self.pushButton_exit.clicked.connect(self.send_exit_button_click) self.pushButton_onekeyfeed.clicked.connect(self.send_onekeyfeed_button_click) int_validator = QIntValidator(0, 100, self.lineEdit_num) self.lineEdit_num.setValidator(int_validator) # self.horizontalSlider_J1.sliderReleased self.pushButton_startFeed.clicked.connect(self.send_startFeed_button_click) self.horizontalSlider_feedingNum.blockSignals(True) self.horizontalSlider_feedingNum.setMinimum(0) def init_Run(self): self.robotClient = None self.configReader = configparser.ConfigParser() # TODO 关闭图像 self.command_position_quene = Queue() self.status_address = DataAddress() self.feedLine_dict = {} self.command_quene = Queue() self.main_threading = None self.detection_person = None # DetectionPerson() self.index = 1 self.configReader.read(Constant.set_ini) ip = self.configReader.get("Robot_Feed", "IPAddress") port = int(self.configReader.get("Robot_Feed", "Port")) photo_locs = [ ( float(self.configReader.get("Robot_Feed", "photo_x1")), float(self.configReader.get("Robot_Feed", "photo_y1")), float(self.configReader.get("Robot_Feed", "photo_z1")), float(self.configReader.get("Robot_Feed", "photo_u1")), float(self.configReader.get("Robot_Feed", "photo_v1")), float(self.configReader.get("Robot_Feed", "photo_w1")), ), ( float(self.configReader.get("Robot_Feed", "photo_x2")), float(self.configReader.get("Robot_Feed", "photo_y2")), float(self.configReader.get("Robot_Feed", "photo_z2")), float(self.configReader.get("Robot_Feed", "photo_u2")), float(self.configReader.get("Robot_Feed", "photo_v2")), float(self.configReader.get("Robot_Feed", "photo_w2")), ), ( float(self.configReader.get("Robot_Feed", "photo_x3")), float(self.configReader.get("Robot_Feed", "photo_y3")), float(self.configReader.get("Robot_Feed", "photo_z3")), float(self.configReader.get("Robot_Feed", "photo_u3")), float(self.configReader.get("Robot_Feed", "photo_v3")), float(self.configReader.get("Robot_Feed", "photo_w3")), ), ( float(self.configReader.get("Robot_Feed", "photo_x4")), float(self.configReader.get("Robot_Feed", "photo_y4")), float(self.configReader.get("Robot_Feed", "photo_z4")), float(self.configReader.get("Robot_Feed", "photo_u4")), float(self.configReader.get("Robot_Feed", "photo_v4")), float(self.configReader.get("Robot_Feed", "photo_w4")), ), ( float(self.configReader.get("Robot_Feed", "photo_x5")), float(self.configReader.get("Robot_Feed", "photo_y5")), float(self.configReader.get("Robot_Feed", "photo_z5")), float(self.configReader.get("Robot_Feed", "photo_u5")), float(self.configReader.get("Robot_Feed", "photo_v5")), float(self.configReader.get("Robot_Feed", "photo_w5")), ), ] origin_position = Real_Position().init_position( float(self.configReader.get("Origin", "X")), float(self.configReader.get("Origin", "Y")), float(self.configReader.get("Origin", "Z")), float(self.configReader.get("Origin", "U")), float(self.configReader.get("Origin", "V")), float(self.configReader.get("Origin", "W")), ) debug_speed = int(self.configReader.get("Speed", "debug_speed")) feed_speed = int(self.configReader.get("Speed", "feed_speed")) reset_speed = int(self.configReader.get("Speed", "reset_speed")) io_take_addr = int(self.configReader.get("Robot_Feed", "io_take_addr")) io_zip_addr = int(self.configReader.get("Robot_Feed", "io_zip_addr")) io_shake_addr = int(self.configReader.get("Robot_Feed", "io_shake_addr")) time_delay_take = float(self.configReader.get("Robot_Feed", "takeDelay")) time_delay_put = float(self.configReader.get("Robot_Feed", "putDelay")) time_delay_shake = float(self.configReader.get("Robot_Feed", "shakeDelay")) max_angle_interval = float( self.configReader.get("Robot_Feed", "max_angle_interval") ) smooth = int(self.configReader.get("Robot_Feed", "smooth")) dynamic_height = float(self.configReader.get("Robot_Feed", "dynamic_height")) # TODO # dropDelay_time = int(self.configReader.get('Robot_Feed', 'dropDelay_time')) self.robotClient = RobotClient( ip, port, photo_locs, self.command_position_quene, self.status_address, [io_take_addr, io_zip_addr, io_shake_addr], time_delay_take, time_delay_put, time_delay_shake, origin_position, ) self.robotClient.debug_speed = debug_speed self.robotClient.feed_speed = feed_speed self.robotClient.reset_speed = reset_speed self.robotClient.max_angle_interval = max_angle_interval self.robotClient.smooth = smooth self.robotClient.dynamic_height = dynamic_height self.feeding = Feeding(self.robotClient) # 临时 self.feeding.need_origin_signal.connect(self.show_infomessage_box) self.feeding.take_no_photo_sigal.connect(self.show_no_photo_message_box) self.feeding.update_detect_image.connect(self.updateUI_label_detection) self.feeding.log_signal.connect(self.log_message) self.last_time = time.time() self.remain_lineName = self.configReader.get("Robot_Feed", "remain_lineName") self.remain_Count = int(self.configReader.get("Robot_Feed", "remain_Count")) self.updateUI_seting.connect(self.update_seting_frame) try: self.robotClient.CreatConnect() except: self.set_label_status_style(False) return Error_Code.SYS_NETERROR if self.robotClient.connected: return 0 else: return Error_Code.SYS_NETERROR def init_seting_frame(self): rows = len(self.feedLine_dict.keys()) + 1 self.tableWidget_feedSeting.setRowCount(rows) self.tableWidget_feedSeting.setColumnCount(20 + 2 * 6) # 设置第一重表头的合并 (三列一组) self.tableWidget_feedSeting_addtional_col_num = 2 self.tableWidget_feedSeting.setSpan( 0, 0 + self.tableWidget_feedSeting_addtional_col_num, 1, 6 ) # 合并前3列 self.tableWidget_feedSeting.setSpan( 0, 6 + self.tableWidget_feedSeting_addtional_col_num, 1, 6 ) # 合并后3列 self.tableWidget_feedSeting.setSpan( 0, 12 + self.tableWidget_feedSeting_addtional_col_num, 1, 6 ) # 合并后3列 self.tableWidget_feedSeting.setSpan( 0, 18 + self.tableWidget_feedSeting_addtional_col_num, 1, 6 ) # 合并后3列 self.tableWidget_feedSeting.setSpan( 0, 24 + self.tableWidget_feedSeting_addtional_col_num, 1, 6 ) # 合并后3列 self.tableWidget_feedSeting.itemChanged.connect( self.send_tabelFeedSet_itemChanged ) btn_safe = QPushButton("获取安全位置") widget_safe = QWidget() layout_safe = QHBoxLayout() layout_safe.addWidget(btn_safe) # 调整布局的间距,使之更紧凑 layout_safe.setContentsMargins(0, 0, 0, 0) # 将布局设置到 QWidget 容器中 widget_safe.setLayout(layout_safe) btn_bk1 = QPushButton("获取破袋位置1") widget_bk1 = QWidget() layout_bk1 = QHBoxLayout() layout_bk1.addWidget(btn_bk1) # 调整布局的间距,使之更紧凑 layout_bk1.setContentsMargins(0, 0, 0, 0) # 将布局设置到 QWidget 容器中 widget_bk1.setLayout(layout_bk1) btn_bk2 = QPushButton("获取破袋位置2") widget_bk2 = QWidget() layout_bk2 = QHBoxLayout() layout_bk2.addWidget(btn_bk2) # 调整布局的间距,使之更紧凑 layout_bk2.setContentsMargins(0, 0, 0, 0) # 将布局设置到 QWidget 容器中 widget_bk2.setLayout(layout_bk2) btn_shake = QPushButton("获取摇晃位置") widget_shake = QWidget() layout_shake = QHBoxLayout() layout_shake.addWidget(btn_shake) layout_shake.setContentsMargins(0, 0, 0, 0) widget_shake.setLayout(layout_shake) btn_dropbag = QPushButton("获取丢袋位置") widget_dropbag = QWidget() layout_dropbag = QHBoxLayout() layout_dropbag.addWidget(btn_dropbag) # 调整布局的间距,使之更紧凑 layout_dropbag.setContentsMargins(0, 0, 0, 0) # 将布局设置到 QWidget 容器中 widget_dropbag.setLayout(layout_dropbag) btn_safe.clicked.connect(self.send_get_safe_position_button_click) btn_bk1.clicked.connect(self.send_get_broken1_position_button_click) btn_bk2.clicked.connect(self.send_get_broken2_position_button_click) btn_shake.clicked.connect(self.send_get_shake_position_button_click) btn_dropbag.clicked.connect(self.send_get_dropbag_position_button_click) # 添加第一重表头项 self.tableWidget_feedSeting.setCellWidget( 0, 0 + self.tableWidget_feedSeting_addtional_col_num, widget_safe ) self.tableWidget_feedSeting.setCellWidget( 0, 6 + self.tableWidget_feedSeting_addtional_col_num, widget_bk1 ) self.tableWidget_feedSeting.setCellWidget( 0, 12 + self.tableWidget_feedSeting_addtional_col_num, widget_bk2 ) self.tableWidget_feedSeting.setCellWidget( 0, 18 + self.tableWidget_feedSeting_addtional_col_num, widget_shake ) self.tableWidget_feedSeting.setCellWidget( 0, 24 + self.tableWidget_feedSeting_addtional_col_num, widget_dropbag ) self.tableWidget_feedSeting.setSelectionBehavior(QTableWidget.SelectRows) self.tableWidget_feedSeting.setAutoScroll(True) # 添加第二重表头 self.tableWidget_feedSeting.setHorizontalHeaderLabels( [ "header", "线名", "X1", "Y1", "Z1", "U1", "V1", "W1", "X2", "Y2", "Z2", "U2", "V2", "W2", "X3", "Y3", "Z3", "U3", "V3", "W3", "X4", "Y4", "Z4", "U4", "V4", "W4", "X5", "Y5", "Z5", "U5", "V5", "W5", ] ) self.tableWidget_feedSeting.hideColumn(0) # 填充数据行 for row, (feed_line_key, feed_line) in enumerate(self.feedLine_dict.items()): self.tableWidget_feedSeting.setItem( row + 1, 0, QTableWidgetItem(feed_line_key) ) self.tableWidget_feedSeting.setItem( row + 1, 1, QTableWidgetItem(feed_line.name) ) self.set_position_to_tabel(row + 1, 0, feed_line.safe_position) self.set_position_to_tabel(row + 1, 1, feed_line.broken1_position) self.set_position_to_tabel(row + 1, 2, feed_line.broken2_position) self.set_position_to_tabel(row + 1, 3, feed_line.broken2_position) self.set_position_to_tabel(row + 1, 4, feed_line.drop_bag_position) # 禁用自动表头 self.tableWidget_feedSeting.verticalHeader().setVisible(True) self.pushButton_tableFeedSet_addRow.clicked.connect( self.send_tabelFeedSet_addRow ) self.pushButton_tableFeedSet_deleRow.clicked.connect( self.send_tabelFeedSet_delRow ) self.pushButton_tableFeedSet_save.clicked.connect(self.send_tabelFeedSet_save) def init_FeedLine(self): # line_count = self.configReader.get('Robot_Feed', 'LineCount', fallback=0) configReader = configparser.ConfigParser() configReader.read(Constant.feedLine_set_file, encoding="utf-8") for i in range(1, Constant.MAX_Line_num): line_str = f"{Constant.feedLine_set_section}{i}" if configReader.has_section(line_str): feed_line = LineModel() feed_line.read_line_model(config_reader=configReader, index=i) self.feedLine_dict[f"{Constant.feedLine_set_section}{i}"] = feed_line self.updateUI_Select_Line() pass def init_robot_info(self): j1_min = int(self.configReader.get("Robot_Feed", "j1_min")) j1_max = int(self.configReader.get("Robot_Feed", "j1_max")) j2_min = int(self.configReader.get("Robot_Feed", "j2_min")) j2_max = int(self.configReader.get("Robot_Feed", "j2_max")) j3_min = int(self.configReader.get("Robot_Feed", "j3_min")) j3_max = int(self.configReader.get("Robot_Feed", "j3_max")) j4_min = int(self.configReader.get("Robot_Feed", "j4_min")) j4_max = int(self.configReader.get("Robot_Feed", "j4_max")) j5_min = int(self.configReader.get("Robot_Feed", "j5_min")) j5_max = int(self.configReader.get("Robot_Feed", "j5_max")) j6_min = int(self.configReader.get("Robot_Feed", "j6_min")) j6_max = int(self.configReader.get("Robot_Feed", "j6_max")) self.horizontalSlider_J1.setMinimum(j1_min) self.horizontalSlider_J1.setMaximum(j1_max) self.horizontalSlider_J2.setMinimum(j2_min) self.horizontalSlider_J2.setMaximum(j2_max) self.horizontalSlider_J3.setMinimum(j3_min) self.horizontalSlider_J3.setMaximum(j3_max) self.horizontalSlider_J4.setMinimum(j4_min) self.horizontalSlider_J4.setMaximum(j4_max) self.horizontalSlider_J5.setMinimum(j5_min) self.horizontalSlider_J5.setMaximum(j5_max) self.horizontalSlider_J6.setMinimum(j6_min) self.horizontalSlider_J6.setMaximum(j6_max) self.label_j1_min.setText(j1_min.__str__()) self.label_j1_max.setText(j1_max.__str__()) self.label_j2_min.setText(j2_min.__str__()) self.label_j2_max.setText(j2_max.__str__()) self.label_j3_min.setText(j3_min.__str__()) self.label_j3_max.setText(j3_max.__str__()) self.label_j4_min.setText(j4_min.__str__()) self.label_j4_max.setText(j4_max.__str__()) self.label_j5_min.setText(j5_min.__str__()) self.label_j5_max.setText(j5_max.__str__()) self.label_j6_min.setText(j6_min.__str__()) self.label_j6_max.setText(str(j6_max)) def start_Runing(self): # 多线程启动 self.main_threading = Thread(target=self.run) # 主循环 self.robot_connect_threading = Thread(target=self.robotClient.run) self.main_UI_threading = Thread(target=self.updateUI) self.detect_person_thread = Thread(target=self.run_detect_persion) self.main_threading.start() self.robot_connect_threading.start() self.main_UI_threading.start() self.detect_person_thread.start() pass def check_continue(self): if self.remain_Count != 0: for key in self.feedLine_dict.keys(): feed_line = self.feedLine_dict[key] if f"FeedLine{self.remain_lineName}" == key: # 提示 remain_messageBox = QMessageBox() remain_messageBox.setIcon(QMessageBox.Icon.Warning) remain_messageBox.setText( f"还有{self.remain_Count}袋未投料,是否继续?" ) # 这里返回多少袋没有投料 # remain_messageBox.setStandardButtons(QMessageBox.StandardButton.Ok | QMessageBox.StandardButton.Cancel) ok_button = remain_messageBox.addButton( "确定", PySide6.QtWidgets.QMessageBox.ButtonRole.AcceptRole ) cancel_button = remain_messageBox.addButton( "取消", PySide6.QtWidgets.QMessageBox.ButtonRole.RejectRole ) result = remain_messageBox.exec() if remain_messageBox.clickedButton() == cancel_button: self.remain_Count = 0 return self.configReader.read(Constant.feedLine_set_file, encoding="utf-8") line_name = self.configReader.get(key, "name") current_index = self.comboBox_lineIndex.findText(line_name) self.comboBox_lineIndex.setCurrentIndex(current_index) self.horizontalSlider_feedingNum.setMaximum(self.remain_Count) self.label_maxNum.setText( str(self.remain_Count) ) # 目标投料袋数设置为setini文件中保存的remain_count self.horizontalSlider_feedingNum.setValue(0) self.send_startFeed_button_click() else: return def send_startFeed_button_click(self): if self.feeding.feedStatus != FeedStatus.FNone: self.show_infomessage_box("正在执行") return # 触发自动运行 if self.robotClient.status_model.curMode != 7: self.send_switch_tool_command() log.log_message(logging.INFO, Constant.str_sys_switch_tool) self.send_start_tool_command() log.log_message(logging.INFO, Constant.str_sys_start_tool) msg_box_person = QMessageBox() msg_box_person.setIcon(QMessageBox.Icon.Information) msg_box_person.setText("是否确认生产区域安全继续生产?") msg_box_person.setWindowTitle("提示") ok_button = msg_box_person.addButton( "确定", PySide6.QtWidgets.QMessageBox.ButtonRole.AcceptRole ) cancel_button = msg_box_person.addButton( "取消", PySide6.QtWidgets.QMessageBox.ButtonRole.RejectRole ) result = msg_box_person.exec() if msg_box_person.clickedButton() == cancel_button: return log.log_message(logging.INFO, "第一层确认生产") has_person = False # has_person, _ = self.detection_person.get_person() # TODO if has_person: # TODO # self.feeding.pause = True # self.send_pause_command(True) # # self.show_messagebox_of_person() msg_box_person.setText("检测到安全区域后人是否继续生产?") result = msg_box_person.exec() if result == QMessageBox.StandardButton.Cancel: return log.log_message(logging.ERROR, "人员进入安全区") num = self.horizontalSlider_feedingNum.maximum() line_head = self.comboBox_lineIndex.currentData() self.command_quene.put( FeedCommand( FeedingConfig( num, FeedLine( self.feedLine_dict[line_head].id, self.feedLine_dict[line_head].name, self.feedLine_dict[line_head].positions, ), self.feeding.robotClient.photo_locs[:], ) ) ) # self.stackedWidget_num.setCurrentIndex(1) self.set_run_status_button(True) self.feeding.pause = False self.feeding.onekey = False log.log_message( logging.INFO, f"{self.feedLine_dict[line_head].name}:{Constant.str_feed_start}", ) def send_num_button_click(self): button = self.sender() if button.text() != "自定义": num = int(button.text()) self.horizontalSlider_feedingNum.setMaximum(num) self.label_maxNum.setText(str(num)) self.horizontalSlider_feedingNum.setValue(0) else: self.lineEdit_num.show() def send_subOneAsix_button_click(self): btn_str = self.sender().objectName() Constant.manual_adjust_accuracy = float( self.lineEdit_manual_adjust_accuracy.text() ) x1 = float(self.label_j1.text()) x2 = float(self.label_j2.text()) x3 = float(self.label_j3.text()) x4 = float(self.label_j4.text()) x5 = float(self.label_j5.text()) x6 = float(self.label_j6.text()) if "j1" in btn_str: x1 = x1 - Constant.manual_adjust_accuracy elif "j2" in btn_str: x2 = x2 - Constant.manual_adjust_accuracy pass elif "j3" in btn_str: x3 = x3 - Constant.manual_adjust_accuracy pass elif "j4" in btn_str: x4 = x4 - Constant.manual_adjust_accuracy pass elif "j5" in btn_str: x5 = x5 - Constant.manual_adjust_accuracy pass elif "j6" in btn_str: x6 = x6 - Constant.manual_adjust_accuracy self.send_position_command(x1, x2, x3, x4, x5, x6, MoveType.AXIS) def send_addOneAsix_button_click(self, btn): btn_str = self.sender().objectName() Constant.manual_adjust_accuracy = float( self.lineEdit_manual_adjust_accuracy.text() ) x1 = float(self.label_j1.text()) x2 = float(self.label_j2.text()) x3 = float(self.label_j3.text()) x4 = float(self.label_j4.text()) x5 = float(self.label_j5.text()) x6 = float(self.label_j6.text()) if "j1" in btn_str: x1 = x1 + Constant.manual_adjust_accuracy elif "j2" in btn_str: x2 = x2 + Constant.manual_adjust_accuracy pass elif "j3" in btn_str: x3 = x3 + Constant.manual_adjust_accuracy pass elif "j4" in btn_str: x4 = x4 + Constant.manual_adjust_accuracy pass elif "j5" in btn_str: x5 = x5 + Constant.manual_adjust_accuracy pass elif "j6" in btn_str: x6 = x6 + Constant.manual_adjust_accuracy self.send_position_command(x1, x2, x3, x4, x5, x6, move_type=MoveType.AXIS) def send_addNum_button_click(self): self.feeding.feedConfig.num += 1 log.log_message(logging.INFO, Constant.str_sys_feedNum_add) max_num = int(self.label_maxNum.text()) + 1 self.horizontalSlider_feedingNum.setMaximum(max_num) self.label_maxNum.setText(str(max_num)) def send_subNum_button_click(self): if self.feeding.feedConfig.num <= 1: # self.send_stopFeed_button_click() self.feeding.feedStatus = FeedStatus.FNone # 清空运行命令 self.send_clear_auto_command() log.log_message(logging.INFO, Constant.str_feed_stop) return self.feeding.feedConfig.num -= 1 log.log_message(logging.INFO, Constant.str_sys_feedNum_sub) max_num = int(self.label_maxNum.text()) - 1 self.horizontalSlider_feedingNum.setMaximum(max_num) self.label_maxNum.setText(str(max_num)) def send_custom_num_returnPressed(self): if self.lineEdit_num.text() == "" or not self.lineEdit_num.text().isdigit(): return self.horizontalSlider_feedingNum.setMaximum(int(self.lineEdit_num.text())) self.horizontalSlider_feedingNum.setValue(0) self.label_maxNum.setText(self.lineEdit_num.text()) log.log_message( logging.INFO, f"{Constant.str_sys_setFeedNum}:{self.label_maxNum.text()} " ) def send_position_button_click(self): # if True: # cmd_command = CMDRequest() # cmd_command.cmdData = ['rewriteData', '800', f'{position_instruction.m0}', 0] # request_command = vars(cmd_command) # self.robotClient.add_sendQuene(request_command) return def send_position_returnPressed(self): log.log_message(logging.INFO, Constant.str_sys_manualPosition) try: self.send_position_command( float(self.lineEdit_j1.text()), float(self.lineEdit_j2.text()), float(self.lineEdit_j3.text()), float(self.lineEdit_j4.text()), float(self.lineEdit_j5.text()), float(self.lineEdit_j6.text()), ) except Exception as e: self.show_infomessage_box(Constant.str_sys_log_move_error) def send_setSpeed_label_doubelClick(self): pass def send_setSpeed_clicked(self): self.robotClient.feed_speed = int(self.lineEdit_speed_run.text()) self.robotClient.debug_speed = int(self.lineEdit_speed_debug.text()) self.robotClient.reset_speed = int(self.lineEdit_speed_reset.text()) self.robotClient.smooth = int(self.lineEdit_setting_smooth.text()) self.robotClient.dynamic_height = float(self.lineEdit_setting_height.text()) try: take_addr = int(self.lineEdit_take_addr.text()) press_addr = int(self.lineEdit_press_addr.text()) shake_addr = int(self.lineEdit_shake_addr.text()) time_delay_take = float(self.lineEdit_timedelay_take.text()) time_delay_put = float(self.lineEdit_timedelay_put.text()) time_delay_shake = float(self.lineEdit_timedelay_shake.text()) self.robotClient.con_ios[0] = take_addr self.robotClient.con_ios[1] = press_addr self.robotClient.con_ios[2] = shake_addr self.robotClient.time_delay_take = time_delay_take self.robotClient.time_delay_put = time_delay_put self.robotClient.time_delay_shake = time_delay_shake self.configReader = configparser.ConfigParser() self.configReader.read(Constant.set_ini) self.configReader.set("Robot_Feed", "io_take_addr", str(take_addr)) self.configReader.set("Robot_Feed", "io_zip_addr", str(press_addr)) self.configReader.set("Robot_Feed", "io_shake_addr", str(shake_addr)) self.configReader.set("Robot_Feed", "takeDelay", str(time_delay_take)) self.configReader.set("Robot_Feed", "putDelay", str(time_delay_put)) self.configReader.set("Robot_Feed", "shakeDelay", str(time_delay_shake)) self.configReader.set( "Speed", "feed_speed", str(self.robotClient.feed_speed) ) self.configReader.set( "Speed", "debug_speed", str(self.robotClient.debug_speed) ) self.configReader.set( "Speed", "reset_speed", str(self.robotClient.reset_speed) ) self.configReader.set("Robot_Feed", "smooth", str(self.robotClient.smooth)) self.configReader.set( "Robot_Feed", "dynamic_height", str(self.robotClient.dynamic_height) ) self.configReader.write(open(Constant.set_ini, "w", encoding="utf-8")) except Exception as e: log.log_message(logging.ERROR, Constant.str_sys_set_error + e) pass # self.pushButton_speed.setText(str(Constant.speed)) log.log_message( logging.INFO, Constant.str_sys_setSpeed + str(self.robotClient.debug_speed) + "|" + str(self.robotClient.feed_speed), ) pass def send_get_safe_position_button_click(self): real_position = self.robotClient.status_model.getRealPosition() row_i = self.tableWidget_feedSeting.currentRow() head = self.tableWidget_feedSeting.item(row_i, 0).text() self.feedLine_dict[head].safe_position.init_position( real_position.X, real_position.Y, real_position.Z, real_position.U, real_position.V, real_position.W, ) self.set_position_to_tabel(row_i, 0, real_position) def send_get_broken1_position_button_click(self): real_position = self.robotClient.status_model.getRealPosition() row_i = self.tableWidget_feedSeting.currentRow() head = self.tableWidget_feedSeting.item(row_i, 0).text() self.feedLine_dict[head].broken1_position.init_position( real_position.X, real_position.Y, real_position.Z, real_position.U, real_position.V, real_position.W, ) self.set_position_to_tabel(row_i, 1, real_position) def send_get_broken2_position_button_click(self): real_position = self.robotClient.status_model.getRealPosition() row_i = self.tableWidget_feedSeting.currentRow() head = self.tableWidget_feedSeting.item(row_i, 0).text() self.feedLine_dict[head].broken2_position.init_position( real_position.X, real_position.Y, real_position.Z, real_position.U, real_position.V, real_position.W, ) self.set_position_to_tabel(row_i, 2, real_position) def send_get_shake_position_button_click(self): real_position = self.robotClient.status_model.getRealPosition() row_i = self.tableWidget_feedSeting.currentRow() head = self.tableWidget_feedSeting.item(row_i, 0).text() self.feedLine_dict[head].shake_position.init_position( real_position.X, real_position.Y, real_position.Z, real_position.U, real_position.V, real_position.W, ) self.set_position_to_tabel(row_i, 3, real_position) def send_get_dropbag_position_button_click(self): real_position = self.robotClient.status_model.getRealPosition() row_i = self.tableWidget_feedSeting.currentRow() head = self.tableWidget_feedSeting.item(row_i, 0).text() self.feedLine_dict[head].drop_bag_position.init_position( real_position.X, real_position.Y, real_position.Z, real_position.U, real_position.V, real_position.W, ) self.set_position_to_tabel(row_i, 4, real_position) def send_get_zipbag_position_button_click(self): real_position = self.robotClient.status_model.getRealPosition() row_i = self.tableWidget_feedSeting.currentRow() head = self.tableWidget_feedSeting.item(row_i, 0).text() self.feedLine_dict[head].zip_bag_position.init_position( real_position.X, real_position.Y, real_position.Z, real_position.U, real_position.V, real_position.W, ) self.set_position_to_tabel(row_i, 6, real_position) def send_tabelFeedSet_addRow(self): for i in range(1, 20): head = f"{Constant.feedLine_set_section}{i}" if head not in self.feedLine_dict: row_position = self.tableWidget_feedSeting.rowCount() # 当前行数 self.tableWidget_feedSeting.insertRow(row_position) safe_position = Real_Position() break_1_position = Real_Position() break_2_position = Real_Position() shake_position = Real_Position() drop_bag_position = Real_Position() self.feedLine_dict[head] = FeedLine( "新建", safe_position, break_1_position, break_2_position, shake_position, drop_bag_position, ) self.tableWidget_feedSeting.setItem( self.tableWidget_feedSeting.rowCount() - 1, 0, QTableWidgetItem(head), ) self.tableWidget_feedSeting.setItem( self.tableWidget_feedSeting.rowCount() - 1, 1, QTableWidgetItem("新建"), ) self.set_position_to_tabel( self.tableWidget_feedSeting.rowCount() - 1, 0, safe_position ) self.set_position_to_tabel( self.tableWidget_feedSeting.rowCount() - 1, 1, break_1_position ) self.set_position_to_tabel( self.tableWidget_feedSeting.rowCount() - 1, 2, break_2_position ) self.set_position_to_tabel( self.tableWidget_feedSeting.rowCount() - 1, 3, shake_position ) self.set_position_to_tabel( self.tableWidget_feedSeting.rowCount() - 1, 4, drop_bag_position ) break def send_tabelFeedSet_delRow(self): selectRow = self.tableWidget_feedSeting.currentRow() if selectRow >= 0: for feed_line_key, feed_line in self.feedLine_dict.items(): if ( feed_line_key == self.tableWidget_feedSeting.item(selectRow, 0).text() ): self.feedLine_dict.pop(feed_line_key) self.tableWidget_feedSeting.removeRow(selectRow) break else: QMessageBox.information(self, "提示", "请选择要删除的行") def send_tabelFeedSet_save(self): count = len(self.feedLine_dict.keys()) self.configReader.read(Constant.set_ini) self.configReader.set("Robot_Feed", "LineCount", str(count)) writeFeedLine_to_ini(self.feedLine_dict, Constant.feedLine_set_file) pass def send_stopFeed_button_click(self): # 清空状态 self.feeding.feedStatus = FeedStatus.FNone self.feeding.reset_status = ResetStatus.RNone # 清空运行命令 self.send_clear_auto_command() # self.feeding.feedConfig.num = 0 log.log_message(logging.INFO, Constant.str_feed_stop) def send_pauseFeed_button_click(self): if self.pushButton_pauseFeed.text() == "暂停": icon9 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.SystemReboot)) self.pushButton_pauseFeed.setIcon(icon9) self.pushButton_pauseFeed.setText("继续") log.log_message(logging.INFO, Constant.str_feed_pause) self.send_pause_command(True) self.feeding.pause = True else: icon9 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackPause)) self.pushButton_pauseFeed.setIcon(icon9) self.pushButton_pauseFeed.setText("暂停") self.send_pause_command(False) log.log_message(logging.INFO, Constant.str_feed_continue) self.send_start_tool_command() log.log_message(logging.INFO, Constant.str_sys_start_tool) self.feeding.pause = False pass def send_tabWidget_control_change(self): if self.robotClient.status_model.curMode != 7: self.send_switch_tool_command() log.log_message(logging.INFO, Constant.str_sys_switch_tool) self.send_start_tool_command() def send_reset_button_click(self): # 触发自动运行 if self.robotClient.status_model.curMode != 7: self.send_switch_tool_command() log.log_message(logging.INFO, Constant.str_sys_switch_tool) self.send_start_tool_command() log.log_message(logging.INFO, Constant.str_sys_start_tool) line_head = self.comboBox_lineIndex.currentData() self.send_clear_auto_command() log.log_message(logging.INFO, Constant.str_feed_reset_start) # safe_position = self.feedLine_dict[line_head].safe_position # 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 = copy.deepcopy(self.feedLine_dict[line_head].positions) position_origin = PositionModel() position_origin.init_position(self.robotClient.origin_position) position_origin.status = 1 return_positions.insert(0, position_origin) if self.feedLine_dict.keys().__contains__(line_head): self.feeding.feedConfig = FeedingConfig( 0, FeedLine( self.feedLine_dict[line_head].id, self.feedLine_dict[line_head].name, return_positions, ), self.feeding.robotClient.photo_locs[:], ) else: log.log_message(logging.ERROR, Constant.str_feed_reset_no_line_error) return self.feeding.reset_status = ResetStatus.RStart # dialog_reset = StopDialog() # dialog_reset.stop_thread_signal.connect(self.stop_reset_thread) else: log.log_message(logging.ERROR, Constant.str_feed_reset_no_line_error) return # thread = threading.Thread(target=self.feeding.return_original_position()) # thread.start() def stop_reset_thread(self): self.feeding.reset_status = ResetStatus.ROk self.send_clear_auto_command() self.send_emergency_alarm_command() def send_tabelFeedSet_itemChanged(self, item): row = item.row() column = item.column() value = item.text() head = self.tableWidget_feedSeting.item(row, 0).text() if column == 1: self.feedLine_dict[head].name = value elif column == (0 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].safe_position.X = float(value) elif column == (1 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].safe_position.Y = float(value) elif column == (2 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].safe_position.Z = float(value) elif column == (3 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].safe_position.U = float(value) elif column == (4 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].safe_position.V = float(value) elif column == (5 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].safe_position.W = float(value) # elif column == 7: elif column == (6 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].broken1_position.X = float(value) elif column == (7 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].broken1_position.Y = float(value) elif column == (8 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].broken1_position.Z = float(value) elif column == (9 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].broken1_position.U = float(value) elif column == (10 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].broken1_position.V = float(value) elif column == (11 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].broken1_position.W = float(value) elif column == (12 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].broken2_position.X = float(value) elif column == (13 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].broken2_position.Y = float(value) elif column == (14 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].broken2_position.Z = float(value) elif column == (15 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].broken2_position.U = float(value) elif column == (16 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].broken2_position.V = float(value) elif column == (17 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].broken2_position.W = float(value) elif column == (18 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].shake_position.X = float(value) elif column == (19 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].shake_position.Y = float(value) elif column == (20 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].shake_position.Z = float(value) elif column == (21 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].shake_position.U = float(value) elif column == (22 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].shake_position.V = float(value) elif column == (23 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].shake_position.W = float(value) elif column == (24 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].drop_bag_position.X = float(value) elif column == (25 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].drop_bag_position.Y = float(value) elif column == (26 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].drop_bag_position.Z = float(value) elif column == (27 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].drop_bag_position.U = float(value) elif column == (28 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].drop_bag_position.V = float(value) elif column == (29 + self.tableWidget_feedSeting_addtional_col_num): self.feedLine_dict[head].drop_bag_position.W = float(value) def run(self): # 主线程的逻辑就是 feeding.run() 接口和错误状态处理 while self.thread_signal: time.sleep(0.1) if Constant.feedStatus: # feedStatus的状态打印 current_status = self.feeding.feedStatus is_paused = self.feeding.pause # 只有当状态或暂停标志发生变化时才打印 if ( current_status != self.last_status_printed or is_paused != self.last_pause_printed ): print( f"[调试] 当前 feedStatus: {current_status}, 是否暂停: {is_paused}" ) self.last_status_printed = current_status self.last_pause_printed = is_paused # print("进入了主线程的 run") # 获取状态和控制标志 current_feed_status = self.feeding.feedStatus is_running = (current_feed_status == FeedStatus.FStart) and ( not self.feeding.pause ) # 加上未暂停 is_stopped = ( # 以下情况应关闭传感器 current_feed_status in [ FeedStatus.FFinished, FeedStatus.FNone, FeedStatus.FReverse, FeedStatus.FStartReverse, ] or self.feeding.pause # 暂停时也视为“停止” ) # 启动条件:处于 FStart 且未暂停,且线程未运行 if is_running and self.sensor_thread is None: print("启动传感器线程..........!!!!!!!!!!!!!!!!!!!!!!") try: self.relay_controller._running = True self.sensor_thread = threading.Thread( target=self.relay_controller.handle_sensor1, name="Sensor1MonitorThread", daemon=True, ) self.sensor_thread.start() self.sensor2_thread = threading.Thread( target=self.relay_controller.handle_sensor2, daemon=True ) self.sensor2_thread.start() print("🟢 传感器1监控线程已启动(开始投料)") print("🟢 传感器2监控线程已启动(关闭滚筒)") except Exception as e: log.log_message(logging.ERROR, f"启动传感器线程失败: {e}") # 关闭条件:暂停、完成、回退等状态 if is_stopped and self.sensor_thread is not None: print("进入了传感器线程关闭流程") try: self.relay_controller._running = False if self.sensor_thread.is_alive(): self.sensor_thread.join(timeout=1) print("🛑 传感器监控线程已关闭(暂停/完成/回退)") self.relay_controller.close(conveyor2=True) except Exception as e: print("传感器线程关闭流程发生了异常") log.log_message(logging.ERROR, f"关闭传感器线程异常: {e}") finally: self.sensor_thread = None # 如果你也有 handle_sensor2 线程,也可以在这里关闭 # 处理命令队列 if not self.command_quene.empty(): command = self.command_quene.get() if ( isinstance(command, FeedCommand) and command.status == Status.Prepareing ): if self.feeding.feedStatus == FeedStatus.FNone: position_origin = PositionModel() position_origin.init_position(self.robotClient.origin_position) position_origin.status = 1 command.feed_config.feedLine.feed_positions.insert( 0, position_origin ) self.robotClient.send_emergency_sound() time.sleep(5) self.robotClient.send_emergency_stop() self.feeding.feedConfig = command.feed_config self.feeding.feedStatus = ( FeedStatus.FStart ) # ✅ 投料开始,会触发传感器线程启动 command.status = Status.Runing self.record_remain_num() # 执行 feeding 主逻辑 try: self.feeding.run() self.feeding.run_reset() except Exception as e: log.log_message(logging.ERROR, f"Feeding运行异常: {e}") # while 循环结束,程序退出,确保线程关闭 try: if self.sensor_thread is not None: self.relay_controller._running = False print( "self.relay_controller._running: ", self.relay_controller._running ) if self.sensor_thread.is_alive(): print("进入 传感器线程等待") self.sensor_thread.join(timeout=1) print("⏹ 主程序退出,传感器线程已关闭") self.sensor_thread = None print("self.sensor_thread: ", self.sensor_thread) except Exception as e: print(f"主循环退出时关闭线程异常: {e}") log.log_message(logging.ERROR, f"主循环退出时关闭线程异常: {e}") def run_detect_persion(self): while self.thread_signal: has_person = False # has_person, _ = self.detection_person.get_person() # TODO if has_person: # TODO # self.feeding.pause = True # self.send_pause_command(True) # # self.show_messagebox_of_person() # msg_box_person.setText("检测到安全区域后人是否继续生产?") # result = msg_box_person.exec() # if result == QMessageBox.StandardButton.Cancel: # return log.log_message(logging.ERROR, "人员进入安全区") time.sleep(1) pass def updateUI(self): while self.thread_signal: time.sleep(0.2) if self.robotClient.connected: self.set_label_status_style(True) else: self.set_label_status_style(False) if self.feeding.feedStatus != FeedStatus.FNone: self.horizontalSlider_feedingNum.setValue( self.horizontalSlider_feedingNum.maximum() - self.feeding.feedConfig.num ) # self.label_remain_num.setText(str(self.feeding.feedConfig.num)) else: self.set_run_status_button(False) if self.feeding.feedConfig != None: # 修改点1:这里修改显示剩余袋数的逻辑 # 原来的逻辑是显示剩余袋数:self.label_remain_num.setText(self.feeding.feedConfig.num)) # 我改成了目标袋数减剩余袋数就是已经投料的袋数self.label_remain_num.setText(str(self.horizontalSlider_feedingNum.maximum()-self.feeding.feedConfig.num)) self.label_remain_num.setText( str( self.horizontalSlider_feedingNum.maximum() - self.feeding.feedConfig.num ) ) if self.feeding.feedStatus == FeedStatus.FNone: self.stackedWidget_num.setCurrentIndex(0) else: self.stackedWidget_num.setCurrentIndex(1) self.label_date.setText(datetime.now().strftime("%Y-%m-%d")) self.label_time.setText(datetime.now().strftime("%H:%M:%S")) self.updateUI_seting.emit() def update_seting_frame(self): self.updateUI_Position() self.updateUI_label_status() self.updateUI_frame_sign(self.feeding.feedStatus) self.updateUI_IOPanel() def updateRobotSeting(self): self.lineEdit_origin_x.setText(str(self.robotClient.origin_position.X)) self.lineEdit_origin_y.setText(str(self.robotClient.origin_position.Y)) self.lineEdit_origin_z.setText(str(self.robotClient.origin_position.Z)) self.lineEdit_origin_u.setText(str(self.robotClient.origin_position.U)) self.lineEdit_origin_v.setText(str(self.robotClient.origin_position.V)) self.lineEdit_origin_w.setText(str(self.robotClient.origin_position.W)) @Slot() def show_no_photo_message_box(self): print("显示弹窗图片") self.feeding.pause = True self.send_pause_command(pause=1) msg_box_person = QMessageBox() msg_box_person.setIcon(QMessageBox.Icon.Warning) msg_box_person.setText("未识别到料袋报警,请重新放料后,点击继续") msg_box_person.setWindowTitle("提示") ok_button = msg_box_person.addButton("确定", QMessageBox.AcceptRole) cancel_button = msg_box_person.addButton("取消", QMessageBox.RejectRole) result = msg_box_person.exec() if msg_box_person.clickedButton() == cancel_button: return # self.show_infomessage_box("") def updateUI_IOPanel(self): try: io_bits = self.robotClient.status_model.get_IO_bits() for index, bit in enumerate(io_bits): toggle = self.dirt_io_points[f"y{index+1}"] if toggle.is_on == bit: continue else: toggle.change_status() except Exception as e: log.log_message(logging.ERROR, Constant.str_sys_log_IO_error) pass @Slot() def updateUI_label_detection(self, img: np.ndarray): img_copy = np.copy(img) backgroud_img = Util.util_pic.cv2_to_qpixmap(img_copy) if backgroud_img == None: return backgroud_img = backgroud_img.scaled( self.label_showDetection.size().width(), self.label_showDetection.size().height(), Qt.AspectRatioMode.IgnoreAspectRatio, Qt.TransformationMode.SmoothTransformation, ) self.label_showDetection.setPixmap(backgroud_img) @Slot() def log_message(self, level, message): log.log_message(level, message) def updateUI_Select_Line(self): self.comboBox_lineIndex.clear() for key, value in self.feedLine_dict.items(): self.comboBox_lineIndex.addItem(value.name, key) def updateUI_label_status(self): if self.robotClient.status_model.isMoving == 1: self.label_move_sign.show() if self.label_move_sign.text() == "正在移动.": self.label_move_sign.setText("正在移动..") else: self.label_move_sign.setText("正在移动.") else: self.label_move_sign.hide() if self.robotClient.status_model.curMode >= 0: try: self.label_status_model.setText( Constant.mode_array[self.robotClient.status_model.curMode] ) except: self.label_status_model.setText("未知模式") self.label_status_remoteCmdLen.setText( str(self.robotClient.status_model.RemoteCmdLen) ) if self.robotClient.status_model.curAlarm != 0: log.log_message( logging.ERROR, Constant.str_sys_log_alarm_error + str(self.robotClient.status_model.curAlarm), ) self.feeding.pause = True self.label_status_alarmcode.setText(str(self.robotClient.status_model.curAlarm)) self.label_status_toolIndex.setText( str(self.robotClient.status_model.toolCoord) ) self.label_status_speed.setText(str(self.robotClient.status_model.curSpeed_n)) def updateUI_Position(self): self.horizontalSlider_J1.setValue(self.status_address.axis_0) self.horizontalSlider_J2.setValue(self.status_address.axis_1) self.horizontalSlider_J3.setValue(self.status_address.axis_2) self.horizontalSlider_J4.setValue(self.status_address.axis_3) self.horizontalSlider_J5.setValue(self.status_address.axis_4) self.horizontalSlider_J6.setValue(self.status_address.axis_5) self.label_j1.setText(str(self.status_address.axis_0)) self.label_j2.setText(str(self.status_address.axis_1)) self.label_j3.setText(str(self.status_address.axis_2)) self.label_j4.setText(str(self.status_address.axis_3)) self.label_j5.setText(str(self.status_address.axis_4)) self.label_j6.setText(str(self.status_address.axis_5)) self.horizontalSlider_J1.setValue(self.status_address.axis_0) self.horizontalSlider_J2.setValue(self.status_address.axis_1) self.horizontalSlider_J3.setValue(self.status_address.axis_2) self.horizontalSlider_J4.setValue(self.status_address.axis_3) self.horizontalSlider_J5.setValue(self.status_address.axis_4) self.horizontalSlider_J6.setValue(self.status_address.axis_5) def set_position_to_tabel(self, row_i, position_j, real_Position: Real_Position): self.tableWidget_feedSeting.setItem( row_i, position_j * 6 + self.tableWidget_feedSeting_addtional_col_num, QTableWidgetItem(str(real_Position.X)), ) self.tableWidget_feedSeting.setItem( row_i, position_j * 6 + 1 + self.tableWidget_feedSeting_addtional_col_num, QTableWidgetItem(str(real_Position.Y)), ) self.tableWidget_feedSeting.setItem( row_i, position_j * 6 + 2 + self.tableWidget_feedSeting_addtional_col_num, QTableWidgetItem(str(real_Position.Z)), ) self.tableWidget_feedSeting.setItem( row_i, position_j * 6 + 3 + self.tableWidget_feedSeting_addtional_col_num, QTableWidgetItem(str(real_Position.U)), ) self.tableWidget_feedSeting.setItem( row_i, position_j * 6 + 4 + self.tableWidget_feedSeting_addtional_col_num, QTableWidgetItem(str(real_Position.V)), ) self.tableWidget_feedSeting.setItem( row_i, position_j * 6 + 5 + self.tableWidget_feedSeting_addtional_col_num, QTableWidgetItem(str(real_Position.W)), ) def updateUI_frame_sign(self, sign: FeedStatus): # print("start") if sign == FeedStatus.FNone: self.set_sign_status(self.label_sign_go, self.pushButton_sign_go, False) self.set_sign_status( self.label_sign_photo, self.pushButton_sign_photo, False ) self.set_sign_status(self.label_sign_take, self.pushButton_sign_take, False) self.set_sign_status(self.label_sign_feed, self.pushButton_sign_feed, False) return if sign < FeedStatus.FPhoto: self.set_sign_status(self.label_sign_go, self.pushButton_sign_go, True) self.set_sign_status( self.label_sign_photo, self.pushButton_sign_photo, False ) self.set_sign_status(self.label_sign_take, self.pushButton_sign_take, False) self.set_sign_status(self.label_sign_feed, self.pushButton_sign_feed, False) return if sign <= FeedStatus.FPhoto: self.set_sign_status(self.label_sign_go, self.pushButton_sign_go, False) self.set_sign_status( self.label_sign_photo, self.pushButton_sign_photo, True ) self.set_sign_status(self.label_sign_take, self.pushButton_sign_take, False) self.set_sign_status(self.label_sign_feed, self.pushButton_sign_feed, False) return if sign <= FeedStatus.FTake: self.set_sign_status(self.label_sign_go, self.pushButton_sign_go, False) self.set_sign_status( self.label_sign_photo, self.pushButton_sign_photo, False ) self.set_sign_status(self.label_sign_take, self.pushButton_sign_take, True) self.set_sign_status(self.label_sign_feed, self.pushButton_sign_feed, False) return if sign <= FeedStatus.FBroken1: self.set_sign_status(self.label_sign_go, self.pushButton_sign_go, False) self.set_sign_status( self.label_sign_photo, self.pushButton_sign_photo, False ) self.set_sign_status(self.label_sign_take, self.pushButton_sign_take, False) self.set_sign_status(self.label_sign_feed, self.pushButton_sign_feed, True) return pass def set_label_status_style(self, connected: bool): # return if connected and not self.label_connect_status.isEnabled(): self.label_connect_status.setEnabled(True) if not connected and self.label_connect_status.isEnabled(): self.label_connect_status.setDisabled(True) def set_sign_status(self, label, btn, signed: bool): # return try: if signed and label.isEnabled(): label.setDisabled(True) btn.setDisabled(True) # if label.styleSheet().strip() != self.active_label_sign_Qss: # label.setStyleSheet(self.active_label_sign_Qss) # self.active_label_sign_Qss = label.styleSheet().strip() # # if btn.styleSheet().strip() != self.active_btn_sign_Qss: # btn.setStyleSheet(self.active_btn_sign_Qss) # self.active_btn_sign_Qss = btn.styleSheet().strip() if not signed and not label.isEnabled(): label.setEnabled(True) btn.setEnabled(True) # if label.styleSheet().strip() != self.noactive_label_sign_Qss: # label.setStyleSheet(self.noactive_label_sign_Qss) # self.noactive_label_sign_Qss = label.styleSheet().strip() # if btn.styleSheet().strip() != self.noactive_btn_sign_Qss: # btn.setStyleSheet(self.noactive_btn_sign_Qss) # self.noactive_btn_sign_Qss = btn.styleSheet().strip() except Exception as e: print(e) def set_run_status_button(self, isRuning: bool): self.pushButton_pauseFeed.setText("暂停") ##self.pushButton_startFeed.setEnabled(False) # if isRuning: # self.pushButton_pauseFeed.show() # self.pushButton_stopFeed.show() # self.pushButton_startFeed.hide() # else: # self.pushButton_pauseFeed.hide() # self.pushButton_stopFeed.hide() # self.pushButton_startFeed.show() def send_clear_auto_command(self): clear_command = CMDInstructRequest() clear_command.emptyList = "1" request_command = clear_command.toString() log.log_message(logging.INFO, Constant.str_sys_clearAlarm) 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, speed=5, p2=None, ): # ailaimi position_instruction = Instruction() position_instruction.m0 = float(x1) position_instruction.m1 = float(x2) position_instruction.m2 = float(x3) position_instruction.m3 = float(x4) position_instruction.action = move_type.value position_instruction.speed = self.robotClient.debug_speed position_instruction.tool = 0 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() log_str = ( f'移动到位置:{"自由路径" if move_type == MoveType.AXIS else "姿势直线"}:' f"m0:{position_instruction.m0}-" f"m2:{position_instruction.m1}-" f"m3:{position_instruction.m2}-" f"m4:{position_instruction.m3}-" ) log.log_message(logging.INFO, log_str) print("request_command", request_command) self.robotClient.add_sendQuene(request_command) def send_pause_command(self, pause: bool): pause_command = CMDRequest() pause_command.cmdData.append("actionPause") if pause: pause_command.cmdData.append("1") else: pause_command.cmdData.append("0") request_command = pause_command.toString() self.robotClient.add_sendQuene(request_command) def send_emergency_alarm_command(self): self.feeding.feedStatus = FeedStatus.FNone stop_command = CMDRequest() stop_command.cmdData.append("actionStop") stop_command.cmdData.append("1") request_command = stop_command.toString() self.send_clear_auto_command() self.robotClient.add_sendQuene(request_command) self.feeding.send_emergency_sound() self.feeding.feedConfig.num = 0 log.log_message(logging.INFO, Constant.str_sys_emergencyStop) # TODO def send_clear_alarm_command(self, pause: bool): self.send_clear_auto_command() pause_command = CMDRequest() pause_command.cmdData.append("StopButton") pause_command.cmdData.append("1") request_command = pause_command.toString() self.robotClient.add_sendQuene(request_command) def send_switch_tool_command(self): switch_command = CMDRequest() switch_command.cmdData.append("switchTool") switch_command.cmdData.append("2") request_command = switch_command.toString() self.robotClient.add_sendQuene(request_command) def send_start_tool_command(self): switch_command = CMDRequest() switch_command.cmdData.append("startButton") switch_command.cmdData.append("1") request_command = switch_command.toString() self.robotClient.add_sendQuene(request_command) def show_messagebox_of_person(self): msg_box = QMessageBox(self) msg_box.setWindowTitle("提示") msg_box.setText("当前有人是否继续") msg_box.setIcon(QMessageBox.Question) msg_box.setStandardButtons(QMessageBox.Yes) msg_box.setDefaultButton(QMessageBox.Yes) result = msg_box.exec() if result == QMessageBox.Yes: self.feeding.pause = False self.send_pause_command(False) ### 设置界面 def get_p1_button_click(self): realPosition = self.robotClient.status_model.getRealPosition() self.lineEdit_x1.setText(str(realPosition.X)) self.lineEdit_y1.setText(str(realPosition.Y)) self.lineEdit_z1.setText(str(realPosition.Z)) self.lineEdit_u1.setText(str(realPosition.U)) self.lineEdit_v1.setText(str(realPosition.V)) self.lineEdit_w1.setText(str(realPosition.W)) def get_p2_button_click(self): realPosition = self.robotClient.status_model.getRealPosition() self.lineEdit_x2.setText(str(realPosition.X)) self.lineEdit_y2.setText(str(realPosition.Y)) self.lineEdit_z2.setText(str(realPosition.Z)) self.lineEdit_u2.setText(str(realPosition.U)) self.lineEdit_v2.setText(str(realPosition.V)) self.lineEdit_w2.setText(str(realPosition.W)) def get_p3_button_click(self): realPosition = self.robotClient.status_model.getRealPosition() self.lineEdit_x3.setText(str(realPosition.X)) self.lineEdit_y3.setText(str(realPosition.Y)) self.lineEdit_z3.setText(str(realPosition.Z)) self.lineEdit_u3.setText(str(realPosition.U)) self.lineEdit_v3.setText(str(realPosition.V)) self.lineEdit_w3.setText(str(realPosition.W)) def get_p4_button_click(self): realPosition = self.robotClient.status_model.getRealPosition() self.lineEdit_x4.setText(str(realPosition.X)) self.lineEdit_y4.setText(str(realPosition.Y)) self.lineEdit_z4.setText(str(realPosition.Z)) self.lineEdit_u4.setText(str(realPosition.U)) self.lineEdit_v4.setText(str(realPosition.V)) self.lineEdit_w4.setText(str(realPosition.W)) def get_p5_button_click(self): realPosition = self.robotClient.status_model.getRealPosition() self.lineEdit_x5.setText(str(realPosition.X)) self.lineEdit_y5.setText(str(realPosition.Y)) self.lineEdit_z5.setText(str(realPosition.Z)) self.lineEdit_u5.setText(str(realPosition.U)) self.lineEdit_v5.setText(str(realPosition.V)) self.lineEdit_w5.setText(str(realPosition.W)) def get_origin_button_click(self): realPosition = self.robotClient.status_model.getRealPosition() self.lineEdit_origin_x.setText(str(realPosition.X)) self.lineEdit_origin_y.setText(str(realPosition.Y)) self.lineEdit_origin_z.setText(str(realPosition.Z)) self.lineEdit_origin_u.setText(str(realPosition.U)) self.lineEdit_origin_v.setText(str(realPosition.V)) self.lineEdit_origin_w.setText(str(realPosition.W)) def set_p1_button_click(self): try: x1 = float(self.lineEdit_x1.text()) y1 = float(self.lineEdit_y1.text()) z1 = float(self.lineEdit_z1.text()) u1 = float(self.lineEdit_u1.text()) v1 = float(self.lineEdit_v1.text()) w1 = float(self.lineEdit_w1.text()) self.robotClient.photo_locs[0] = (x1, y1, z1, u1, v1, w1) self.configReader.read(Constant.set_ini) self.configReader.set("Robot_Feed", "photo_x1", str(x1)) self.configReader.set("Robot_Feed", "photo_y1", str(y1)) self.configReader.set("Robot_Feed", "photo_z1", str(z1)) self.configReader.set("Robot_Feed", "photo_u1", str(u1)) self.configReader.set("Robot_Feed", "photo_v1", str(v1)) self.configReader.set("Robot_Feed", "photo_w1", str(w1)) self.configReader.write(open(Constant.set_ini, "w", encoding="utf-8")) log.log_message(logging.INFO, f"设置拍照点1:{x1},{y1},{z1}") except: self.show_infomessage_box("设置拍照点1失败") def set_p2_button_click(self): try: x2 = float(self.lineEdit_x2.text()) y2 = float(self.lineEdit_y2.text()) z2 = float(self.lineEdit_z2.text()) u2 = float(self.lineEdit_u2.text()) v2 = float(self.lineEdit_v2.text()) w2 = float(self.lineEdit_w2.text()) self.robotClient.photo_locs[1] = (x2, y2, z2, u2, v2, w2) self.configReader.read(Constant.set_ini) self.configReader.set("Robot_Feed", "photo_x2", str(x2)) self.configReader.set("Robot_Feed", "photo_y2", str(y2)) self.configReader.set("Robot_Feed", "photo_z2", str(z2)) self.configReader.set("Robot_Feed", "photo_u2", str(u2)) self.configReader.set("Robot_Feed", "photo_v2", str(v2)) self.configReader.set("Robot_Feed", "photo_w2", str(w2)) self.configReader.write(open(Constant.set_ini, "w", encoding="utf-8")) log.log_message(logging.INFO, f"设置拍照点2:{x2},{y2},{z2}") except: self.show_infomessage_box("设置拍照点2失败") def set_p3_button_click(self): try: x3 = float(self.lineEdit_x3.text()) y3 = float(self.lineEdit_y3.text()) z3 = float(self.lineEdit_z3.text()) u3 = float(self.lineEdit_u3.text()) v3 = float(self.lineEdit_v3.text()) w3 = float(self.lineEdit_w3.text()) self.robotClient.photo_locs[2] = (x3, y3, z3, u3, v3, w3) self.configReader.read(Constant.set_ini) self.configReader.set("Robot_Feed", "photo_x3", str(x3)) self.configReader.set("Robot_Feed", "photo_y3", str(y3)) self.configReader.set("Robot_Feed", "photo_z3", str(z3)) self.configReader.set("Robot_Feed", "photo_u3", str(u3)) self.configReader.set("Robot_Feed", "photo_v3", str(v3)) self.configReader.set("Robot_Feed", "photo_w3", str(w3)) self.configReader.write(open(Constant.set_ini, "w", encoding="utf-8")) log.log_message(logging.INFO, f"设置拍照点3:{x3},{y3},{z3}") except: self.show_infomessage_box("设置拍照点3失败") def set_p4_button_click(self): try: x4 = float(self.lineEdit_x4.text()) y4 = float(self.lineEdit_y4.text()) z4 = float(self.lineEdit_z4.text()) u4 = float(self.lineEdit_u4.text()) v4 = float(self.lineEdit_v4.text()) w4 = float(self.lineEdit_w4.text()) self.robotClient.photo_locs[3] = (x4, y4, z4, u4, v4, w4) self.configReader.read(Constant.set_ini) self.configReader.set("Robot_Feed", "photo_x4", str(x4)) self.configReader.set("Robot_Feed", "photo_y4", str(y4)) self.configReader.set("Robot_Feed", "photo_z4", str(z4)) self.configReader.set("Robot_Feed", "photo_u4", str(u4)) self.configReader.set("Robot_Feed", "photo_v4", str(v4)) self.configReader.set("Robot_Feed", "photo_w4", str(w4)) self.configReader.write(open(Constant.set_ini, "w", encoding="utf-8")) log.log_message(logging.INFO, f"设置拍照点4:{x4},{y4},{z4}") except: self.show_infomessage_box("设置拍照点4失败") def set_p5_button_click(self): try: x5 = float(self.lineEdit_x5.text()) y5 = float(self.lineEdit_y5.text()) z5 = float(self.lineEdit_z5.text()) u5 = float(self.lineEdit_u5.text()) v5 = float(self.lineEdit_v5.text()) w5 = float(self.lineEdit_w5.text()) self.robotClient.photo_locs[4] = (x5, y5, z5, u5, v5, w5) self.configReader.read(Constant.set_ini) self.configReader.set("Robot_Feed", "photo_x5", str(x5)) self.configReader.set("Robot_Feed", "photo_y5", str(y5)) self.configReader.set("Robot_Feed", "photo_z5", str(z5)) self.configReader.set("Robot_Feed", "photo_u5", str(u5)) self.configReader.set("Robot_Feed", "photo_v5", str(v5)) self.configReader.set("Robot_Feed", "photo_w5", str(w5)) self.configReader.write(open(Constant.set_ini, "w", encoding="utf-8")) log.log_message(logging.INFO, f"设置拍照点5:{x5},{y5},{z5}") except: self.show_infomessage_box("设置拍照点5失败") def set_origin_button_click(self): try: x = float(self.lineEdit_origin_x.text()) y = float(self.lineEdit_origin_y.text()) z = float(self.lineEdit_origin_z.text()) u = float(self.lineEdit_origin_u.text()) v = float(self.lineEdit_origin_v.text()) w = float(self.lineEdit_origin_w.text()) origin_position = Real_Position() origin_position.init_position(x, y, z, u, v, w) self.robotClient.origin_position = origin_position self.configReader.read(Constant.set_ini) self.configReader.set("Origin", "X", str(x)) self.configReader.set("Origin", "Y", str(y)) self.configReader.set("Origin", "Z", str(z)) self.configReader.set("Origin", "U", str(u)) self.configReader.set("Origin", "V", str(v)) self.configReader.set("Origin", "W", str(w)) self.configReader.write(open(Constant.set_ini, "w", encoding="utf-8")) log.log_message(logging.INFO, f"设置原点:{x},{y},{z}") except: log.log_message(logging.ERROR, f"设置原点失败") self.show_infomessage_box("设置原点失败") def updateUI_Photo_Set(self): self.lineEdit_x1.setText(str(self.robotClient.photo_locs[0][0])) self.lineEdit_y1.setText(str(self.robotClient.photo_locs[0][1])) self.lineEdit_z1.setText(str(self.robotClient.photo_locs[0][2])) self.lineEdit_u1.setText(str(self.robotClient.photo_locs[0][3])) self.lineEdit_v1.setText(str(self.robotClient.photo_locs[0][4])) self.lineEdit_w1.setText(str(self.robotClient.photo_locs[0][5])) self.lineEdit_x2.setText(str(self.robotClient.photo_locs[1][0])) self.lineEdit_y2.setText(str(self.robotClient.photo_locs[1][1])) self.lineEdit_z2.setText(str(self.robotClient.photo_locs[1][2])) self.lineEdit_u2.setText(str(self.robotClient.photo_locs[1][3])) self.lineEdit_v2.setText(str(self.robotClient.photo_locs[1][4])) self.lineEdit_w2.setText(str(self.robotClient.photo_locs[1][5])) self.lineEdit_x3.setText(str(self.robotClient.photo_locs[2][0])) self.lineEdit_y3.setText(str(self.robotClient.photo_locs[2][1])) self.lineEdit_z3.setText(str(self.robotClient.photo_locs[2][2])) self.lineEdit_u3.setText(str(self.robotClient.photo_locs[2][3])) self.lineEdit_v3.setText(str(self.robotClient.photo_locs[2][4])) self.lineEdit_w3.setText(str(self.robotClient.photo_locs[2][5])) self.lineEdit_x4.setText(str(self.robotClient.photo_locs[3][0])) self.lineEdit_y4.setText(str(self.robotClient.photo_locs[3][1])) self.lineEdit_z4.setText(str(self.robotClient.photo_locs[3][2])) self.lineEdit_u4.setText(str(self.robotClient.photo_locs[3][3])) self.lineEdit_v4.setText(str(self.robotClient.photo_locs[3][4])) self.lineEdit_w4.setText(str(self.robotClient.photo_locs[3][5])) self.lineEdit_x5.setText(str(self.robotClient.photo_locs[4][0])) self.lineEdit_y5.setText(str(self.robotClient.photo_locs[4][1])) self.lineEdit_z5.setText(str(self.robotClient.photo_locs[4][2])) self.lineEdit_u5.setText(str(self.robotClient.photo_locs[4][3])) self.lineEdit_v5.setText(str(self.robotClient.photo_locs[4][4])) self.lineEdit_w5.setText(str(self.robotClient.photo_locs[4][5])) pass def updateUI_Base_Set(self): self.lineEdit_speed_run.setText(str(self.robotClient.feed_speed)) self.lineEdit_speed_debug.setText(str(self.robotClient.debug_speed)) self.lineEdit_speed_reset.setText(str(self.robotClient.reset_speed)) self.lineEdit_take_addr.setText(str(self.robotClient.con_ios[0])) self.lineEdit_press_addr.setText(str(self.robotClient.con_ios[1])) self.lineEdit_shake_addr.setText(str(self.robotClient.con_ios[2])) self.lineEdit_setting_smooth.setText(str(self.robotClient.smooth)) self.lineEdit_timedelay_take.setText(str(self.robotClient.time_delay_take)) self.lineEdit_timedelay_put.setText(str(self.robotClient.time_delay_put)) self.lineEdit_timedelay_shake.setText(str(self.robotClient.time_delay_shake)) self.lineEdit_setting_height.setText(str(self.robotClient.dynamic_height)) def show_infomessage_box(self, message): # print("显示弹窗") msg_box = QMessageBox(self) msg_box.setWindowTitle("提示") msg_box.setText(message) msg_box.setIcon(QMessageBox.Icon.Information) msg_box.setStandardButtons(QMessageBox.StandardButton.Ok) msg_box.show() def send_click_change_stackView(self, index): self.stackedWidget_view.setCurrentIndex(index) if index == 0: self.updateUI_Select_Line() if index == 2: self.updateRobotSeting() self.updateUI_Photo_Set() if index == 3: self.updateUI_Base_Set() # 修改点2:设置一键投料的目标袋数从999设置到40袋 def send_onekeyfeed_button_click(self): # if self.feeding.feedStatus != FeedStatus.FNone: # self.show_infomessage_box("正在执行") # return self.horizontalSlider_feedingNum.setMaximum(40) self.label_maxNum.setText(str(40)) self.horizontalSlider_feedingNum.setValue(0) self.send_startFeed_button_click() self.feeding.onekey = True def send_exit_button_click(self): self.closeEvent(None) QApplication.quit() sys.exit(app.exec()) def send_click_sysmeuExpand(self): self.frame_sys_seting.setVisible(not self.frame_sys_seting.isVisible()) if self.frame_2.sizePolicy().verticalPolicy() == QSizePolicy.Policy.Fixed: self.frame_2.setSizePolicy( QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding ) else: self.frame_2.setSizePolicy( QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed ) def send_IO_Point_OpenOrClose(self, index, togger): if togger: self.feeding.sendIOControl(index - 1, 1) log.log_message(logging.INFO, f"打开IO{index}") else: self.feeding.sendIOControl(index - 1, 0) log.log_message(logging.INFO, f"关闭IO{index}") def showEvent(self, event): super().showEvent(event) QTimer.singleShot(2000, self.check_continue) def closeEvent(self, event): self.hide() # 用户体验,先将窗口隐藏掉 print("self.record_remain_num") self.record_remain_num() print("self.feeding.close_feed()") self.feeding.close_feed() self.thread_signal = False print("self.detect_person_thread.join()") self.detect_person_thread.join() print("self.main_UI_threading.join()") self.main_UI_threading.join() print("self.main_threading.join()") self.main_threading.join() print("after self.main_threading.join()") self.robotClient.close() print("self.robot_connect_threading.join()") self.robot_connect_threading.join() log.log_message(logging.INFO, Constant.str_sys_exit) print(" closeEvent over") # os._exit(0) # 记录投料袋数 def record_remain_num(self): try: self.configReader = configparser.ConfigParser() self.configReader.read(Constant.set_ini) self.configReader.set( "Robot_Feed", "remain_linename", str(self.feeding.feedConfig.feedLine.id), ) self.configReader.set( "Robot_Feed", "remain_count", str(self.feeding.feedConfig.num) ) self.configReader.write(open(Constant.set_ini, "w", encoding="utf-8")) except: log.log_message(logging.ERROR, Constant.str_sys_log_feedNum) class MyApplication(QApplication): def __init__(self, argv): super().__init__(argv) def notify(self, receiver, event): try: return super().notify(receiver, event) except Exception as e: log.log_message(logging.ERROR, e) # 可以在这里记录日志或者执行其他操作 return False def handle_exception(exc_type, exc_value, exc_tb): if issubclass(exc_type, KeyboardInterrupt): log.log_message(logging.INFO, "用户主动退出程序") return log.log_message(logging.ERROR, exc_value) traceback.print_exception(exc_type, exc_value, exc_tb) if __name__ == "__main__": app = MyApplication(sys.argv) window = MainWindow() window.show() sys.excepthook = handle_exception try: sys.exit(app.exec()) print("after sys.exit(app.exec())") except Exception as e: log.log_message(logging.ERROR, e)