Sic.Framework-Nanjing-Baishi/MECF.Framework.RT.Equipment.../Devices/IoSensorWaterFlowTemp.cs

104 lines
3.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Aitex.Core.RT.SCCore;
using System;
using System.Xml;
using Aitex.Core.RT.DataCenter;
using Aitex.Core.RT.IOCore;
using MECF.Framework.Common.Aitex.Core.Common.DeviceData;
namespace Aitex.Core.RT.Device.Devices
{
public class IoSensorWaterFlowTemp : IoSensorAnalog
{
#region Variables
private readonly DIAccessor _diFlowSW;
private double _warnOffset;
private readonly AITWaterFlowData _devData;
#endregion
#region Constructors
public IoSensorWaterFlowTemp(string module, XmlElement node, string ioModule = "")
: base(module, node, ioModule)
{
_devData = new AITWaterFlowData();
_diFlowSW = ParseDiNode("diFlowSW", node, ioModule);
LoadConfig();
}
#endregion
#region Properties
/// <summary>
/// 冷却水流侦测传感器信号。
/// </summary>
public bool IsFlowSw => _diFlowSW?.Value ?? false;
private new AITWaterFlowData DeviceData
{
get
{
_devData.Update(base.DeviceData);
_devData.IsFlowSW = IsFlowSw;
return _devData;
}
}
#endregion
#region Methods
protected sealed override void LoadConfig()
{
base.LoadConfig();
var scNameWarnOffset = $"{ScBasePath}.WarningOffset";
// 重新设定水温警告值当前系统中的水温警告值非设定值而是在Alarm基础上偏移指定的温度。
_warnOffset = SC.SafeGetValue(scNameWarnOffset, 0.0);
UpdateWarnThreshold(_warnOffset, _alarmLow, _alarmHigh);
// 当WarnOffset、AlarmLow、AlarmHigh中的任意参数发生变更时重新计算Warn阈值
SC.RegisterValueChangedCallback(scNameWarnOffset, v =>
{
_warnOffset = (double)v;
UpdateWarnThreshold(_warnOffset, _alarmLow, _alarmHigh);
});
SC.RegisterValueChangedCallback(_scNameAlarmLow,
v => UpdateWarnThreshold(_warnOffset, (double)v, _alarmHigh));
SC.RegisterValueChangedCallback(_scNameAlarmHigh,
v => UpdateWarnThreshold(_warnOffset, _alarmLow, (double)v));
}
public override bool Initialize()
{
DATA.Subscribe($"{Module}.{Name}.DeviceData", () => DeviceData);
DATA.Subscribe($"{Module}.CoolingWater.{Display}.Value", () => Value);
DATA.Subscribe($"{Module}.CoolingWater.{Display}.FlowSensor", () => IsFlowSw);
return base.Initialize();
}
/// <summary>
/// 根据给定的Alarm阈值和偏移值计算Warn阈值。
/// </summary>
/// <param name="offset"></param>
/// <param name="alarmLow"></param>
/// <param name="alarmHigh"></param>
private void UpdateWarnThreshold(double offset, double alarmLow, double alarmHigh)
{
checked
{
_warningLow = alarmLow + Math.Abs(offset);
_warningHigh = alarmHigh - Math.Abs(offset);
}
}
#endregion
}
}