264 lines
7.5 KiB
C#
264 lines
7.5 KiB
C#
using System.Xml;
|
|
using Aitex.Core.Common.DeviceData;
|
|
using Aitex.Core.RT.DataCenter;
|
|
using Aitex.Core.RT.Event;
|
|
using Aitex.Core.RT.IOCore;
|
|
using Aitex.Core.RT.SCCore;
|
|
using Aitex.Core.RT.Tolerance;
|
|
using Aitex.Core.Util;
|
|
using MECF.Framework.Common.Event;
|
|
|
|
namespace Aitex.Core.RT.Device.Unit
|
|
{
|
|
public class IoPressureMeter3 : BaseDevice, IDevice, IPressureMeter
|
|
{
|
|
public double Value
|
|
{
|
|
get
|
|
{
|
|
return _isFloatAioType ? _aiValue.FloatValue : _aiValue.Value;
|
|
}
|
|
}
|
|
public double FeedBack
|
|
{
|
|
get
|
|
{
|
|
return _isFloatAioType ? _aiValue.FloatValue : _aiValue.Value;
|
|
}
|
|
}
|
|
public double Precision
|
|
{
|
|
get
|
|
{
|
|
return _scPrecision == null ? 1500 : _scPrecision.DoubleValue;
|
|
}
|
|
}
|
|
|
|
private AITPressureMeterData DeviceData
|
|
{
|
|
get
|
|
{
|
|
AITPressureMeterData data = new AITPressureMeterData()
|
|
{
|
|
DeviceName = Name,
|
|
DeviceSchematicId = DeviceID,
|
|
DisplayName = Display,
|
|
FeedBack = Value,
|
|
Unit = Unit,
|
|
FormatString = _formatString,
|
|
DisplayWithUnit = true,
|
|
IsError = IsError,
|
|
IsWarning = IsWarning,
|
|
Precision = Precision,
|
|
};
|
|
|
|
return data;
|
|
}
|
|
}
|
|
|
|
public bool IsWarning
|
|
{
|
|
get
|
|
{
|
|
return _checkWarning.Result;
|
|
}
|
|
}
|
|
|
|
public bool IsError
|
|
{
|
|
get
|
|
{
|
|
return _checkAlarm.Result;
|
|
}
|
|
}
|
|
|
|
public double MinPressure
|
|
{
|
|
get
|
|
{
|
|
return _scMinValue == null ? 0 : _scMinValue.DoubleValue;
|
|
}
|
|
}
|
|
|
|
public double MaxPressure
|
|
{
|
|
get
|
|
{
|
|
return _scMaxValue == null ? 0 : _scMaxValue.DoubleValue;
|
|
}
|
|
}
|
|
|
|
public int WarningTime
|
|
{
|
|
get
|
|
{
|
|
return _scWarningTime == null ? 0 : _scWarningTime.IntValue;
|
|
}
|
|
}
|
|
|
|
public int AlarmTime
|
|
{
|
|
get
|
|
{
|
|
return _scAlarmTime == null ? 0 : _scAlarmTime.IntValue;
|
|
}
|
|
}
|
|
|
|
public bool EnableAlarm
|
|
{
|
|
get
|
|
{
|
|
return _scEnableAlarm == null ? true : _scEnableAlarm.BoolValue;
|
|
}
|
|
}
|
|
|
|
public bool IsOutOfRange
|
|
{
|
|
get
|
|
{
|
|
if (MinPressure < 0.01 && MaxPressure < 0.01)
|
|
return false;
|
|
|
|
return (Value < MinPressure) || (Value > MaxPressure);
|
|
}
|
|
}
|
|
|
|
public string Unit { get; set; }
|
|
|
|
private AIAccessor _aiValue = null;
|
|
|
|
private string _formatString = "F5";
|
|
|
|
private SCConfigItem _scMinValue;
|
|
private SCConfigItem _scMaxValue;
|
|
private SCConfigItem _scEnableAlarm;
|
|
private SCConfigItem _scWarningTime;
|
|
private SCConfigItem _scAlarmTime;
|
|
private SCConfigItem _scPrecision;
|
|
|
|
private ToleranceChecker _checkWarning = new ToleranceChecker();
|
|
private ToleranceChecker _checkAlarm = new ToleranceChecker();
|
|
|
|
|
|
public AlarmEventItem AlarmToleranceWarning { get; set; }
|
|
public AlarmEventItem AlarmToleranceError { get; set; }
|
|
|
|
private bool _isFloatAioType = false;
|
|
|
|
public IoPressureMeter3(string module, XmlElement node, string ioModule = "")
|
|
{
|
|
var attrModule = node.GetAttribute("module");
|
|
base.Module = string.IsNullOrEmpty(attrModule) ? module : attrModule;
|
|
Name = node.GetAttribute("id");
|
|
Display = node.GetAttribute("display");
|
|
DeviceID = node.GetAttribute("schematicId");
|
|
Unit = node.GetAttribute("unit");
|
|
|
|
_isFloatAioType = !string.IsNullOrEmpty(node.GetAttribute("aioType")) && (node.GetAttribute("aioType") == "float");
|
|
|
|
_aiValue = ParseAiNode("aiValue", node, ioModule);
|
|
|
|
if (node.HasAttribute("formatString"))
|
|
_formatString = string.IsNullOrEmpty(node.GetAttribute("formatString")) ? "F5" : node.GetAttribute("formatString");
|
|
|
|
string scBasePath = node.GetAttribute("scBasePath");
|
|
if (string.IsNullOrEmpty(scBasePath))
|
|
scBasePath = $"{Module}.{Name}";
|
|
else
|
|
{
|
|
scBasePath = scBasePath.Replace("{module}", Module);
|
|
}
|
|
|
|
_scMinValue = ParseScNode("", node, "", $"{scBasePath}.{Name}.MinValue");
|
|
_scMaxValue = ParseScNode("", node, "", $"{scBasePath}.{Name}.MaxValue");
|
|
_scEnableAlarm = ParseScNode("", node, "", $"{scBasePath}.{Name}.EnableAlarm");
|
|
_scWarningTime = ParseScNode("", node, "", $"{scBasePath}.{Name}.WarningTime");
|
|
_scAlarmTime = ParseScNode("", node, "", $"{scBasePath}.{Name}.AlarmTime");
|
|
_scPrecision = ParseScNode("", node, "", $"{scBasePath}.{Name}.Precision");
|
|
|
|
}
|
|
|
|
public bool Initialize()
|
|
{
|
|
DATA.Subscribe($"{Module}.{Name}.Value", () => Value);
|
|
DATA.Subscribe($"{Module}.{Name}.DeviceData", () => DeviceData);
|
|
|
|
AlarmToleranceWarning = SubscribeAlarm($"{Module}.{Name}.OutOfToleranceWarning", "", ResetWarningChecker, EventLevel.Warning);
|
|
AlarmToleranceError = SubscribeAlarm($"{Module}.{Name}.OutOfToleranceError", "", ResetErrorChecker);
|
|
|
|
return true;
|
|
}
|
|
|
|
public void Terminate()
|
|
{
|
|
}
|
|
|
|
public void Monitor()
|
|
{
|
|
if (EnableAlarm && (WarningTime > 0))
|
|
{
|
|
_checkWarning.Monitor(Value, MinPressure, MaxPressure, WarningTime);
|
|
|
|
if (_checkWarning.Trig)
|
|
{
|
|
AlarmToleranceWarning.Description =
|
|
$"{Display} out of range [{MinPressure},{MaxPressure}]{Unit} for {WarningTime} seconds";
|
|
AlarmToleranceWarning.Set();
|
|
}
|
|
|
|
if (!_checkWarning.Result)
|
|
{
|
|
AlarmToleranceWarning.Reset();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
AlarmToleranceWarning.Reset();
|
|
}
|
|
|
|
if (EnableAlarm && (AlarmTime > 0))
|
|
{
|
|
_checkAlarm.Monitor(Value, MinPressure, MaxPressure, AlarmTime);
|
|
|
|
if (_checkAlarm.Trig)
|
|
{
|
|
AlarmToleranceError.Description =
|
|
$"{Display} out of range [{MinPressure},{MaxPressure}]{Unit} for {AlarmTime} seconds";
|
|
AlarmToleranceError.Set();
|
|
}
|
|
|
|
if (!_checkAlarm.Result)
|
|
{
|
|
AlarmToleranceError.Reset();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
AlarmToleranceError.Reset();
|
|
}
|
|
}
|
|
|
|
public bool ResetWarningChecker()
|
|
{
|
|
_checkWarning.RST = true;
|
|
|
|
return true;
|
|
}
|
|
|
|
public bool ResetErrorChecker()
|
|
{
|
|
_checkAlarm.RST = true;
|
|
|
|
return true;
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
AlarmToleranceWarning.Reset();
|
|
AlarmToleranceError.Reset();
|
|
}
|
|
}
|
|
}
|
|
|
|
|