using Aitex.Core.RT.DataCenter; using Aitex.Core.RT.Device; using Aitex.Core.RT.Event; using Aitex.Core.RT.IOCore; using Aitex.Core.RT.Log; using Aitex.Core.RT.OperationCenter; using Aitex.Core.RT.SCCore; using Aitex.Core.Util; using MECF.Framework.Common.CommonData.DeviceData; using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Temps.AE; using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Temps; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; namespace Aitex.Core.RT.Device.Devices { public class IoPSU : BaseDevice, IDevice { public float OutputVoltageFeedBack { get { return _aiOutputVoltage == null ? 0 : (_isFloatAioType ? _aiOutputVoltage.FloatValue : _aiOutputVoltage.Value); } } public float OutputArmsFeedBack { get { return _aiOutputArms == null ? 0 : (_isFloatAioType ? _aiOutputArms.FloatValue : _aiOutputArms.Value); } } public double Resistance { get { return OutputArmsFeedBack == 0 ? 0 : ((int)(OutputVoltageFeedBack / OutputArmsFeedBack * 1000)) / 1000.0; } } public float OutputPowerFeedBack { get { return _aiOutputPower == null ? 0 : (_isFloatAioType ? _aiOutputPower.FloatValue : _aiOutputPower.Value); } } public bool StatusFeedBack { get { return _diStatus == null ? false : _diStatus.Value; } } public float SimVoltageFeedBack { get { return _aiSimVoltage == null ? 0 : (_isFloatAioType ? _aiSimVoltage.FloatValue : _aiSimVoltage.Value); } } public float SimArmsFeedBack { get { return _aiSimArms == null ? 0 : (_isFloatAioType ? _aiSimArms.FloatValue : _aiSimArms.Value); } } public bool AlarmFeedBack { get { return _diAlarm == null ? false : _diAlarm.Value; } } public float ConstantSetPoint { get { return _aoConstant == null ? 0 : (_isFloatAioType ? _aoConstant.FloatValue : _aoConstant.Value); } set { if (_isFloatAioType) { _aoConstant.FloatValue = value; } else { _aoConstant.Value = (short)value; } } } public bool AllHeatEnable { get { return _diHeatEnable == null ? false : _diHeatEnable.Value; } } private bool _isFloatAioType = false; private AIAccessor _aiOutputVoltage = null; private AIAccessor _aiOutputArms = null; private AIAccessor _aiOutputPower = null; private AIAccessor _aiSimVoltage = null; private AIAccessor _aiSimArms = null; //private AOAccessor _aoEnable = null; //private AOAccessor _aoReset = null; private AOAccessor _aoConstant = null; private DIAccessor _diStatus = null; private DIAccessor _diAlarm = null; private DIAccessor _diHeatEnable = null; private DIAccessor _diCommunicationError = null; private DOAccessor _doReset; private DOAccessor _doStatus; private DOAccessor _doHeatEnable; private DOAccessor _doRelatedEnable; //每个Enable同时关联的Inner,Middle,Out Enable private string _infoText = ""; private string _commInfoText = ""; private R_TRIG _alarmTrig = new R_TRIG(); private R_TRIG _commAlarmTrig = new R_TRIG(); private R_TRIG _enableTrig = new R_TRIG(); private R_TRIG _enableTrig2 = new R_TRIG(); private R_TRIG _trigVoltage = new R_TRIG(); private R_TRIG _trigCurrent = new R_TRIG(); private R_TRIG _trigResistance = new R_TRIG(); private DeviceTimer _timer = new DeviceTimer(); private DeviceTimer _timerResistance = new DeviceTimer(); public Func FuncCheckInterLock; public IoPSU(string module, XmlElement node, string ioModule = "") { var attrModule = node.GetAttribute("module"); base.Module = string.IsNullOrEmpty(attrModule) ? module : attrModule; base.Name = node.GetAttribute("id"); base.Display = node.GetAttribute("display"); base.DeviceID = node.GetAttribute("schematicId"); _aiOutputVoltage = ParseAiNode("aiOutputVoltage", node, ioModule); _aiOutputArms = ParseAiNode("aiOutputArms", node, ioModule); _aiOutputPower = ParseAiNode("aiOutputPower", node, ioModule); _aiSimVoltage = ParseAiNode("aiSimVoltage", node, ioModule); _aiSimArms = ParseAiNode("aiSimArms", node, ioModule); _aoConstant = ParseAoNode("aoConstant", node, ioModule); _doReset = ParseDoNode("doReset", node, ioModule); _doStatus = ParseDoNode("doStatus", node, ioModule); _diStatus = ParseDiNode("diStatus", node, ioModule); _diAlarm = ParseDiNode("diAlarm", node, ioModule); _doHeatEnable = ParseDoNode("doHeatEnable", node, ioModule); _diHeatEnable = ParseDiNode("diHeatEnable", node, ioModule); _doRelatedEnable = ParseDoNode("doRelatedEnable", node, ioModule); _diCommunicationError = ParseDiNode("diCommunicationError", node, ioModule); _infoText = node.GetAttribute("AlarmText"); _commInfoText = node.GetAttribute("commAlarmText"); _isFloatAioType = !string.IsNullOrEmpty(node.GetAttribute("aioType")) && (node.GetAttribute("aioType") == "float"); } string reason = string.Empty; public bool Initialize() { DATA.Subscribe($"{Module}.{Name}.OutputVoltageFeedBack", () => OutputVoltageFeedBack); DATA.Subscribe($"{Module}.{Name}.OutputArmsFeedBack", () => OutputArmsFeedBack); DATA.Subscribe($"{Module}.{Name}.Resistance", () => Resistance); DATA.Subscribe($"{Module}.{Name}.OutputPowerFeedBack", () => OutputPowerFeedBack); DATA.Subscribe($"{Module}.{Name}.StatusFeedBack", () => StatusFeedBack); DATA.Subscribe($"{Module}.{Name}.SimVoltageFeedBack", () => SimVoltageFeedBack); DATA.Subscribe($"{Module}.{Name}.SimArmsFeedBack", () => SimArmsFeedBack); DATA.Subscribe($"{Module}.{Name}.ConstantSetPoint", () => ConstantSetPoint); DATA.Subscribe($"{Module}.{Name}.AlarmFeedBack", () => AlarmFeedBack); DATA.Subscribe($"{Module}.{Name}.AllHeatEnable", () => AllHeatEnable); OP.Subscribe($"{Module}.{Name}.SetHeadHeaterEnable", (function, args) => { bool isTrue = Convert.ToBoolean(args[0]); SetHeadHeaterEnable(isTrue, out reason); return true; }); OP.Subscribe($"{Module}.{Name}.SetPSUEnable", (function, args) => { bool isTrue = Convert.ToBoolean(args[0]); SetPSUEnable(isTrue, out reason); return true; }); OP.Subscribe($"{Module}.{Name}.SetPSUReset", (function, args) => { bool isTrue = Convert.ToBoolean(args[0]); SetPSUReset(isTrue, out reason); return true; }); return true; } public bool SetPSUEnable(bool setValue, out string reason) { reason = ""; if (!_doStatus.Check(setValue, out reason)) { EV.PostWarningLog(Module, reason); return false; } if (!_doRelatedEnable.Check(setValue, out reason)) { EV.PostWarningLog(Module, reason); return false; } if (!_doStatus.SetValue(setValue, out reason)) { EV.PostWarningLog(Module, reason); return false; } if (!_doRelatedEnable.SetValue(setValue, out reason)) { EV.PostWarningLog(Module, reason); return false; } return true; } public bool SetHeadHeaterEnable(bool setValue, out string reason) { reason = ""; if (FuncCheckInterLock != null) { if (!FuncCheckInterLock(setValue)) { EV.PostInfoLog(Module, $"Set PSU Enable fialed for Interlock!"); return false; } } if (!_doHeatEnable.Check(setValue, out reason)) { EV.PostWarningLog(Module, reason); return false; } if (!_doHeatEnable.SetValue(setValue, out reason)) { EV.PostWarningLog(Module, reason); return false; } return true; } public bool SetPSUReset(bool setValue, out string reason) { reason = ""; if (!_doReset.Check(setValue, out reason)) { EV.PostWarningLog(Module, reason); return false; } if (!_doReset.SetValue(setValue, out reason)) { EV.PostWarningLog(Module, reason); return false; } _timer.Start(1000); return true; } public bool CheckPSUEnable() { return _doStatus.Value; } public void Terminate() { } public void Monitor() { try { MonitorEnableTimer(); MonitorAlarm(); if (_timer.IsTimeout()) { _timer.Stop(); } else if (_timer.IsIdle()) { if (_doReset.Value) { _doReset.Value = false; } } } catch (Exception ex) { LOG.Write(ex); } } public void Reset() { _alarmTrig.RST = true; _commAlarmTrig.RST = true; _trigVoltage.RST = true; _trigCurrent.RST = true; } private void MonitorAlarm() { //检查电阻值是否在合理范围 double dbResistorMax = SC.GetValue($"PM.{Module}.Heater.{Name}ResistanceMax"); if (Resistance > dbResistorMax && _timerResistance.IsIdle()) { _timerResistance.Start(3000); } if (Resistance <= dbResistorMax) { _timerResistance.Stop(); } _trigResistance.CLK = _timerResistance.IsTimeout(); if (_trigResistance.Q) { EV.PostAlarmLog(Module, $"{Name} Resistance is out of range.Current Resistance is {Resistance}"); } } private bool isActiveRecord = false; private void MonitorEnableTimer() { if (base.Name == "PSU2") { _enableTrig.CLK = !_diHeatEnable.Value; if (_enableTrig.Q) { if (isActiveRecord) { SC.SetItemValue($"PM.{Module}.OpenLidCountDownTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } } _enableTrig2.CLK = _diHeatEnable.Value; if (_enableTrig2.Q) { isActiveRecord = true; SC.SetItemValue($"PM.{Module}.OpenLidCountDownTime", ""); } } } public double AETemp { get { object temp=new object(); if (SC.GetConfigItem("AETemp.EnableDevice").BoolValue) { temp = DATA.Poll($"{Module}.AETemp.Middle"); } if (SC.GetConfigItem("AKunTemp.EnableDevice").BoolValue) { temp = DATA.Poll($"{Module}.AKunTemp.Middle"); } return temp == null ? 0 : (double)temp; } } } }