main_controller: add 重量读取线程
This commit is contained in:
@ -1,58 +1,67 @@
|
|||||||
from re import U
|
from PySide6.QtCore import QTimer, Signal, QObject # 导入Qt核心类
|
||||||
|
from PySide6.QtWidgets import QApplication # 用于获取主线程
|
||||||
|
import threading
|
||||||
from hardware import transmitter
|
from hardware import transmitter
|
||||||
from view.main_window import MainWindow
|
from view.main_window import MainWindow
|
||||||
import threading
|
|
||||||
from .camera_controller import CameraController
|
from .camera_controller import CameraController
|
||||||
from .bottom_control_controller import BottomControlController
|
from .bottom_control_controller import BottomControlController
|
||||||
from hardware.transmitter import TransmitterController
|
from hardware.transmitter import TransmitterController
|
||||||
from hardware.relay import RelayController
|
from hardware.relay import RelayController
|
||||||
|
|
||||||
|
# 定义信号类(用于后台线程向 UI主线程传递数据)
|
||||||
|
class Signals(QObject):
|
||||||
|
weight_updated = Signal(int) # 传递上料斗重量
|
||||||
|
|
||||||
class MainController:
|
class MainController:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
# 主界面
|
# 主界面
|
||||||
self.main_window = MainWindow()
|
self.main_window = MainWindow()
|
||||||
# 定时器
|
|
||||||
self.timer = threading.Timer(5.0, self._onTimer)
|
|
||||||
self.timer.start() # 每5秒触发一次
|
|
||||||
|
|
||||||
self.timer2=threading.Timer(1.0, self._onTimer2)
|
# 1. 用于更新下料斗夹爪角度的QTimer
|
||||||
self.timer2.start() # 每秒触发一次
|
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.angle = 10
|
||||||
self.max_angle = 60
|
self.max_angle = 60
|
||||||
self.min_angle = 10
|
self.min_angle = 10
|
||||||
self.is_add = True
|
self.is_add = True
|
||||||
# 初始化子界面
|
|
||||||
self._initSubViews()
|
|
||||||
|
|
||||||
# 初始化子控制器
|
# 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._initSubControllers()
|
||||||
|
|
||||||
|
def _read_weight_in_background(self):
|
||||||
# self.__connectSignals()
|
"""在后台线程中读取重量"""
|
||||||
|
def weight_task():
|
||||||
def _onTimer(self):
|
|
||||||
# 定时任务逻辑
|
|
||||||
# 变送器是 192.168.250.63,端口 502
|
|
||||||
loc_tra = TransmitterController(RelayController())
|
loc_tra = TransmitterController(RelayController())
|
||||||
upper_weight=loc_tra.read_data(1) # 目前只有上料斗安装了变送器
|
# 上料斗重量 (目前只有上料斗安装变送器, 可以读取到重量)
|
||||||
# lower_weight=loc_tra.read_data(2)
|
upper_weight = loc_tra.read_data(1)
|
||||||
|
# 发送信号到主线程更新UI
|
||||||
if upper_weight is not None:
|
if upper_weight is not None:
|
||||||
# upper_weight=0
|
self.signals.weight_updated.emit(upper_weight)
|
||||||
self.main_window.hopper_widget.setUpperHopperWeight(upper_weight)
|
|
||||||
|
|
||||||
# if lower_weight is None:
|
# 启动后台线程执行重量读取操作
|
||||||
# lower_weight=0
|
threading.Thread(target=weight_task, daemon=True).start()
|
||||||
|
|
||||||
# self.main_window.hopper_widget.setUpperHopperWeight(upper_weight)
|
def _update_upper_weight(self, weight):
|
||||||
# self.main_window.hopper_widget.setLowerHopperWeight(lower_weight)
|
"""主线程中 更新界面上料斗重量数据"""
|
||||||
# 重新启动定时器以实现重复执行
|
self.main_window.hopper_widget.setUpperHopperWeight(weight)
|
||||||
self.timer = threading.Timer(5.0, self._onTimer)
|
|
||||||
self.timer.start()
|
|
||||||
pass
|
|
||||||
|
|
||||||
def _onTimer2(self):
|
def _onTimer2(self):
|
||||||
# print(str(self.angle))
|
"""QTimer触发的 料斗夹爪角度更新"""
|
||||||
# 定时任务逻辑
|
|
||||||
if self.is_add:
|
if self.is_add:
|
||||||
self.angle += 1
|
self.angle += 1
|
||||||
else:
|
else:
|
||||||
@ -65,34 +74,24 @@ class MainController:
|
|||||||
self.is_add = True
|
self.is_add = True
|
||||||
self.angle = 10
|
self.angle = 10
|
||||||
|
|
||||||
|
# 直接更新UI
|
||||||
self.main_window.hopper_widget.setLowerHopperOpeningAngle(self.angle)
|
self.main_window.hopper_widget.setLowerHopperOpeningAngle(self.angle)
|
||||||
# 重新启动定时器以实现重复执行
|
|
||||||
self.timer2 = threading.Timer(1.0, self._onTimer2)
|
|
||||||
self.timer2.start()
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def showMainWindow(self):
|
def showMainWindow(self):
|
||||||
# self.main_window.show()
|
|
||||||
self.main_window.showFullScreen()
|
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("task1","15:44 PM")
|
||||||
self.main_window.dispatch_task_widget.set_task_time("task2","17:37 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("task1","15:38 PM")
|
||||||
self.main_window.segment_task_widget.set_task_time("task2","17:24 PM")
|
self.main_window.segment_task_widget.set_task_time("task2","17:24 PM")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def _initSubControllers(self):
|
def _initSubControllers(self):
|
||||||
# 振捣视频控制
|
|
||||||
self.camera_controller = CameraController(
|
self.camera_controller = CameraController(
|
||||||
video_view=self.main_window.vibration_video
|
video_view=self.main_window.vibration_video
|
||||||
)
|
)
|
||||||
# 底部控制(按钮)控制器
|
|
||||||
self.bottom_control_controller = BottomControlController(
|
self.bottom_control_controller = BottomControlController(
|
||||||
bottom_control_widget=self.main_window.bottom_control_widget,
|
bottom_control_widget=self.main_window.bottom_control_widget,
|
||||||
main_window=self.main_window
|
main_window=self.main_window
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def _initSubViews(self):
|
def _initSubViews(self):
|
||||||
pass
|
pass
|
||||||
@ -79,7 +79,7 @@ class TransmitterController:
|
|||||||
# 上料斗变送器的信息:
|
# 上料斗变送器的信息:
|
||||||
IP = "192.168.250.63"
|
IP = "192.168.250.63"
|
||||||
PORT = 502
|
PORT = 502
|
||||||
TIMEOUT = 5 # 超时时间为 5秒
|
TIMEOUT = 2 # 超时时间为 2秒
|
||||||
BUFFER_SIZE= 1024
|
BUFFER_SIZE= 1024
|
||||||
weight = None
|
weight = None
|
||||||
|
|
||||||
@ -106,9 +106,9 @@ class TransmitterController:
|
|||||||
print("未收到设备数据")
|
print("未收到设备数据")
|
||||||
|
|
||||||
except ConnectionRefusedError:
|
except ConnectionRefusedError:
|
||||||
print(f"连接失败:{IP}:{PORT} 拒绝连接(设备离线/端口错误)")
|
print(f"变送器连接失败:{IP}:{PORT} 拒绝连接(设备离线/端口错误)")
|
||||||
except socket.timeout:
|
except socket.timeout:
|
||||||
print(f"超时:{TIMEOUT}秒内未收到数据")
|
print(f"读取变送器数据超时:{TIMEOUT}秒内未收到数据")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"读取异常:{e}")
|
print(f"读取异常:{e}")
|
||||||
|
|
||||||
|
|||||||
@ -6,6 +6,7 @@ from view.widgets.switch_button import SwitchButton
|
|||||||
import resources.resources_rc
|
import resources.resources_rc
|
||||||
from utils.image_paths import ImagePaths
|
from utils.image_paths import ImagePaths
|
||||||
|
|
||||||
|
# 底部的控制控件,包括 系统诊断、系统中心等按钮
|
||||||
class BottomControlWidget(QWidget):
|
class BottomControlWidget(QWidget):
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
@ -262,8 +263,9 @@ class BottomControlWidget(QWidget):
|
|||||||
text_label.setStyleSheet("color: #3bfff8; font-size: 20px;")
|
text_label.setStyleSheet("color: #3bfff8; font-size: 20px;")
|
||||||
layout.addWidget(text_label, alignment=Qt.AlignVCenter)
|
layout.addWidget(text_label, alignment=Qt.AlignVCenter)
|
||||||
|
|
||||||
# 开关
|
# 开关(初始的时候,自动模式是打开的)
|
||||||
self.auto_switch = SwitchButton()
|
self.auto_switch = SwitchButton()
|
||||||
|
self.auto_switch.setChecked(True) # 设置自动模式初始状态
|
||||||
layout.addWidget(self.auto_switch, alignment=Qt.AlignVCenter | Qt.AlignRight)
|
layout.addWidget(self.auto_switch, alignment=Qt.AlignVCenter | Qt.AlignRight)
|
||||||
|
|
||||||
return widget
|
return widget
|
||||||
|
|||||||
@ -5,6 +5,8 @@ from PySide6.QtCore import Qt, QTimer, QDateTime
|
|||||||
import resources.resources_rc
|
import resources.resources_rc
|
||||||
from utils.image_paths import ImagePaths
|
from utils.image_paths import ImagePaths
|
||||||
|
|
||||||
|
"""主界面最上方的导航栏"""
|
||||||
|
|
||||||
# 自定义消息容器, 显示系统消息
|
# 自定义消息容器, 显示系统消息
|
||||||
class MsgContainer(QWidget):
|
class MsgContainer(QWidget):
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
|
|||||||
Reference in New Issue
Block a user