using Aitex.Core.RT.Device; using Aitex.Core.RT.Log; using Aitex.Core.RT.Routine; using Aitex.Core.RT.SCCore; using CyberX8_Core; using CyberX8_RT.Devices.Reservoir; using MECF.Framework.Common.Persistent.Reservoirs; using MECF.Framework.Common.Routine; using System; using System.Collections.Generic; namespace CyberX8_RT.Modules.Reservoir { public class DosingSystemInitializeRoutine : RoutineBase, IRoutine { private enum InitializeStep { CheckState, InitData, End } #region 内部变量 /// /// 模块名称 /// private string _moduleName; /// /// SHReservoirDevice /// private StandardHotReservoirDevice _standardHotReservoirdevice; /// /// Replen Persistent Value /// private Dictionary _replenPersistentValue = new Dictionary(); #endregion #region 属性 /// /// 当前子状态机 /// public string CurrentStateMachine { get { return Runner.CurrentStep.ToString(); } } #endregion /// /// 构造函数 /// /// public DosingSystemInitializeRoutine(string module) : base(module) { _moduleName = module; } public void Abort() { Runner.Stop("Manual Abort"); } public RState Monitor() { Runner.Run(InitializeStep.CheckState, CheckState, NullFun, _delay_1ms) .Run(InitializeStep.InitData, InitData, NullFun, _delay_1ms) .End(InitializeStep.End, NullFun); return Runner.Status; } /// /// CheckState /// /// private bool CheckState() { _standardHotReservoirdevice = DEVICE.GetDevice($"{_moduleName}"); if (_standardHotReservoirdevice == null) { LOG.WriteLog(eEvent.ERR_RESERVOIR, _moduleName, "Reservoir Device is not exist"); return false; } for (int i = 0; i < _standardHotReservoirdevice.ReplenNum; i++) { if (_standardHotReservoirdevice.ReplenDatas[i].ReplenPumpEnable) { //未关则关闭Replen Pump Object[] args = new object[1]; args[0] = "Replen"+(i+1).ToString(); bool result = _standardHotReservoirdevice.ReplenPumpOffOperation("", args); if (result) { LOG.WriteLog(eEvent.INFO_RESERVOIR, _moduleName, "Replen Pump Off"); } else { LOG.WriteLog(eEvent.ERR_RESERVOIR, _moduleName, "Replen Pump Off is failed"); return false; } } } return true; } /// /// Clear Data /// /// private bool InitData() { for (int i = 0; i < _standardHotReservoirdevice.ReplenNum; i++) { string replenName = "Replen" + (i + 1).ToString(); _replenPersistentValue[replenName] = ReplenPersistentManager.Instance.GetReplenPersistentValue(_moduleName, replenName); if (_replenPersistentValue[replenName] == null) { LOG.WriteLog(eEvent.ERR_RESERVOIR, _moduleName, $"{replenName} persistent file is null"); return false; } _replenPersistentValue[replenName].CurrentDosingVolume = 0; _replenPersistentValue[replenName].AutoDosingStartAmpHour = 0; _replenPersistentValue[replenName].AutoDosingStartTime = DateTime.MinValue; _replenPersistentValue[replenName].IsDosingRunning = false; _replenPersistentValue[replenName].TargetDosingVolume = 0; ReplenPersistentManager.Instance.UpdatePersistentValue(_moduleName, replenName); _standardHotReservoirdevice.CheckandUpdateBottleLevel(replenName); _standardHotReservoirdevice.ReplenDatas[i].IsAutoDosingError = false; } return true; } /// /// 启动 /// /// /// public RState Start(params object[] objs) { return Runner.Start(Module, "DosingSystem Initialize"); } } }