From 84382b0cc0d1fdc0c87c2c2de9ad2d2a0a671232 Mon Sep 17 00:00:00 2001 From: yanganjie Date: Tue, 4 Nov 2025 16:20:50 +0800 Subject: [PATCH] =?UTF-8?q?main=5Fcontroller:=20add=20=E9=87=8D=E9=87=8F?= =?UTF-8?q?=E8=AF=BB=E5=8F=96=E7=BA=BF=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controller/main_controller.py | 121 +++++++++++++------------- hardware/transmitter.py | 6 +- view/widgets/bottom_control_widget.py | 4 +- view/widgets/system_nav_bar.py | 2 + 4 files changed, 68 insertions(+), 65 deletions(-) diff --git a/controller/main_controller.py b/controller/main_controller.py index c97ed15..586def9 100644 --- a/controller/main_controller.py +++ b/controller/main_controller.py @@ -1,98 +1,97 @@ -from re import U -from hardware import transmitter -from view.main_window import MainWindow +from PySide6.QtCore import QTimer, Signal, QObject # 导入Qt核心类 +from PySide6.QtWidgets import QApplication # 用于获取主线程 import threading +from hardware import transmitter +from view.main_window import MainWindow from .camera_controller import CameraController from .bottom_control_controller import BottomControlController from hardware.transmitter import TransmitterController from hardware.relay import RelayController +# 定义信号类(用于后台线程向 UI主线程传递数据) +class Signals(QObject): + weight_updated = Signal(int) # 传递上料斗重量 + class MainController: def __init__(self): # 主界面 self.main_window = MainWindow() - # 定时器 - self.timer = threading.Timer(5.0, self._onTimer) - self.timer.start() # 每5秒触发一次 - - self.timer2=threading.Timer(1.0, self._onTimer2) - self.timer2.start() # 每秒触发一次 - self.angle=10 - self.max_angle=60 - self.min_angle=10 - self.is_add=True - # 初始化子界面 + + # 1. 用于更新下料斗夹爪角度的QTimer + self.timer_angle = QTimer() + self.timer_angle.setInterval(1000) # 1秒触发一次 + self.timer_angle.timeout.connect(self._onTimer2) # 连接到角度更新函数 + self.timer_angle.start() + + # 下料斗夹具角度相关参数 + self.angle = 10 + self.max_angle = 60 + self.min_angle = 10 + self.is_add = True + + # 2. 用于更新重量的 QTimer + self.timer_weight = QTimer() + self.timer_weight.setInterval(2000) # 2秒触发一次 + self.timer_weight.timeout.connect(self._read_weight_in_background) + self.timer_weight.start() + + # 信号实例(用于后台线程传递数据到主线程) + self.signals = Signals() + self.signals.weight_updated.connect(self._update_upper_weight) # 主线程更新UI + + # 初始化子界面和控制器 self._initSubViews() - - # 初始化子控制器 self._initSubControllers() - - # self.__connectSignals() - - def _onTimer(self): - # 定时任务逻辑 - # 变送器是 192.168.250.63,端口 502 - loc_tra=TransmitterController(RelayController()) - upper_weight=loc_tra.read_data(1) # 目前只有上料斗安装了变送器 - # lower_weight=loc_tra.read_data(2) - if upper_weight is not None: - # upper_weight=0 - self.main_window.hopper_widget.setUpperHopperWeight(upper_weight) + def _read_weight_in_background(self): + """在后台线程中读取重量""" + def weight_task(): + loc_tra = TransmitterController(RelayController()) + # 上料斗重量 (目前只有上料斗安装变送器, 可以读取到重量) + upper_weight = loc_tra.read_data(1) + # 发送信号到主线程更新UI + if upper_weight is not None: + self.signals.weight_updated.emit(upper_weight) - # if lower_weight is None: - # lower_weight=0 - - # self.main_window.hopper_widget.setUpperHopperWeight(upper_weight) - # self.main_window.hopper_widget.setLowerHopperWeight(lower_weight) - # 重新启动定时器以实现重复执行 - self.timer = threading.Timer(5.0, self._onTimer) - self.timer.start() - pass - + # 启动后台线程执行重量读取操作 + threading.Thread(target=weight_task, daemon=True).start() + + def _update_upper_weight(self, weight): + """主线程中 更新界面上料斗重量数据""" + self.main_window.hopper_widget.setUpperHopperWeight(weight) + def _onTimer2(self): - # print(str(self.angle)) - # 定时任务逻辑 + """QTimer触发的 料斗夹爪角度更新""" if self.is_add: - self.angle+=1 + self.angle += 1 else: - self.angle-=1 + self.angle -= 1 - if self.angle>self.max_angle: - self.is_add=False - self.angle=self.max_angle - if self.angle<=self.min_angle: - self.is_add=True - self.angle=10 - + if self.angle > self.max_angle: + self.is_add = False + self.angle = self.max_angle + if self.angle <= self.min_angle: + self.is_add = True + self.angle = 10 + + # 直接更新UI self.main_window.hopper_widget.setLowerHopperOpeningAngle(self.angle) - # 重新启动定时器以实现重复执行 - self.timer2 = threading.Timer(1.0, self._onTimer2) - self.timer2.start() - pass - - + def showMainWindow(self): - # self.main_window.show() self.main_window.showFullScreen() self.main_window.dispatch_task_widget.set_task_time("task1","15:44 PM") self.main_window.dispatch_task_widget.set_task_time("task2","17:37 PM") self.main_window.segment_task_widget.set_task_time("task1","15:38 PM") self.main_window.segment_task_widget.set_task_time("task2","17:24 PM") - - def _initSubControllers(self): - # 振捣视频控制 self.camera_controller = CameraController( video_view=self.main_window.vibration_video ) - # 底部控制(按钮)控制器 self.bottom_control_controller = BottomControlController( bottom_control_widget=self.main_window.bottom_control_widget, main_window=self.main_window ) - def _initSubViews(self): pass \ No newline at end of file diff --git a/hardware/transmitter.py b/hardware/transmitter.py index 1bd2ef4..d22b033 100644 --- a/hardware/transmitter.py +++ b/hardware/transmitter.py @@ -79,7 +79,7 @@ class TransmitterController: # 上料斗变送器的信息: IP = "192.168.250.63" PORT = 502 - TIMEOUT = 5 # 超时时间为 5秒 + TIMEOUT = 2 # 超时时间为 2秒 BUFFER_SIZE= 1024 weight = None @@ -106,9 +106,9 @@ class TransmitterController: print("未收到设备数据") except ConnectionRefusedError: - print(f"连接失败:{IP}:{PORT} 拒绝连接(设备离线/端口错误)") + print(f"变送器连接失败:{IP}:{PORT} 拒绝连接(设备离线/端口错误)") except socket.timeout: - print(f"超时:{TIMEOUT}秒内未收到数据") + print(f"读取变送器数据超时:{TIMEOUT}秒内未收到数据") except Exception as e: print(f"读取异常:{e}") diff --git a/view/widgets/bottom_control_widget.py b/view/widgets/bottom_control_widget.py index a59f05f..051d74e 100644 --- a/view/widgets/bottom_control_widget.py +++ b/view/widgets/bottom_control_widget.py @@ -6,6 +6,7 @@ from view.widgets.switch_button import SwitchButton import resources.resources_rc from utils.image_paths import ImagePaths +# 底部的控制控件,包括 系统诊断、系统中心等按钮 class BottomControlWidget(QWidget): def __init__(self, parent=None): super().__init__(parent) @@ -262,8 +263,9 @@ class BottomControlWidget(QWidget): text_label.setStyleSheet("color: #3bfff8; font-size: 20px;") layout.addWidget(text_label, alignment=Qt.AlignVCenter) - # 开关 + # 开关(初始的时候,自动模式是打开的) self.auto_switch = SwitchButton() + self.auto_switch.setChecked(True) # 设置自动模式初始状态 layout.addWidget(self.auto_switch, alignment=Qt.AlignVCenter | Qt.AlignRight) return widget diff --git a/view/widgets/system_nav_bar.py b/view/widgets/system_nav_bar.py index 4664fa1..9090473 100644 --- a/view/widgets/system_nav_bar.py +++ b/view/widgets/system_nav_bar.py @@ -5,6 +5,8 @@ from PySide6.QtCore import Qt, QTimer, QDateTime import resources.resources_rc from utils.image_paths import ImagePaths +"""主界面最上方的导航栏""" + # 自定义消息容器, 显示系统消息 class MsgContainer(QWidget): def __init__(self, parent=None):