|
@@ -16,6 +16,7 @@ using Venus_RT.Devices;
|
|
using Venus_RT.Devices.YASKAWA;
|
|
using Venus_RT.Devices.YASKAWA;
|
|
using Venus_RT.Devices.EFEM;
|
|
using Venus_RT.Devices.EFEM;
|
|
using Venus_RT.Modules.LPs;
|
|
using Venus_RT.Modules.LPs;
|
|
|
|
+using Venus_RT.Modules.EFEM;
|
|
|
|
|
|
namespace Venus_RT.Modules
|
|
namespace Venus_RT.Modules
|
|
{
|
|
{
|
|
@@ -78,7 +79,7 @@ namespace Venus_RT.Modules
|
|
Map,
|
|
Map,
|
|
ToInit,
|
|
ToInit,
|
|
Cool,
|
|
Cool,
|
|
- PickAndPlace,
|
|
|
|
|
|
+ Swap,
|
|
Grip,
|
|
Grip,
|
|
Ungrip,
|
|
Ungrip,
|
|
Flip,
|
|
Flip,
|
|
@@ -100,12 +101,17 @@ namespace Venus_RT.Modules
|
|
// Fields
|
|
// Fields
|
|
//
|
|
//
|
|
private readonly string Name;
|
|
private readonly string Name;
|
|
- private readonly Efem _efem;
|
|
|
|
|
|
+ private readonly EfemBase _efem;
|
|
private readonly LoadPortModule[] _lpms = new LoadPortModule[2];
|
|
private readonly LoadPortModule[] _lpms = new LoadPortModule[2];
|
|
private readonly EfemType _efemType;
|
|
private readonly EfemType _efemType;
|
|
- public Efem EfemDevice => _efem;
|
|
|
|
|
|
+ public EfemBase EfemDevice => _efem;
|
|
public EfemType EFEMType => _efemType;
|
|
public EfemType EFEMType => _efemType;
|
|
|
|
|
|
|
|
+ // routine
|
|
|
|
+ private readonly EfemPickRoutine _pickRoutine;
|
|
|
|
+ private readonly EfemPlaceRoutine _placeRoutine;
|
|
|
|
+ private readonly EfemSwapRoutine _swapRoutine;
|
|
|
|
+
|
|
// Constructor
|
|
// Constructor
|
|
//
|
|
//
|
|
public EfemEntity()
|
|
public EfemEntity()
|
|
@@ -115,10 +121,14 @@ namespace Venus_RT.Modules
|
|
_bigWafer = SC.GetValue<int>($"System.BigWafer");
|
|
_bigWafer = SC.GetValue<int>($"System.BigWafer");
|
|
_efemType = (EfemType)SC.GetValue<int>($"EFEM.EfemType");
|
|
_efemType = (EfemType)SC.GetValue<int>($"EFEM.EfemType");
|
|
|
|
|
|
- _efem = new Efem();
|
|
|
|
|
|
+ _efem = new JetEfem();
|
|
|
|
|
|
Name = ModuleName.EFEM.ToString();
|
|
Name = ModuleName.EFEM.ToString();
|
|
|
|
|
|
|
|
+ _pickRoutine = new EfemPickRoutine(_efem);
|
|
|
|
+ _placeRoutine = new EfemPlaceRoutine(_efem);
|
|
|
|
+ _swapRoutine = new EfemSwapRoutine(_efem);
|
|
|
|
+
|
|
InitFsmMap();
|
|
InitFsmMap();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -190,93 +200,64 @@ namespace Venus_RT.Modules
|
|
fsm = new StateMachine<EfemEntity>("EFEM", (int)STATE.Unknown, 50);
|
|
fsm = new StateMachine<EfemEntity>("EFEM", (int)STATE.Unknown, 50);
|
|
fsm.EnableRepeatedMsg(true);
|
|
fsm.EnableRepeatedMsg(true);
|
|
|
|
|
|
- AnyStateTransition(FSM_MSG.TIMER, fnMonitor, FSM_STATE.SAME);
|
|
|
|
- AnyStateTransition(MSG.RecHwMsg, fnRecMsg, FSM_STATE.SAME);
|
|
|
|
- //AnyStateTransition(MSG.LED, fnSetLED, STATE.SettingLamp);
|
|
|
|
- AnyStateTransition(MSG.TurnOffBuzzer, fnTurnOffBuzzer, FSM_STATE.SAME);
|
|
|
|
- //AnyStateTransition(MSG.SwitchOnBuzzerAndRed, fnSwitchOnBuzzerAndRed, FSM_STATE.SAME);
|
|
|
|
- AnyStateTransition(MSG.Recover, fnRecover, STATE.Idle);
|
|
|
|
- AnyStateTransition(MSG.Error, fnError, STATE.Error);
|
|
|
|
- AnyStateTransition(MSG.Online, fnOnline, FSM_STATE.SAME);
|
|
|
|
- AnyStateTransition(MSG.Abort, fnAbortRobot, STATE.Idle);
|
|
|
|
- AnyStateTransition(MSG.ToInit, fnToInit, STATE.Init);
|
|
|
|
-
|
|
|
|
- EnterExitTransition<STATE, FSM_MSG>(STATE.Initializing, fnEnterExecute, FSM_MSG.NONE, fnExitExecute);
|
|
|
|
- EnterExitTransition<STATE, FSM_MSG>(STATE.InitingRB, fnEnterExecute, FSM_MSG.NONE, null);
|
|
|
|
- EnterExitTransition<STATE, FSM_MSG>(STATE.InitingAL, fnEnterExecute, FSM_MSG.NONE, null);
|
|
|
|
- EnterExitTransition<STATE, FSM_MSG>(STATE.Picking, fnEnterExecute, FSM_MSG.NONE, fnExitExecute);
|
|
|
|
- EnterExitTransition<STATE, FSM_MSG>(STATE.Gotoing, fnEnterExecute, FSM_MSG.NONE, fnExitExecute);
|
|
|
|
- EnterExitTransition<STATE, FSM_MSG>(STATE.Placing, fnEnterExecute, FSM_MSG.NONE, fnExitExecute);
|
|
|
|
- EnterExitTransition<STATE, FSM_MSG>(STATE.Swapping, fnEnterExecute, FSM_MSG.NONE, fnExitExecute);
|
|
|
|
- EnterExitTransition<STATE, FSM_MSG>(STATE.Extending, fnEnterExecute, FSM_MSG.NONE, fnExitExecute);
|
|
|
|
- EnterExitTransition<STATE, FSM_MSG>(STATE.Retracting, fnEnterExecute, FSM_MSG.NONE, fnExitExecute);
|
|
|
|
- EnterExitTransition<STATE, FSM_MSG>(STATE.Lifting, fnEnterExecute, FSM_MSG.NONE, null);
|
|
|
|
- EnterExitTransition<STATE, FSM_MSG>(STATE.Aligning, fnEnterExecute, FSM_MSG.NONE, null);
|
|
|
|
- EnterExitTransition<STATE, FSM_MSG>(STATE.Mapping, fnEnterExecute, FSM_MSG.NONE, fnExitExecute);
|
|
|
|
- EnterExitTransition<STATE, FSM_MSG>(STATE.Gripping, fnEnterExecute, FSM_MSG.NONE, null);
|
|
|
|
- EnterExitTransition<STATE, FSM_MSG>(STATE.Ungripping, fnEnterExecute, FSM_MSG.NONE, null);
|
|
|
|
- EnterExitTransition<STATE, FSM_MSG>(STATE.Fliping, fnEnterExecute, FSM_MSG.NONE, fnExitExecute);
|
|
|
|
-
|
|
|
|
- Transition(STATE.Unknown, MSG.CommReady, null, STATE.Init);
|
|
|
|
|
|
+ AnyStateTransition(FSM_MSG.TIMER, fnMonitor, FSM_STATE.SAME);
|
|
|
|
+ AnyStateTransition(MSG.TurnOffBuzzer, fnTurnOffBuzzer, FSM_STATE.SAME);
|
|
|
|
+ AnyStateTransition(MSG.Recover, fnRecover, STATE.Idle);
|
|
|
|
+ AnyStateTransition(MSG.Error, fnError, STATE.Error);
|
|
|
|
+ AnyStateTransition(MSG.Online, fnOnline, FSM_STATE.SAME);
|
|
|
|
+ AnyStateTransition(MSG.Abort, fnAbortRobot, STATE.Idle);
|
|
|
|
+ AnyStateTransition(MSG.ToInit, fnToInit, STATE.Init);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ Transition(STATE.Unknown, MSG.CommReady, null, STATE.Init);
|
|
|
|
|
|
// Home
|
|
// Home
|
|
- Transition(STATE.Init, MSG.HomeAll, fnHomeAll, STATE.Initializing);
|
|
|
|
- Transition(STATE.Idle, MSG.HomeAll, fnHomeAll, STATE.Initializing); // 暂时加,出错的时候做 HOME
|
|
|
|
- Transition(STATE.Initializing, MSG.ActionDone, null, STATE.Orgshing);
|
|
|
|
- Transition(STATE.Orgshing, MSG.ActionDone, fnActionDone, STATE.Idle);
|
|
|
|
- Transition(STATE.Idle, MSG.HomeRB, fnHomeRobot, STATE.InitingRB);
|
|
|
|
- Transition(STATE.InitingRB, MSG.ActionDone, null, STATE.Idle);
|
|
|
|
- //Transition(STATE.SettingLamp, MSG.ActionDone, fnSetLampDone, STATE.Idle);
|
|
|
|
-
|
|
|
|
- // Pick
|
|
|
|
- Transition(STATE.Idle, MSG.Pick, fnPick, STATE.Picking);
|
|
|
|
- Transition(STATE.Picking, MSG.ActionDone, fnActionDone, STATE.Idle);
|
|
|
|
- Transition(STATE.Picking, MSG.PMLiftPinUp, fnPmPinUp, STATE.Idle);
|
|
|
|
- Transition(STATE.Picking, MSG.PMLiftPinDown, fnPmPinDown, STATE.Idle);
|
|
|
|
-
|
|
|
|
- // Place
|
|
|
|
- Transition(STATE.Idle, MSG.Place, fnPlace, STATE.Placing);
|
|
|
|
- Transition(STATE.Placing, MSG.ActionDone, fnActionDone, STATE.Idle);
|
|
|
|
- Transition(STATE.Placing, MSG.PMLiftPinUp, fnPmPinUp, STATE.Idle);
|
|
|
|
- Transition(STATE.Placing, MSG.PMLiftPinDown, fnPmPinDown, STATE.Idle);
|
|
|
|
-
|
|
|
|
- // PickAndPlace
|
|
|
|
- Transition(STATE.Idle, MSG.PickAndPlace, fnSwap, STATE.Swapping);
|
|
|
|
- Transition(STATE.Swapping, MSG.ActionDone, fnActionDone, STATE.Idle);
|
|
|
|
- Transition(STATE.Swapping, MSG.PMLiftPinUp, fnPmPinUp, STATE.Idle);
|
|
|
|
- Transition(STATE.Swapping, MSG.PMLiftPinDown, fnPmPinDown, STATE.Idle);
|
|
|
|
-
|
|
|
|
- // Goto
|
|
|
|
- Transition(STATE.Idle, MSG.Goto, fnGoto, STATE.Gotoing);
|
|
|
|
- Transition(STATE.Gotoing, MSG.ActionDone, fnActionDone, STATE.Idle);
|
|
|
|
|
|
+ Transition(STATE.Init, MSG.HomeAll, fnHomeAll, STATE.Initializing);
|
|
|
|
+ Transition(STATE.Idle, MSG.HomeAll, fnHomeAll, STATE.Initializing); // 暂时加,出错的时候做 HOME
|
|
|
|
+ Transition(STATE.Initializing, MSG.ActionDone, null, STATE. Orgshing);
|
|
|
|
+ Transition(STATE.Orgshing, MSG.ActionDone, fnActionDone, STATE.Idle);
|
|
|
|
+ Transition(STATE.Idle, MSG.HomeRB, fnHomeRobot, STATE.InitingRB);
|
|
|
|
+ Transition(STATE.InitingRB, MSG.ActionDone, null, STATE.Idle);
|
|
|
|
+
|
|
|
|
+ // Pick wafer
|
|
|
|
+ Transition(STATE.Idle, MSG.Pick, FnStartPick, STATE.Picking);
|
|
|
|
+ Transition(STATE.Picking, FSM_MSG.TIMER, FnPickTimeout, STATE.Idle);
|
|
|
|
+ Transition(STATE.Picking, MSG.Abort, FnAbortPick, STATE.Idle);
|
|
|
|
+
|
|
|
|
+ // Place wafer
|
|
|
|
+ Transition(STATE.Idle, MSG.Place, FnStartPlace, STATE.Placing);
|
|
|
|
+ Transition(STATE.Placing, FSM_MSG.TIMER, FnPlaceTimeout, STATE.Idle);
|
|
|
|
+ Transition(STATE.Placing, MSG.Abort, FnAbortPlace, STATE.Idle);
|
|
|
|
+
|
|
|
|
+ // Swap wafer with LL sequence
|
|
|
|
+ Transition(STATE.Idle, MSG.Swap, FnStartSwap, STATE.Swapping);
|
|
|
|
+ Transition(STATE.Swapping, FSM_MSG.TIMER, FnSwapTimeout, STATE.Idle);
|
|
|
|
+ Transition(STATE.Swapping, MSG.Abort, FnAbortSwap, STATE.Idle);
|
|
|
|
|
|
- // Extend
|
|
|
|
- Transition(STATE.Idle, MSG.Extend, fnExtend, STATE.Extending);
|
|
|
|
- Transition(STATE.Extending, MSG.ActionDone, fnActionDone, STATE.Idle);
|
|
|
|
|
|
+ // Goto
|
|
|
|
+ Transition(STATE.Idle, MSG.Goto, fnGoto, STATE.Gotoing);
|
|
|
|
+ Transition(STATE.Gotoing, MSG.ActionDone, fnActionDone, STATE.Idle);
|
|
|
|
|
|
- // Retract
|
|
|
|
- Transition(STATE.Idle, MSG.Retract, fnRetract, STATE.Retracting);
|
|
|
|
- Transition(STATE.Retracting, MSG.ActionDone, fnActionDone, STATE.Idle);
|
|
|
|
|
|
|
|
// Map
|
|
// Map
|
|
- Transition(STATE.Idle, MSG.Map, fnMap, STATE.Mapping);
|
|
|
|
- Transition(STATE.Mapping, MSG.ActionDone, fnActionDone, STATE.Idle);
|
|
|
|
|
|
+ Transition(STATE.Idle, MSG.Map, fnMap, STATE.Mapping);
|
|
|
|
+ Transition(STATE.Mapping, MSG.ActionDone, fnActionDone, STATE.Idle);
|
|
|
|
|
|
// Grip
|
|
// Grip
|
|
- Transition(STATE.Idle, MSG.Grip, fnGrip, STATE.Gripping);
|
|
|
|
- Transition(STATE.Gripping, MSG.ActionDone, fnActionDone, STATE.Idle);
|
|
|
|
|
|
+ Transition(STATE.Idle, MSG.Grip, fnGrip, STATE.Gripping);
|
|
|
|
+ Transition(STATE.Gripping, MSG.ActionDone, fnActionDone, STATE.Idle);
|
|
|
|
|
|
// Ungrip
|
|
// Ungrip
|
|
- Transition(STATE.Idle, MSG.Ungrip, fnUngrip, STATE.Ungripping);
|
|
|
|
- Transition(STATE.Ungripping, MSG.ActionDone, fnActionDone, STATE.Idle);
|
|
|
|
|
|
+ Transition(STATE.Idle, MSG.Ungrip, fnUngrip, STATE.Ungripping);
|
|
|
|
+ Transition(STATE.Ungripping, MSG.ActionDone, fnActionDone, STATE.Idle);
|
|
|
|
|
|
// Aligner
|
|
// Aligner
|
|
- Transition(STATE.Idle, MSG.HomeAL, fnHomeAligner, STATE.InitingAL);
|
|
|
|
- Transition(STATE.InitingAL, MSG.ActionDone, fnActionDone, STATE.Idle);
|
|
|
|
- Transition(STATE.Idle, MSG.Lift, fnLift, STATE.Lifting);
|
|
|
|
- Transition(STATE.Lifting, MSG.LiftActionDone, fnActionDone, STATE.Idle);
|
|
|
|
- Transition(STATE.Idle, MSG.Align, fnAlign, STATE.Aligning);
|
|
|
|
- Transition(STATE.Aligning, MSG.ActionDone, fnActionDone, STATE.Idle);
|
|
|
|
|
|
+ Transition(STATE.Idle, MSG.HomeAL, fnHomeAligner, STATE.InitingAL);
|
|
|
|
+ Transition(STATE.InitingAL, MSG.ActionDone, fnActionDone, STATE.Idle);
|
|
|
|
+ Transition(STATE.Idle, MSG.Lift, fnLift, STATE.Lifting);
|
|
|
|
+ Transition(STATE.Lifting, MSG.LiftActionDone, fnActionDone, STATE.Idle);
|
|
|
|
+ Transition(STATE.Idle, MSG.Align, fnAlign, STATE.Aligning);
|
|
|
|
+ Transition(STATE.Aligning, MSG.ActionDone, fnActionDone, STATE.Idle);
|
|
|
|
|
|
|
|
|
|
EnumLoop<STATE>.ForEach((item) => { fsm.MapState((int)item, item.ToString()); });
|
|
EnumLoop<STATE>.ForEach((item) => { fsm.MapState((int)item, item.ToString()); });
|
|
@@ -286,7 +267,6 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
private bool fnHomeAll(object[] param)
|
|
private bool fnHomeAll(object[] param)
|
|
{
|
|
{
|
|
- _efem.ClearActions();
|
|
|
|
_efem.HomeAll();
|
|
_efem.HomeAll();
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
@@ -314,71 +294,17 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
private bool fnEnterExecute(object[] param)
|
|
private bool fnEnterExecute(object[] param)
|
|
{
|
|
{
|
|
- _efem.ExecuteAction();
|
|
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
private bool fnExitExecute(object[] param)
|
|
private bool fnExitExecute(object[] param)
|
|
{
|
|
{
|
|
- _efem.ExecuteAction();
|
|
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
private bool fnActionDone(object[] param)
|
|
private bool fnActionDone(object[] param)
|
|
{
|
|
{
|
|
- try
|
|
|
|
- {
|
|
|
|
- EfemOperation actionType = (EfemOperation)param[0];
|
|
|
|
-
|
|
|
|
- if ((actionType == EfemOperation.Orgsh || actionType == EfemOperation.Home) && (fsm.State == (int)STATE.Orgshing))
|
|
|
|
- {
|
|
|
|
- if (_efem.HasActions)
|
|
|
|
- {
|
|
|
|
- _efem.ExecuteAction();
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (actionType == EfemOperation.Extend)
|
|
|
|
- {
|
|
|
|
- if (fsm.State == (int)STATE.Placing)
|
|
|
|
- {
|
|
|
|
- _efem.ExecuteAction();
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- else if (fsm.State == (int)STATE.Picking)
|
|
|
|
- {
|
|
|
|
- if (_efem.HasActions)
|
|
|
|
- {
|
|
|
|
- _efem.ExecuteAction();
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- return true;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- else if (fsm.State == (int)STATE.Swapping)
|
|
|
|
- {
|
|
|
|
- if (_efem.HasActions)
|
|
|
|
- {
|
|
|
|
- _efem.ExecuteAction();
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- return true;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return true;
|
|
|
|
- }
|
|
|
|
- catch (Exception ex)
|
|
|
|
- {
|
|
|
|
- EV.PostAlarmLog(ModuleName.EFEM.ToString(), ex.Message);
|
|
|
|
- return true;
|
|
|
|
- }
|
|
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
|
|
|
|
public bool CheckToPostMessage(int msg, params object[] args)
|
|
public bool CheckToPostMessage(int msg, params object[] args)
|
|
@@ -395,19 +321,6 @@ namespace Venus_RT.Modules
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
- private bool fnRecMsg(object[] param)
|
|
|
|
- {
|
|
|
|
- if (param == null) return false;
|
|
|
|
- string strHwMsg = param[0] as string;
|
|
|
|
-
|
|
|
|
- if (_efem is EfemBase device)
|
|
|
|
- {
|
|
|
|
- device.ReceiveMessage(strHwMsg);
|
|
|
|
- return true;
|
|
|
|
- }
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
private bool fnMonitor(object[] param)
|
|
private bool fnMonitor(object[] param)
|
|
{
|
|
{
|
|
STATE curSt = (STATE)fsm.State;
|
|
STATE curSt = (STATE)fsm.State;
|
|
@@ -471,7 +384,6 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
private bool fnRecover(object[] param)
|
|
private bool fnRecover(object[] param)
|
|
{
|
|
{
|
|
- _efem.ClearActions();
|
|
|
|
_efem.ClearError();
|
|
_efem.ClearError();
|
|
//_efem.ExecuteAction();
|
|
//_efem.ExecuteAction();
|
|
return true;
|
|
return true;
|
|
@@ -479,8 +391,6 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
private bool fnAbortRobot(object[] param)
|
|
private bool fnAbortRobot(object[] param)
|
|
{
|
|
{
|
|
- _efem.ClearActions();
|
|
|
|
- _efem.AbortRobot();
|
|
|
|
//_efem.ExecuteAction();
|
|
//_efem.ExecuteAction();
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
@@ -496,7 +406,6 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
private bool fnTurnOffBuzzer(object[] param)
|
|
private bool fnTurnOffBuzzer(object[] param)
|
|
{
|
|
{
|
|
- _efem.TurnOffBuzzer();
|
|
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -509,197 +418,79 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
private bool fnSetLampDone(object[] param)
|
|
private bool fnSetLampDone(object[] param)
|
|
{
|
|
{
|
|
- if (_efem.HasActions)
|
|
|
|
- {
|
|
|
|
- _efem.ExecuteAction();
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
{
|
|
{
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- private bool fnPick(object[] param)
|
|
|
|
|
|
+ private bool FnStartPick(object[] param)
|
|
{
|
|
{
|
|
- // module
|
|
|
|
- ModuleName unit = ModuleName.EFEM;
|
|
|
|
- if (param[0] is string s1)
|
|
|
|
- unit = ModuleNameString.ToEnum(s1);
|
|
|
|
- else if (param[0] is ModuleName mod)
|
|
|
|
- unit = mod;
|
|
|
|
- else
|
|
|
|
- throw new ArgumentException("Argument error");
|
|
|
|
-
|
|
|
|
- // slot
|
|
|
|
- byte slot = (byte)(int)param[1];
|
|
|
|
-
|
|
|
|
- // hand
|
|
|
|
- Hand arm = (Hand)Enum.Parse(typeof(Hand), param[2].ToString());
|
|
|
|
|
|
+ return _pickRoutine.Start(param) == RState.Running;
|
|
|
|
+ }
|
|
|
|
|
|
- // wafer size
|
|
|
|
- WaferSize ws1 = WaferSize.WS0;
|
|
|
|
- if (param[3] is string s2)
|
|
|
|
- {
|
|
|
|
- if (Enum.TryParse(s2, out WaferSize p5))
|
|
|
|
- ws1 = p5;
|
|
|
|
- }
|
|
|
|
- else if (param[3] is WaferSize p6)
|
|
|
|
|
|
+ private bool FnPickTimeout(object[] param)
|
|
|
|
+ {
|
|
|
|
+ RState ret = _pickRoutine.Monitor();
|
|
|
|
+ if (ret == RState.Failed || ret == RState.Timeout)
|
|
{
|
|
{
|
|
- ws1 = p6;
|
|
|
|
|
|
+ PostMsg(MSG.Error);
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
|
|
|
|
- MoveParam mp = new MoveParam(unit, slot, ModuleName.EfemRobot, (byte)arm, arm, ws1);
|
|
|
|
- if (!_efem.Pick(mp))
|
|
|
|
- return false;
|
|
|
|
|
|
+ return ret == RState.End;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ private bool FnAbortPick(object[] param)
|
|
|
|
+ {
|
|
|
|
+ _pickRoutine.Abort();
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
-
|
|
|
|
- private bool fnPlace(object[] param)
|
|
|
|
|
|
+ private bool FnStartPlace(object[] param)
|
|
{
|
|
{
|
|
- // module
|
|
|
|
- ModuleName unit = ModuleName.EFEM;
|
|
|
|
- if (param[0] is string s1)
|
|
|
|
- unit = ModuleNameString.ToEnum(s1);
|
|
|
|
- else if (param[0] is ModuleName mod)
|
|
|
|
- unit = mod;
|
|
|
|
- else
|
|
|
|
- throw new ArgumentException("Argument error");
|
|
|
|
-
|
|
|
|
- // slot
|
|
|
|
- byte slot = (byte)(int)param[1];
|
|
|
|
-
|
|
|
|
- // hand
|
|
|
|
- Hand arm = (Hand)Enum.Parse(typeof(Hand), param[2].ToString());
|
|
|
|
|
|
+ return _placeRoutine.Start(param) == RState.Running;
|
|
|
|
+ }
|
|
|
|
|
|
- // wafer size
|
|
|
|
- WaferSize ws1 = WaferSize.WS0;
|
|
|
|
- if (param[3] is string s2)
|
|
|
|
- {
|
|
|
|
- if (Enum.TryParse(s2, out WaferSize p5))
|
|
|
|
- ws1 = p5;
|
|
|
|
- }
|
|
|
|
- else if (param[3] is WaferSize p6)
|
|
|
|
|
|
+ private bool FnPlaceTimeout(object[] param)
|
|
|
|
+ {
|
|
|
|
+ RState ret = _placeRoutine.Monitor();
|
|
|
|
+ if (ret == RState.Failed || ret == RState.Timeout)
|
|
{
|
|
{
|
|
- ws1 = p6;
|
|
|
|
|
|
+ PostMsg(MSG.Error);
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
|
|
|
|
- MoveParam mp = new MoveParam(ModuleName.EfemRobot, (byte)arm, unit, slot, arm, ws1);
|
|
|
|
- if (!_efem.Place(mp))
|
|
|
|
- return false;
|
|
|
|
-
|
|
|
|
- return true;
|
|
|
|
|
|
+ return ret == RState.End;
|
|
}
|
|
}
|
|
|
|
|
|
- private bool fnGoto(object[] param)
|
|
|
|
|
|
+ private bool FnAbortPlace(object[] param)
|
|
{
|
|
{
|
|
- // module
|
|
|
|
- ModuleName unit = ModuleName.EFEM;
|
|
|
|
- if (param[0] is string s1)
|
|
|
|
- unit = ModuleNameString.ToEnum(s1);
|
|
|
|
- else if (param[0] is ModuleName mod)
|
|
|
|
- unit = mod;
|
|
|
|
- else
|
|
|
|
- throw new ArgumentException("Argument error");
|
|
|
|
-
|
|
|
|
- // slot
|
|
|
|
- byte slot = (byte)(int)param[1];
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- Hand arm = Hand.Blade1;
|
|
|
|
-
|
|
|
|
- WaferSize ws = WaferSize.WS6;
|
|
|
|
-
|
|
|
|
- if (WaferManager.Instance.CheckHasWafer(ModuleName.EfemRobot, 0))
|
|
|
|
- {
|
|
|
|
- arm = Hand.Blade1;
|
|
|
|
- ws = WaferManager.Instance.GetWafer(ModuleName.EfemRobot, 0).Size;
|
|
|
|
- }
|
|
|
|
- else if (WaferManager.Instance.CheckHasWafer(ModuleName.EfemRobot, 1))
|
|
|
|
- {
|
|
|
|
- arm = Hand.Blade2;
|
|
|
|
- ws = WaferManager.Instance.GetWafer(ModuleName.EfemRobot, 1).Size;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- MoveParam mp = new MoveParam(unit, slot, unit, slot, arm, ws);
|
|
|
|
- _efem.Goto(mp);
|
|
|
|
|
|
+ _placeRoutine.Abort();
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
- private bool fnSwap(object[] param)
|
|
|
|
|
|
+ private bool FnStartSwap(object[] param)
|
|
{
|
|
{
|
|
- // module
|
|
|
|
- ModuleName unit = ModuleName.EFEM;
|
|
|
|
- if (param[0] is string s1)
|
|
|
|
- unit = ModuleNameString.ToEnum(s1);
|
|
|
|
- else if (param[0] is ModuleName mod)
|
|
|
|
- unit = mod;
|
|
|
|
- else
|
|
|
|
- throw new ArgumentException("Argument error");
|
|
|
|
-
|
|
|
|
- // pickSlot
|
|
|
|
- byte pickSlot = (byte)(int)param[1];
|
|
|
|
-
|
|
|
|
- // pick hand
|
|
|
|
- Hand pickArm = (Hand)Enum.Parse(typeof(Hand), param[2].ToString());
|
|
|
|
|
|
+ return _swapRoutine.Start(param) == RState.Running;
|
|
|
|
+ }
|
|
|
|
|
|
- // wafer size
|
|
|
|
- WaferSize ws1 = WaferSize.WS0;
|
|
|
|
- if (param[5] is string s2)
|
|
|
|
- {
|
|
|
|
- if (Enum.TryParse(s2, out WaferSize p5))
|
|
|
|
- ws1 = p5;
|
|
|
|
- }
|
|
|
|
- else if (param[5] is WaferSize p6)
|
|
|
|
|
|
+ private bool FnSwapTimeout(object[] param)
|
|
|
|
+ {
|
|
|
|
+ RState ret = _swapRoutine.Monitor();
|
|
|
|
+ if (ret == RState.Failed || ret == RState.Timeout)
|
|
{
|
|
{
|
|
- ws1 = p6;
|
|
|
|
|
|
+ PostMsg(MSG.Error);
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
|
|
|
|
- MoveParam pickParam = new MoveParam(unit, pickSlot, ModuleName.EfemRobot, (byte)pickArm, pickArm, ws1);
|
|
|
|
-
|
|
|
|
- // place slot
|
|
|
|
- byte placeSlot = (byte)(int)param[4];
|
|
|
|
-
|
|
|
|
- // hand
|
|
|
|
- Hand placeArm = (Hand)Enum.Parse(typeof(Hand), param[3].ToString());
|
|
|
|
-
|
|
|
|
- MoveParam placeParam = new MoveParam(ModuleName.EfemRobot, (byte)placeArm, unit, placeSlot, placeArm, ws1);
|
|
|
|
-
|
|
|
|
- _efem.PickAndPlace(pickParam, placeParam);
|
|
|
|
- return true;
|
|
|
|
|
|
+ return ret == RState.End;
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- private bool fnExtend(object[] param)
|
|
|
|
|
|
+ private bool FnAbortSwap(object[] param)
|
|
{
|
|
{
|
|
- // module
|
|
|
|
- ModuleName unit = ModuleName.EFEM;
|
|
|
|
- if (param[0] is string s1)
|
|
|
|
- unit = ModuleNameString.ToEnum(s1);
|
|
|
|
- else if (param[0] is ModuleName mod)
|
|
|
|
- unit = mod;
|
|
|
|
- else
|
|
|
|
- throw new ArgumentException("Argument error");
|
|
|
|
-
|
|
|
|
- Hand arm = (Hand)Enum.Parse(typeof(Hand), (string)param[2]);
|
|
|
|
-
|
|
|
|
- ExtendParam mp = new ExtendParam
|
|
|
|
- {
|
|
|
|
- Module = unit,
|
|
|
|
- Arm = arm,
|
|
|
|
- Pos = (ExtendPos)Enum.Parse(typeof(ExtendPos), param[1] as string)
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- if (!_efem.Extend(mp))
|
|
|
|
- return false;
|
|
|
|
-
|
|
|
|
|
|
+ _swapRoutine.Abort();
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
-
|
|
|
|
- private bool fnRetract(object[] param)
|
|
|
|
|
|
+ private bool fnGoto(object[] param)
|
|
{
|
|
{
|
|
// module
|
|
// module
|
|
ModuleName unit = ModuleName.EFEM;
|
|
ModuleName unit = ModuleName.EFEM;
|
|
@@ -710,49 +501,10 @@ namespace Venus_RT.Modules
|
|
else
|
|
else
|
|
throw new ArgumentException("Argument error");
|
|
throw new ArgumentException("Argument error");
|
|
|
|
|
|
- Hand arm = (Hand)Enum.Parse(typeof(Hand), (string)param[2]);
|
|
|
|
-
|
|
|
|
- ExtendParam mp = new ExtendParam
|
|
|
|
- {
|
|
|
|
- Module = unit,
|
|
|
|
- Arm = arm,
|
|
|
|
- Pos = (ExtendPos)Enum.Parse(typeof(ExtendPos), param[1] as string)
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- if (!_efem.Retract(mp))
|
|
|
|
- return false;
|
|
|
|
-
|
|
|
|
|
|
+ _efem.Goto(unit);
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
- private bool fnPmPinUp(object[] param)
|
|
|
|
- {
|
|
|
|
- _efem.UpdateStatus((ushort)param[0], ActionStatus.Completed);
|
|
|
|
- if (_efem.HasActions)
|
|
|
|
- {
|
|
|
|
- _efem.ExecuteAction();
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- return true;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- private bool fnPmPinDown(object[] param)
|
|
|
|
- {
|
|
|
|
- _efem.UpdateStatus((ushort)param[0], ActionStatus.Completed);
|
|
|
|
- if (_efem.HasActions)
|
|
|
|
- {
|
|
|
|
- _efem.ExecuteAction();
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- return true;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
private bool fnLift(object[] param)
|
|
private bool fnLift(object[] param)
|
|
{
|
|
{
|
|
// module
|
|
// module
|
|
@@ -944,8 +696,8 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
public int InvokePickAndPlace(ModuleName targetModule, Hand pickHand, int pickSlot, Hand placeHand, int placeSlot, WaferSize size)
|
|
public int InvokePickAndPlace(ModuleName targetModule, Hand pickHand, int pickSlot, Hand placeHand, int placeSlot, WaferSize size)
|
|
{
|
|
{
|
|
- if (CheckToPostMessage((int)MSG.PickAndPlace, targetModule, pickSlot, pickHand, placeHand, placeSlot, size))
|
|
|
|
- return (int)MSG.PickAndPlace;
|
|
|
|
|
|
+ if (CheckToPostMessage((int)MSG.Swap, targetModule, pickSlot, pickHand, placeHand, placeSlot, size))
|
|
|
|
+ return (int)MSG.Swap;
|
|
|
|
|
|
return (int)FSM_MSG.NONE;
|
|
return (int)FSM_MSG.NONE;
|
|
}
|
|
}
|
|
@@ -968,16 +720,16 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
public bool IsPrepareTransferReady(ModuleName module, EnumTransferType type, int slot)
|
|
public bool IsPrepareTransferReady(ModuleName module, EnumTransferType type, int slot)
|
|
{
|
|
{
|
|
- if (type == EnumTransferType.Pick)
|
|
|
|
- {
|
|
|
|
- //需要补充:判断LP 放好了,而且已经map过。
|
|
|
|
- return _efem[module].HasCassette && _efem[module].IsMapped;
|
|
|
|
- }
|
|
|
|
- else if (type == EnumTransferType.Place)
|
|
|
|
- {
|
|
|
|
- //需要补充:判断LP 放好了,而且已经map过。
|
|
|
|
- return _efem[module].HasCassette && _efem[module].IsMapped;
|
|
|
|
- }
|
|
|
|
|
|
+ //if (type == EnumTransferType.Pick)
|
|
|
|
+ //{
|
|
|
|
+ // //需要补充:判断LP 放好了,而且已经map过。
|
|
|
|
+ // return _efem[module].HasCassette && _efem[module].IsMapped;
|
|
|
|
+ //}
|
|
|
|
+ //else if (type == EnumTransferType.Place)
|
|
|
|
+ //{
|
|
|
|
+ // //需要补充:判断LP 放好了,而且已经map过。
|
|
|
|
+ // return _efem[module].HasCassette && _efem[module].IsMapped;
|
|
|
|
+ //}
|
|
|
|
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
@@ -990,21 +742,24 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
internal bool CheckReadyTransfer(ModuleName module)
|
|
internal bool CheckReadyTransfer(ModuleName module)
|
|
{
|
|
{
|
|
- return _efem[module].HasCassette && _efem[module].IsMapped;
|
|
|
|
|
|
+ //return _efem[module].HasCassette && _efem[module].IsMapped;
|
|
|
|
+ return true;
|
|
}
|
|
}
|
|
internal bool CheckPlaced(ModuleName module)
|
|
internal bool CheckPlaced(ModuleName module)
|
|
{
|
|
{
|
|
- return _efem[module].HasCassette;
|
|
|
|
|
|
+ //return _efem[module].HasCassette;
|
|
|
|
+ return true;
|
|
}
|
|
}
|
|
|
|
|
|
internal void NoteJobStart(ModuleName module)
|
|
internal void NoteJobStart(ModuleName module)
|
|
{
|
|
{
|
|
- _efem[module].NoteJobStart();
|
|
|
|
|
|
+ //_efem[module].NoteJobStart();
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
internal void NoteJobComplete(ModuleName module)
|
|
internal void NoteJobComplete(ModuleName module)
|
|
{
|
|
{
|
|
- _efem[module].NoteJobComplete();
|
|
|
|
|
|
+ //_efem[module].NoteJobComplete();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1035,11 +790,11 @@ namespace Venus_RT.Modules
|
|
Error // 7
|
|
Error // 7
|
|
}
|
|
}
|
|
|
|
|
|
- private readonly Efem _efem;
|
|
|
|
|
|
+ private readonly EfemBase _efem;
|
|
|
|
|
|
private ModuleName Module { get; }
|
|
private ModuleName Module { get; }
|
|
|
|
|
|
- public LoadportEntity(ModuleName mod, Efem efem)
|
|
|
|
|
|
+ public LoadportEntity(ModuleName mod, EfemBase efem)
|
|
{
|
|
{
|
|
this.Module = mod;
|
|
this.Module = mod;
|
|
_efem = efem;
|
|
_efem = efem;
|
|
@@ -1089,7 +844,7 @@ namespace Venus_RT.Modules
|
|
private bool fnOnline(object[] param)
|
|
private bool fnOnline(object[] param)
|
|
{
|
|
{
|
|
bool online = (bool)param[0];
|
|
bool online = (bool)param[0];
|
|
- _efem.SetOnline(Module, online);
|
|
|
|
|
|
+ //_efem.SetOnline(Module, online);
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1113,7 +868,6 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
private bool fnEnterExecute(object[] param)
|
|
private bool fnEnterExecute(object[] param)
|
|
{
|
|
{
|
|
- _efem.ExecuteAction();
|
|
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|