| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 | 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 内部变量        /// <summary>        /// ModuleName        /// </summary>        private string _moduleName;        /// <summary>        /// ReplenID        /// </summary>        private int _replenNum;        /// <summary>        /// StandardHotReservoirDevice         /// </summary>        private StandardHotReservoirDevice _shReservoirDevice;        /// <summary>        /// 当前操作        /// </summary>        private List<DosingOperation> _currentDosingOperation;        /// <summary>        /// Replen Persistent Value        /// </summary>        private Dictionary<string, ReplenPersistentValue> _persistentValue = new Dictionary<string, ReplenPersistentValue>();        /// <summary>        /// DosingSystem初始化状态        /// </summary>        private RState _initializeRState;        /// <summary>        /// DosingSystemState        /// </summary>        private string _dosingSystemState;        /// <summary>        /// DosingSystemInitializeRoutine        /// </summary>        private DosingSystemInitializeRoutine _dosingSystemInitializeRoutine;        /// <summary>        /// DosingSystem是否已初始化        /// </summary>        private bool _isDosingSystemInitialized;        #endregion        #region 属性        /// <summary>        /// DosingSystem是否已经Initialized        /// </summary>        public bool IsDosingSystemInitialized { get { return _isDosingSystemInitialized; } }        /// <summary>        /// DosingSystem State        /// </summary>        public string DosingSystemState { get { return _dosingSystemState; } }        /// <summary>        /// DosingSystem Initialize State        /// </summary>        public RState InitializeState { get { return _initializeRState; } }        #endregion        /// <summary>        /// 构造函数        /// </summary>        /// <param name="moduleName"></param>        public DosingCommonHelper(string moduleName, int replenNum)        {            _moduleName = moduleName;            _replenNum = replenNum;            _shReservoirDevice = DEVICE.GetDevice<StandardHotReservoirDevice>($"{_moduleName}");            _currentDosingOperation = new List<DosingOperation>();            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();        }        /// <summary>        /// AutoDose监控        /// </summary>        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);                }            }        }        /// <summary>        /// ManualDose监控        /// </summary>        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;                }            }        }        /// <summary>        /// Dose状态监控        /// </summary>        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);                }            }        }        /// <summary>        /// 监控DosingSystem初始化        /// </summary>        /// <returns></returns>        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();            }        }        /// <summary>        /// DosingSystem初始化        /// </summary>        /// <param name="cmd"></param>        /// <param name="args"></param>        /// <returns></returns>        public bool DosingInitialize()        {            _dosingSystemState = DoseState.Initializing.ToString();            _isDosingSystemInitialized = false;            _initializeRState = _dosingSystemInitializeRoutine.Start();            if (_initializeRState == RState.Running) return true;            return false;        }        /// <summary>        /// Enetr Init State        /// </summary>        /// <param name="cmd"></param>        /// <param name="args"></param>        /// <returns></returns>        public bool DosingEnterInit()        {            if (_dosingSystemState == DoseState.Idle.ToString())            {                _dosingSystemState = DoseState.Init.ToString();            }            _isDosingSystemInitialized = false;            return true;        }    }}
 |