| 
					
				 | 
			
			
				@@ -87,7 +87,7 @@ namespace Venus_RT.Modules 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         private DateTime _scheduledTime; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        public WaferTask(ModuleName source, int srcSlot, ModuleName dest, int dstSlot, float temp, Guid waferID, string recipeName, string wtwClean, SequenceLLInOutPath inOutPath, int LLDelay) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public WaferTask(ModuleName source, int srcSlot, ModuleName dest, int dstSlot, float temp, Guid waferID, string recipeName, string wtwClean, SequenceLLInOutPath inOutPath, int LLDelay, bool needAlign) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             sourceMod = currentMod = nextMod = routedMod = source; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             sourceSlot = currentSlot = nextSlot = routedSlot = srcSlot; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -101,7 +101,7 @@ namespace Venus_RT.Modules 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             wtwCleanRecipe = wtwClean; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             llInOutPath = inOutPath; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             llDelayTime = LLDelay; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            IsAligned = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            IsAligned = !needAlign; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             pressureStatus = RState.Init; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             temperatureStatus = RState.End; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1923,7 +1923,7 @@ namespace Venus_RT.Modules 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         if (wafer.ProcessJob.Sequence.PMs.Contains(pm) && wafer.NextSequenceStep == 0 && !_lstWaferTasks.Exists(task => task.sourceMod == (ModuleName)wafer.OriginStation && task.sourceSlot == wafer.OriginSlot)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            CreateWaferTasks(wafer, pm,  wafer.ProcessJob.Sequence.LLDelayTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            CreateWaferTasks(wafer, pm); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1931,12 +1931,13 @@ namespace Venus_RT.Modules 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        private void CreateWaferTasks(WaferInfo wafer, ModuleName pm, int LLDeayTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private void CreateWaferTasks(WaferInfo wafer, ModuleName pm) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             var recipeName = wafer.ProcessJob.Sequence.GetRecipe(pm); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             var recipeContent = RecipeFileManager.Instance.LoadRecipe(pm.ToString(), recipeName, false, RecipeType.Process.ToString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             Recipe recipe = Recipe.Load(recipeContent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             int temperature = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if(int.TryParse(recipe.Header.Temperature, out int temp)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 temperature = temp; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1951,7 +1952,8 @@ namespace Venus_RT.Modules 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                             recipeName, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                             wafer.ProcessJob.Sequence.WTWCleanRecipe, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                             wafer.ProcessJob.Sequence.LLInOutPath,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                            LLDeayTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                            wafer.ProcessJob.Sequence.LLDelayTime, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                            IsSequenceNeedAlign(wafer.ProcessJob.Sequence)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             waferTask.OnWaferArrived += WaferArrived; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             waferTask.OnWaferLeaved += WaferLeaved; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1967,7 +1969,7 @@ namespace Venus_RT.Modules 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             var readyInWafers = _lstWaferTasks.Where(wafer => ModuleHelper.IsLoadPort(wafer.currentMod) && IsCtrlJobExecuting(wafer.currentMod) && wafer.movingStatus == RState.Init && wafer.pressureStatus == RState.Init && CanWaferGotoLL(wafer, ll)).OrderBy(wafer => wafer.currentSlot).ToArray(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             var freeHands = GetEFEMFreeHand(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if ((atmWafers.Count >= 2 && atmWafers.Count(wafer => !wafer.IsAligned) == 0) || freeHands.Count == 0 || readyInWafers.Length == 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if ((atmWafers.Count >= 2 && !atmWafers.Exists(wafer => !wafer.IsAligned)) || freeHands.Count == 0 || readyInWafers.Length == 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             // force all wafer aligned 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1977,15 +1979,23 @@ namespace Venus_RT.Modules 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(notAlignedWafer.First().currentMod, notAlignedWafer.First().currentSlot, ModuleName.Aligner1, 0, (Hand)notAlignedWafer.First().currentSlot) }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             // forward one wafer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            else if ((readyInWafers.Length > 0) && (atmWafers.Count == 0 || (atmWafers.Count == 1 && _lstWaferTasks.Count(wafer => ModuleHelper.IsAligner(wafer.currentMod)) == 0 && emptySlots.Count >= 2))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            else if ((readyInWafers.Length > 0) && (atmWafers.Count == 0 || (atmWafers.Count == 1 && emptySlots.Count >= 2))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                readyInWafers[0].RouteTo(ModuleName.Aligner1, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(readyInWafers[0].IsAligned) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // pick from LP 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(readyInWafers[0].currentMod, readyInWafers[0].currentSlot, ModuleName.EfemRobot, (int)freeHands[0], freeHands[0]) }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                else if(!_lstWaferTasks.Exists(wt => ModuleHelper.IsAligner(wt.currentMod))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    readyInWafers[0].RouteTo(ModuleName.Aligner1, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // pick from LP 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(readyInWafers[0].currentMod, readyInWafers[0].currentSlot, ModuleName.EfemRobot, (int)freeHands[0], freeHands[0]) }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // pick from LP 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(readyInWafers[0].currentMod, readyInWafers[0].currentSlot, ModuleName.EfemRobot, (int)freeHands[0], freeHands[0]) }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // place to aligner 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.EfemRobot, (int)freeHands[0], ModuleName.Aligner1, 0, freeHands[0]) }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // place to aligner 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.EfemRobot, (int)freeHands[0], ModuleName.Aligner1, 0, freeHands[0]) }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             // forward aligner wafer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             else if (atmWafers.Count == 1 && emptySlots.Count >= 2 && ModuleHelper.IsAligner(atmWafers.First().currentMod) && freeHands.Count > 1) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2262,7 +2272,9 @@ namespace Venus_RT.Modules 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if(atmWaferCount == 0 || (atmWaferCount == 1 && inLLWaferStatus.emptySlot.Count == 2 && _efemRobotSingleArmOption == 0 && (outLLWaferStatus.outSlot.Count < 2 || _dictModuleTask[outLL].TimeToReady > 20))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 有两片processed wafer 时且, 不需要align wafer 时, 不要预期 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if((atmWaferCount == 0 && (outLLWaferStatus.outSlot.Count() < 2 || _lstWaferTasks.Exists(wt => ModuleHelper.IsLoadPort(wt.currentMod) && !wt.IsAligned))) ||  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                   (atmWaferCount == 1 && inLLWaferStatus.emptySlot.Count == 2 && _efemRobotSingleArmOption == 0 && (outLLWaferStatus.outSlot.Count < 2 || _dictModuleTask[outLL].TimeToReady > 20))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     if (ForwardATMWafers(inLL)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         return; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -4402,6 +4414,21 @@ namespace Venus_RT.Modules 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private bool IsSequenceNeedAlign(SequenceInfo sequence) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // check wether need align 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            foreach (var step in sequence.Steps) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                foreach(var mod in step.StepModules) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if(ModuleHelper.IsAligner(mod)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         #endregion 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |