PMN2Purge.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. using Aitex.Core.Common.DeviceData;
  2. using Aitex.Core.RT.Device;
  3. using Aitex.Core.RT.Device.Unit;
  4. using Aitex.Core.RT.Event;
  5. using Aitex.Core.Util;
  6. using Aitex.Core.Utilities;
  7. using MECF.Framework.Common.Event;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Linq;
  11. using System.Reflection;
  12. using MECF.Framework.Common.SubstrateTrackings;
  13. using Aitex.Core.Common;
  14. using FurnaceRT.Equipments.Systems;
  15. using Aitex.Core.RT.IOCore;
  16. using MECF.Framework.Common.Equipment;
  17. using MECF.Framework.RT.Core.IoProviders;
  18. using MECF.Framework.Common.Device.Bases;
  19. using FurnaceRT.Equipments.Boats;
  20. using IoHeater = FurnaceRT.Devices.IoHeater;
  21. using IoPressureMeter = FurnaceRT.Devices.IoPressureMeter;
  22. using FurnaceRT.Devices;
  23. using Aitex.Core.RT.Log;
  24. using FurnaceRT.Equipments.PMs.Devices;
  25. using Aitex.Core.RT.SCCore;
  26. namespace FurnaceRT.Equipments.PMs
  27. {
  28. public partial class PMModule
  29. {
  30. enum N2PurgeMode
  31. {
  32. Auto,
  33. Manual_N2Purge,
  34. Manual_ATM,
  35. Manual_Maintenance,
  36. Auto_Check,
  37. }
  38. private Dictionary<string, Tuple<R_TRIG, List<Tuple<IoValve, bool>>>> _n2PurgeSequenceAction;
  39. private Dictionary<string, Func<bool>> _n2PurgeSequenceStatus;
  40. private N2PurgeMode _N2PurgeMode = N2PurgeMode.Auto;
  41. private bool GetN2PurgeAIRTo20PPMStatus()
  42. {
  43. return ValveLABacksideDoorCylinderControl.DOOpen.Value;
  44. }
  45. private bool GetN2PurgeUnder20PPMStatus()
  46. {
  47. return ConcentrationO2.Value < 20;
  48. }
  49. private bool GetN2PurgeAIRStatus()
  50. {
  51. return ValveLABacksideDoorCylinderControl.DOClose.Value && (AlarmSignalFilterBox1DoorSwitch != null ? !AlarmSignalFilterBox1DoorSwitch.Value : false);
  52. }
  53. private bool GetN2PurgeDoorOpenStatus()
  54. {
  55. return ValveLABacksideDoorCylinderControl.DOClose.Value && (AlarmSignalFilterBox1DoorSwitch != null ? !AlarmSignalFilterBox1DoorSwitch.Value : false);
  56. }
  57. private bool GetN2PurgeFoup1Status()
  58. {
  59. return GetN2PurgeAIRTo20PPMStatus() && GetN2PurgeUnder20PPMStatus() && FIMS1.IsFoupExist && FIMS1.CollisionAvoidanceUpDownStatus == DeviceStatus.Down;
  60. }
  61. private bool GetN2PurgeFoup2Status()
  62. {
  63. return GetN2PurgeAIRTo20PPMStatus() && GetN2PurgeUnder20PPMStatus() && FIMS2.IsFoupExist && FIMS2.CollisionAvoidanceUpDownStatus == DeviceStatus.Down; ;
  64. }
  65. private void MonitorN2Purge()
  66. {
  67. if (_N2PurgeMode != N2PurgeMode.Auto)
  68. return;
  69. if (_n2PurgeSequenceAction != null && _n2PurgeSequenceStatus != null)
  70. {
  71. foreach (var key in _n2PurgeSequenceAction.Keys)
  72. {
  73. var value = _n2PurgeSequenceAction[key];
  74. value.Item1.CLK = _n2PurgeSequenceStatus[key].Invoke();
  75. if (value.Item1.Q && value.Item2 != null)
  76. {
  77. LOG.Write($"N2 purge sequence trig: {key}");
  78. //EV.PostWarningLog("System",$"N2 purge sequence trig: {key}");
  79. foreach (var valve in value.Item2)
  80. {
  81. if (valve.Item1.Status != valve.Item2)
  82. valve.Item1.TurnValve(valve.Item2, out _);
  83. }
  84. }
  85. }
  86. }
  87. }
  88. public void SetN2PurgeLAO2CheckFirstEnable(bool isEable)
  89. {
  90. if (TrigN2PurgeLAO2CheckFirstEnable != null && TrigN2PurgeLAO2CheckFirstEnable.Value != isEable)
  91. TrigN2PurgeLAO2CheckFirstEnable.SetTrigger(isEable, out _);
  92. }
  93. public void SetN2PurgeFIMS1O2CheckEnable(ModuleName fims, bool isEable)
  94. {
  95. if (fims == ModuleName.FIMS1 && TrigN2PurgeFIMS1O2CheckEnable != null && TrigN2PurgeFIMS1O2CheckEnable.Value != isEable)
  96. TrigN2PurgeFIMS1O2CheckEnable.SetTrigger(isEable, out _);
  97. if (fims == ModuleName.FIMS2 && TrigN2PurgeFIMS2O2CheckEnable != null && TrigN2PurgeFIMS2O2CheckEnable.Value != isEable)
  98. TrigN2PurgeFIMS2O2CheckEnable.SetTrigger(isEable, out _);
  99. }
  100. public void SetN2PurgeProcess(bool isEable)
  101. {
  102. if (TrigN2PurgeProcess != null && TrigN2PurgeProcess.Value != isEable)
  103. TrigN2PurgeProcess.SetTrigger(isEable, out _);
  104. }
  105. public void SetN2PurgeLAO2CheckSV(float value)
  106. {
  107. if (TrigN2PurgeLAO2CheckSV != null)
  108. TrigN2PurgeLAO2CheckSV?.SetAOTrigger(value, out _);
  109. }
  110. public void SetN2PurgeFOUPO2CheckSV(float value)
  111. {
  112. if (TrigN2PurgeFOUPO2CheckSV != null)
  113. TrigN2PurgeFOUPO2CheckSV?.SetAOTrigger(value, out _);
  114. }
  115. public void SetN2PurgeParameters()
  116. {
  117. if (SC.ContainsItem("PM1.N2Purge.TransferRoomArrivalWaitTime") && TrigN2PurgeLAO2CheckTime != null)
  118. {
  119. var time = (float)SC.GetValue<double>("PM1.N2Purge.TransferRoomArrivalWaitTime");
  120. TrigN2PurgeLAO2CheckTime.SetAOTrigger(time, out _);
  121. }
  122. if (SC.ContainsItem("PM1.N2Purge.TransferRoomStableWaitTime") && TrigN2PurgeLAO2OverTime != null)
  123. {
  124. var time = (float)SC.GetValue<double>("PM1.N2Purge.TransferRoomStableWaitTime");
  125. TrigN2PurgeLAO2OverTime.SetAOTrigger(time, out _);
  126. }
  127. if (SC.ContainsItem("PM1.N2Purge.FOUPOpenerArrivalWaitTime") && TrigN2PurgeFOUPO2CheckTime != null)
  128. {
  129. var time = (float)SC.GetValue<double>("PM1.N2Purge.FOUPOpenerArrivalWaitTime");
  130. TrigN2PurgeFOUPO2CheckTime.SetAOTrigger(time, out _);
  131. }
  132. if (SC.ContainsItem("PM1.N2Purge.FOUPOpenerStableWaitTime") && TrigN2PurgeFOUPO2OverTime != null)
  133. {
  134. var time = (float)SC.GetValue<double>("PM1.N2Purge.FOUPOpenerStableWaitTime");
  135. TrigN2PurgeFOUPO2OverTime.SetAOTrigger(time, out _);
  136. }
  137. if (SC.ContainsItem("PM1.N2Purge.O2DetectorTransferRoomToFOUPTime") && TrigN2PurgeExchangeLATOFOUPWaitTime != null)
  138. {
  139. var time = (float)SC.GetValue<double>("PM1.N2Purge.O2DetectorTransferRoomToFOUPTime");
  140. TrigN2PurgeExchangeLATOFOUPWaitTime.SetAOTrigger(time, out _);
  141. }
  142. if (SC.ContainsItem("PM1.N2Purge.O2DetectorFOUPToTransferRoomTime") && TrigN2PurgeExchangeFOUPTOLAWaitTime != null)
  143. {
  144. var time = (float)SC.GetValue<double>("PM1.N2Purge.O2DetectorFOUPToTransferRoomTime");
  145. TrigN2PurgeExchangeFOUPTOLAWaitTime.SetAOTrigger(time, out _);
  146. }
  147. if (SC.ContainsItem("PM1.N2Purge.O2DetectorFOUPToFOUPTime") && TrigN2PurgeExchangeFOUPTOFOUPWaitTime != null)
  148. {
  149. var time = (float)SC.GetValue<double>("PM1.N2Purge.O2DetectorFOUPToFOUPTime");
  150. TrigN2PurgeExchangeFOUPTOFOUPWaitTime.SetAOTrigger(time, out _);
  151. }
  152. }
  153. }
  154. }