|
@@ -1,155 +1,155 @@
|
|
|
-using Aitex.Core.RT.Routine;
|
|
|
-using Aitex.Core.RT.SCCore;
|
|
|
-using Aitex.Core.Util;
|
|
|
-using Venus_RT.Devices;
|
|
|
-using MECF.Framework.Common.Equipment;
|
|
|
-using MECF.Framework.Common.SubstrateTrackings;
|
|
|
-using Venus_Core;
|
|
|
-
|
|
|
-namespace Venus_RT.Modules.PMs
|
|
|
-{
|
|
|
- class LLPickRoutine : PMRoutineBase, IRoutine
|
|
|
- {
|
|
|
- private enum LLPickStep
|
|
|
- {
|
|
|
- kPrepareTransfer,
|
|
|
- kExtend,
|
|
|
- KDelay2s,
|
|
|
- kPinUp,
|
|
|
- kRetract,
|
|
|
- kPostTransfer,
|
|
|
- kVentLoadLock,
|
|
|
- }
|
|
|
-
|
|
|
- private readonly LoadLockVentRoutine _loadLockVentRoutine;
|
|
|
- private int _prepareTransferTimeout = 120;
|
|
|
- private int _transferWaferTimeout = 120;
|
|
|
- public LLPickRoutine(JetPMBase chamber, LoadLockVentRoutine ventRoutine) : base(chamber)
|
|
|
- {
|
|
|
- Name = "PickWafer";
|
|
|
- _loadLockVentRoutine = ventRoutine;
|
|
|
- }
|
|
|
-
|
|
|
- public RState Start(params object[] objs)
|
|
|
- {
|
|
|
- _prepareTransferTimeout = SC.GetValue<int>($"{Module}.PrepareTransferTimeout");
|
|
|
- _transferWaferTimeout = SC.GetValue<int>($"{Module}.TransferWaferTimeout");
|
|
|
-
|
|
|
- if(WaferManager.Instance.CheckNoWafer(ModuleName.PMA, 0))
|
|
|
- {
|
|
|
- Stop("腔体没有 Wafer,不能执行取片动作");
|
|
|
- return RState.Failed;
|
|
|
- }
|
|
|
-
|
|
|
- if (WaferManager.Instance.CheckHasWafer(ModuleName.LLA, 0))
|
|
|
- {
|
|
|
- Stop("Loadlock 里面有片 Wafer,不能执行取片动作");
|
|
|
- return RState.Failed;
|
|
|
- }
|
|
|
-
|
|
|
- if(WaferManager.Instance.GetWafer(ModuleName.PMA, 0).ChuckState == Aitex.Core.Common.EnumWaferChuckStatus.Chucked)
|
|
|
- {
|
|
|
- Stop("腔体中Wafer没有 Dechuck,不能执行取片动作");
|
|
|
- return RState.Failed;
|
|
|
- }
|
|
|
-
|
|
|
- if (RouteManager.IsATMMode)
|
|
|
- {
|
|
|
- if (!_chamber.IsATM || !_chamber.IsATMLoadlock)
|
|
|
- {
|
|
|
- Stop("腔体非大气状态,请先执行充气动作");
|
|
|
- return RState.Failed;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if (!_chamber.IsVAC || !_chamber.IsVACLoadLock)
|
|
|
- {
|
|
|
- Stop("腔体非真空状态,请先执行抽真空动作");
|
|
|
- return RState.Failed;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- _chamber.OpenValve(ValveType.FastPump, false);
|
|
|
- _chamber.OpenValve(ValveType.LoadlockPumping, false);
|
|
|
-
|
|
|
- Reset();
|
|
|
- return Runner.Start(Module, Name);
|
|
|
- }
|
|
|
- public RState Monitor()
|
|
|
- {
|
|
|
- Runner.Run(LLPickStep.kPrepareTransfer, PrepareTransfer, IsPrepareReady, _prepareTransferTimeout * 1000)
|
|
|
- .Run(LLPickStep.kExtend, _chamber.ExtendWafer, () => { return _chamber.IsLoadlockArmExtend; }, _transferWaferTimeout * 1000)
|
|
|
- .Delay(LLPickStep.KDelay2s,2000)
|
|
|
- .Run(LLPickStep.kPinUp, SetLiftPinDown, () => { return _chamber.CheckLiftDown(); })
|
|
|
- .Run(LLPickStep.kRetract, _chamber.RetractWafer, () => { return _chamber.IsLoadlockArmRetract; }, _transferWaferTimeout * 1000)
|
|
|
- .Run(LLPickStep.kPostTransfer, PostTransfer, IsPostTransferReady, _prepareTransferTimeout * 1000)
|
|
|
- .End(LLPickStep.kVentLoadLock, VentLoadLock, IsVentDone);
|
|
|
-
|
|
|
- return Runner.Status;
|
|
|
- }
|
|
|
-
|
|
|
- private bool PrepareTransfer()
|
|
|
- {
|
|
|
- _chamber.SetLiftPin(MovementPosition.Up, out _);
|
|
|
- _chamber.SetSlitDoor(true, out _);
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- private bool IsPrepareReady()
|
|
|
- {
|
|
|
- return _chamber.CheckLiftUp() && _chamber.CheckSlitDoorOpen();
|
|
|
- }
|
|
|
-
|
|
|
- private bool PostTransfer()
|
|
|
- {
|
|
|
- WaferManager.Instance.WaferMoved(ModuleName.PMA, 0, ModuleName.LLA, 0);
|
|
|
- _chamber.SetSlitDoor(false, out _);
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- private bool IsPostTransferReady()
|
|
|
- {
|
|
|
-
|
|
|
- return _chamber.CheckLiftDown() && _chamber.CheckSlitDoorClose();
|
|
|
- }
|
|
|
-
|
|
|
- private bool SetLiftPinDown()
|
|
|
- {
|
|
|
- return _chamber.SetLiftPin(MovementPosition.Down, out _);
|
|
|
- }
|
|
|
-
|
|
|
- private bool VentLoadLock()
|
|
|
- {
|
|
|
- //2023/06/08朱让取消
|
|
|
- //if (!_isATMMode)
|
|
|
- //{
|
|
|
- // return _loadLockVentRoutine.Start() == RState.Running;
|
|
|
- //}
|
|
|
- //else
|
|
|
- return true;
|
|
|
- }
|
|
|
+//using Aitex.Core.RT.Routine;
|
|
|
+//using Aitex.Core.RT.SCCore;
|
|
|
+//using Aitex.Core.Util;
|
|
|
+//using Venus_RT.Devices;
|
|
|
+//using MECF.Framework.Common.Equipment;
|
|
|
+//using MECF.Framework.Common.SubstrateTrackings;
|
|
|
+//using Venus_Core;
|
|
|
+
|
|
|
+//namespace Venus_RT.Modules.PMs
|
|
|
+//{
|
|
|
+// class LLPickRoutine : PMRoutineBase, IRoutine
|
|
|
+// {
|
|
|
+// private enum LLPickStep
|
|
|
+// {
|
|
|
+// kPrepareTransfer,
|
|
|
+// kExtend,
|
|
|
+// KDelay2s,
|
|
|
+// kPinUp,
|
|
|
+// kRetract,
|
|
|
+// kPostTransfer,
|
|
|
+// kVentLoadLock,
|
|
|
+// }
|
|
|
+
|
|
|
+// private readonly LoadLockVentRoutine _loadLockVentRoutine;
|
|
|
+// private int _prepareTransferTimeout = 120;
|
|
|
+// private int _transferWaferTimeout = 120;
|
|
|
+// public LLPickRoutine(JetPMBase chamber, LoadLockVentRoutine ventRoutine) : base(chamber)
|
|
|
+// {
|
|
|
+// Name = "PickWafer";
|
|
|
+// _loadLockVentRoutine = ventRoutine;
|
|
|
+// }
|
|
|
+
|
|
|
+// public RState Start(params object[] objs)
|
|
|
+// {
|
|
|
+// _prepareTransferTimeout = SC.GetValue<int>($"{Module}.PrepareTransferTimeout");
|
|
|
+// _transferWaferTimeout = SC.GetValue<int>($"{Module}.TransferWaferTimeout");
|
|
|
+
|
|
|
+// if(WaferManager.Instance.CheckNoWafer(ModuleName.PMA, 0))
|
|
|
+// {
|
|
|
+// Stop("腔体没有 Wafer,不能执行取片动作");
|
|
|
+// return RState.Failed;
|
|
|
+// }
|
|
|
+
|
|
|
+// if (WaferManager.Instance.CheckHasWafer(ModuleName.LLA, 0))
|
|
|
+// {
|
|
|
+// Stop("Loadlock 里面有片 Wafer,不能执行取片动作");
|
|
|
+// return RState.Failed;
|
|
|
+// }
|
|
|
+
|
|
|
+// if(WaferManager.Instance.GetWafer(ModuleName.PMA, 0).ChuckState == Aitex.Core.Common.EnumWaferChuckStatus.Chucked)
|
|
|
+// {
|
|
|
+// Stop("腔体中Wafer没有 Dechuck,不能执行取片动作");
|
|
|
+// return RState.Failed;
|
|
|
+// }
|
|
|
+
|
|
|
+// if (RouteManager.IsATMMode)
|
|
|
+// {
|
|
|
+// if (!_chamber.IsATM || !_chamber.IsATMLoadlock)
|
|
|
+// {
|
|
|
+// Stop("腔体非大气状态,请先执行充气动作");
|
|
|
+// return RState.Failed;
|
|
|
+// }
|
|
|
+// }
|
|
|
+// else
|
|
|
+// {
|
|
|
+// if (!_chamber.IsVAC || !_chamber.IsVACLoadLock)
|
|
|
+// {
|
|
|
+// Stop("腔体非真空状态,请先执行抽真空动作");
|
|
|
+// return RState.Failed;
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// _chamber.OpenValve(ValveType.FastPump, false);
|
|
|
+// _chamber.OpenValve(ValveType.LoadlockPumping, false);
|
|
|
+
|
|
|
+// Reset();
|
|
|
+// return Runner.Start(Module, Name);
|
|
|
+// }
|
|
|
+// public RState Monitor()
|
|
|
+// {
|
|
|
+// Runner.Run(LLPickStep.kPrepareTransfer, PrepareTransfer, IsPrepareReady, _prepareTransferTimeout * 1000)
|
|
|
+// .Run(LLPickStep.kExtend, _chamber.ExtendWafer, () => { return _chamber.IsLoadlockArmExtend; }, _transferWaferTimeout * 1000)
|
|
|
+// .Delay(LLPickStep.KDelay2s,2000)
|
|
|
+// .Run(LLPickStep.kPinUp, SetLiftPinDown, () => { return _chamber.CheckLiftDown(); })
|
|
|
+// .Run(LLPickStep.kRetract, _chamber.RetractWafer, () => { return _chamber.IsLoadlockArmRetract; }, _transferWaferTimeout * 1000)
|
|
|
+// .Run(LLPickStep.kPostTransfer, PostTransfer, IsPostTransferReady, _prepareTransferTimeout * 1000)
|
|
|
+// .End(LLPickStep.kVentLoadLock, VentLoadLock, IsVentDone);
|
|
|
+
|
|
|
+// return Runner.Status;
|
|
|
+// }
|
|
|
+
|
|
|
+// private bool PrepareTransfer()
|
|
|
+// {
|
|
|
+// _chamber.SetLiftPin(MovementPosition.Up, out _);
|
|
|
+// _chamber.SetSlitDoor(true, out _);
|
|
|
+// return true;
|
|
|
+// }
|
|
|
+
|
|
|
+// private bool IsPrepareReady()
|
|
|
+// {
|
|
|
+// return _chamber.CheckLiftUp() && _chamber.CheckSlitDoorOpen();
|
|
|
+// }
|
|
|
+
|
|
|
+// private bool PostTransfer()
|
|
|
+// {
|
|
|
+// WaferManager.Instance.WaferMoved(ModuleName.PMA, 0, ModuleName.LLA, 0);
|
|
|
+// _chamber.SetSlitDoor(false, out _);
|
|
|
+// return true;
|
|
|
+// }
|
|
|
+
|
|
|
+// private bool IsPostTransferReady()
|
|
|
+// {
|
|
|
+
|
|
|
+// return _chamber.CheckLiftDown() && _chamber.CheckSlitDoorClose();
|
|
|
+// }
|
|
|
+
|
|
|
+// private bool SetLiftPinDown()
|
|
|
+// {
|
|
|
+// return _chamber.SetLiftPin(MovementPosition.Down, out _);
|
|
|
+// }
|
|
|
+
|
|
|
+// private bool VentLoadLock()
|
|
|
+// {
|
|
|
+// //2023/06/08朱让取消
|
|
|
+// //if (!_isATMMode)
|
|
|
+// //{
|
|
|
+// // return _loadLockVentRoutine.Start() == RState.Running;
|
|
|
+// //}
|
|
|
+// //else
|
|
|
+// return true;
|
|
|
+// }
|
|
|
|
|
|
- private bool IsVentDone()
|
|
|
- {
|
|
|
- //2023/06/08朱让取消
|
|
|
- //if(!_isATMMode)
|
|
|
- //{
|
|
|
- // RState ret = _loadLockVentRoutine.Monitor();
|
|
|
- // if (ret == RState.Failed || ret == RState.Timeout)
|
|
|
- // {
|
|
|
- // Runner.Stop("Vent Failed");
|
|
|
- // return false;
|
|
|
- // }
|
|
|
-
|
|
|
- // return ret == RState.End;
|
|
|
- //}
|
|
|
-
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- public void Abort()
|
|
|
- {
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
+// private bool IsVentDone()
|
|
|
+// {
|
|
|
+// //2023/06/08朱让取消
|
|
|
+// //if(!_isATMMode)
|
|
|
+// //{
|
|
|
+// // RState ret = _loadLockVentRoutine.Monitor();
|
|
|
+// // if (ret == RState.Failed || ret == RState.Timeout)
|
|
|
+// // {
|
|
|
+// // Runner.Stop("Vent Failed");
|
|
|
+// // return false;
|
|
|
+// // }
|
|
|
+
|
|
|
+// // return ret == RState.End;
|
|
|
+// //}
|
|
|
+
|
|
|
+// return true;
|
|
|
+// }
|
|
|
+
|
|
|
+// public void Abort()
|
|
|
+// {
|
|
|
+// }
|
|
|
+// }
|
|
|
+//}
|