123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- 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;
- }
- }
- }
|