This commit is contained in:
2025-11-01 17:33:26 +08:00
parent bd0815d0e7
commit 32c14c2e7b
15 changed files with 543 additions and 102 deletions

View File

@ -1,12 +1,18 @@
# core/state.py
class SystemState:
from PySide6.QtCore import Signal, QObject
import threading
from enum import IntEnum
class SystemState(QObject):
"""状态中以_开头的属性会发送信号通知,不需要的不要加_开头"""
state_updated=Signal(str,object)
def __init__(self):
super().__init__()
# 系统运行状态
self.running = False
# 下料控制相关
self.upper_door_position = 'default' # default(在搅拌楼下接料), over_lower(在下料斗上方), returning(返回中)
self.lower_feeding_stage = 0 # 0:未下料, 1:第一阶段, 2:第二阶段, 3:第三阶段, 4:等待模具车对齐
self._upper_door_position = 'default' # default(在搅拌楼下接料), over_lower(在下料斗上方), returning(返回中)
self._lower_feeding_stage = 0 # 0:未下料, 1:第一阶段, 2:第二阶段, 3:第三阶段, 4:等待模具车对齐
self.lower_feeding_cycle = 0 # 下料斗下料循环次数
self.upper_feeding_count = 0 # 上料斗已下料次数
self.upper_feeding_max = 2 #上料斗最大下料次数
@ -26,3 +32,46 @@ class SystemState:
self.door_opening_large = False # 夹角
self.vehicle_aligned = False # 模具车是否对齐
self.last_angle = None # 上次检测角度
#当前RFID的内容格式为 模块编号,分块号,尺寸规格,方量
self.rfid_current=None
#当前生产的管片
self.current_artifact=None
#当前生产状态
self.feed_status=FeedStatus.FNone
# 记录需要监听的属性名(筛选掉不需要发信号的内部变量)
#是否破拱
self._upper_is_arch_=False
self._lower_is_arch_=False
self.lock = threading.RLock()
self._watched_props = [k for k in self.__dict__ if k.startswith('_')]
def __setattr__(self, name, value):
super().__setattr__(name, value)
if name in self._watched_props:
with self.lock:
public_name = name.lstrip('_')
self.state_updated.emit(public_name, value)
class FeedStatus(IntEnum):
#初始值
FNone = 0
# 检查模车(模车到位)
FCheckM = 1
#RFID检测或匹配
FRFID=2,
# 开始(管片待生产任务)
FStart = 3
# 检查盖板(盖板到位)
FCheckGB = 4
#下料1
FFeed1 = 5
# 下料2
FFeed2 = 6
# 下料3
FFeed3 = 7
#完成(管片生产完成)
FFinished = 11

View File

@ -7,6 +7,7 @@ from core.state import SystemState
from hardware.relay import RelayController
from hardware.inverter import InverterController
from hardware.transmitter import TransmitterController
from hardware.RFID.rfid_service import rfid_service
from vision.camera import CameraController
from vision.detector import VisionDetector
from feeding.controller import FeedingController
@ -37,14 +38,22 @@ class FeedingControlSystem:
self.transmitter_controller,
self.vision_detector,
self.camera_controller,
self.rfid_controller,
self.state,
settings
)
# 初始化RFID控制器
self.rfid_controller = rfid_service(
host=settings.rfid_host,
port=settings.rfid_port
)
# 线程管理
self.monitor_thread = None
self.visual_control_thread = None
self.alignment_check_thread = None
self.lower_feeding_thread = None
def initialize(self):
"""初始化系统"""
@ -68,6 +77,9 @@ class FeedingControlSystem:
if not self.vision_detector.load_models():
raise Exception("视觉模型加载失败")
if not self.check_device_connectivity():
raise Exception("设备连接失败")
# 启动系统监控
self.start_monitoring()
@ -77,6 +89,10 @@ class FeedingControlSystem:
# 启动对齐检查
self.start_alignment_check()
# 启动下料轮询线程
self.start_lower_feeding()
print("控制系统初始化完成")
def start_monitoring(self):
@ -131,7 +147,7 @@ class FeedingControlSystem:
"""对齐检查循环"""
while self.state.running:
try:
if self.state.lower_feeding_stage == 4: # 等待对齐阶段
if self.state._lower_feeding_stage == 4: # 等待对齐阶段
current_frame = self.camera_controller.capture_frame()
if current_frame is not None:
self.state.vehicle_aligned = self.vision_detector.detect_vehicle_alignment(current_frame)
@ -146,7 +162,54 @@ class FeedingControlSystem:
def start_lower_feeding(self):
"""启动下料流程"""
self.feeding_controller.start_feeding()
self.lower_feeding_thread = threading.Thread(
target=self._start_lower_feeding,
daemon=True
)
self.lower_feeding_thread.start()
def _start_lower_feeding(self):
"""启动下料流程"""
while self.state.running:
self.feeding_controller.start_feeding()
time.sleep(self.settings.lower_feeding_interval)
def check_device_connectivity(self) -> bool:
"""检查关键设备连接状态"""
try:
# 检查网络继电器连接
test_response = self.relay_controller.send_command(self.relay_controller.read_status_command)
if not test_response:
print("网络继电器连接失败")
return False
# 检查变频器连接
if not self.relay_controller.modbus_client.connect():
print("无法连接到网络继电器Modbus服务")
return False
# 尝试读取变频器一个寄存器(测试连接)
test_result = self.relay_controller.modbus_client.read_holding_registers(
address=0x00,
count=1,
slave=self.inverter_controller.config['slave_id']
)
if isinstance(test_result, Exception):
print("变频器连接测试失败")
return False
# 检查下料斗变送器连接
test_weight = self.transmitter_controller.read_data(2)
if test_weight is None:
print("下料斗变送器连接失败")
return False
self.relay_controller.modbus_client.close()
return True
except Exception as e:
print(f"设备连接检查失败: {e}")
return False
def stop(self):
"""停止系统"""
@ -160,6 +223,8 @@ class FeedingControlSystem:
self.visual_control_thread.join()
if self.alignment_check_thread:
self.alignment_check_thread.join()
if self.lower_feeding_thread:
self.lower_feeding_thread.join()
# 释放摄像头资源
self.camera_controller.release()