87 lines
2.8 KiB
C#
87 lines
2.8 KiB
C#
using Aitex.Core.RT.Device;
|
|
using Aitex.Core.RT.Device.Unit;
|
|
using Aitex.Core.RT.Event;
|
|
using Aitex.Core.RT.IOCore;
|
|
using Aitex.Core.RT.SCCore;
|
|
using Aitex.Core.RT.Tolerance;
|
|
using MECF.Framework.Common.Event;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Security.Cryptography;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Xml;
|
|
|
|
namespace Aitex.Core.RT.Device.Devices
|
|
{
|
|
public class IoPressureBalanceChecker : BaseDevice, IDevice
|
|
{
|
|
private readonly AIAccessor _aiValue1 = null;
|
|
private readonly AIAccessor _aiValue2 = null;
|
|
private readonly string _formatString = "0.0";
|
|
|
|
private double _threshold = 8;
|
|
private double _value = 0;
|
|
|
|
/// <summary>
|
|
/// 误差超限警告检查器
|
|
/// </summary>
|
|
private readonly ToleranceChecker _balanceChecker;
|
|
|
|
public string Value => _value.ToString(_formatString);
|
|
public IoPressureBalanceChecker(string module, XmlElement node, string ioModule = "") : base(module, node, ioModule)
|
|
{
|
|
_aiValue1 = ParseAiNode("aiValue1", node, ioModule);
|
|
_aiValue2 = ParseAiNode("aiValue2", node, ioModule);
|
|
|
|
_balanceChecker = new ToleranceChecker(5);
|
|
|
|
if (node.HasAttribute("formatString"))
|
|
_formatString = string.IsNullOrEmpty(node.GetAttribute("formatString")) ? "F5" : node.GetAttribute("formatString");
|
|
}
|
|
|
|
public bool Initialize()
|
|
{
|
|
_threshold = SC.GetValue<double>($"PM.{Module}.Heater.PressureBalanceDifference");
|
|
return true;
|
|
}
|
|
|
|
private bool ResetChecker()
|
|
{
|
|
_balanceChecker.Reset(5);
|
|
return true;
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
_balanceChecker.Reset(5);
|
|
}
|
|
|
|
public void Terminate()
|
|
{
|
|
_balanceChecker.Reset(5);
|
|
}
|
|
|
|
protected override void HandleMonitor()
|
|
{
|
|
_value = _aiValue1.FloatValue - _aiValue2.FloatValue;
|
|
_balanceChecker.Monitor(_value, -_threshold, _threshold, 5);
|
|
if (_balanceChecker.Trig)
|
|
{
|
|
var alarmLevel = SC.SafeGetStringValue($"PM.{Module}.Heater.PressureImbalanceAlarmLevel", "Warning");
|
|
if (alarmLevel == "Warning")
|
|
{
|
|
EV.PostWarningLog(Module, $"PT1:{_aiValue1}({_aiValue1.FloatValue})/PT2:{_aiValue2}({_aiValue2.FloatValue}) Pressure out of balance(threshold:{_threshold})");
|
|
}
|
|
else
|
|
{
|
|
EV.PostAlarmLog(Module, $"PT1:{_aiValue1}({_aiValue1.FloatValue})/PT2:{_aiValue2}({_aiValue2.FloatValue}) Pressure out of balance(threshold:{_threshold})");
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|