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; using Aitex.Core.RT.SCCore; 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 != null ? !AlarmSignalFilterBox1DoorSwitch.Value : false); } private bool GetN2PurgeDoorOpenStatus() { return ValveLABacksideDoorCylinderControl.DOClose.Value && (AlarmSignalFilterBox1DoorSwitch != null ? !AlarmSignalFilterBox1DoorSwitch.Value : false); } 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 _); } } } } } public void SetN2PurgeLAO2CheckFirstEnable(bool isEable) { if (TrigN2PurgeLAO2CheckFirstEnable != null && TrigN2PurgeLAO2CheckFirstEnable.Value != isEable) TrigN2PurgeLAO2CheckFirstEnable.SetTrigger(isEable, out _); } public void SetN2PurgeFIMS1O2CheckEnable(ModuleName fims, bool isEable) { if (fims == ModuleName.FIMS1 && TrigN2PurgeFIMS1O2CheckEnable != null && TrigN2PurgeFIMS1O2CheckEnable.Value != isEable) TrigN2PurgeFIMS1O2CheckEnable.SetTrigger(isEable, out _); if (fims == ModuleName.FIMS2 && TrigN2PurgeFIMS2O2CheckEnable != null && TrigN2PurgeFIMS2O2CheckEnable.Value != isEable) TrigN2PurgeFIMS2O2CheckEnable.SetTrigger(isEable, out _); } public void SetN2PurgeProcess(bool isEable) { if (TrigN2PurgeProcess != null && TrigN2PurgeProcess.Value != isEable) TrigN2PurgeProcess.SetTrigger(isEable, out _); } public void SetN2PurgeLAO2CheckSV(float value) { if (TrigN2PurgeLAO2CheckSV != null) TrigN2PurgeLAO2CheckSV?.SetAOTrigger(value, out _); } public void SetN2PurgeFOUPO2CheckSV(float value) { if (TrigN2PurgeFOUPO2CheckSV != null) TrigN2PurgeFOUPO2CheckSV?.SetAOTrigger(value, out _); } public void SetN2PurgeParameters() { if (SC.ContainsItem("PM1.N2Purge.TransferRoomArrivalWaitTime") && TrigN2PurgeLAO2CheckTime != null) { var time = (float)SC.GetValue("PM1.N2Purge.TransferRoomArrivalWaitTime"); TrigN2PurgeLAO2CheckTime.SetAOTrigger(time, out _); } if (SC.ContainsItem("PM1.N2Purge.TransferRoomStableWaitTime") && TrigN2PurgeLAO2OverTime != null) { var time = (float)SC.GetValue("PM1.N2Purge.TransferRoomStableWaitTime"); TrigN2PurgeLAO2OverTime.SetAOTrigger(time, out _); } if (SC.ContainsItem("PM1.N2Purge.FOUPOpenerArrivalWaitTime") && TrigN2PurgeFOUPO2CheckTime != null) { var time = (float)SC.GetValue("PM1.N2Purge.FOUPOpenerArrivalWaitTime"); TrigN2PurgeFOUPO2CheckTime.SetAOTrigger(time, out _); } if (SC.ContainsItem("PM1.N2Purge.FOUPOpenerStableWaitTime") && TrigN2PurgeFOUPO2OverTime != null) { var time = (float)SC.GetValue("PM1.N2Purge.FOUPOpenerStableWaitTime"); TrigN2PurgeFOUPO2OverTime.SetAOTrigger(time, out _); } if (SC.ContainsItem("PM1.N2Purge.O2DetectorTransferRoomToFOUPTime") && TrigN2PurgeExchangeLATOFOUPWaitTime != null) { var time = (float)SC.GetValue("PM1.N2Purge.O2DetectorTransferRoomToFOUPTime"); TrigN2PurgeExchangeLATOFOUPWaitTime.SetAOTrigger(time, out _); } if (SC.ContainsItem("PM1.N2Purge.O2DetectorFOUPToTransferRoomTime") && TrigN2PurgeExchangeFOUPTOLAWaitTime != null) { var time = (float)SC.GetValue("PM1.N2Purge.O2DetectorFOUPToTransferRoomTime"); TrigN2PurgeExchangeFOUPTOLAWaitTime.SetAOTrigger(time, out _); } if (SC.ContainsItem("PM1.N2Purge.O2DetectorFOUPToFOUPTime") && TrigN2PurgeExchangeFOUPTOFOUPWaitTime != null) { var time = (float)SC.GetValue("PM1.N2Purge.O2DetectorFOUPToFOUPTime"); TrigN2PurgeExchangeFOUPTOFOUPWaitTime.SetAOTrigger(time, out _); } } } }