316 lines
8.9 KiB
C#
316 lines
8.9 KiB
C#
|
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>
|
|||
|
[DataContract]
|
|||
|
public class PMThicknessMaintainer:IObserver
|
|||
|
{
|
|||
|
#region Variables
|
|||
|
|
|||
|
protected DateTime _startDate = DateTime.Now;
|
|||
|
protected DateTime? _trigDate = null;
|
|||
|
protected double _value = 0;
|
|||
|
protected bool _isTimeOut = false;
|
|||
|
protected double _timeExceeded = 0;
|
|||
|
protected readonly R_TRIG _trigTimeOut = new();
|
|||
|
protected double _threshold = 1000000;
|
|||
|
protected double _valueElapsed = 0;
|
|||
|
protected double _valueExceeded = 0;
|
|||
|
|
|||
|
public Func<bool> GetProcessing;
|
|||
|
|
|||
|
[DataMember]
|
|||
|
MaintainerItemCollection _itemcollection;
|
|||
|
|
|||
|
[Subscription("UnMaintainedCount")]
|
|||
|
public int UnMaintainedCount => _itemcollection.UnMaintainCount;
|
|||
|
|
|||
|
public delegate bool Save();
|
|||
|
|
|||
|
public event Save OnSave;
|
|||
|
|
|||
|
[Subscription("ValueElapsed")]
|
|||
|
public double ValueElapsed => _valueElapsed;
|
|||
|
|
|||
|
[DataMember]
|
|||
|
public string Name { get; set; }
|
|||
|
|
|||
|
[DataMember]
|
|||
|
public string Module { get; set; }
|
|||
|
|
|||
|
[DataMember]
|
|||
|
public int Index { get; set; }
|
|||
|
|
|||
|
[DataMember]
|
|||
|
public string Description { get; set; }
|
|||
|
|
|||
|
[DataMember]
|
|||
|
public bool Enable { get; set; }
|
|||
|
|
|||
|
[DataMember]
|
|||
|
public TimeUnit TimeDisplayUnit { get; set; }
|
|||
|
|
|||
|
#region OutputOnly
|
|||
|
|
|||
|
[Subscription("IsTrigger")]
|
|||
|
public bool IsTrigger => _isTimeOut;
|
|||
|
|
|||
|
[Subscription("StartDate")]
|
|||
|
public DateTime StartDate => _startDate;
|
|||
|
|
|||
|
[Subscription("Value")]
|
|||
|
/// <summary>
|
|||
|
/// 厚度,单位mm
|
|||
|
/// </summary>
|
|||
|
public double Value => _value;
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 单位mm
|
|||
|
/// </summary>
|
|||
|
[Subscription("Threshold")]
|
|||
|
public double Threshold => _threshold;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 触发日期
|
|||
|
/// </summary>
|
|||
|
[Subscription("TrigDate")]
|
|||
|
public DateTime? TrigDate => _trigDate;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 超出时间,单位TimeDisplayUnit
|
|||
|
/// </summary>
|
|||
|
[Subscription("TimeExceeded")]
|
|||
|
public double TimeExceeded => _timeExceeded;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 超出阈值,mm
|
|||
|
/// </summary>
|
|||
|
[Subscription("ValueExceeded")]
|
|||
|
public double ValueExceeded => _valueExceeded;
|
|||
|
|
|||
|
[Subscription("IsProcessing")]
|
|||
|
public bool IsProcessing => (GetProcessing == null) ? false : GetProcessing();
|
|||
|
#endregion
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region Constructors
|
|||
|
public PMThicknessMaintainer()
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public PMThicknessMaintainer(MaintainerItemCollection item,
|
|||
|
string name,
|
|||
|
string module,
|
|||
|
int index,
|
|||
|
string description,
|
|||
|
bool enabled,
|
|||
|
DateTime startdate,
|
|||
|
double threshold,
|
|||
|
TimeUnit timedisplayunit)
|
|||
|
{
|
|||
|
_itemcollection = item;
|
|||
|
Name = name;
|
|||
|
Module = module;
|
|||
|
Index = index;
|
|||
|
Description = description;
|
|||
|
Enable = enabled;
|
|||
|
TimeDisplayUnit = timedisplayunit;
|
|||
|
|
|||
|
_threshold = threshold;
|
|||
|
|
|||
|
_startDate = startdate;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region Methods
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 检查膜厚度并做出动作
|
|||
|
/// </summary>
|
|||
|
public void Monitor()
|
|||
|
{
|
|||
|
DateTime now = DateTime.Now;
|
|||
|
|
|||
|
////①确认未使能;没有维护项也不进行计算
|
|||
|
if (!Enable || _itemcollection.Count == 0)
|
|||
|
{
|
|||
|
_isTimeOut = false;
|
|||
|
_timeExceeded = 0;
|
|||
|
_valueElapsed = 0;
|
|||
|
_value = 0;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
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, TimeDisplayUnit);
|
|||
|
}
|
|||
|
_valueElapsed = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
_timeExceeded = 0;
|
|||
|
_valueElapsed = DateTimeHelper.SecondsTransform(Threshold - _value, TimeDisplayUnit);
|
|||
|
}
|
|||
|
|
|||
|
_trigTimeOut.CLK = _isTimeOut;
|
|||
|
|
|||
|
if (_trigTimeOut.Q)
|
|||
|
{
|
|||
|
bool iswarning = true;
|
|||
|
if (SC.ContainsItem("System.IgnoreMaintainTimeOutWarning"))
|
|||
|
{
|
|||
|
iswarning = !SC.GetValue<bool>("System.IgnoreMaintainTimeOutWarning");
|
|||
|
}
|
|||
|
if (iswarning)
|
|||
|
EV.PostWarningLog("Maintainance", $"Plan {Name} reach the deadline, please check as soon as possible.");
|
|||
|
else
|
|||
|
EV.PostInfoLog("Maintainance", $"Plan {Name} reach the deadline, please check as soon as possible.");
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
private void UpdateValue()
|
|||
|
{
|
|||
|
string sql = $"Select \"thickness\" from \"pm_thickness_data\" where \"startdate\"='{StartDate.ToString()}' and \"pm_name\"='{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(), Module, 0);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 重新开始计时,未使能时或不满足条件无法复位
|
|||
|
/// </summary>
|
|||
|
/// <returns></returns>
|
|||
|
public bool Reset()
|
|||
|
{
|
|||
|
if (!CanReset())
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
_isTimeOut = false;
|
|||
|
DateTime now = DateTime.Now;
|
|||
|
_startDate = now;
|
|||
|
_trigDate = null;
|
|||
|
|
|||
|
OnSave?.Invoke();
|
|||
|
|
|||
|
_value = 0;
|
|||
|
|
|||
|
ThinknessDataRecorder.InsertPMThinkness(_startDate.ToString(),Module,0);
|
|||
|
|
|||
|
_timeExceeded = 0;
|
|||
|
_valueExceeded = 0;
|
|||
|
_valueElapsed = DateTimeHelper.SecondsTransform(Threshold, TimeDisplayUnit);
|
|||
|
_itemcollection.CheckAllItemMaintained(StartDate);
|
|||
|
|
|||
|
return true;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 阈值设置
|
|||
|
/// </summary>
|
|||
|
/// <param name="threshold">必须大于0</param>
|
|||
|
/// <returns></returns>
|
|||
|
public bool SetThreshold(double threshold)
|
|||
|
{
|
|||
|
if (threshold <= 0)
|
|||
|
{
|
|||
|
EV.PostWarningLog("Maintainance", $"threshold must be greater than zero");
|
|||
|
return false;
|
|||
|
}
|
|||
|
_threshold = threshold;
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
public bool SetStartDate(DateTime t)
|
|||
|
{
|
|||
|
_startDate = t;
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
public bool CanReset()
|
|||
|
{
|
|||
|
return UnMaintainedCount == 0;
|
|||
|
}
|
|||
|
|
|||
|
public bool SetMaintain(string parentname, string name, int itemid, DateTime date)
|
|||
|
{
|
|||
|
return _itemcollection.SetMaintain(parentname, name, itemid, date);
|
|||
|
}
|
|||
|
|
|||
|
public Dictionary<string, List<MaintainerItem>> GetAllMaintainerItemsDic()
|
|||
|
{
|
|||
|
return _itemcollection.GetAllItemsDic();
|
|||
|
}
|
|||
|
|
|||
|
public bool SetMaintainerItemEnable(string parentname, string name, int itemid, bool enable)
|
|||
|
{
|
|||
|
return _itemcollection.SetMaintainerItemEnable(parentname, name, itemid, enable);
|
|||
|
}
|
|||
|
|
|||
|
public void AddMaintainerItem(string parentname, MaintainerItem item)
|
|||
|
{
|
|||
|
_itemcollection.AddMaintainerItem(parentname, item);
|
|||
|
}
|
|||
|
|
|||
|
public void RemoveMaintainerItem(string parentname, string itemname, int id)
|
|||
|
{
|
|||
|
_itemcollection.RemoveMaintainerItem(parentname, itemname, id);
|
|||
|
}
|
|||
|
#endregion
|
|||
|
}
|
|||
|
}
|