| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 | using Aitex.Core.Common.DeviceData;using Aitex.Core.RT.Device;using Aitex.Core.RT.Device.Unit;using Aitex.Core.RT.Event;using Aitex.Core.Util;using Aitex.Core.Utilities;using MECF.Framework.Common.Event;using System;using System.Collections.Generic;using System.Linq;using System.Reflection;using MECF.Framework.Common.SubstrateTrackings;using Aitex.Core.Common;using FurnaceRT.Equipments.Systems;using Aitex.Core.RT.IOCore;using MECF.Framework.Common.Equipment;using MECF.Framework.RT.Core.IoProviders;using MECF.Framework.Common.Device.Bases;using FurnaceRT.Equipments.Boats;using IoHeater = FurnaceRT.Devices.IoHeater;using IoPressureMeter = FurnaceRT.Devices.IoPressureMeter;using FurnaceRT.Devices;using Aitex.Core.RT.Log;using FurnaceRT.Equipments.PMs.Devices;namespace FurnaceRT.Equipments.PMs{    public partial class PMModule    {        enum N2PurgeMode        {            Auto,            Manual_N2Purge,            Manual_ATM,            Manual_Maintenance,            Auto_Check,        }        private Dictionary<string, Tuple<R_TRIG, List<Tuple<IoValve, bool>>>> _n2PurgeSequenceAction;        private Dictionary<string, Func<bool>> _n2PurgeSequenceStatus;        private N2PurgeMode _N2PurgeMode = N2PurgeMode.Auto;        private bool GetN2PurgeAIRTo20PPMStatus()        {            return ValveLABacksideDoorCylinderControl.DOOpen.Value;        }        private bool GetN2PurgeUnder20PPMStatus()        {            return ConcentrationO2.Value < 20;        }        private bool GetN2PurgeAIRStatus()        {            return ValveLABacksideDoorCylinderControl.DOClose.Value && !AlarmSignalFilterBox1DoorSwitch.Value;        }        private bool GetN2PurgeDoorOpenStatus()        {            return ValveLABacksideDoorCylinderControl.DOClose.Value && AlarmSignalFilterBox1DoorSwitch.Value;        }        private bool GetN2PurgeFoup1Status()        {            return GetN2PurgeAIRTo20PPMStatus() && GetN2PurgeUnder20PPMStatus() && FIMS1.IsFoupExist && FIMS1.CollisionAvoidanceUpDownStatus == DeviceStatus.Down;        }        private bool GetN2PurgeFoup2Status()        {            return GetN2PurgeAIRTo20PPMStatus() && GetN2PurgeUnder20PPMStatus() && FIMS2.IsFoupExist && FIMS2.CollisionAvoidanceUpDownStatus == DeviceStatus.Down; ;        }        private void MonitorN2Purge()        {            if (_N2PurgeMode != N2PurgeMode.Auto)                return;            if(_n2PurgeSequenceAction != null && _n2PurgeSequenceStatus != null)            {                foreach(var key in _n2PurgeSequenceAction.Keys)                {                    var value = _n2PurgeSequenceAction[key];                    value.Item1.CLK = _n2PurgeSequenceStatus[key].Invoke();                    if(value.Item1.Q && value.Item2 != null)                    {                        LOG.Write($"N2 purge sequence trig: {key}");                        //EV.PostWarningLog("System",$"N2 purge sequence trig: {key}");                        foreach(var valve in value.Item2)                        {                            if (valve.Item1.Status != valve.Item2)                                valve.Item1.TurnValve(valve.Item2, out _);                        }                    }                }            }        }           }}
 |