using Aitex.Core.RT.Device; using Aitex.Core.RT.Log; using CyberX8_Core; using CyberX8_RT.Devices.Reservoir; using CyberX8_RT.Modules.Reservoir; using MECF.Framework.Common.Persistent.Reservoirs; using MECF.Framework.Common.Persistent.Temperature; using MECF.Framework.Common.RecipeCenter; using System; using System.Collections.Generic; using System.Reflection; using static CyberX8_RT.Devices.Reservoir.DosingSystemHelper; namespace CyberX8_RT.Devices.Dose { public class DosingCommonHelper { public enum DoseState { Init, Idle, Error, Initializing } #region 内部变量 /// /// ModuleName /// private string _moduleName; /// /// ReplenID /// private int _replenNum; /// /// StandardHotReservoirDevice /// private StandardHotReservoirDevice _shReservoirDevice; /// /// 当前操作 /// private List _currentDosingOperation; /// /// Replen Persistent Value /// private Dictionary _persistentValue = new Dictionary(); /// /// DosingSystem初始化状态 /// private RState _initializeRState; /// /// DosingSystemState /// private string _dosingSystemState; /// /// DosingSystemInitializeRoutine /// private DosingSystemInitializeRoutine _dosingSystemInitializeRoutine; /// /// DosingSystem是否已初始化 /// private bool _isDosingSystemInitialized; #endregion #region 属性 /// /// DosingSystem是否已经Initialized /// public bool IsDosingSystemInitialized { get { return _isDosingSystemInitialized; } } /// /// DosingSystem State /// public string DosingSystemState { get { return _dosingSystemState; } } /// /// DosingSystem Initialize State /// public RState InitializeState { get { return _initializeRState; } } #endregion /// /// 构造函数 /// /// public DosingCommonHelper(string moduleName, int replenNum) { _moduleName = moduleName; _replenNum = replenNum; _shReservoirDevice = DEVICE.GetDevice($"{_moduleName}"); _currentDosingOperation = new List(); for (int i = 0; i < _replenNum; i++) { string replenName = "Replen" + (i + 1).ToString(); _currentDosingOperation.Add(DosingOperation.None); _persistentValue[replenName] = ReplenPersistentManager.Instance.GetReplenPersistentValue(_moduleName, replenName); } _dosingSystemInitializeRoutine = new DosingSystemInitializeRoutine(_moduleName); _dosingSystemState = DoseState.Init.ToString(); } /// /// AutoDose监控 /// public void AutoDoseSystemMonitor() { for (int i = 0; i < _replenNum; i++) { string replenName = "Replen" + (i + 1).ToString(); if (_shReservoirDevice.ReplenDatas[i].IsAutoDosingError) { //LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"{replenName} is in Error State"); continue; } //AutoDoing条件(1.自动模式 2.当前Recipe非空 3.Recipe未更换) RdsRecipe recipe = _shReservoirDevice.RdsRecipe[i]; if (recipe != null && _shReservoirDevice.DosingSystemHelpers[i].CheckandLoadRecipe(recipe)) { //非AutoDosing模式下进入AutoDosing模式,并记录开始数据 if (_currentDosingOperation[i] != DosingOperation.AutoDosing) { LOG.WriteLog(eEvent.INFO_RESERVOIR, _moduleName, $"Timing of {replenName} AutoDosing has started now"); _shReservoirDevice.DosingSystemHelpers[i].RecordStartData(); _currentDosingOperation[i] = DosingOperation.AutoDosing; } else { //AutoDosing模式下,若上一次Dosing完成则再次记录数据 if (_persistentValue[replenName].AutoDosingStartTime == DateTime.MinValue && _persistentValue[replenName].AutoDosingStartAmpHour == 0) { LOG.WriteLog(eEvent.INFO_RESERVOIR, _moduleName, $"Timing of {replenName} AutoDosing has started again now"); _shReservoirDevice.DosingSystemHelpers[i].RecordStartData(); } } } else { _currentDosingOperation[i] = DosingOperation.None; } //AutoDosing监控 if (!_persistentValue[replenName].IsDosingRunning && _currentDosingOperation[i] == DosingOperation.AutoDosing && _shReservoirDevice.DosingSystemHelpers[i].AutoDosingMonitor()) { _shReservoirDevice.DosingSystemHelpers[i].StartDosing(_shReservoirDevice.DosingSystemHelpers[i].AutoDosingVolume, true); } } } /// /// ManualDose监控 /// public void ManualDoseSystemMonitor() { for (int i = 0; i < _replenNum; i++) { string replenName = "Replen" + (i + 1).ToString(); if (_currentDosingOperation[i] == DosingOperation.ManualDosing && !_persistentValue[replenName].IsDosingRunning) { _currentDosingOperation[i] = DosingOperation.None; } else if (_currentDosingOperation[i] == DosingOperation.ManualDosing && _persistentValue[replenName].IsDosingRunning) { continue; } } } public void CheckDoseOperation() { for (int i = 0; i < _replenNum; i++) { if (_currentDosingOperation[i] == DosingOperation.AutoDosing) { _currentDosingOperation[i] = DosingOperation.None; } } } /// /// Dose状态监控 /// public void DoseStatusMonitor() { //DosingSystem Initialize监控 if (_initializeRState == RState.Running) { DosingInitializingMonitor(); } for (int i = 0; i < _replenNum; i++) { string replenName = "Replen" + (i + 1).ToString(); RState state = _shReservoirDevice.DosingSystemHelpers[i].DosingState; if (state == RState.Running) { _shReservoirDevice.DosingSystemHelpers[i].DosingTimeOutMonitor(); } else if(state == RState.Failed || state == RState.Timeout) { if (_shReservoirDevice.ReplenDatas[i].ReplenPumpEnable) { Object[] args = new object[1]; args[0] = replenName; bool result = _shReservoirDevice.ReplenPumpOffOperation("", args); if (result) { LOG.WriteLog(eEvent.INFO_RESERVOIR, _moduleName, "Replen Pump Off"); } } } //BottleLevel监控 if (_shReservoirDevice.ReplenDatas[i].BottleLevel != BottleLevelState.Warning.ToString()) { _shReservoirDevice.CheckandUpdateBottleLevel(replenName, -1, false); } } } /// /// 监控DosingSystem初始化 /// /// public void DosingInitializingMonitor() { _initializeRState = _dosingSystemInitializeRoutine.Monitor(); if (_initializeRState == RState.Failed || _initializeRState == RState.Timeout) { _dosingSystemState = DoseState.Error.ToString(); } if (_initializeRState == RState.End) { _isDosingSystemInitialized = true; _dosingSystemState = DoseState.Idle.ToString(); } } /// /// DosingSystem初始化 /// /// /// /// public bool DosingInitialize() { _dosingSystemState = DoseState.Initializing.ToString(); _isDosingSystemInitialized = false; _initializeRState = _dosingSystemInitializeRoutine.Start(); if (_initializeRState == RState.Running) return true; return false; } /// /// Enetr Init State /// /// /// /// public bool DosingEnterInit() { if (_dosingSystemState == DoseState.Idle.ToString()) { _dosingSystemState = DoseState.Init.ToString(); } _isDosingSystemInitialized = false; return true; } } }