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>>> _n2PurgeSequenceAction; private Dictionary> _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 _); } } } } } } }