2023-04-19 18:01:08 +08:00
|
|
|
|
using Aitex.Core.RT.SCCore;
|
|
|
|
|
using System;
|
2023-04-19 15:38:04 +08:00
|
|
|
|
using System.Xml;
|
2023-08-08 00:36:56 +08:00
|
|
|
|
using Aitex.Core.RT.DataCenter;
|
|
|
|
|
using Aitex.Core.RT.IOCore;
|
|
|
|
|
using MECF.Framework.Common.Aitex.Core.Common.DeviceData;
|
2023-04-19 15:38:04 +08:00
|
|
|
|
|
|
|
|
|
namespace Aitex.Core.RT.Device.Devices
|
|
|
|
|
{
|
|
|
|
|
public class IoSensorWaterFlowTemp : IoSensorAnalog
|
|
|
|
|
{
|
|
|
|
|
|
2023-04-20 14:26:02 +08:00
|
|
|
|
#region Variables
|
|
|
|
|
|
2023-08-08 00:36:56 +08:00
|
|
|
|
private readonly DIAccessor _diFlowSW;
|
2023-04-20 14:26:02 +08:00
|
|
|
|
private double _warnOffset;
|
2023-08-08 00:36:56 +08:00
|
|
|
|
private readonly AITWaterFlowData _devData;
|
2023-04-20 14:26:02 +08:00
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Constructors
|
|
|
|
|
|
2023-04-19 15:38:04 +08:00
|
|
|
|
public IoSensorWaterFlowTemp(string module, XmlElement node, string ioModule = "")
|
|
|
|
|
: base(module, node, ioModule)
|
|
|
|
|
{
|
2023-08-08 00:36:56 +08:00
|
|
|
|
_devData = new AITWaterFlowData();
|
|
|
|
|
|
|
|
|
|
_diFlowSW = ParseDiNode("diFlowSW", node, ioModule);
|
|
|
|
|
|
2023-04-19 18:01:08 +08:00
|
|
|
|
LoadConfig();
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-20 14:26:02 +08:00
|
|
|
|
#endregion
|
|
|
|
|
|
2023-08-08 00:36:56 +08:00
|
|
|
|
#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
|
|
|
|
|
|
2023-04-20 14:26:02 +08:00
|
|
|
|
#region Methods
|
|
|
|
|
|
|
|
|
|
protected sealed override void LoadConfig()
|
2023-04-19 18:01:08 +08:00
|
|
|
|
{
|
|
|
|
|
base.LoadConfig();
|
|
|
|
|
|
2023-04-20 14:26:02 +08:00
|
|
|
|
var scNameWarnOffset = $"{ScBasePath}.WarningOffset";
|
|
|
|
|
|
2023-04-19 15:38:04 +08:00
|
|
|
|
// 重新设定水温警告值,当前系统中的水温警告值非设定值,而是在Alarm基础上偏移指定的温度。
|
2023-04-20 14:26:02 +08:00
|
|
|
|
_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));
|
|
|
|
|
}
|
2023-04-19 18:01:08 +08:00
|
|
|
|
|
2023-08-08 00:36:56 +08:00
|
|
|
|
public override bool Initialize()
|
|
|
|
|
{
|
|
|
|
|
DATA.Subscribe($"{Module}.{Name}.DeviceData", () => DeviceData);
|
|
|
|
|
return base.Initialize();
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-20 14:26:02 +08:00
|
|
|
|
/// <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)
|
|
|
|
|
{
|
2023-04-19 15:38:04 +08:00
|
|
|
|
checked
|
|
|
|
|
{
|
2023-04-20 14:26:02 +08:00
|
|
|
|
_warningLow = alarmLow + Math.Abs(offset);
|
|
|
|
|
_warningHigh = alarmHigh - Math.Abs(offset);
|
2023-04-19 15:38:04 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2023-04-20 14:26:02 +08:00
|
|
|
|
|
|
|
|
|
#endregion
|
2023-04-19 15:38:04 +08:00
|
|
|
|
}
|
|
|
|
|
}
|