完成自动检测贴标信号后自动回填到包装区域中

This commit is contained in:
zhu-mengmeng 2025-06-11 17:00:05 +08:00
parent 266380f43f
commit fddb83dcce
4 changed files with 163 additions and 100 deletions

Binary file not shown.

View File

@ -2,8 +2,11 @@ from pymodbus.client import ModbusTcpClient
client = ModbusTcpClient('localhost', port=5020) client = ModbusTcpClient('localhost', port=5020)
client.connect() client.connect()
client.write_registers(address=11, values=[15]) # client.write_registers(address=11, values=[117])
client.write_registers(address=13, values=[1])
# client.write_registers(address=13, values=[1])
result = client.read_holding_registers(address=11, count=1)
result = client.read_holding_registers(address=13, count=1)
print(result,"123===") print(result,"123===")
client.close() client.close()

View File

@ -26,9 +26,7 @@ class LabelSignalHandler(RegisterHandler):
self.callback = callback self.callback = callback
self.status_map = { self.status_map = {
0: "无贴标", 0: "无贴标",
1: "贴标中", 1: "贴标完成"
2: "贴标完成",
3: "贴标错误"
} }
def handle_change(self, value): def handle_change(self, value):

View File

@ -46,7 +46,7 @@ class MainWindow(MainWindowUI):
self.corp_name = corp_name self.corp_name = corp_name
self.corp_id = corp_id self.corp_id = corp_id
self.position_id = position_id self.position_id = position_id
self.init_seq = {} # 初始化轴包装的序号
# 设置窗口标题 # 设置窗口标题
if user_name and corp_name: if user_name and corp_name:
self.setWindowTitle(f"腾智微丝产线包装系统 - {user_name} ({corp_name})") self.setWindowTitle(f"腾智微丝产线包装系统 - {user_name} ({corp_name})")
@ -117,7 +117,24 @@ class MainWindow(MainWindowUI):
# 加载已完成检验数据 # 加载已完成检验数据
self.show_pack_item() self.show_pack_item()
# 创建状态处理器实例
self.machine_handlers = MachineStatusHandlers()
# 添加状态显示到状态栏
self.modbus_status_label = QLabel("Modbus: 未连接")
self.weight_label = QLabel("重量: --")
self.label_status_label = QLabel("贴标: 无贴标")
self.error_status_label = QLabel("故障: 无")
# 设置样式
self.error_status_label.setStyleSheet("color: green; font-weight: bold;")
# 添加到状态栏
self.statusBar().addPermanentWidget(self.modbus_status_label)
self.statusBar().addPermanentWidget(self.weight_label)
self.statusBar().addPermanentWidget(self.label_status_label)
self.statusBar().addPermanentWidget(self.error_status_label)
self.statusBar().addPermanentWidget(QLabel(" "))
logging.info(f"主窗口已创建,用户: {user_name}") logging.info(f"主窗口已创建,用户: {user_name}")
def add_pallet_type_selectors(self): def add_pallet_type_selectors(self):
@ -203,8 +220,7 @@ class MainWindow(MainWindowUI):
if self.camera_enabled and hasattr(self, 'camera_display'): if self.camera_enabled and hasattr(self, 'camera_display'):
self.camera_display.signal_camera_status.connect(self.handle_camera_status) self.camera_display.signal_camera_status.connect(self.handle_camera_status)
# 初始化后检查是否有已完成的记录
QTimer.singleShot(1000, self.check_and_process_finished_records)
def update_inspection_columns(self): def update_inspection_columns(self):
"""更新检验列配置 - 使用检验配置管理器获取启用的列数和标题""" """更新检验列配置 - 使用检验配置管理器获取启用的列数和标题"""
@ -445,6 +461,10 @@ class MainWindow(MainWindowUI):
# 获取托盘号对应的托盘类型 # 获取托盘号对应的托盘类型
tray_id = self.tray_edit.currentText() tray_id = self.tray_edit.currentText()
pallet_type = self.pallet_type_manager.get_pallet_type_by_pallet_id(tray_id) pallet_type = self.pallet_type_manager.get_pallet_type_by_pallet_id(tray_id)
# 初始化托盘号对应的序号
if tray_id not in self.init_seq:
self.init_seq[tray_id] = 1
if not pallet_type: if not pallet_type:
QMessageBox.warning(self, "错误", "未查到对应下料托盘类型") QMessageBox.warning(self, "错误", "未查到对应下料托盘类型")
return return
@ -884,23 +904,7 @@ class MainWindow(MainWindowUI):
# 保存到数据库 # 保存到数据库
inspection_dao.save_inspection_data(order_id, data) inspection_dao.save_inspection_data(order_id, data)
# if result:
# logging.info(f"已成功保存工程号 {order_id} 的检验数据,位置: {position}, 值: {value}")
# # 显示临时状态消息
# self.statusBar().showMessage(f"已保存检验数据:{value}", 3000)
# #TODO: 如果是称重字段,生成贴标号,然后给打印机信号,进行贴标
# if position == 12 and value:
# # 直接调用加载到包装记录的方法
# self.load_finished_record_to_package_record(order_id, tray_id)
# logging.info(f"检测到称重字段有值,已自动写入包装记录")
# else:
# # 使用延迟调用避免频繁刷新UI
# QTimer.singleShot(500, self.check_and_process_finished_records)
# else:
# logging.warning(f"保存工程号 {order_id} 的检验数据失败")
# # 显示错误消息
# self.statusBar().showMessage(f"保存检验数据失败", 3000)
except Exception as e: except Exception as e:
logging.error(f"保存检验数据失败: {str(e)}") logging.error(f"保存检验数据失败: {str(e)}")
@ -1174,52 +1178,6 @@ class MainWindow(MainWindowUI):
except Exception as e: except Exception as e:
logging.error(f"更新包装记录统计数据失败: {str(e)}") logging.error(f"更新包装记录统计数据失败: {str(e)}")
def check_and_process_finished_records(self):
"""检查并处理所有已完成的检验记录"""
try:
# 获取当前托盘号
tray_id = self.tray_edit.currentText()
# 使用InspectionDAO获取未完成的检验数据
from dao.inspection_dao import InspectionDAO
inspection_dao = InspectionDAO()
# 获取所有检验数据
all_data = inspection_dao.get_inspection_data_unfinished(tray_id)
# 按工程号分组
orders_data = {}
for data in all_data:
order_id = data['order_id']
if order_id not in orders_data:
orders_data[order_id] = []
orders_data[order_id].append(data)
# 检查每个工程号是否有贴标数据
for order_id, items in orders_data.items():
# 查找贴标数据
has_label = False
label_value = ""
for item in items:
if item['position'] == 11: # 贴标
label_value = item['value']
if label_value:
has_label = True
break
if has_label:
# 将已有贴标的记录添加到包装记录
self.load_finished_record_to_package_record(order_id, tray_id)
logging.info(f"已将工程号 {order_id} 的贴标记录添加到包装记录")
# 重新加载检验数据
self.load_finished_inspection_data()
except Exception as e:
logging.error(f"检查并处理已完成的检验记录失败: {str(e)}")
QMessageBox.warning(self, "处理失败", f"检查并处理已完成的检验记录失败: {str(e)}")
def show_table_context_menu(self, pos): def show_table_context_menu(self, pos):
"""显示表格上下文菜单 """显示表格上下文菜单
@ -1383,24 +1341,6 @@ class MainWindow(MainWindowUI):
# 获取Modbus监控器实例 # 获取Modbus监控器实例
self.modbus_monitor = get_modbus_monitor() self.modbus_monitor = get_modbus_monitor()
# 创建机器状态处理器实例
self.machine_handlers = MachineStatusHandlers()
# 添加状态显示到状态栏
self.modbus_status_label = QLabel("Modbus: 未连接")
self.weight_label = QLabel("重量: --")
self.label_status_label = QLabel("贴标: 无贴标")
self.error_status_label = QLabel("故障: 无")
# 设置样式
self.error_status_label.setStyleSheet("color: green; font-weight: bold;")
# 添加到状态栏
self.statusBar().addPermanentWidget(self.modbus_status_label)
self.statusBar().addPermanentWidget(self.weight_label)
self.statusBar().addPermanentWidget(self.label_status_label)
self.statusBar().addPermanentWidget(self.error_status_label)
# 注册寄存器处理器 # 注册寄存器处理器
self._register_modbus_handlers() self._register_modbus_handlers()
@ -1482,6 +1422,9 @@ class MainWindow(MainWindowUI):
logging.warning("工程号为空") logging.warning("工程号为空")
return return
# 获取托盘号
tray_id = self.tray_edit.currentText()
# 断开单元格变更信号,避免程序自动写入时触发 # 断开单元格变更信号,避免程序自动写入时触发
try: try:
self.process_table.cellChanged.disconnect(self.handle_inspection_cell_changed) self.process_table.cellChanged.disconnect(self.handle_inspection_cell_changed)
@ -1496,12 +1439,27 @@ class MainWindow(MainWindowUI):
self.process_table.setItem(data_row, weight_col, weight_item) self.process_table.setItem(data_row, weight_col, weight_item)
logging.info(f"已将称重数据 {weight}g 写入表格单元格 [{data_row}, {weight_col}]") logging.info(f"已将称重数据 {weight}g 写入表格单元格 [{data_row}, {weight_col}]")
# 保存称重数据到数据库
from dao.inspection_dao import InspectionDAO
inspection_dao = InspectionDAO()
# 构建数据
data = [{
'position': 12, # 称重位置是12
'config_id': 12,
'value': str(weight),
'status': 'pass',
'remark': '',
'tray_id': tray_id
}]
# 保存到数据库
inspection_dao.save_inspection_data(order_id, data)
logging.info(f"称重数据 {weight}g 已保存到数据库")
# 重新连接单元格变更信号 # 重新连接单元格变更信号
self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) self.process_table.cellChanged.connect(self.handle_inspection_cell_changed)
# 主动触发单元格变更事件
self.handle_inspection_cell_changed(data_row, weight_col)
except Exception as e: except Exception as e:
logging.error(f"写入称重数据到表格失败: {str(e)}") logging.error(f"写入称重数据到表格失败: {str(e)}")
# 确保信号重新连接 # 确保信号重新连接
@ -1516,8 +1474,98 @@ class MainWindow(MainWindowUI):
logging.info(f"[处理] 贴标状态: {status}") logging.info(f"[处理] 贴标状态: {status}")
# 更新UI显示 # 更新UI显示
self.label_status_label.setText(f"贴标: {status}") self.label_status_label.setText(f"贴标: {status}")
# 在这里可以添加更多业务逻辑
pass # 只有当信号为贴标完成(2)时才进行处理
if signal == 1:
try:
# 获取数据行数
if self.process_table.rowCount() <= 2: # 没有数据行
logging.warning("没有可用的数据行来处理贴标完成信号")
return
# 获取当前选中的行或第一个数据行
current_row = self.process_table.currentRow()
data_row = current_row if current_row >= 2 else 2 # 使用第一个数据行索引为2
# 确保行存在
if data_row >= self.process_table.rowCount():
logging.warning(f"选中的行 {data_row} 超出了表格范围")
return
# 获取工程号
order_id_item = self.process_table.item(data_row, 1)
if not order_id_item:
logging.warning("无法获取工程号")
return
order_id = order_id_item.text().strip()
if not order_id:
logging.warning("工程号为空")
return
# 获取托盘号
tray_id = self.tray_edit.currentText()
# 获取启用的检验配置
enabled_configs = self.inspection_manager.get_enabled_configs()
# 计算贴标列索引 - 贴标位置在检验列之后的第一列
label_col = 2 + len(enabled_configs)
# 生成贴标号(托盘号+序号)
label_value = f"{tray_id}-{self.init_seq[tray_id]}"
# 断开单元格变更信号,避免程序自动写入时触发
try:
self.process_table.cellChanged.disconnect(self.handle_inspection_cell_changed)
except:
logging.warning("断开单元格变更信号失败,可能信号未连接")
# 创建并设置贴标单元格
label_item = QTableWidgetItem(label_value)
label_item.setTextAlignment(Qt.AlignCenter)
# 写入单元格
self.process_table.setItem(data_row, label_col, label_item)
logging.info(f"已将贴标数据 {label_value} 写入表格单元格 [{data_row}, {label_col}]")
# 保存贴标数据到数据库
from dao.inspection_dao import InspectionDAO
inspection_dao = InspectionDAO()
# 构建数据
data = [{
'position': 11, # 贴标位置是11
'config_id': 11,
'value': label_value,
'status': 'pass',
'remark': '',
'tray_id': tray_id
}]
# 保存到数据库
inspection_dao.save_inspection_data(order_id, data)
# 调用加载到包装记录的方法
self.load_finished_record_to_package_record(order_id, tray_id)
logging.info(f"贴标完成,已将工程号 {order_id} 的记录加载到包装记录")
# 删除当前处理的行
self.process_table.removeRow(data_row)
logging.info(f"已删除处理完成的行 {data_row}")
# 重新连接单元格变更信号
self.process_table.cellChanged.connect(self.handle_inspection_cell_changed)
# 更新托盘号对应的序号
self.init_seq[tray_id] += 1
except Exception as e:
logging.error(f"处理贴标完成信号失败: {str(e)}")
# 确保信号重新连接
try:
self.process_table.cellChanged.connect(self.handle_inspection_cell_changed)
except:
pass
@Slot(bool, str) @Slot(bool, str)
def handle_modbus_status(self, is_connected, message): def handle_modbus_status(self, is_connected, message):
@ -1550,15 +1598,29 @@ class MainWindow(MainWindowUI):
def handle_loading_feedback(self, status, desc): def handle_loading_feedback(self, status, desc):
"""处理上料信息反馈""" """处理上料信息反馈"""
logging.info(f"[处理] 上料信息: {desc}") logging.info(f"[处理] 上料信息: {desc}")
# 在这里添加业务逻辑
pass # 如果上料完成(status=2),显示状态信息
if status == 2:
self.show_operation_status("上料完成", "input", desc)
QMessageBox.information(self, "上料操作", f"上料操作已完成: {desc}")
# 如果上料错误(status=3),显示错误信息
elif status == 3:
self.show_operation_status("上料错误", "input", desc)
QMessageBox.warning(self, "上料操作", f"上料操作出错: {desc}")
@Slot(int, str) @Slot(int, str)
def handle_unloading_feedback(self, status, desc): def handle_unloading_feedback(self, status, desc):
"""处理下料信息反馈""" """处理下料信息反馈"""
logging.info(f"[处理] 下料信息: {desc}") logging.info(f"[处理] 下料信息: {desc}")
# 在这里添加业务逻辑
pass # 如果下料完成(status=2),显示状态信息
if status == 2:
self.show_operation_status("下料完成", "output", desc)
QMessageBox.information(self, "下料操作", f"下料操作已完成: {desc}")
# 如果下料错误(status=3),显示错误信息
elif status == 3:
self.show_operation_status("下料错误", "output", desc)
QMessageBox.warning(self, "下料操作", f"下料操作出错: {desc}")
def _update_error_status(self): def _update_error_status(self):
"""更新故障状态显示""" """更新故障状态显示"""