Files
Feeding_control_system/core/system_state.py
2026-02-10 10:18:17 +08:00

151 lines
5.1 KiB
Python

import threading
from enum import IntEnum
import queue
import json
from dataclasses import asdict
from busisness.blls import ArtifactBll,PDRecordBll
class SystemState:
"""系统状态类,存在变化的参数及标志"""
"""系统状态中以_开头的属性会发送到OPC通知,不需要的不要加_开头"""
# state_updated=Signal(str,object)
def __init__(self):
super().__init__()
#
self.watched_props = []
self.lock = threading.RLock()
self.opc_queue = queue.Queue()
# 系统运行状态
self.running = True
# 上料斗控制相关
self._upper_door_position = Upper_Door_Position.Default # default(在搅拌楼下接料), over_lower(在下料斗上方), returning(返回中)
# 是否破拱
self._upper_is_arch_=False
self._upper_door_closed=True
self._upper_weight=0
self._upper_volume=0.0
#下料比例变频
self.vf_frequencys=[{'radio':0,'fre':230},{'radio':0.3,'fre':230},{'radio':0.6,'fre':230}]
#使用
self._mould_frequency=230
self._mould_vibrate_status=False #True振动中False未振动
#记录模具开始振动的时间
self.mould_vibrate_time=0
#下料斗状态
self._lower_is_arch_=False
self._lower_weight=0
#模具车状态
self._mould_weight=0
#需要下料的总重量
self._mould_need_weight=0
#完成下料的总重量
self._mould_finish_weight=0
# 视觉系统状态
self.overflow_detected = "0" # 堆料检测
#当前生产的管片
self.current_artifact=None
#当前生产状态
self._feed_status=FeedStatus.FNone
self.bll_artifact=ArtifactBll()
self.bll_pdrecord=PDRecordBll()
#记录正在生产code模具编号,status:2正生产3完成生成,weight:完成重量
self._db_status={'code':'','status':1,'weight':0}
#派单数据发送到OPC
self._pd_data=''
#变频器相关
#是否启动变频器0未1普通块启动2F块启动 3结束
self.vf_status=0
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('_')
try:
if public_name.startswith('db'):
self.save_db(public_name,value) #有影响的话改成异步
else:
if public_name=="pd_data":
#更新派单表
if hasattr(value,'MouldCode'):
self.bll_pdrecord.start_pd(value.MouldCode,value.FBetonVolume)
_opc_pd={
"ArtifactID":value.ArtifactID,
"TaskID":value.TaskID,
"ProduceMixID":value.ProduceMixID,
"BetonVolume":value.FBetonVolume,
"PlannedVolume":value.PlannedVolume
}
self.opc_queue.put_nowait((public_name, json.dumps(_opc_pd)))
else:
self.opc_queue.put_nowait((public_name, value))
except queue.Full:
# 队列已满,记录异常但不中断程序
print(f"OPC queue is full, skipping update for {public_name}")
except Exception as e:
# 捕获其他异常
print(f"Unexpected error putting to OPC queue: {e}")
# self.state_updated.emit(public_name, value)
def save_db(self,public_name,val):
if not val:
return
if public_name=="db_status":
_code=val['code']
if _code:
_status=val['status']
if _status==3:
#完成生产
self.bll_artifact.finish_produce(_code,val['weight'])
elif _status==2:
#开始生产
self.bll_artifact.start_produce(_code)
class FeedStatus(IntEnum):
#初始值
FNone = 0
# 检查模车(模车到位)
FCheckGB = 1
#RFID检测或匹配
FRFID=2,
# 下料1(下料斗到模具车)
FFeed1=5
#下料2(上--》下)
FFeed2 = 6
# 下料3(下--》模)
FFeed3 = 7
# 下料4(上--》下)
FFeed4 = 8
#下料5(下-》模)
FFeed5 = 9
#完成(管片生产完成)
FFinished = 11
class Upper_Door_Position(IntEnum):
# default(在搅拌楼下接料), over_lower(在下料斗上方), returning(返回中)
Default = 0
Over_Lower = 1
Returning = 2
class Upper_PLC_Status(IntEnum):
# 即将振捣室
PLC_ZDS_Ready = 4
#到达振捣室
PLC_ZDS_Finish = 5
#即将搅拌楼
PLC_JBL_Ready = 64
#到达搅拌楼
PLC_JBL_Finish = 66