变频器集成以及增加点动控制(0209)
This commit is contained in:
178
core/system_state.py
Normal file
178
core/system_state.py
Normal file
@ -0,0 +1,178 @@
|
||||
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_feeding_stage = 0 # 0:未下料, 1:第一阶段, 2:第二阶段, 3:第三阶段, 4:等待模具车对齐
|
||||
self._lower_is_arch_=False
|
||||
self._lower_weight=0
|
||||
self._lower_angle=0.0
|
||||
|
||||
#模具车状态
|
||||
self._mould_weight=0
|
||||
|
||||
|
||||
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._mould_need_weight=0
|
||||
#完成下料的总重量
|
||||
self._mould_finish_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 = "0" # 堆料检测
|
||||
self.current_finish_status=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=2416.4
|
||||
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
|
||||
Reference in New Issue
Block a user