Przeglądaj źródła

add ReturnWafer for Venus SE.

zhouhr 1 rok temu
rodzic
commit
724b0ca304

+ 1 - 0
Venus/Venus_Core/RtState.cs

@@ -42,6 +42,7 @@ namespace Venus_Core
         SERunning,
         ReturnWafer,
         SETransfer,
+        SEReturnWafer
     }
 
     public enum PMState

+ 9 - 0
Venus/Venus_MainPages/ViewModels/VenusSeOperationOverViewModel.cs

@@ -279,7 +279,11 @@ namespace Venus_MainPages.ViewModels
         private DelegateCommand<object> _SelectAllCommand;
         public DelegateCommand<object> SelectAllCommand =>
             _SelectAllCommand ?? (_SelectAllCommand = new DelegateCommand<object>(OnSelectAll));
+        private DelegateCommand<object> _ReturnAllWafer;
+        public DelegateCommand<object> ReturnAllWafer =>
+            _ReturnAllWafer ?? (_ReturnAllWafer = new DelegateCommand<object>(OnReturnAllWafer));
 
+        
         #endregion
 
         #region 构造函数
@@ -334,6 +338,11 @@ namespace Venus_MainPages.ViewModels
             AssociateSequence(info, true);
         }
 
+        private void OnReturnAllWafer(object obj)
+        {
+            InvokeClient.Instance.Service.DoOperation("System.ReturnAllSEWafer");
+        }
+
         private void OnCreateJob(object obj)
         {
             var info = obj as WaferAssociationInfo;

+ 3 - 2
Venus/Venus_MainPages/Views/VenusSeOperationOverView.xaml

@@ -167,7 +167,7 @@
 
                     </StackPanel>
                 </StackPanel>
-                <WrapPanel Orientation="Horizontal"  Canvas.Left="600"  Canvas.Top="640" Width="400">
+                <WrapPanel Orientation="Horizontal"  Canvas.Left="500"  Canvas.Top="636" Width="580" Height="282">
                     <customControls:PathButton Content="Home All"   HorizontalAlignment="Center" Margin="0,5,0,0"  Height="35" Command="{Binding HomeAll}" />
                     <customControls:PathButton Content="AutoMode"   HorizontalAlignment="Center" Margin="0,5,0,0"  Height="35" Command="{Binding SetAutoMode}" />
                     <customControls:PathButton Content="OutAuto"   HorizontalAlignment="Center" Margin="0,5,0,0"  Height="35" Command="{Binding SetManualMode}" />
@@ -184,6 +184,7 @@
                     <customControls:PathButton Content="TMPick" HorizontalAlignment="Center" Margin="0,5,0,0"  Height="35" Command="{Binding TmPick}"/>
                     <TextBox Width="20" Height="40" VerticalAlignment="Center" TextAlignment="Center" Text="{Binding PickNum,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"></TextBox>
                     <customControls:PathButton Content="TMPlace" HorizontalAlignment="Center" Margin="0,5,0,0"  Height="35" Command="{Binding TMPlace}"/>
+                    <customControls:PathButton Content="ReturnAllWafer" HorizontalAlignment="Center" Margin="0,5,0,0"  Height="35" Command="{Binding ReturnAllWafer}"/>
                 </WrapPanel>
                 <TextBlock Text="Job"  Canvas.Left="1000"   Canvas.Top="30" Foreground="White" TextAlignment="Center" Background="#2570a1" Padding="5,3" HorizontalAlignment="Center" VerticalAlignment="Top" Width="362"/>
                 <Viewbox Width="362" Canvas.Left="1000"  Canvas.Top="50" Visibility="{Binding VCEIsInstalled,Converter={StaticResource boolToVisibility2}}" >
@@ -191,7 +192,7 @@
                 </Viewbox>
             </Canvas>
             <!-- OverOperation -->
-            
+
             <!-- Cycle information-->
             <Canvas Canvas.Top="690" Canvas.Left="1550">
                 <Border BorderBrush="#4e6a8a" BorderThickness="2" Padding="10" CornerRadius="7">

+ 45 - 19
Venus/Venus_RT/Modules/RouteManager.cs

@@ -72,7 +72,8 @@ namespace Venus_RT.Modules
             CreateSEJob,
             StartSEJob,
             AbortSEJob,
-            SEMoveWafer
+            SEMoveWafer,
+            SEReturnWafer
         }
 
         public PMEntity PMA { get; private set; }
