Sic.Framework-Nanjing-Baishi/MECF.Framework.RT.Equipment.../Unit/IoHeater2.cs

249 lines
7.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.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;
}
}
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;
}
}
}