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($"{Module}.PrepareTransferTimeout"); _transferWaferTimeout = SC.GetValue($"{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() { } } }