From 60d1b51e5fe64959726d9c4b795b63e273f57b66 Mon Sep 17 00:00:00 2001 From: zhu-mengmeng <15588200382@163.com> Date: Mon, 16 Jun 2025 09:50:18 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=E5=A4=84=E7=90=86NG=20=E4=BF=A1?= =?UTF-8?q?=E5=8F=B7=EF=BC=8CNG=20=E4=B8=BA=E6=9C=80=E6=96=B0=E4=B8=80?= =?UTF-8?q?=E6=9D=A1=E6=95=B0=E6=8D=AE=EF=BC=8C=E5=B9=B6=E4=B8=94=E8=BD=B4?= =?UTF-8?q?=E5=8C=85=E8=A3=85=E5=8F=B7=E6=B7=BB=E5=8A=A0=20NG=20=E6=A0=87?= =?UTF-8?q?=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/jtDB.db | Bin 49152 -> 49152 bytes from pymodbus.py | 6 +-- widgets/main_window.py | 91 +++++++++++++++++++++++++++++++++++++---- 3 files changed, 87 insertions(+), 10 deletions(-) diff --git a/db/jtDB.db b/db/jtDB.db index 8b0a9fbd793b158fd127fdf187cde47179098f13..247974b4998dd48f7d44e3b1585cdce73a10fabe 100644 GIT binary patch delta 1578 zcma)+PiWIn9LHb&v`L!%Y23Os>lB5x3}?6ec};C7%(8(XLq!=#Wv~gu9X9+^QAX8t z4~DoMbUcKKUIf|6gQHUI9D*0`p7pSkf}qTc2k~H&yy~_lthprQ_s#cxe&6?dDV3N~ ziFp{KwpMyasIB!$YnY0aw}$&pFj1z6xza$8y~F%rie)K0!dON=f@wbiFWNxG_EFTZeYt znx3<|eF-2TP`wD0^q`i~4dr;l3Z#;8R`4LG*NwuwWg{+dT@FIrBLtNokXy15MNgY4 zV-P~9W-_}`{#CS;>J>(<-tK;?r8HMi<`#b+<)~9&2rSW3I7LP9`(o#q zDBAmYb*fO<4GGhxp7x@1HrXwZ<|mL$45w~&T!5lzhvDf66(2{1EJYldB#^+)D~~$y zvzzj$-qNCYIycLjM={3;wzhg3HH(->J+6@-QL{!_6va|iPC$lf*nzqSi6x7=T`5iP zCpA$QKD!o8C~!Yz@G_XiQh0{RqllZaUo_2ToJ9w0%mLk_qq+y_=scooqaz6T=UOK& zz71ic8pbawLbvlj(G^oA2Y~3y%db9DEI$hlt>k)yX~a5%7ss{1Yga{)sGQS?A5;=O zu8n;XcTH>_iFT{3T5A>ms3dxQbO2mJ0?xgY%QLT8sw>nFI(ANF?b$?OJLkBfH{`sh z)jSH=YvKP*Z=#Gdr|F*pe9?E&D~q>Ffu1K zu}ltJAvt-^V#&#Sw@FHwC>R)68Jbxc8WdL+m!#%C>zwg?_6) Date: Mon, 16 Jun 2025 11:36:28 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E5=AF=84?= =?UTF-8?q?=E5=AD=98=E5=99=A8=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=95=85=E9=9A=9C=E7=B1=BB=E5=9E=8B=E6=98=A0?= =?UTF-8?q?=E5=B0=84=EF=BC=8C=E4=BC=98=E5=8C=96=E4=B8=BB=E7=AA=97=E5=8F=A3?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=A0=87=E7=AD=BE=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- from pymodbus.py | 5 +-- utils/register_handlers.py | 28 +++++++++++++---- widgets/main_window.py | 64 +++++++++++++++++++++----------------- 3 files changed, 61 insertions(+), 36 deletions(-) diff --git a/from pymodbus.py b/from pymodbus.py index e434a61..e35b5d8 100644 --- a/from pymodbus.py +++ b/from pymodbus.py @@ -3,11 +3,12 @@ from pymodbus.client import ModbusTcpClient client = ModbusTcpClient('localhost', port=5020) client.connect() # client.write_registers(address=11, values=[110]) -client.write_registers(address=6, values=[1]) +# client.write_registers(address=6, values=[1]) # client.write_registers(address=5, values=[16]) # client.write_registers(address=13, values=[1]) +client.write_registers(address=24, values=[1]) -result = client.read_holding_registers(address=6, count=1) +result = client.read_holding_registers(address=24, count=1) print(result.registers[0],"123===") client.close() \ No newline at end of file diff --git a/utils/register_handlers.py b/utils/register_handlers.py index dbec3ff..f0b0374 100644 --- a/utils/register_handlers.py +++ b/utils/register_handlers.py @@ -154,9 +154,16 @@ class Error1Handler(RegisterHandler): def __init__(self, callback=None): super().__init__() self.callback = callback + self.error_map = { + 0: "无报警", + 1: "人工启动机器人后自复位", + 2: "码垛真空压异常/报警 机器人暂停", + 3: "拆垛真空压异常/报警 机器人暂停", + 4: "机器人未收到CCD数据/机器人视觉通讯异常/报警 机器人暂停" + } def handle_change(self, value): - error_desc = "正常" if value == 0 else f"故障类型1-{value}" + error_desc = self.error_map.get(value, f"未知故障类型1-{value}") logging.info(f"故障信息1: {error_desc}") # 如果有回调函数,则调用 @@ -165,11 +172,15 @@ class Error1Handler(RegisterHandler): class Error2Handler(RegisterHandler): - """寄存器D23处理器,处理故障信息2""" + """寄存器D23处理器,处理滚动线报警""" def __init__(self, callback=None): super().__init__() self.callback = callback - + self.error_map = { + 0: "无报警", + 1: "急停报警", + 2: "贴标故障" + } def handle_change(self, value): error_desc = "正常" if value == 0 else f"故障类型2-{value}" logging.info(f"故障信息2: {error_desc}") @@ -180,14 +191,19 @@ class Error2Handler(RegisterHandler): class Error3Handler(RegisterHandler): - """寄存器D24处理器,处理故障信息3""" + """寄存器D24处理器,处理拆码垛报警""" def __init__(self, callback=None): super().__init__() self.callback = callback + self.error_map = { + 0: "无报警", + 1: "拆垛层数判断有误重新选择层数", + 2: "码垛层数判断有误重新选择层数" + } def handle_change(self, value): - error_desc = "正常" if value == 0 else f"故障类型3-{value}" - logging.info(f"故障信息3: {error_desc}") + error_desc = self.error_map.get(value, f"拆码垛报警-{value}") + logging.info(f"拆码垛报警: {error_desc}") # 如果有回调函数,则调用 if self.callback: diff --git a/widgets/main_window.py b/widgets/main_window.py index d618001..7c0c28b 100644 --- a/widgets/main_window.py +++ b/widgets/main_window.py @@ -1398,12 +1398,12 @@ class MainWindow(MainWindowUI): # 创建新的状态标签 status_label = QLabel(f"{status}: {pallet_type}", container) - status_label.setFont(self.normal_font) + status_label.setFont(self.second_title_font) status_label.setStyleSheet("color: red; background-color: transparent;") status_label.setAlignment(Qt.AlignRight | Qt.AlignTop) # 使用绝对定位,放置在右上角 - status_label.setGeometry(container.width() - 200, 5, 190, 30) + status_label.setGeometry(container.width() - 250, 5, 240, 30) # 确保标签始终保持在顶层显示 status_label.raise_() @@ -1428,7 +1428,7 @@ class MainWindow(MainWindowUI): label: 状态标签 """ # 更新标签位置,保持在右上角 - label.setGeometry(container.width() - 200, 5, 190, 30) + label.setGeometry(container.width() - 250, 5, 240, 30) # 调用原始的resizeEvent(如果有的话) original_resize = getattr(container, "_original_resize_event", None) @@ -1621,7 +1621,7 @@ class MainWindow(MainWindowUI): label_col = 2 + len(enabled_configs) # 生成贴标号(托盘号+序号) - label_value = f"{self.init_seq[tray_id]}" + label_value = f"{tray_id}-{self.init_seq[tray_id]}" # 断开单元格变更信号,避免程序自动写入时触发 try: @@ -1749,61 +1749,69 @@ class MainWindow(MainWindowUI): @Slot(int, str) def handle_error_1(self, error_code, error_desc): - """处理故障信息1""" - logging.info(f"[处理] 故障信息1: {error_desc}") + """机器人视觉报警""" + logging.info(f"[处理] 机器人视觉报警: {error_desc}") + from utils.register_handlers import Error1Handler + error_handler = Error1Handler() + detailed_desc = error_handler.error_map.get(error_code, f"机器人视觉报警-{error_code}") + # 保存故障码 self.error_1 = error_code self._update_error_status() # 如果有故障,显示提示 - if error_code > 0: - QMessageBox.warning(self, "设备故障", f"故障1: {error_desc}") + if error_code in (2, 3): + QMessageBox.warning(self, "机器人视觉报警", f"机器人视觉报警: {detailed_desc}") # error_1 属于上料故障,需要把上料寄存器置为 0 modbus = ModbusUtils() client = modbus.get_client() modbus.write_register_until_success(client, 2, 0) + modbus.write_register_until_success(client, 3, 0) modbus.close_client(client) - self.show_operation_status("上料", "input", error_desc) + self.show_operation_status("异常", "", detailed_desc) @Slot(int, str) def handle_error_2(self, error_code, error_desc): - """处理故障信息2""" - logging.info(f"[处理] 故障信息2: {error_desc}") + """滚筒线报警""" + logging.info(f"[处理] 滚筒线报警: {error_desc}") + from utils.register_handlers import Error2Handler + error_handler = Error2Handler() + detailed_desc = error_handler.error_map.get(error_code, f"滚筒线报警-{error_code}") # 保存故障码 self.error_2 = error_code self._update_error_status() # 如果有故障,显示提示 if error_code > 0: - QMessageBox.warning(self, "设备故障", f"故障2: {error_desc}") # error_2 属于下料故障,需要把下料寄存器置为 0 modbus = ModbusUtils() client = modbus.get_client() modbus.write_register_until_success(client, 3, 0) modbus.close_client(client) - self.show_operation_status("下料", "output", error_desc) - + self.show_operation_status("异常", "", detailed_desc) @Slot(int, str) def handle_error_3(self, error_code, error_desc): - """处理故障信息3""" - logging.info(f"[处理] 故障信息3: {error_desc}") + """拆码垛报警""" + logging.info(f"[处理] 拆码垛报警: {error_desc}") + from utils.register_handlers import Error3Handler + error_handler = Error3Handler() + detailed_desc = error_handler.error_map.get(error_code, f"拆码垛报警-{error_code}") # 保存故障码 self.error_3 = error_code self._update_error_status() - + modbus = ModbusUtils() + client = modbus.get_client() # 如果有故障,显示提示 - if error_code > 0: - QMessageBox.warning(self, "设备故障", f"故障3: {error_desc}") - # error_3 属于全局故障,需要把上料和下料寄存器置为 0 - modbus = ModbusUtils() - client = modbus.get_client() + if error_code == 1: + QMessageBox.warning(self, "异常", f"异常: {detailed_desc}") modbus.write_register_until_success(client, 2, 0) - modbus.write_register_until_success(client, 3, 0) modbus.close_client(client) - self.show_operation_status("上料", "input", error_desc) - self.show_operation_status("下料", "output", error_desc) - + self.show_operation_status("异常", "", detailed_desc) + elif error_code == 2: + QMessageBox.warning(self, "异常", f"异常: {detailed_desc}") + modbus.write_register_until_success(client, 3, 0) + modbus.close_client(client) @Slot(int) def handle_unloading_level(self, level): """处理下料层数信息""" @@ -1873,8 +1881,8 @@ class MainWindow(MainWindowUI): if tray_id not in self.init_seq: self.init_seq[tray_id] = 1 - # 生成贴标号(仅使用序号) - label_value = f"{self.init_seq[tray_id]}-NG" + # 生成贴标号(托盘号+序号) + label_value = f"{tray_id}-{self.init_seq[tray_id]}-NG" self.init_seq[tray_id] += 1 # 保存贴标数据到数据库