Procházet zdrojové kódy

fix the sync issue for efem socket.

sangwq před 1 rokem
rodič
revize
4f7a01400f

+ 25 - 8
Venus/Venus_RT/Devices/EFEM/JetEfem.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Diagnostics;
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
@@ -34,8 +35,30 @@ namespace Venus_RT.Devices.EFEM
         private EfemMessage _revMsg;
         private bool _LiftIsUp = false;
         private bool _LiftIsDown = false;
+        private R_TRIG _busyTrig = new R_TRIG();
+        private Stopwatch _busyWatch = new Stopwatch();
 
-        public override RState Status { get { return _status; } }
+        public override RState Status 
+        { 
+            get 
+            {
+                _busyTrig.CLK = _status == RState.Running;
+                if(_busyTrig.Q)
+                {
+                    _busyWatch.Restart();
+                }
+                else if(_busyTrig.M)
+                {
+                    if(_busyWatch.ElapsedMilliseconds > 30000)
+                    {
+                        _busyWatch.Stop();
+                        _status = RState.Timeout;
+                    }
+                }
+
+                return _status;
+            } 
+        }
         public override bool IsHomed { get { return _IsHomed; } }
         public override RobotMoveInfo TMRobotMoveInfo { get { return _robotMoveInfo; } }
 
@@ -66,6 +89,7 @@ namespace Venus_RT.Devices.EFEM
 
             _status = RState.Init;
             _IsHomed = false;
+            _busyTrig.RST = true;
 
             _LPMs[0] = new Loadport(ModuleName.LP1, this);
             _LPMs[1] = new Loadport(ModuleName.LP2, this);
@@ -105,7 +129,6 @@ namespace Venus_RT.Devices.EFEM
                     System.Threading.Thread.Sleep(600);
                 }
             });
-
         }
 
         public override void Monitor()