@@ -159,6 +160,7 @@ namespace Venus_RT.Modules
         private ReturnAllWafer _returnWafer;
 		private SETMCycle _seTMCycle;
         private SEManualTransfer _setransfer;
+        private SEReturnWafer _sereturnWafer;
 
         private bool _isWaitUnload;
         private static int _isATMMode = -1;
@@ -280,7 +282,11 @@ namespace Venus_RT.Modules
 
             OP.Subscribe("System.ReturnAllWafer", (string cmd, object[] args) =>
             {
-                return CheckToPostMessage((int)MSG.ReturnAllWafer, args[0], args[1], args[2], args[3]);
+
+                if (seTM != null && VCE != null)
+                    return CheckToPostMessage((int)MSG.SEReturnWafer, args);
+                else
+                    return CheckToPostMessage((int)MSG.ReturnAllWafer, args[0], args[1], args[2], args[3]);
             });
             OP.Subscribe("System.MoveWafer", (string cmd, object[] args) =>
             {
@@ -306,8 +312,8 @@ namespace Venus_RT.Modules
                     return CheckToPostMessage((int)MSG.MoveWafer,
                         source, (int)args[1],
                         destination, (int)args[3],
-                        (bool)args[4], (int)args[5],
-                        (bool)args[6], (int)args[7], (string)args[8]);
+                        args[4], args[5],
+                        args[6], args[7], (string)args[8]);
             });
 
             OP.Subscribe("System.HomeAll", (string cmd, object[] args) =>
@@ -439,6 +445,7 @@ namespace Venus_RT.Modules
 			OP.Subscribe("System.SETMCycle", (cmd, args) => CheckToPostMessage((int)MSG.SETMCycle, args));
             OP.Subscribe("System.CreateSEJob", (cmd, args) => CheckToPostMessage((int)MSG.CreateSEJob, args));
             OP.Subscribe("System.StartSEJob",(cmd,args)=>CheckToPostMessage((int)MSG.StartSEJob,args));
+            OP.Subscribe("System.ReturnAllSEWafer", (cmd, args) => CheckToPostMessage((int)MSG.SEReturnWafer, args));
         }
         public bool CheckToPostMessage(int msg, params object[] args)
         {
@@ -609,6 +616,7 @@ namespace Venus_RT.Modules
             _returnWafer = new ReturnAllWafer(_manualTransfer);
 			_seTMCycle = new SETMCycle(ModuleName.SETM);
             _setransfer = new SEManualTransfer();
+            _sereturnWafer = new SEReturnWafer(_setransfer);
 
 
             BuildTransitionTable();
@@ -685,21 +693,23 @@ namespace Venus_RT.Modules
             Transition(RtState.ReturnWafer,     MSG.ABORT,              FsmAbort,                   RtState.Idle);
 
             // SETM  Cycle
-            Transition(RtState.Idle,            MSG.SETMCycle,          FsmStartSETMCycle,            RtState.SETMCycle);
-            Transition(RtState.SETMCycle,       FSM_MSG.TIMER,          FsmMonitorSETMCycle,          RtState.Idle);
-            Transition(RtState.SETMCycle,       MSG.StopSECycle,        FsmStopSETMCycle,             RtState.Idle);
-            // SETM CreateCycle
-            Transition(RtState.Idle,            MSG.CreateSEJob,        FsmStartCreateSEJob,          RtState.Idle);
-            // SETM StartCycle
-            Transition(RtState.Idle,            MSG.StartSEJob,         FsmStartSEJob,                RtState.SERunning);
-            Transition(RtState.SERunning,       FSM_MSG.TIMER,          FsmSEJobMonitor,              RtState.Idle);
-            Transition(RtState.SERunning,       MSG.StopSECycle,        FsmStopSETMCycle,             RtState.Idle);
+            Transition(RtState.Idle,            MSG.SETMCycle,          FsmStartSETMCycle,          RtState.SETMCycle);
+            Transition(RtState.SETMCycle,       FSM_MSG.TIMER,          FsmMonitorSETMCycle,        RtState.Idle);
+            Transition(RtState.SETMCycle,       MSG.StopSECycle,        FsmStopSETMCycle,           RtState.Idle);
+            // SETM CreateCycle                                                                     
+            Transition(RtState.Idle,            MSG.CreateSEJob,        FsmStartCreateSEJob,        RtState.Idle);
+            // SETM StartCycle                                                                      
+            Transition(RtState.Idle,            MSG.StartSEJob,         FsmStartSEJob,              RtState.SERunning);
+            Transition(RtState.SERunning,       FSM_MSG.TIMER,          FsmSEJobMonitor,            RtState.Idle);
+            Transition(RtState.SERunning,       MSG.StopSECycle,        FsmStopSETMCycle,           RtState.Idle);
             // SE Transfer
-            Transition(RtState.Idle,            MSG.SEMoveWafer,        FsmStartMoveWafer,            RtState.SETransfer);
-            Transition(RtState.SETransfer,      FSM_MSG.TIMER,          FsmMonitorMoveWafer,          RtState.Idle);
-            Transition(RtState.SETransfer,      MSG.StopSECycle,        FsmSEAbort,                   RtState.Idle);
+            Transition(RtState.Idle,            MSG.SEMoveWafer,        FsmStartSEMoveWafer,        RtState.SETransfer);
+            Transition(RtState.SETransfer,      FSM_MSG.TIMER,          FsmMonitorSEMoveWafer,      RtState.Idle);
+            Transition(RtState.SETransfer,      MSG.StopSECycle,        FsmSEAbort,                 RtState.Idle);
             // SE ReturnWafer
-
+            Transition(RtState.Idle,            MSG.SEReturnWafer,      FsmStartSEReturnWafer,      RtState.SEReturnWafer);
+            Transition(RtState.SEReturnWafer,   FSM_MSG.TIMER,          FsmMonitorSEReturnWafer,    RtState.Idle);
+            Transition(RtState.SEReturnWafer,   MSG.StopSECycle,        FsmSEAbort,                 RtState.Idle);
         }
 
         private bool FsmMonitor(object[] objs)
