diff --git a/db/jtDB.db b/db/jtDB.db index e7baf46..12c64cc 100644 Binary files a/db/jtDB.db and b/db/jtDB.db differ diff --git a/from pymodbus.py b/from pymodbus.py index 2d0fcb0..318d62c 100644 --- a/from pymodbus.py +++ b/from pymodbus.py @@ -2,8 +2,11 @@ from pymodbus.client import ModbusTcpClient client = ModbusTcpClient('localhost', port=5020) 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===") client.close() \ No newline at end of file diff --git a/utils/register_handlers.py b/utils/register_handlers.py index aa7dc99..efb93b7 100644 --- a/utils/register_handlers.py +++ b/utils/register_handlers.py @@ -26,9 +26,7 @@ class LabelSignalHandler(RegisterHandler): self.callback = callback self.status_map = { 0: "无贴标", - 1: "贴标中", - 2: "贴标完成", - 3: "贴标错误" + 1: "贴标完成" } def handle_change(self, value): diff --git a/widgets/main_window.py b/widgets/main_window.py index 9173cf3..83df61f 100644 --- a/widgets/main_window.py +++ b/widgets/main_window.py @@ -46,7 +46,7 @@ class MainWindow(MainWindowUI): self.corp_name = corp_name self.corp_id = corp_id self.position_id = position_id - + self.init_seq = {} # 初始化轴包装的序号 # 设置窗口标题 if user_name and corp_name: self.setWindowTitle(f"腾智微丝产线包装系统 - {user_name} ({corp_name})") @@ -117,7 +117,24 @@ class MainWindow(MainWindowUI): # 加载已完成检验数据 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}") def add_pallet_type_selectors(self): @@ -203,8 +220,7 @@ class MainWindow(MainWindowUI): if self.camera_enabled and hasattr(self, 'camera_display'): 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): """更新检验列配置 - 使用检验配置管理器获取启用的列数和标题""" @@ -445,6 +461,10 @@ class MainWindow(MainWindowUI): # 获取托盘号对应的托盘类型 tray_id = self.tray_edit.currentText() 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: QMessageBox.warning(self, "错误", "未查到对应下料托盘类型") return @@ -884,23 +904,7 @@ class MainWindow(MainWindowUI): # 保存到数据库 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: logging.error(f"保存检验数据失败: {str(e)}") @@ -1173,53 +1177,7 @@ class MainWindow(MainWindowUI): except Exception as 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): """显示表格上下文菜单 @@ -1383,24 +1341,6 @@ class MainWindow(MainWindowUI): # 获取Modbus监控器实例 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() @@ -1482,6 +1422,9 @@ class MainWindow(MainWindowUI): logging.warning("工程号为空") return + # 获取托盘号 + tray_id = self.tray_edit.currentText() + # 断开单元格变更信号,避免程序自动写入时触发 try: 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) 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.handle_inspection_cell_changed(data_row, weight_col) - except Exception as e: logging.error(f"写入称重数据到表格失败: {str(e)}") # 确保信号重新连接 @@ -1509,15 +1467,105 @@ class MainWindow(MainWindowUI): self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) except: pass - + @Slot(int, str) def handle_label_signal(self, signal, status): """处理贴标信号变化""" logging.info(f"[处理] 贴标状态: {status}") # 更新UI显示 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) def handle_modbus_status(self, is_connected, message): @@ -1550,15 +1598,29 @@ class MainWindow(MainWindowUI): def handle_loading_feedback(self, status, 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) def handle_unloading_feedback(self, status, 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): """更新故障状态显示"""