255 lines
7.3 KiB
C#
255 lines
7.3 KiB
C#
|
using Aitex.Core.Common.DeviceData;
|
|||
|
using Aitex.Core.RT.DataCenter;
|
|||
|
using Aitex.Core.RT.Event;
|
|||
|
using Aitex.Core.RT.IOCore;
|
|||
|
using Aitex.Core.RT.OperationCenter;
|
|||
|
using Aitex.Core.RT.SCCore;
|
|||
|
using Aitex.Core.RT.Tolerance;
|
|||
|
using MECF.Framework.Common.Event;
|
|||
|
using System;
|
|||
|
using System.Xml;
|
|||
|
|
|||
|
namespace Aitex.Core.RT.Device.Unit
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
///
|
|||
|
/// 1个DO控制开关, 1个AI显示当前反馈。根据反馈值和设定值的差别,来自动调整开或者关
|
|||
|
///
|
|||
|
/// AI 大于 设定值,关闭DO
|
|||
|
/// AI 小于 设定值, 打开DO
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
public class IoHeater2 : BaseDevice, IDevice
|
|||
|
{
|
|||
|
public bool HeaterOnSetPoint
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_doOn != null)
|
|||
|
return _doOn.Value;
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
set
|
|||
|
{
|
|||
|
if (_doOn != null)
|
|||
|
_doOn.Value = value;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public float Feedback
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _aiFeedback.FloatValue;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public string Unit
|
|||
|
{
|
|||
|
get; set;
|
|||
|
}
|
|||
|
|
|||
|
private AITHeaterData DeviceData
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
AITHeaterData data = new AITHeaterData()
|
|||
|
{
|
|||
|
Module = Module,
|
|||
|
DeviceName = Name,
|
|||
|
DeviceSchematicId = DeviceID,
|
|||
|
DisplayName = Display,
|
|||
|
|
|||
|
FeedBack = Feedback,
|
|||
|
|
|||
|
IsPowerOn = HeaterOnSetPoint,
|
|||
|
IsPowerOnSetPoint = HeaterOnSetPoint,
|
|||
|
|
|||
|
Unit = Unit,
|
|||
|
|
|||
|
DisplayWithUnit = true,
|
|||
|
FormatString = "F2",
|
|||
|
};
|
|||
|
|
|||
|
return data;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private DOAccessor _doOn = null;
|
|||
|
|
|||
|
private AIAccessor _aiFeedback = null;
|
|||
|
|
|||
|
private bool _isFloatAioType = false;
|
|||
|
|
|||
|
private SCConfigItem _scAutoAdjustMinValue;
|
|||
|
private SCConfigItem _scAutoAdjustMaxValue;
|
|||
|
private SCConfigItem _scEnableAutoAdjust;
|
|||
|
|
|||
|
private SCConfigItem _scEnableAlarm;
|
|||
|
private SCConfigItem _scAlarmTime;
|
|||
|
private SCConfigItem _scAlarmMaxValue;
|
|||
|
private SCConfigItem _scAlarmMinValue;
|
|||
|
|
|||
|
private bool _enableHeatUp;
|
|||
|
|
|||
|
public AlarmEventItem AlarmOutOfRange { get; set; }
|
|||
|
|
|||
|
private ToleranceChecker _outOfRangeChecker = new ToleranceChecker();
|
|||
|
|
|||
|
public IoHeater2(string module, XmlElement node, string ioModule = "")
|
|||
|
{
|
|||
|
base.Module = string.IsNullOrEmpty(node.GetAttribute("module")) ? module : node.GetAttribute("module");
|
|||
|
base.Name = node.GetAttribute("id");
|
|||
|
base.Display = node.GetAttribute("display");
|
|||
|
base.DeviceID = node.GetAttribute("schematicId");
|
|||
|
|
|||
|
Unit = node.GetAttribute("unit");
|
|||
|
|
|||
|
string scBasePath = node.GetAttribute("scBasePath");
|
|||
|
if (string.IsNullOrEmpty(scBasePath))
|
|||
|
scBasePath = $"{Module}.{Name}";
|
|||
|
else
|
|||
|
{
|
|||
|
scBasePath = scBasePath.Replace("{module}", Module);
|
|||
|
}
|
|||
|
|
|||
|
_isFloatAioType = !string.IsNullOrEmpty(node.GetAttribute("aioType")) && (node.GetAttribute("aioType") == "float");
|
|||
|
|
|||
|
_aiFeedback = ParseAiNode("aiFeedback", node, ioModule);
|
|||
|
_doOn = ParseDoNode("doOn", node, ioModule);
|
|||
|
|
|||
|
_scAutoAdjustMinValue = SC.GetConfigItem($"{scBasePath}.{Name}.AutoAdjustMinValue");
|
|||
|
_scAutoAdjustMaxValue = SC.GetConfigItem($"{scBasePath}.{Name}.AutoAdjustMaxValue");
|
|||
|
_scEnableAutoAdjust = SC.GetConfigItem($"{scBasePath}.{Name}.EnableAutoAdjust");
|
|||
|
|
|||
|
_scEnableAlarm = SC.GetConfigItem($"{scBasePath}.{Name}.EnableAlarm");
|
|||
|
_scAlarmTime = SC.GetConfigItem($"{scBasePath}.{Name}.AlarmTime");
|
|||
|
_scAlarmMaxValue = SC.GetConfigItem($"{scBasePath}.{Name}.AlarmMaxValue");
|
|||
|
_scAlarmMinValue = SC.GetConfigItem($"{scBasePath}.{Name}.AlarmMinValue");
|
|||
|
|
|||
|
_enableHeatUp = true;
|
|||
|
}
|
|||
|
|
|||
|
public bool Initialize()
|
|||
|
{
|
|||
|
AlarmOutOfRange = SubscribeAlarm($"{Module}.{Name}.OutOfRangeAlarm", $"{Name} temperature out of range", ResetOutOfRangeChecker);
|
|||
|
|
|||
|
DATA.Subscribe($"{Module}.{Name}.DeviceData", () => DeviceData);
|
|||
|
DATA.Subscribe($"{Module}.{Name}.Feedback", () => Feedback);
|
|||
|
|
|||
|
|
|||
|
OP.Subscribe($"{Module}.{Name}.{AITHeaterOperation.Ramp}", (out string reason, int time, object[] param) =>
|
|||
|
{
|
|||
|
|
|||
|
reason = "do not support set temperature";
|
|||
|
EV.PostWarningLog(Module, reason);
|
|||
|
|
|||
|
return true;
|
|||
|
});
|
|||
|
|
|||
|
OP.Subscribe($"{Module}.{Name}.{AITHeaterOperation.SetPowerOnOff}", (out string reason, int time, object[] param) =>
|
|||
|
{
|
|||
|
bool isOn = Convert.ToBoolean((string)param[0]);
|
|||
|
|
|||
|
if (_doOn != null)
|
|||
|
{
|
|||
|
if (!_doOn.SetValue(isOn, out reason))
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
reason = $"set {Module}.{Name} heater on";
|
|||
|
return true;
|
|||
|
});
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
public void EnableControl(bool enable)
|
|||
|
{
|
|||
|
if (_enableHeatUp == enable)
|
|||
|
return;
|
|||
|
|
|||
|
_enableHeatUp = enable;
|
|||
|
|
|||
|
if (!_enableHeatUp)
|
|||
|
{
|
|||
|
EV.PostInfoLog(Module, "Disable control heater temperature");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void Stop()
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public void Terminate()
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
public void Monitor()
|
|||
|
{
|
|||
|
MonitorAutoHeaterUp();
|
|||
|
|
|||
|
MonitorOutOfRange();
|
|||
|
}
|
|||
|
|
|||
|
private void MonitorAutoHeaterUp()
|
|||
|
{
|
|||
|
if (!_enableHeatUp)
|
|||
|
{
|
|||
|
HeaterOnSetPoint = false;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (_scEnableAlarm.BoolValue && Feedback > _scAlarmMaxValue.DoubleValue)
|
|||
|
{
|
|||
|
HeaterOnSetPoint = false;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (_scEnableAutoAdjust.BoolValue)
|
|||
|
{
|
|||
|
if (Feedback > _scAutoAdjustMaxValue.DoubleValue)
|
|||
|
{
|
|||
|
HeaterOnSetPoint = false;
|
|||
|
}
|
|||
|
|
|||
|
if (Feedback < _scAutoAdjustMinValue.DoubleValue)
|
|||
|
{
|
|||
|
HeaterOnSetPoint = true;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void MonitorOutOfRange()
|
|||
|
{
|
|||
|
if (!_scEnableAlarm.BoolValue)
|
|||
|
{
|
|||
|
_outOfRangeChecker.RST = true;
|
|||
|
AlarmOutOfRange.Reset();
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
_outOfRangeChecker.Monitor(Feedback, _scAlarmMinValue.DoubleValue, _scAlarmMaxValue.DoubleValue, _scAlarmTime.IntValue);
|
|||
|
if (_outOfRangeChecker.Trig)
|
|||
|
{
|
|||
|
AlarmOutOfRange.Description = $"{Display} out of range [{_scAlarmMinValue.DoubleValue:F1},{_scAlarmMaxValue.DoubleValue:F1}] {Unit} for {_scAlarmTime.IntValue:F0} seconds";
|
|||
|
AlarmOutOfRange.Set();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void Reset()
|
|||
|
{
|
|||
|
AlarmOutOfRange.Reset();
|
|||
|
}
|
|||
|
|
|||
|
public bool ResetOutOfRangeChecker()
|
|||
|
{
|
|||
|
_outOfRangeChecker.Reset(_scAlarmTime.IntValue);
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|