@@ -1038,12 +1048,12 @@ namespace Venus_RT.Modules
             return ret == RState.End;
         }
 
-        private bool FsmStartMoveWafer(object[] objs)
+        private bool FsmStartSEMoveWafer(object[] objs)
         {
             return _setransfer.Start(objs) == RState.Running;
         }
 
-        private bool FsmMonitorMoveWafer(object[] objs)
+        private bool FsmMonitorSEMoveWafer(object[] objs)
         {
             RState ret = _setransfer.Monitor();
             if (ret == RState.Failed || ret == RState.Timeout)
@@ -1054,6 +1064,22 @@ namespace Venus_RT.Modules
             return ret == RState.End;
         }
 
+        private bool FsmStartSEReturnWafer(object[] objs)
+        {
+            return _sereturnWafer.Start(objs) == RState.Running;
+        }
+
+        private bool FsmMonitorSEReturnWafer(object[] objs)
+        {
+            RState ret = _sereturnWafer.Monitor();
+            if (ret == RState.Failed || ret == RState.Timeout)
+            {
+                PostMsg(MSG.ERROR);
+                return false;
+            }
+            return ret == RState.End;
+        }
+
         private bool FsmSEAbort(object[] objs)
         {
             _setransfer.Abort();

+ 100 - 1
Venus/Venus_RT/Modules/SEManualTransfer.cs

@@ -27,7 +27,6 @@ namespace Venus_RT.Modules
         private MovingStatus _moving_status = MovingStatus.Idle;
         private RState _transferstate = RState.Init;
 
-        private int _tmRobotSingleArmOption = 0;//usable wafer
         private ModuleName source_station;
         private int source_slot;
         private ModuleName destination_station;
@@ -184,4 +183,104 @@ namespace Venus_RT.Modules
 
         }
     }