@@ -247,12 +270,6 @@ namespace Venus_RT.Devices.EFEM
 
         public override bool ClearError()
         {
-            if (_status == RState.Running)
-            {
-                LOG.Write(eEvent.ERR_EFEM_ROBOT, ModuleName.EFEM, "EFEM is busy, please wait a minute");
-                return false;
-            }
-
             _currentMsg = new EfemMessage
             {
                 Port = ModuleName.EFEM,

+ 2 - 2
Venus/Venus_RT/Modules/EFEM/EFEMAlignRoutine.cs

@@ -71,9 +71,9 @@ namespace Venus_RT.Modules.EFEM
 
         public RState Monitor()
         {
-            Runner.Wait(AlignStep.WaitIdle,     WaitEFEMIdle,                0)
+            Runner.Wait(AlignStep.WaitIdle,     WaitEFEMIdle,               _delay_60s)
                 .Run(AlignStep.Rotate,          fnalign,                    CheckAlignDone,         _moveTimeout)
-                .End( AlignStep.End,            ActionDone,                  0);
+                .End( AlignStep.End,            ActionDone,                 0);
             return Runner.Status;
         }
 

+ 12 - 4
Venus/Venus_RT/Modules/EFEM/EfemHomeRoutine.cs

@@ -19,6 +19,7 @@ namespace Venus_RT.Modules.EFEM
     {
         private enum HomeStep
         {
+            WaitEFEMReady,
             ClearError,
             InitRobot,
             HomeAllAxes,
@@ -56,7 +57,8 @@ namespace Venus_RT.Modules.EFEM
 
             if(_targetModule == ModuleName.EFEM)
             {
-                Runner.Run(HomeStep.ClearError,            ClearError,             IsStepComplete,         _homeTimeout)
+                Runner.Wait(HomeStep.WaitEFEMReady,        WaitEFEMIdle,            _delay_60s)
+                    .Run(HomeStep.ClearError,              ClearError,             IsStepComplete,         _homeTimeout)
                     .Run(HomeStep.InitRobot,               HomeAll,                IsStepComplete,         _homeTimeout)
                     .Run(HomeStep.HomeAllAxes,             HomeAllAxes,            IsStepComplete,         _homeTimeout)
                     .Run(HomeStep.CheckWaferPresence,      CheckWaferPresence,     VerifyWaferPresence,    _homeTimeout)
@@ -64,9 +66,10 @@ namespace Venus_RT.Modules.EFEM
             }
             else
             {
-                Runner.Run(HomeModuleStep.Home,        HomeModule,         IsStepComplete,     _homeTimeout)
-                    .Run(HomeModuleStep.HomeAxes,      HomeModuleAxes,     IsStepComplete,     _homeTimeout)
-                    .End(HomeModuleStep.End,           NullFun,            _delay_50ms);
+                Runner.Wait(HomeStep.WaitEFEMReady,     WaitEFEMIdle,       _delay_60s)
+                    .Run(HomeModuleStep.Home,           HomeModule,         IsStepComplete,     _homeTimeout)
+                    .Run(HomeModuleStep.HomeAxes,       HomeModuleAxes,     IsStepComplete,     _homeTimeout)
+                    .End(HomeModuleStep.End,            NullFun,            _delay_50ms);
             }
 
 
@@ -94,6 +97,11 @@ namespace Venus_RT.Modules.EFEM
                 return false;
         }
 
+        private bool WaitEFEMIdle()
+        {
+            return _efem.Status != RState.Running;
+        }
+
         private bool ClearError()
         {
             return _efem.ClearError();

+ 5 - 5
Venus/Venus_RT/Modules/EFEM/EfemPickRoutine.cs

@@ -100,14 +100,14 @@ namespace Venus_RT.Modules.EFEM
         {
             if(_bDoublePick)
             {
-                Runner.Wait(PickStep.WaitModuleReady,  WaitModuleReady)
-                        .Run(PickStep.Picking1,        Pick1,          Pick1Done,       _moveTimeout + _delay_1s)
-                        .Run(PickStep.Picking2,        Pick2,          Pick2Done,       _moveTimeout + _delay_1s)
+                Runner.Wait(PickStep.WaitModuleReady,  WaitModuleReady,     _delay_60s)
+                        .Run(PickStep.Picking1,        Pick1,               Pick1Done,       _moveTimeout + _delay_1s)
+                        .Run(PickStep.Picking2,        Pick2,               Pick2Done,       _moveTimeout + _delay_1s)
                         .End(PickStep.End,             ActionDone);
             }
             else
             {
-                Runner.Wait(PickStep.WaitModuleReady, WaitModuleReady)
+                Runner.Wait(PickStep.WaitModuleReady, WaitModuleReady,      _delay_60s)
                         .Run(PickStep.Picking1,        Pick1,          Pick1Done,       _moveTimeout + _delay_1s)
                         .End(PickStep.End,             ActionDone);
             }
@@ -122,7 +122,7 @@ namespace Venus_RT.Modules.EFEM
 
         private bool WaitModuleReady()
         {
-            return true;
+            return _efem.Status == RState.End;
         }
 
         private bool Pick1()

+ 6 - 6
Venus/Venus_RT/Modules/EFEM/EfemPlaceRoutine.cs

@@ -109,15 +109,15 @@ namespace Venus_RT.Modules.EFEM
         {
             if (_bDoublePlace)
             {
-                Runner.Wait(PlaceStep.WaitModuleReady,     WaitModuleReady)
-                        .Run(PlaceStep.Placing1,           Place1,         Place1Done,      _moveTimeout + _delay_1s)
-                        .Run(PlaceStep.Placing2,           Place2,         Place2Done,      _moveTimeout + _delay_1s)
+                Runner.Wait(PlaceStep.WaitModuleReady,     WaitModuleReady,     _delay_60s)
+                        .Run(PlaceStep.Placing1,           Place1,              Place1Done,      _moveTimeout + _delay_1s)
+                        .Run(PlaceStep.Placing2,           Place2,              Place2Done,      _moveTimeout + _delay_1s)
                         .End(PlaceStep.End,                ActionDone);
             }
             else
             {
-                Runner.Wait(PlaceStep.WaitModuleReady, WaitModuleReady)
-                        .Run(PlaceStep.Placing1,           Place1,         Place1Done,      _moveTimeout + _delay_1s)
+                Runner.Wait(PlaceStep.WaitModuleReady, WaitModuleReady,         _delay_60s)
+                        .Run(PlaceStep.Placing1,           Place1,              Place1Done,      _moveTimeout + _delay_1s)
                         .End(PlaceStep.End,                ActionDone);
             }
 
@@ -131,7 +131,7 @@ namespace Venus_RT.Modules.EFEM
 
         private bool WaitModuleReady()
         {
-            return true;
+            return _efem.Status == RState.End;
         }
 
         private bool Place1()

+ 7 - 0
Venus/Venus_RT/Modules/EFEM/EfemSwapRoutine.cs

@@ -22,6 +22,7 @@ namespace Venus_RT.Modules.EFEM
             WaitModuleReady,
             ModulePrepare,
             OpenSlitDoor,
+            WaitEFEMIdle,
             MoveWafer,
             WaitMaferMoved,
             CloseSlitDoor,
@@ -111,6 +112,7 @@ namespace Venus_RT.Modules.EFEM
             Runner.Wait(SwapStep.WaitModuleReady,  () => _llModule.IsIdle,     _delay_60s)
                 .Run(SwapStep.ModulePrepare,       ModulePrepare,              IsModulePrepareReady)
                 .Run(SwapStep.OpenSlitDoor,        OpenSlitDoor,               IsSlitDoorOpen)
+                .Wait(SwapStep.WaitEFEMIdle,       WaitRobotReady)
                 .LoopStart(SwapStep.MoveWafer,     loopName(),                 _actionCount,           MoveWafer)
                 .LoopEnd(SwapStep.WaitMaferMoved,  NullFun,                    WaitWaferMoved,         _moveTimeout + _delay_1s)
                 .Run(SwapStep.CloseSlitDoor,       CloseSlitDoor,              IsSlitDoorClosed)
@@ -155,6 +157,11 @@ namespace Venus_RT.Modules.EFEM
             return _tmModule.IsLLSlitDoorClosed(_targetModule);
         }
 
+        private bool WaitRobotReady()
+        {
+            return _efem.Status == RState.End;
+        }
+
         private bool VerifyWaferExistence(MoveItem item)
         {
             if (WaferManager.Instance.CheckHasWafer(item.DestinationModule, item.DestinationSlot))

+ 4 - 2
Venus/Venus_RT/Modules/LPs/LoadPortClampRoutine.cs

@@ -12,6 +12,7 @@ namespace Venus_RT.Modules.LPs
     {
         enum RoutineStep
         {
+            WaitEFEMIdle,
             Clamp,
             End,
              
@@ -44,8 +45,9 @@ namespace Venus_RT.Modules.LPs
 
         public RState Monitor()
         {
-            Runner.Run(RoutineStep.Clamp, Clamp, CheckDevice, _timeout * 1000)
-                    .End(RoutineStep.End, NullFun, _delay_1s);
+            Runner.Wait(RoutineStep.WaitEFEMIdle,   () => _lpModule.IsRobotIdle,    _delay_60s)
+                    .Run(RoutineStep.Clamp,         Clamp,                          CheckDevice,    _timeout * 1000)
+                    .End(RoutineStep.End,           NullFun,                        _delay_1s);
 
             return Runner.Status;
         }

+ 4 - 3
Venus/Venus_RT/Modules/LPs/LoadPortHomeRoutine.cs

@@ -12,7 +12,7 @@ namespace Venus_RT.Modules.LPs
     {
         enum RoutineStep
         {
-             
+            WaitEFEMIdle,
             Home,
             End,
              
@@ -44,8 +44,9 @@ namespace Venus_RT.Modules.LPs
 
         public RState Monitor()
         {
-            Runner.Run(RoutineStep.Home, Home, CheckDevice, _timeout * 1000)
-                .End(RoutineStep.End, NullFun, _delay_1s);
+            Runner.Wait(RoutineStep.WaitEFEMIdle,   () => _lpModule.IsRobotIdle,        _delay_60s)
+                .Run(RoutineStep.Home,              Home,               CheckDevice,    _timeout * 1000)
+                .End(RoutineStep.End,               NullFun,            _delay_1s);
 
             return Runner.Status;
         }

+ 4 - 2
Venus/Venus_RT/Modules/LPs/LoadPortLoadRoutine.cs

@@ -13,6 +13,7 @@ namespace Venus_RT.Modules.LPs
     {
         enum RoutineStep
         {
+            WaitEFEMIdle,
             Load,
             End,
         }
@@ -47,8 +48,9 @@ namespace Venus_RT.Modules.LPs
 
         public RState Monitor()
         {
-            Runner.Run(RoutineStep.Load, Load, CheckDevice, _timeout * 1000)
-                .End(RoutineStep.End, NullFun, _delay_1s);
+            Runner.Wait(RoutineStep.WaitEFEMIdle,   () => _lpModule.IsRobotIdle,    _delay_60s)
+                .Run(RoutineStep.Load,              Load,                           CheckDevice,    _timeout * 1000)
+                .End(RoutineStep.End,               NullFun,                        _delay_1s);
 
             return Runner.Status;
         }

+ 6 - 0
Venus/Venus_RT/Modules/LPs/LoadPortModule.cs

@@ -3,6 +3,7 @@ using Aitex.Core.RT.Fsm;
 using Aitex.Core.RT.OperationCenter;
 using Aitex.Core.RT.Routine;
 using Aitex.Core.Utilities;
+using Aitex.Core.Util;
 using Aitex.Sorter.Common;
 using MECF.Framework.Common.Equipment;
 using MECF.Framework.Common.Schedulers;
@@ -104,6 +105,11 @@ namespace Venus_RT.Modules.LPs
             get { return FsmState == (int)STATE.Init; }
         }
 
+        public bool IsRobotIdle
+        {
+            get { return Singleton<RouteManager>.Instance.EFEM.RobotStatus == RState.End; }
+        }
+
         private LoadPortHomeRoutine _home;
         //private LoadPortCloseDoorRoutine _closeDoor;
         private LoadPortClampRoutine _clamp;

+ 4 - 2
Venus/Venus_RT/Modules/LPs/LoadPortReadCarrierIdRoutine.cs

@@ -12,6 +12,7 @@ namespace Venus_RT.Modules.LPs
     {
         enum RoutineStep
         {
+            WaitEFEMIdle,
             ReadCarrierId,
             End,
         }
@@ -40,8 +41,9 @@ namespace Venus_RT.Modules.LPs
 
         public RState Monitor()
         {
-            Runner.Run(RoutineStep.ReadCarrierId, ReadCarrierId, CheckDevice, _timeout * 1000)
-                    .End(RoutineStep.End, NullFun, _delay_1s);
+            Runner.Wait(RoutineStep.WaitEFEMIdle,       () => _lpModule.IsRobotIdle,    _delay_60s)
+                    .Run(RoutineStep.ReadCarrierId,     ReadCarrierId,                  CheckDevice,    _timeout * 1000)
+                    .End(RoutineStep.End,               NullFun,                        _delay_1s);
 
             return Runner.Status;
         }

+ 4 - 3
Venus/Venus_RT/Modules/LPs/LoadPortReadTagDataRoutine.cs

@@ -12,9 +12,9 @@ namespace Venus_RT.Modules.LPs
     {
         enum RoutineStep
         {
+            WaitEFEMIdle,
             ReadTagData,
             End,
-            
         }
 
         private int _timeout = 0;
@@ -41,8 +41,9 @@ namespace Venus_RT.Modules.LPs
 
         public RState Monitor()
         {
-            Runner.Run(RoutineStep.ReadTagData, ReadTagData, CheckDevice, _timeout * 1000)
-                    .End(RoutineStep.End, NullFun, _delay_1s);
+            Runner.Wait(RoutineStep.WaitEFEMIdle,       () => _lpModule.IsRobotIdle,    _delay_60s)
+                    .Run(RoutineStep.ReadTagData,       ReadTagData,                    CheckDevice,        _timeout * 1000)
+                    .End(RoutineStep.End,               NullFun,                        _delay_1s);
 
             return Runner.Status;
         }

+ 4 - 3
Venus/Venus_RT/Modules/LPs/LoadPortUnclampRoutine.cs

@@ -12,9 +12,9 @@ namespace Venus_RT.Modules.LPs
     {
         enum RoutineStep
         {
+            WaitEFEMIdle,
             Unclamp,
             End,
-             
         }
 
         private int _timeout = 0;
@@ -42,8 +42,9 @@ namespace Venus_RT.Modules.LPs
 
         public RState Monitor()
         {
-            Runner.Run(RoutineStep.Unclamp, Unclamp, CheckDevice, _timeout * 1000)
-                    .End(RoutineStep.End, NullFun, _delay_1s);
+            Runner.Wait(RoutineStep.WaitEFEMIdle,       () => _lpModule.IsRobotIdle,    _delay_60s)
+                    .Run(RoutineStep.Unclamp,           Unclamp,                        CheckDevice,    _timeout * 1000)
+                    .End(RoutineStep.End,               NullFun,                        _delay_1s);
 
             return Runner.Status;
         }

+ 4 - 2
Venus/Venus_RT/Modules/LPs/LoadPortUnloadRoutine.cs

@@ -13,6 +13,7 @@ namespace Venus_RT.Modules.LPs
     {
         enum RoutineStep
         {
+            WaitEFEMIdle,
             Unload,
             End,
         }
@@ -47,8 +48,9 @@ namespace Venus_RT.Modules.LPs
 
         public RState Monitor()
         {
-            Runner.Run(RoutineStep.Unload, Unload, CheckDevice, _timeout * 1000)
-                    .End(RoutineStep.End, NullFun, _delay_1s);
+            Runner.Wait(RoutineStep.WaitEFEMIdle,       () => _lpModule.IsRobotIdle,    _delay_60s)
+                    .Run(RoutineStep.Unload,            Unload,                         CheckDevice,        _timeout * 1000)
+                    .End(RoutineStep.End,               NullFun,                        _delay_1s);
 
             return Runner.Status;
         }

+ 4 - 2
Venus/Venus_RT/Modules/LPs/LoadPortWriteCarrierIdRoutine.cs

@@ -10,6 +10,7 @@ namespace Venus_RT.Modules.LPs
     {
         enum RoutineStep
         {
+            WaitEFEMIdle,
             WriteCarrierId,
             End,
         }
@@ -42,8 +43,9 @@ namespace Venus_RT.Modules.LPs
 
         public RState Monitor()
         {
-            Runner.Run(RoutineStep.WriteCarrierId, WriteCarrierId, CheckDevice, _timeout * 1000)
-                    .End(RoutineStep.End, NullFun, _delay_1s);
+            Runner.Wait(RoutineStep.WaitEFEMIdle,       () => _lpModule.IsRobotIdle,    _delay_60s)
+                    .Run(RoutineStep.WriteCarrierId,    WriteCarrierId,                 CheckDevice,        _timeout * 1000)
+                    .End(RoutineStep.End,               NullFun,                        _delay_1s);
 
             return Runner.Status;
         }

+ 4 - 3
Venus/Venus_RT/Modules/LPs/LoadPortWriteTagDataRoutine.cs

@@ -10,9 +10,9 @@ namespace Venus_RT.Modules.LPs
     {
         enum RoutineStep
         {
+            WaitEFEMIdle,
             WriteTagData,
             End,
-
         }
 
         public string TagDataSetPoint { get; set; }
@@ -42,8 +42,9 @@ namespace Venus_RT.Modules.LPs
 
         public RState Monitor()
         {
-            Runner.Run(RoutineStep.WriteTagData, WriteTagData, CheckDevice, _timeout * 1000)
-                    .End(RoutineStep.End, NullFun, _delay_1s);
+            Runner.Wait(RoutineStep.WaitEFEMIdle,       () => _lpModule.IsRobotIdle,    _delay_60s)
+                    .Run(RoutineStep.WriteTagData,      WriteTagData,                   CheckDevice,    _timeout * 1000)
+                    .End(RoutineStep.End,               NullFun,                        _delay_1s);
 
             return Runner.Status;
         }