料袋末尾检测

This commit is contained in:
2025-09-28 09:48:12 +08:00
parent 61e6d39dbf
commit 1916fb0bbc
62 changed files with 29808 additions and 21103 deletions

522
main.py
View File

@ -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)