+
+    public class SEReturnWafer : IRoutine
+    {
+        //target:
+        //1. 1 wafer return as a Queue
+        //2. all wafers return as a Queue
+        private SEManualTransfer _transfer = null;
+        private Queue<MoveItem> _ReturnQueue = new Queue<MoveItem> ();//all wafer enqueue
+        private List<ModuleName> modulelist = new List<ModuleName>();
+        public SEReturnWafer(SEManualTransfer transfer)
+        {
+            _transfer = transfer;
+            string[] InstalledModules = SC.GetStringValue("System.InstalledModules").ToString().Split(',');
+            foreach (string module in InstalledModules)
+            {
+                //module without vce
+                if(Enum.TryParse(module,out ModuleName mod) && !ModuleHelper.IsVCE(mod) && mod!=ModuleName.SETM)
+                    modulelist.Add(mod);
+            }
+        }
+        public RState Start(params object[] objs)
+        {
+            _ReturnQueue.Clear();
+            //单个wafer
+            if (objs.Length > 0)
+            {
+                _ReturnQueue.Enqueue((MoveItem)objs[0]);
+            }
+            //all wafer return
+            else
+            {
+                AllWaferBack();
+            }
+
+            return RState.Running;
+        }
+        public RState Monitor()
+        {
+            while (_ReturnQueue.Count > 0 || _transfer.Monitor() == RState.Running)
+            {
+                switch (_transfer.Monitor())
+                {
+                    case RState.Init:
+                    case RState.End:
+                        MoveItem moveItem = _ReturnQueue.Dequeue();
+                        return _transfer.Start(moveItem.SourceModule,moveItem.SourceSlot,moveItem.DestinationModule,moveItem.DestinationSlot,false,1,false,1,"");
+                    case RState.Running:
+                        return RState.Running;
+                    case RState.Timeout:
+                    case RState.Failed:
+                        return RState.Failed;
+                }
+            }
+
+            return RState.End;
+        }
+
+        private void AllWaferBack()
+        {
+            //Firstly,robot wafer back
+            //Then,chamber wafer back
+            CheckWaferEnqueue(ModuleName.TMRobot, 0);
+            CheckWaferEnqueue(ModuleName.TMRobot, 1);
+
+            foreach (ModuleName mod in modulelist)
+            {
+                if (mod == ModuleName.TMRobot)
+                    continue;
+                else
+                    CheckWaferEnqueue(mod,0);
+            }
+        }
+
+        //wafer back vce
+        //1. has wafer
+        //2. vce isinstalled and slot no wafer
+        //3. robot check hand && chamber check 0
+        private void CheckWaferEnqueue(ModuleName source_module,int source_slot)
+        {
+            if (WaferManager.Instance.CheckHasWafer(source_module, source_slot))
+            {
+                WaferInfo waferInfo = WaferManager.Instance.GetWafer(source_module, source_slot);
+                if (ModuleHelper.IsVCE((ModuleName)waferInfo.OriginStation) 
+                    && ModuleHelper.IsInstalled((ModuleName)waferInfo.OriginStation) 
+                    && WaferManager.Instance.CheckNoWafer((ModuleName)waferInfo.OriginStation, waferInfo.OriginSlot))
+                {
+                    if(source_module == ModuleName.TMRobot)
+                        _ReturnQueue.Enqueue(new MoveItem(source_module, source_slot, (ModuleName)waferInfo.OriginStation, waferInfo.OriginSlot, (Hand)source_slot));
+                    else
+                        _ReturnQueue.Enqueue(new MoveItem(source_module, source_slot, (ModuleName)waferInfo.OriginStation, waferInfo.OriginSlot, 0));
+                }
+            }
+        }
+
+
+        public void Abort()
+        {
+
+        }
+    }
 }