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

209 lines
5.3 KiB
C#
Raw Normal View History

2024-01-29 11:12:21 +08:00
using Aitex.Core.RT.Event;
using Aitex.Core.RT.SCCore;
using Aitex.Core.Util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
namespace MECF.Framework.Common.Aitex.Core.RT.EMS
{
[DataContract]
public class TimeObserver : 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;
#endregion
#region Properties
[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>
/// 单位s
/// </summary>
public double Value => _value;
[Subscription("Threshold")]
/// <summary>
/// 单位s
/// </summary>
public double Threshold => _threshold;
[Subscription("TrigDate")]
public DateTime? TrigDate => _trigDate;
/// <summary>
/// 超出时间单位TimeDisplayUnit
/// </summary>
[Subscription("TimeExceeded")]
public double TimeExceeded => _timeExceeded;
[Subscription("ValueExceeded")]
public virtual double ValueExceeded => _timeExceeded;
[Subscription("IsProcessing")]
public virtual bool IsProcessing => true;
#endregion
#endregion
#region Constructors
public TimeObserver()
{
}
public TimeObserver(string name,string module ,int index,string description, bool enabled,DateTime startdate, double threshold, TimeUnit timedisplayunit)
{
Name = name;
Module = module;
Index = index;
Description = description;
Enable = enabled;
TimeDisplayUnit = timedisplayunit;
_threshold = threshold;
_startDate = startdate;
}
#endregion
#region Methods
/// <summary>
/// 计算剩余时间和超时时间,不同类算法不同,需要重载
/// </summary>
public virtual void Monitor()
{
_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.");
}
}
/// <summary>
/// 重新开始计时,未使能时或不满足条件无法复位
/// </summary>
/// <returns></returns>
public virtual bool Reset()
{
if (!Enable)
{
EV.PostWarningLog("Maintainance", $"Plan {Name} is disable,can not be reset");
return false;
}
if (CanReset())
return true;
else return false;
}
/// <summary>
/// 阈值设置
/// </summary>
/// <param name="threshold">必须大于0</param>
/// <returns></returns>
public virtual bool SetThreshold(double threshold)
{
if (threshold <= 0)
{
EV.PostWarningLog("Maintainance", $"threshold must be greater than zero");
return false;
}
return true;
}
public virtual bool SetStartDate(DateTime t)
{
return true;
}
public virtual bool CanReset()
{
return true;
}
public virtual bool SetMaintain(string parentname, string name, int itemid, DateTime date)
{
return true;
}
public virtual Dictionary<string, List<MaintainerItem>> GetAllMaintainerItemsDic()
{
return new();
}
public virtual bool SetMaintainerItemEnable(string parentname, string name, int itemid, bool enable)
{
return true;
}
public virtual void AddMaintainerItem(string parentname, MaintainerItem item)
{
}
public virtual void RemoveMaintainerItem(string parentname, string itemname, int id)
{
}
#endregion
}
}