using System; using System.Security.Cryptography; using System.Xml; using Aitex.Core.RT.Device; using Aitex.Core.RT.Device.Unit; using Aitex.Core.RT.IOCore; using Aitex.Core.RT.Log; using Aitex.Core.RT.OperationCenter; using Aitex.Core.Util; using Venus_RT.Devices.IODevices; namespace Venus_RT.Devices { class IoGasStick : BaseDevice, IDevice { private readonly IoValve _DownValve; private readonly IoValve _UpValve; //private DIAccessor _diPressureAlarm; private DOAccessor _doByPassPressureAlarm; public readonly MfcBase1 _mfc; // Properties // public double FlowSP { get => _mfc.SetPoint; //set => _mfc.SetPoint = value; } public bool IsOutOfRange => _mfc.IsOutOfTolerance; private F_TRIG _trigPressureAlarm = new F_TRIG(); // Constructor // public IoGasStick(string module, XmlElement node, string ioModule = "") { base.Module = module; base.Name = node.GetAttribute("id"); base.Display = node.GetAttribute("display"); base.DeviceID = node.GetAttribute("schematicId"); _DownValve = ParseDeviceNode(Module, "downvalve", node); _UpValve = ParseDeviceNode(Module, "upvalve", node); _mfc = ParseDeviceNode(Module, "mfc", node); //_diPressureAlarm = ParseDiNode("diPressureAlarm", node, ioModule); _doByPassPressureAlarm = ParseDoNode("doByPassPressureAlarm", node, ioModule); } public bool Initialize() { OP.Subscribe($"{Module}.{_mfc.Name}", (out string reason, int time, object[] para) => { reason = ""; double sp = Convert.ToDouble((string)para[0]); Flow(sp); return true; }); return true; } public void Flow(double setpoint) { if (setpoint >= 0.01) { _DownValve.TurnValve(true, out _); _UpValve?.TurnValve(true, out _); } else { _DownValve.TurnValve(false, out _); _UpValve?.TurnValve(false, out _); } _mfc.SetPoint = setpoint; //_mfc.Ramp(setpoint, 1000); } public void Pump() { _UpValve?.TurnValve(true, out _); _mfc.SetPoint = _mfc.Scale; } public void Monitor() { _DownValve.Monitor(); if (_mfc.Name == "MfcN2" && _DownValve?.Status == false) { return; } _trigPressureAlarm.CLK = _mfc.PressureAlarm; if (_trigPressureAlarm.Q ) { eEvent _eEvent; if (_mfc.SetPoint > 0 && _doByPassPressureAlarm?.Value == false) { switch (_mfc.Display) { case "Gas1": _eEvent = eEvent.ERR_MFC1_PRESSURE; break; case "Gas2": _eEvent = eEvent.ERR_MFC2_PRESSURE; break; case "Gas3": _eEvent = eEvent.ERR_MFC3_PRESSURE; break; case "Gas4": _eEvent = eEvent.ERR_MFC4_PRESSURE; break; case "Gas5": _eEvent = eEvent.ERR_MFC5_PRESSURE; break; case "Gas6": _eEvent = eEvent.ERR_MFC6_PRESSURE; break; case "Gas7": _eEvent = eEvent.ERR_MFC7_PRESSURE; break; case "Gas8": _eEvent = eEvent.ERR_MFC8_PRESSURE; break; case "N2": _eEvent = eEvent.ERR_N2_PRESSURE; break; default: _eEvent = eEvent.WARN_DEVICE_INFO; break; } _DownValve.TurnValve(false, out _); _UpValve?.TurnValve(false, out _); _mfc.SetPoint = 0; } else { switch (_mfc.Display) { case "Gas1": _eEvent = eEvent.WARN_MFC1_PRESSURE; break; case "Gas2": _eEvent = eEvent.WARN_MFC2_PRESSURE; break; case "Gas3": _eEvent = eEvent.WARN_MFC3_PRESSURE; break; case "Gas4": _eEvent = eEvent.WARN_MFC4_PRESSURE; break; case "Gas5": _eEvent = eEvent.WARN_MFC5_PRESSURE; break; case "Gas6": _eEvent = eEvent.WARN_MFC6_PRESSURE; break; case "Gas7": _eEvent = eEvent.WARN_MFC7_PRESSURE; break; case "Gas8": _eEvent = eEvent.WARN_MFC8_PRESSURE; break; case "N2": _eEvent = eEvent.WARN_N2_PRESSURE; break; default: _eEvent = eEvent.WARN_DEVICE_INFO; break; } } LOG.Write(_eEvent, Module, $"{Name}, {_mfc.Display} Pressure Alarm"); } } public void Terminate() { } public void Reset() { } public void Stop() { _DownValve.TurnValve(false, out _); _UpValve?.TurnValve(false, out _); //_mfc.Ramp(0, 1000); _mfc.SetPoint = 0; } } }