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.lower_feeding_cycle = 0 # 下料斗下料循环次数 self.upper_feeding_count = 0 # 上料斗已下料次数 self.upper_feeding_max = 2 #上料斗最大下料次数 # 重量相关 self.last_upper_weight = 0 self.last_lower_weight = 0 self.last_weight_time = 0 self.need_total_weight=0 self.initial_upper_weight=0 self.initial_lower_weight=0 # 错误计数 self.upper_weight_error_count = 0 self.lower_weight_error_count = 0 # 视觉系统状态 self.angle_control_mode = "normal" # 角度控制模式: normal, reducing, maintaining, recovery self.overflow_detected = False # 堆料检测 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.density=2500 # 记录需要监听的属性名(筛选掉不需要发信号的内部变量) #是否破拱 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, # 开始(管片待生产任务) FApiCheck = 3 # 检查盖板(盖板到位) FCheckGB = 4 # 上料到下料(上料斗到下料斗) FUpperToLower=5 #下料1 FFeed1 = 6 # 下料2 FFeed2 = 7 # 下料3 FFeed3 = 8 #完成(管片生产完成) FFinished = 11