Sic.Framework-Nanjing-Baishi/MECF.Framework.Common/Aitex/Core/RT/EMS/CoatingMaintainer.cs

228 lines
6.6 KiB
C#

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
{
/// <summary>
/// 监控膜生长厚度,超出阈值后报警提示
/// </summary>
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<bool>(() => {
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<bool>(() => {
var r = DATA.Poll(_info.Module + ".IsProcessing");
if (r != null)
{
return (bool)r;
}
return false;
}
);
}
}
#endregion
#region Methods
/// <summary>
/// 检查膜厚度
/// </summary>
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);
}
}
}
/// <summary>
/// 重新开始计时,未使能时或不满足条件无法复位
/// </summary>
/// <returns></returns>
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;
}
/// <summary>
/// 阈值设置
/// </summary>
/// <param name="threshold"></param>
/// <param name="args"></param>
/// <returns></returns>
public override bool SetThreshold(double threshold, params object[] args)
{
if (!base.SetThreshold(threshold))
{
return false;
}
_threshold = threshold;
return true;
}
#endregion
}
}