using Aitex.Core.RT.Log; using Aitex.Core.RT.SCCore; using MECF.Framework.Common.Persistent.Reservoirs; using MECF.Framework.Common.RecipeCenter; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace CyberX8_RT.Devices.Reservoir { public class ReservoirDiReplenHelper { #region 内部变量 /// /// 模块名称 /// private string _module; /// /// 持久化对象 /// private ReservoirsPersistentValue _persistentValue; /// /// 锁 /// private object _locker = new object(); #endregion /// /// 构造函数 /// /// /// /// public ReservoirDiReplenHelper(string module,ReservoirsPersistentValue persistentValue) { _module = module; _persistentValue = persistentValue; } /// /// 监控 /// public void MonitorPeriodTime() { double levelHysteresis = SC.GetValue("Reservoir.LevelHysteresis"); double diValveMaxOnTimePeriod = SC.GetValue($"Reservoir.{_module}.DIValveMaxOnTimePeriod"); //没有在注水 if (_persistentValue != null && !_persistentValue.IsDiReplenOn) { //超过时间 if (DateTime.Now.Subtract(_persistentValue.PeriodStartTime).TotalMinutes >= diValveMaxOnTimePeriod * 60) { _persistentValue.PeriodStartTime = DateTime.Now; _persistentValue.TotalReplen = 0; _persistentValue.LastTotalReplen = 0; ReservoirsPersistentManager.Instance.UpdatePersistentValue(_module); } } } /// /// 监控手动注水 /// public bool MonitorManualDiReplenComplete(int replenSecond, Func direplenOffAction) { lock (_locker) { _persistentValue.TotalReplen = _persistentValue.LastTotalReplen + (int)DateTime.Now.Subtract(_persistentValue.DiReplenTime).TotalSeconds; } if(DateTime.Now.Subtract(_persistentValue.DiReplenTime).TotalSeconds >= replenSecond) { bool result = direplenOffAction("",null); if(result) { _persistentValue.LastTotalReplen = _persistentValue.TotalReplen; _persistentValue.IsDiReplenOn = false; ReservoirsPersistentManager.Instance.UpdatePersistentValue(_module); LOG.WriteLog(eEvent.INFO_RESERVOIR, _module, "Manual Direplen complete"); } return result; } return false; } /// /// 单次自动注水超时 /// /// public bool AutoDiReplenMonitorTimeOut(Func direplenOffAction) { lock (_locker) { _persistentValue.TotalReplen = _persistentValue.LastTotalReplen+(int)DateTime.Now.Subtract(_persistentValue.DiReplenTime).TotalSeconds; } double diValveMaxOnTimePerFill = SC.GetValue($"Reservoir.{_module}.DIValveMaxOnTimePerFill"); if(DateTime.Now.Subtract(_persistentValue.DiReplenTime).TotalSeconds >= diValveMaxOnTimePerFill * 60) { bool result = direplenOffAction("", null); if(result) { LOG.WriteLog(eEvent.WARN_RESERVOIR, _module, $"Direplen time over {diValveMaxOnTimePerFill}"); _persistentValue.LastTotalReplen = _persistentValue.TotalReplen; _persistentValue.IsDiReplenOn = false; ReservoirsPersistentManager.Instance.UpdatePersistentValue(_module); } return result; } return false; } /// /// 自动注水是否结束 /// /// /// /// /// public bool AutoDiReplenMonitorComplete(double level,double recipeLevel,ResRecipe _recipe,Func direplenOffAction) { double levelHysteresis = SC.GetValue("Reservoir.LevelHysteresis"); //按液位补水 if (_recipe.DIReplenEnable && _recipe.DIReplenTimeRate == 0 && _recipe.DIReplenCurrentRate == 0 && level >= recipeLevel) { LOG.WriteLog(eEvent.INFO_RESERVOIR, _module, "Auto replen complete"); bool result= direplenOffAction("",null); if(result) { _persistentValue.LastTotalReplen = _persistentValue.TotalReplen; _persistentValue.IsDiReplenOn = false; ReservoirsPersistentManager.Instance.UpdatePersistentValue(_module); } } return false; } } }