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

93 lines
3.0 KiB
C#

using Aitex.Core.Common.DeviceData.IoDevice;
using Aitex.Core.RT.DataCenter;
using Aitex.Core.RT.Event;
using Aitex.Core.RT.IOCore;
using Aitex.Core.RT.SCCore;
using Aitex.Core.Util;
using MECF.Framework.Common.Aitex.Core.Common.DeviceData.IoDevice;
using System.Xml;
namespace Aitex.Core.RT.Device.Devices
{
public class IoLineHeater : BaseDevice, IDevice
{
//配置中标记的AI名称
protected readonly AIAccessor _aiTemp;
protected readonly DOAccessor _doLineHeaterEnable;
protected readonly string _scNameAlarmHigh;
protected double _alarmHigh;
protected readonly R_TRIG _trigIsAlarm = new R_TRIG();
protected int _alarmCount;
private readonly LineHeaterData _lineHeaterData = new();
public LineHeaterData lineHeaterData
{
get
{
_lineHeaterData.LineHeaterLaber = Display;
_lineHeaterData.ScHighTemp = _alarmHigh;
_lineHeaterData.TempValue = _aiTemp.FloatValue;
return _lineHeaterData;
}
}
public IoLineHeater(string module, XmlElement node, string ioModule = "") : base(module, node, ioModule)
{
_aiTemp = ParseAiNode("aiHeatTMA", node, ioModule);
_doLineHeaterEnable = ParseDoNode("doLineHeaterEnable", node, ioModule);
_scNameAlarmHigh = $"{ScBasePath}.{node.GetAttribute("scAlarmHigh")}";
}
protected override void HandleMonitor()
{
if (_alarmHigh == 0)
return;
if (_aiTemp.FloatValue >= _alarmHigh)
{
_trigIsAlarm.CLK = true;
if (_trigIsAlarm.Q)
{
if (_doLineHeaterEnable == null)
{
EV.PostWarningLog(Module,
$"{_aiTemp.Name} {_aiTemp.FloatValue} over temperature {_alarmHigh} but doLineHeaterEnable can not be off since it's not defined");
}
else
{
_doLineHeaterEnable.SetValue(false, out _);
EV.PostWarningLog(Module,
$"{_aiTemp.Name} {_aiTemp.FloatValue} over temperature {_alarmHigh}\r\n{Module}.{_doLineHeaterEnable.Name} force off");
}
}
}
}
public bool Initialize()
{
DATA.Subscribe($"{Module}.LineHeater.{Display}", () => _aiTemp.FloatValue);
DATA.Subscribe($"{Module}.{Name}.LineHeaterData", () => lineHeaterData, SubscriptionAttribute.FLAG.IgnoreSaveDB);
_alarmHigh = SC.SafeGetValue(_scNameAlarmHigh, double.PositiveInfinity);
SC.RegisterValueChangedCallback(_scNameAlarmHigh, v => _alarmHigh = (double)v);
return true;
}
public void Reset()
{
_trigIsAlarm.RST = true;
}
public void Terminate()
{
}
}
}