料袋末尾检测
This commit is contained in:
522
main.py
522
main.py
@ -19,7 +19,7 @@ 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
|
||||
QTableWidgetItem, QWidget, QHBoxLayout, QAbstractItemView, QMessageBox, QSizePolicy, QComboBox, QMenu, QDialog, QGridLayout
|
||||
from datetime import datetime
|
||||
|
||||
from click import clear
|
||||
@ -47,9 +47,7 @@ from Util.util_log import log
|
||||
from ui_MainWin import Ui_MainWindow
|
||||
from view.ResetView import StopDialog
|
||||
from EMV.EMV import RelayController
|
||||
|
||||
|
||||
#from view.ResetView import StopDialog
|
||||
from CU.drop import DropPositionManager
|
||||
|
||||
|
||||
class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
@ -60,10 +58,18 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
self.setupUi(self)
|
||||
#传感器继电器加入变量
|
||||
self.relay_controller = RelayController()
|
||||
self.drop_position_manager = DropPositionManager()
|
||||
self.sensor_thread = None
|
||||
self.sensor2_thread = None
|
||||
self.last_status_printed = None
|
||||
self.last_pause_printed = None
|
||||
self.cur_pushbutton_num = None
|
||||
self.pushbutton_num_style = """
|
||||
QPushButton { background-color: #101F3F;color:#ffffff }
|
||||
"""
|
||||
self.pushbutton_num_style_select = """
|
||||
QPushButton { background-color: lightgreen; color: black; }
|
||||
"""
|
||||
#传感器加入变量结束
|
||||
#self.setWindowFlags(Qt.WindowType.FramelessWindowHint)
|
||||
self.thread_signal = True
|
||||
@ -80,6 +86,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
self.table_line_changed = False
|
||||
self.table_position_changed = False
|
||||
self.selected_line_section = ''
|
||||
|
||||
|
||||
|
||||
def init_IOPanel(self):
|
||||
self.dirt_io_points = {}
|
||||
@ -225,12 +233,15 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
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'))
|
||||
if section.startswith(Constant.feedLine_set_section):
|
||||
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'))
|
||||
elif section.startswith(Constant.dropLine_set_section):
|
||||
self.drop_position_manager.save_path_points(line_model)
|
||||
self.init_FeedLine()
|
||||
break
|
||||
self.init_table_lines_data()
|
||||
@ -267,19 +278,25 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
self.table_line_changed = False
|
||||
self.table_position_changed = False
|
||||
self.tableWidget_lines.setRowCount(0)
|
||||
last_item_index=len(self.feedLine_dict.items())+1
|
||||
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.init_table_lines_item(key,value.name,value.id)
|
||||
# self.init_table_lines_item('feedline'+str(last_item_index),'码垛路径',last_item_index)
|
||||
self.tableWidget_line_positions.setRowCount(0)
|
||||
self.tableWidget_lines.blockSignals(False)
|
||||
|
||||
def init_table_lines_item(self,key,name,id):
|
||||
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(name))
|
||||
self.tableWidget_lines.setItem(self.tableWidget_lines.rowCount()-1, 2, QTableWidgetItem(str(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 = ''
|
||||
|
||||
def show_lines_context_menu(self):
|
||||
menu = QMenu(self)
|
||||
action_add = menu.addAction("添加投料线")
|
||||
@ -388,11 +405,14 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
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'))
|
||||
|
||||
if self.selected_line_section.startswith(Constant.dropLine_set_section):
|
||||
self.drop_position_manager.del_drop_point(section)
|
||||
else:
|
||||
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
|
||||
@ -493,6 +513,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
#自由路径修改成关节坐标
|
||||
combox_lineType.addItem("关节",4)
|
||||
combox_lineType.setCurrentIndex(combox_lineType.findData(position_model.lineType))
|
||||
combox_lineType.wheelEvent=lambda e:None
|
||||
combox_lineType.currentIndexChanged.connect(self.send_table_position_status_changed)
|
||||
self.tableWidget_line_positions.setCellWidget(row_i, 7, combox_lineType)
|
||||
|
||||
@ -504,10 +525,12 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
combox.addItem("抓取",5)
|
||||
combox.addItem("抓取后点", 3)
|
||||
combox.addItem("破带点1",6)
|
||||
combox.addItem("破带点2",7)
|
||||
combox.addItem("码垛前点",7)
|
||||
combox.addItem("震动点",8)
|
||||
combox.addItem("扔带点",9)
|
||||
combox.addItem("码垛点",9)
|
||||
combox.addItem("码垛后点",10)
|
||||
combox.setCurrentIndex(combox.findData(position_model.status))
|
||||
combox.wheelEvent=lambda e:None
|
||||
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)))
|
||||
@ -566,15 +589,23 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
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.tableWidget_line_positions.setStyleSheet("""
|
||||
QTableWidget::item:selected {
|
||||
background-color: #888888;
|
||||
}
|
||||
""")
|
||||
self.label_showDetection.setScaledContents(True)
|
||||
if self.label_showDetection.size().width() < 100 or self.label_showDetection.size().height() < 100:
|
||||
self.label_showDetection.setMinimumSize(541, 321)
|
||||
|
||||
self.timer_updateui=QTimer(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.lineEdit_j1.returnPressed.connect(self.send_position_returnPressed)
|
||||
self.lineEdit_j2.returnPressed.connect(self.send_position_returnPressed)
|
||||
@ -598,7 +629,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
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_stopFeed.clicked.connect(self.send_emergency_alarm_command)
|
||||
self.pushButton_pauseFeed.clicked.connect(self.send_pauseFeed_button_click)
|
||||
|
||||
self.pushButton_get_p1.clicked.connect(self.get_p1_button_click)
|
||||
@ -616,13 +647,14 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
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_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.pushButton_numkeybord.clicked.connect(self.send_numkeybord_click)
|
||||
|
||||
#self.tabWidget_control.currentChanged.connect(self.send_tabWidget_control_change)
|
||||
|
||||
@ -637,8 +669,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
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)
|
||||
|
||||
# self.pushButton_onekeyfeed.clicked.connect(self.send_onekeyfeed_button_click)
|
||||
self.comboBox_lineIndex.wheelEvent=lambda e:None
|
||||
int_validator = QIntValidator(0, 100, self.lineEdit_num)
|
||||
self.lineEdit_num.setValidator(int_validator)
|
||||
|
||||
@ -650,9 +682,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
self.horizontalSlider_feedingNum.blockSignals(True)
|
||||
self.horizontalSlider_feedingNum.setMinimum(0)
|
||||
|
||||
|
||||
|
||||
|
||||
def init_Run(self):
|
||||
self.robotClient = None
|
||||
self.configReader = configparser.ConfigParser()
|
||||
@ -715,15 +744,27 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
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 = Feeding(self.robotClient,self.relay_controller)
|
||||
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.take_photo_sigal.connect(self.show_photo_message)
|
||||
# self.feeding.update_detect_image.connect(self.updateUI_label_detection)
|
||||
# self.camera_img.update_camera_image.connect(self.updateUI_label_detection)
|
||||
self.feeding.log_signal.connect(self.log_message)
|
||||
self.feeding.stack_finish_signal.connect(self.stack_finish)
|
||||
# self.camera_img=CameraImg(self.feeding)
|
||||
# self.camera_img.update_camera_image.connect(self.updateUI_label_detection)
|
||||
|
||||
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.maduo_Count = int(self.configReader.get('Robot_Feed', 'maduo_Count'))
|
||||
self.label_remain_num.setText(str(self.remain_Count))
|
||||
self.label_maxNum.setText(str(self.maduo_Count))
|
||||
_cur_sel_button=[button for button in self.frame_23.findChildren(QPushButton) if button.text()==str(self.maduo_Count)]
|
||||
if _cur_sel_button:
|
||||
_cur_sel_button[0].setStyleSheet(self.pushbutton_num_style_select)
|
||||
self.cur_pushbutton_num = _cur_sel_button[0]
|
||||
self.horizontalSlider_feedingNum.setMaximum(self.maduo_Count)
|
||||
self.updateUI_seting.connect(self.update_seting_frame)
|
||||
try:
|
||||
self.robotClient.CreatConnect()
|
||||
@ -851,6 +892,12 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
feed_line = LineModel()
|
||||
feed_line.read_line_model(config_reader=configReader,index=i)
|
||||
self.feedLine_dict[f'{Constant.feedLine_set_section}{i}'] = feed_line
|
||||
#加载所有码垛的路径信息
|
||||
for i in range(1,Constant.MAX_Line_num):
|
||||
line_model = self.drop_position_manager.load_path_points(i)
|
||||
if line_model:
|
||||
self.feedLine_dict[f'{Constant.dropLine_set_section}{i}'] = line_model
|
||||
|
||||
self.updateUI_Select_Line()
|
||||
pass
|
||||
|
||||
@ -894,17 +941,40 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
|
||||
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 = Thread(target=self.run,name="feeding")#主循环
|
||||
self.robot_connect_threading = Thread(target=self.robotClient.run,name="robot_connect")
|
||||
# self.main_UI_threading = Thread(target=self.updateUI,name="updateUI")
|
||||
self.timer_updateui.timeout.connect(self.updateUI)
|
||||
self.timer_updateui.start(1000)
|
||||
self.sensor_thread = Thread(
|
||||
target=self.relay_controller.handle_sensor1,
|
||||
name="Sensor1",
|
||||
daemon=True
|
||||
)
|
||||
self.sensor2_thread = Thread(
|
||||
target=self.relay_controller.handle_sensor2,
|
||||
name="Sensor2",
|
||||
daemon=True)
|
||||
self.relay_controller._running=True
|
||||
self.relay_controller.pause_start_sensor(True)
|
||||
|
||||
self.detect_person_thread = Thread(target=self.run_detect_persion,name="run_detect_persion")
|
||||
# self.camera_threading = Thread(target=self.camera_img.run,name="camera",daemon=True)
|
||||
self.main_threading.start()
|
||||
if not Constant.DebugPosition:
|
||||
self.robot_connect_threading.start()
|
||||
self.main_UI_threading.start()
|
||||
# self.main_UI_threading.start()
|
||||
self.detect_person_thread.start()
|
||||
#启动传感器线程
|
||||
self.sensor_thread.start()
|
||||
self.sensor2_thread.start()
|
||||
|
||||
# self.camera_threading.start()
|
||||
|
||||
pass
|
||||
|
||||
|
||||
|
||||
def check_continue(self):
|
||||
if self.remain_Count!=0:
|
||||
for key in self.feedLine_dict.keys():
|
||||
@ -968,13 +1038,23 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
# self.show_messagebox_of_person()
|
||||
msg_box_person.setText("检测到安全区域后人是否继续生产?")
|
||||
result = msg_box_person.exec()
|
||||
if result == QMessageBox.StandardButton.Cancel:
|
||||
if msg_box_person.clickedButton() == cancel_button:
|
||||
return
|
||||
log.log_message(logging.ERROR, '人员进入安全区')
|
||||
|
||||
#QSlide控件默认的最大值为99
|
||||
num = self.horizontalSlider_feedingNum.maximum()
|
||||
# if num==99:
|
||||
# num = 30 #默认是30包
|
||||
line_head = self.comboBox_lineIndex.currentData()
|
||||
num=5 #先默认30包码垛
|
||||
if self.feeding.feedConfig:
|
||||
self.remain_Count=self.feeding.feedConfig.remain_count
|
||||
msg_box_person.setText(f"确认当前是从第{self.remain_Count+1}袋开始码垛,总共需要{num}袋!!")
|
||||
result = msg_box_person.exec()
|
||||
if msg_box_person.clickedButton() == cancel_button:
|
||||
return
|
||||
|
||||
self.label_button_status.setText("运行中...")
|
||||
# num=25 #先默认30包码垛
|
||||
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.remain_Count), self.feeding.robotClient.photo_locs[:],self.remain_Count)))
|
||||
# self.stackedWidget_num.setCurrentIndex(1)
|
||||
self.set_run_status_button(True)
|
||||
@ -989,6 +1069,10 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
self.horizontalSlider_feedingNum.setMaximum(num)
|
||||
self.label_maxNum.setText(str(num))
|
||||
self.horizontalSlider_feedingNum.setValue(0)
|
||||
if self.cur_pushbutton_num:
|
||||
self.cur_pushbutton_num.setStyleSheet(self.pushbutton_num_style)
|
||||
button.setStyleSheet(self.pushbutton_num_style_select)
|
||||
self.cur_pushbutton_num=button
|
||||
else:
|
||||
self.lineEdit_num.show()
|
||||
|
||||
@ -1046,34 +1130,76 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
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()} ')
|
||||
#码垛开始数量
|
||||
self.remain_Count=int(self.lineEdit_num.text())-1
|
||||
if self.remain_Count<0:
|
||||
self.remain_Count=0
|
||||
if self.feeding.feedConfig:
|
||||
self.feeding.feedConfig.remain_count=self.remain_Count
|
||||
self.label_remain_num.setText(str(self.remain_Count))
|
||||
|
||||
def send_numkeybord_click(self):
|
||||
# 创建数字键盘对话框
|
||||
num_dialog = QDialog(self)
|
||||
num_dialog.setWindowTitle("数字键盘")
|
||||
num_dialog.setFixedSize(300, 400)
|
||||
|
||||
# 创建网格布局
|
||||
grid_layout = QGridLayout(num_dialog)
|
||||
|
||||
# 添加1-30的数字按钮
|
||||
for i in range(1, 31):
|
||||
button = QPushButton(str(i), num_dialog)
|
||||
button.setStyleSheet(
|
||||
"""
|
||||
*{background-color: #101F3F;
|
||||
font: 10pt "楷体";
|
||||
color:#ffffff;
|
||||
border-radius: 5px;
|
||||
min-height: 40px;
|
||||
}
|
||||
*:hover {
|
||||
background-color: lightgreen;
|
||||
color: black;
|
||||
}
|
||||
*:pressed {
|
||||
background-color: red;
|
||||
color: white;
|
||||
}
|
||||
""")
|
||||
# 5行6列排列
|
||||
row = (i - 1) // 6
|
||||
col = (i - 1) % 6
|
||||
grid_layout.addWidget(button, row, col)
|
||||
|
||||
# 绑定点击事件
|
||||
button.clicked.connect(lambda checked, num=i: self.set_lineEdit_num_value(num, num_dialog))
|
||||
|
||||
# 添加取消按钮
|
||||
cancel_button = QPushButton("取消", num_dialog)
|
||||
cancel_button.setStyleSheet(
|
||||
"""
|
||||
*{background-color: #6c757d;
|
||||
font: 10pt "楷体";
|
||||
color:#ffffff;
|
||||
border-radius: 5px;
|
||||
min-height: 40px;
|
||||
}
|
||||
*:hover {
|
||||
background-color: #5a6268;
|
||||
}
|
||||
""")
|
||||
grid_layout.addWidget(cancel_button, 5, 0, 1, 6)
|
||||
cancel_button.clicked.connect(num_dialog.close)
|
||||
|
||||
# 显示对话框
|
||||
num_dialog.exec()
|
||||
|
||||
def set_lineEdit_num_value(self, num, dialog):
|
||||
# 设置lineEdit_num的值并关闭对话框
|
||||
self.lineEdit_num.setText(str(num))
|
||||
dialog.close()
|
||||
|
||||
def send_position_button_click(self):
|
||||
# if True:
|
||||
@ -1186,6 +1312,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
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}'
|
||||
@ -1230,26 +1357,64 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
|
||||
def send_stopFeed_button_click(self):
|
||||
# 清空状态
|
||||
#self.feeding.feedStatus = FeedStatus.FNone
|
||||
#self.feeding.reset_status = ResetStatus.RNone
|
||||
self.feeding.feedStatus = FeedStatus.FNone
|
||||
self.feeding.reset_status = ResetStatus.RNone
|
||||
# 清空运行命令
|
||||
self.send_clear_auto_command()
|
||||
self.relay_controller.pause_start_sensor(True)
|
||||
#self.feeding.feedConfig.num = 0
|
||||
log.log_message(logging.INFO, Constant.str_feed_stop)
|
||||
|
||||
def stop_all_work(self):
|
||||
"""停止所有工作"""
|
||||
self.feeding.feedStatus = FeedStatus.FNone
|
||||
self.feeding.reset_status = ResetStatus.RNone
|
||||
self.relay_controller.pause_start_sensor(True)
|
||||
self.feeding.pause = True #暂停,停止滚去等
|
||||
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)
|
||||
|
||||
def send_emergency_alarm_command(self):
|
||||
"""停止当前工作,需要启动"""
|
||||
msg_box_person = QMessageBox()
|
||||
msg_box_person.setIcon(QMessageBox.Icon.Question)
|
||||
msg_box_person.setText("您确定要停止当前工作吗?")
|
||||
msg_box_person.setWindowTitle("提示")
|
||||
|
||||
msg_box_person.addButton("确定", PySide6.QtWidgets.QMessageBox.ButtonRole.AcceptRole)
|
||||
cancel_button = msg_box_person.addButton("取消", PySide6.QtWidgets.QMessageBox.ButtonRole.RejectRole)
|
||||
msg_box_person.exec()
|
||||
if msg_box_person.clickedButton() == cancel_button:
|
||||
return
|
||||
self.stop_all_work()
|
||||
|
||||
#TODO
|
||||
|
||||
|
||||
def send_pauseFeed_button_click(self):
|
||||
if self.pushButton_pauseFeed.text() == '暂停':
|
||||
|
||||
self.relay_controller.pause_start_sensor(True)
|
||||
icon9 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.SystemReboot))
|
||||
self.pushButton_pauseFeed.setIcon(icon9)
|
||||
self.pushButton_pauseFeed.setText('继续')
|
||||
self.label_button_status.setText("已暂停")
|
||||
log.log_message(logging.INFO, Constant.str_feed_pause)
|
||||
self.send_pause_command(True)
|
||||
self.relay_controller.pause_start_sensor(True)
|
||||
self.feeding.pause = True
|
||||
else:
|
||||
self.relay_controller.pause_start_sensor(False)
|
||||
icon9 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackPause))
|
||||
self.pushButton_pauseFeed.setIcon(icon9)
|
||||
self.pushButton_pauseFeed.setText('暂停')
|
||||
self.label_button_status.setText("运行中...")
|
||||
self.send_pause_command(False)
|
||||
log.log_message(logging.INFO, Constant.str_feed_continue)
|
||||
self.send_start_tool_command()
|
||||
@ -1257,6 +1422,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
self.feeding.pause = False
|
||||
|
||||
pass
|
||||
|
||||
|
||||
def send_tabWidget_control_change(self):
|
||||
if self.robotClient.status_model.curMode != 7:
|
||||
self.send_switch_tool_command()
|
||||
@ -1312,7 +1479,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
# 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()
|
||||
@ -1394,60 +1560,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
# 主线程的逻辑就是 feeding.run() 接口和错误状态处理
|
||||
while self.thread_signal:
|
||||
time.sleep(0.1)
|
||||
if not Constant.DebugPosition:
|
||||
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
|
||||
|
||||
# 获取状态和控制标志
|
||||
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:
|
||||
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:
|
||||
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:
|
||||
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()
|
||||
@ -1463,6 +1575,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
time.sleep(5)
|
||||
self.robotClient.send_emergency_stop()
|
||||
self.feeding.feedConfig = command.feed_config
|
||||
# 开启传感器线程检测相关
|
||||
self.relay_controller.pause_start_sensor(False)
|
||||
self.feeding.feedStatus = FeedStatus.FStart # ✅ 投料开始,会触发传感器线程启动
|
||||
command.status = Status.Runing
|
||||
self.record_remain_num()
|
||||
@ -1504,33 +1618,31 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
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.feeding.feedConfig.remain_count)
|
||||
# self.label_remain_num.setText(str(self.feeding.feedConfig.num))
|
||||
else:
|
||||
self.set_run_status_button(False)
|
||||
# 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.feeding.feedConfig.remain_count)
|
||||
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.feeding.feedConfig.remain_count))
|
||||
if self.feeding.feedStatus == FeedStatus.FNone:
|
||||
self.stackedWidget_num.setCurrentIndex(0)
|
||||
else:
|
||||
self.stackedWidget_num.setCurrentIndex(1)
|
||||
# self.label_remain_num.setText(str(self.feeding.feedConfig.num))
|
||||
else:
|
||||
self.set_run_status_button(False)
|
||||
|
||||
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.label_date.setText(datetime.now().strftime("%Y-%m-%d"))
|
||||
self.label_time.setText(datetime.now().strftime("%H:%M:%S"))
|
||||
|
||||
self.updateUI_seting.emit()
|
||||
self.updateUI_seting.emit()
|
||||
|
||||
def update_seting_frame(self):
|
||||
self.updateUI_Position()
|
||||
@ -1547,20 +1659,10 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
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 show_photo_message(self):
|
||||
|
||||
pass
|
||||
|
||||
|
||||
def stack_finish(self):
|
||||
"""
|
||||
@ -1568,15 +1670,17 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
"""
|
||||
# self.feeding.feedConfig.remain_count=0
|
||||
# self.closeEvent(None)
|
||||
self.send_pause_command(True)
|
||||
self.feeding.pause = True
|
||||
|
||||
# self.send_pause_command(True)
|
||||
# self.feeding.pause = True
|
||||
# self.relay_controller.pause_start_sensor(True)
|
||||
msg_box_finish = QMessageBox()
|
||||
msg_box_finish.setIcon(QMessageBox.Icon.Warning)
|
||||
msg_box_finish.setText("码码完成")
|
||||
msg_box_finish.setText("码垛完成,请移走拖板")
|
||||
msg_box_finish.setWindowTitle("提示")
|
||||
msg_box_finish.addButton("确定", QMessageBox.AcceptRole)
|
||||
result=msg_box_finish.exec()
|
||||
self.label_remain_num.setText(str(self.feeding.feedConfig.remain_count))
|
||||
self.stop_all_work()
|
||||
|
||||
|
||||
def updateUI_IOPanel(self):
|
||||
@ -1592,13 +1696,29 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
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:
|
||||
def updateUI_label_detection(self,img):
|
||||
# 检查img是否为字符串路径
|
||||
_backgroud_img=None
|
||||
if isinstance(img, str):
|
||||
try:
|
||||
# 直接使用QPixmap加载图像文件,避免通过cv2转换,提高性能
|
||||
_backgroud_img = PySide6.QtGui.QPixmap(img)
|
||||
except Exception as e:
|
||||
log.log_message(logging.ERROR, f"加载图像时出错: {str(e)}")
|
||||
return
|
||||
else:
|
||||
# 如果不是字符串,则尝试直接复制并转换(兼容旧的np.ndarray参数)
|
||||
try:
|
||||
_backgroud_img = Util.util_pic.cv2_to_qpixmap(img)
|
||||
except Exception as e:
|
||||
log.log_message(logging.ERROR, f"处理图像数据时出错: {str(e)}")
|
||||
return
|
||||
|
||||
# 检查图像是否有效
|
||||
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)
|
||||
_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()
|
||||
@ -1693,7 +1813,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
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:
|
||||
if sign <= FeedStatus.FDropBag:
|
||||
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)
|
||||
@ -1796,21 +1916,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
request_command = pause_command.toString()
|
||||
self.robotClient.add_sendQuene(request_command)
|
||||
|
||||
def send_emergency_alarm_command(self):
|
||||
self.feeding.feedStatus = FeedStatus.FNone
|
||||
self.feeding.pause = True #暂停,停止滚去等
|
||||
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()
|
||||
@ -2103,14 +2208,13 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
if index == 3:
|
||||
self.updateUI_Base_Set()
|
||||
|
||||
#修改点2:设置一键投料的目标袋数从999设置到40袋
|
||||
#修改点2:设置一键投料的目标袋数从999设置到30袋
|
||||
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.setMaximum(30)
|
||||
self.label_maxNum.setText(str(30))
|
||||
self.horizontalSlider_feedingNum.setValue(0)
|
||||
|
||||
self.send_startFeed_button_click()
|
||||
@ -2148,6 +2252,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
# self.feeding.is_detected = False
|
||||
# self.feeding.detect_thread.join()
|
||||
self.feeding.close_feed()
|
||||
# self.camera_img.stop()
|
||||
self.thread_signal = False
|
||||
self.robotClient.close()
|
||||
if self.relay_controller:
|
||||
@ -2162,8 +2267,11 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
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.remain_count))
|
||||
if self.feeding.feedConfig:
|
||||
self.configReader.set('Robot_Feed', 'remain_linename', str(self.feeding.feedConfig.feedLine.id))
|
||||
self.configReader.set('Robot_Feed', 'remain_count', str(self.feeding.feedConfig.remain_count))
|
||||
if self.cur_pushbutton_num:
|
||||
self.configReader.set('Robot_Feed', 'maduo_count', self.cur_pushbutton_num.text())
|
||||
self.configReader.write(open(Constant.set_ini, 'w', encoding='utf-8'))
|
||||
except:
|
||||
log.log_message(logging.ERROR, Constant.str_sys_log_feedNum)
|
||||
|
||||
Reference in New Issue
Block a user