米厂码垛修改

This commit is contained in:
2025-09-10 09:16:57 +08:00
parent 2f45c4c38f
commit 65dde435c8
47 changed files with 11258 additions and 10485 deletions

187
main.py
View File

@ -490,7 +490,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
combox_lineType.addItem("直线",0)
combox_lineType.addItem("曲线中间点",2)
combox_lineType.addItem("曲线终点",3)
combox_lineType.addItem("自由路径",4)
#自由路径修改成关节坐标
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)
@ -719,6 +720,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
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.feeding.stack_finish_signal.connect(self.stack_finish)
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'))
@ -897,10 +899,12 @@ class MainWindow(QMainWindow, Ui_MainWindow):
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()
if not Constant.DebugPosition:
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():
@ -915,7 +919,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
cancel_button = remain_messageBox.addButton("取消", PySide6.QtWidgets.QMessageBox.ButtonRole.RejectRole)
result = remain_messageBox.exec()
if remain_messageBox.clickedButton() == cancel_button:
self.remain_Count = 0
# self.remain_Count = 0
return
self.configReader.read(Constant.feedLine_set_file, encoding='utf-8')
line_name = self.configReader.get(key, 'name')
@ -970,7 +974,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
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[:])))
num=5 #先默认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)
self.feeding.pause = False
@ -1273,19 +1278,31 @@ class MainWindow(QMainWindow, Ui_MainWindow):
#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[:])
if self.feeding.feedConfig:
#改变路径后的值进行复位
__current_feed_config=self.feeding.feedConfig
# __current_lineid=__current_feed_config.feedLine.id
# __current_linename=__current_feed_config.feedLine.name
# __current_position=
# self.feeding.feedConfig= FeedingConfig(0, FeedLine(__current_lineid, __current_linename,
# __current_feed_config.feedLine.positions,0),
# self.feeding.robotClient.photo_locs[:],0)
else:
log.log_message(logging.ERROR, Constant.str_feed_reset_no_line_error)
return
#用配置的路径进行复位
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.remain_Count),
self.feeding.robotClient.photo_locs[:],self.remain_Count)
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)
@ -1377,64 +1394,66 @@ class MainWindow(QMainWindow, Ui_MainWindow):
# 主线程的逻辑就是 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 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
# 只有当状态或暂停标志发生变化时才打印
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}")
# 获取状态和控制标志
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
# 关闭条件:暂停、完成、回退等状态
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 线程,也可以在这里关闭
# 如果你也有 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:
#插入起始点set.ini中配置的点
position_origin = PositionModel()
position_origin.init_position(self.robotClient.origin_position)
position_origin.status = 1
@ -1493,7 +1512,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
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.feeding.feedConfig.remain_count)
# self.label_remain_num.setText(str(self.feeding.feedConfig.num))
else:
self.set_run_status_button(False)
@ -1501,7 +1520,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
#修改点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))
self.label_remain_num.setText(str(self.feeding.feedConfig.remain_count))
if self.feeding.feedStatus == FeedStatus.FNone:
self.stackedWidget_num.setCurrentIndex(0)
else:
@ -1542,6 +1561,23 @@ class MainWindow(QMainWindow, Ui_MainWindow):
if msg_box_person.clickedButton() == cancel_button:
return
# self.show_infomessage_box("")
def stack_finish(self):
"""
码垛完成处理
"""
# self.feeding.feedConfig.remain_count=0
# self.closeEvent(None)
self.send_pause_command(True)
self.feeding.pause = True
msg_box_finish = QMessageBox()
msg_box_finish.setIcon(QMessageBox.Icon.Warning)
msg_box_finish.setText("码码完成")
msg_box_finish.setWindowTitle("提示")
msg_box_finish.addButton("确定", QMessageBox.AcceptRole)
result=msg_box_finish.exec()
def updateUI_IOPanel(self):
try:
@ -1762,7 +1798,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
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")
@ -2081,9 +2117,10 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.feeding.onekey = True
def send_exit_button_click(self):
self.closeEvent(None)
QApplication.quit()
sys.exit(app.exec())
self.close()
# 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())
@ -2102,17 +2139,23 @@ class MainWindow(QMainWindow, Ui_MainWindow):
def showEvent(self, event):
super().showEvent(event)
QTimer.singleShot(2000, self.check_continue)
# QTimer.singleShot(2000, self.check_continue)
def closeEvent(self, event):
#关闭窗口事件
self.record_remain_num()
# self.feeding.is_detected = False
# self.feeding.detect_thread.join()
self.feeding.close_feed()
self.thread_signal = False
self.robotClient.close()
if self.relay_controller:
self.relay_controller.stop_sensor(self.sensor_thread,self.sensor2_thread)
# self.relay_controller.close(conveyor2=True)
log.log_message(logging.INFO, Constant.str_sys_exit)
#显示接受关闭事件
event.accept()
#记录投料袋数
def record_remain_num(self):
@ -2120,7 +2163,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
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.set('Robot_Feed', 'remain_count', str(self.feeding.feedConfig.remain_count))
self.configReader.write(open(Constant.set_ini, 'w', encoding='utf-8'))
except:
log.log_message(logging.ERROR, Constant.str_sys_log_feedNum)