using Aitex.Core.RT.DataCenter; using Aitex.Core.RT.DBCore; using Aitex.Core.RT.Event; using Aitex.Core.RT.SCCore; using Aitex.Core.Util; using MECF.Framework.Common.DBCore; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace MECF.Framework.Common.Aitex.Core.RT.EMS { /// /// 监控膜生长厚度,超出阈值后报警提示 /// public class CoatingMaintainer:Maintainer { #region Variables #endregion #region Constructors public CoatingMaintainer() { } public CoatingMaintainer(MaintainerItemCollection item, string name, string module, int index, string description, bool enabled, DateTime startdate, double threshold, TimeUnit timedisplayunit):base(item, name, module, index, description, enabled, startdate, threshold, timedisplayunit) { _info.Type = nameof(CoatingMaintainer); if (_info.Module == "PM1" || _info.Module == "PM2") { _getProcessing = new Func(() => { var r = DATA.Poll(_info.Module + ".IsProcessing"); if (r != null) { return (bool)r; } return false; } ); } } public CoatingMaintainer(MaintainerItemCollection item, MaintainerInfo info, DateTime startdate, double threshold) : base(item, info, startdate, threshold) { _info.Type = nameof(CoatingMaintainer); if (_info.Module == "PM1" || _info.Module == "PM2") { _getProcessing = new Func(() => { var r = DATA.Poll(_info.Module + ".IsProcessing"); if (r != null) { return (bool)r; } return false; } ); } } #endregion #region Methods /// /// 检查膜厚度 /// public override void Monitor() { DateTime now = DateTime.Now; _isProcessing = _getProcessing(); ////①确认未使能;没有维护项也不进行计算 if (!_info.Enable || _itemCollection.Count == 0) { _isTimeOut = false; _timeExceeded = 0; _valueElapsed = 0; _value = 0; } else { UpdateValue(); _itemCollection.CheckAllItemMaintained(_startDate); if (_unMaintainedCount == 0) { Reset(); //所有项都维护,翻转沙漏 } _valueExceeded = _value - _threshold; if (_valueExceeded <= 0) { _valueExceeded = 0; } if (_valueExceeded > 0) { if (!_isTimeOut && !_trigDate.HasValue) { _trigDate = now; } _isTimeOut = true; if (_unMaintainedCount != 0) { if (_trigDate.HasValue) { _timeExceeded = DateTimeHelper.DateTimeSubtraction(_trigDate.Value, now, TimeUnit.Seconds); } _valueElapsed = 0; } } else { _timeExceeded = 0; _valueElapsed = _threshold - _value; } } UpdateInfo(); base.Monitor(); } private void UpdateValue() { string sql = $"Select \"thickness\" from \"pm_thickness_data2\" where \"startdate\"='{_startDate.ToString()}' and \"pm_name\"='{_info.Module}';"; DataSet dataSet = DB.ExecuteDataSet(sql); if (dataSet != null && dataSet.Tables != null && dataSet.Tables.Count == 1) { if (dataSet.Tables[0].Rows.Count == 1) { _value = Convert.ToDouble(dataSet.Tables[0].Rows[0]["thickness"].ToString()); } else if (dataSet.Tables[0].Rows.Count == 0) { ThinknessDataRecorder.InsertPMThinkness(_startDate.ToString(), _info.Module, 0); } } } /// /// 重新开始计时,未使能时或不满足条件无法复位 /// /// public override bool Reset() { if (!_info.Enable) { EV.PostWarningLog("Maintenance", $"Plan {_info.Name} is disable,can not be reset"); return false; } if (!CanReset()) { return false; } _isTimeOut = false; DateTime now = DateTime.Now; _startDate = now; _trigDate = null; _value = 0; ThinknessDataRecorder.InsertPMThinkness(_startDate.ToString(),_info.Module,0); _timeExceeded = 0; _valueExceeded = 0; _valueElapsed = _threshold; _itemCollection.CheckAllItemMaintained(_startDate); UpdateInfo(); return base.Reset(); } public override void UpdateInfo() { _info.Value = _value; _info.Threshold = _threshold; _info.ValueExceeded = _valueExceeded; _info.ValueElapsed = _valueElapsed; base.UpdateInfo(); } public override bool SetStartDate(DateTime t) { if (!base.SetStartDate(t)) { return false; } _startDate = t; return true; } /// /// 阈值设置 /// /// /// /// public override bool SetThreshold(double threshold, params object[] args) { if (!base.SetThreshold(threshold)) { return false; } _threshold = threshold; return true; } #endregion } }