|
@@ -21,6 +21,7 @@ namespace Venus_RT.Modules.TM
|
|
|
private enum PlaceStep
|
|
|
{
|
|
|
WaitPMReady,
|
|
|
+ PreRotation,
|
|
|
PMPrepare,
|
|
|
ArmExtend,
|
|
|
QueryAWC,
|
|
@@ -43,6 +44,7 @@ namespace Venus_RT.Modules.TM
|
|
|
|
|
|
private DateTime _starttime;
|
|
|
private bool _queryAwc;
|
|
|
+ private Dictionary<ModuleName, ModuleName> _rotateModules = new Dictionary<ModuleName, ModuleName>();
|
|
|
public MFPMPlaceRoutine(JetTM tm, ITransferRobot robot) : base(ModuleName.TMRobot)
|
|
|
{
|
|
|
_JetTM = tm;
|
|
@@ -53,6 +55,19 @@ namespace Venus_RT.Modules.TM
|
|
|
_queryAwc = true;
|
|
|
else
|
|
|
_queryAwc = false;
|
|
|
+
|
|
|
+ foreach (var mod in new List<ModuleName> { ModuleName.PMA, ModuleName.PMB, ModuleName.PMC, ModuleName.PMD})
|
|
|
+ {
|
|
|
+ string rotateModule = SC.GetStringValue($"TM.PreRotation.{mod}");
|
|
|
+ if(rotateModule.Length == 3)
|
|
|
+ {
|
|
|
+ ModuleName rotModule = ModuleHelper.Converter(rotateModule);
|
|
|
+ if(ModuleHelper.IsPm(rotModule) || ModuleHelper.IsLoadLock(rotModule))
|
|
|
+ {
|
|
|
+ _rotateModules.Add(mod, rotModule);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
public RState Start(params object[] objs)
|
|
|
{
|
|
@@ -102,15 +117,17 @@ namespace Venus_RT.Modules.TM
|
|
|
|
|
|
public RState Monitor()
|
|
|
{
|
|
|
- Runner.Wait(PlaceStep.WaitPMReady, () => _pmModule.IsIdle, _delay_60s)
|
|
|
- .Run(PlaceStep.PMPrepare, ModulePrepare, IsModulePrepareReady, _delay_60s)
|
|
|
- .Run(PlaceStep.ArmExtend, ArmExtend, WaitRobotExtendDone, _placingTimeout)
|
|
|
- .Run(PlaceStep.QueryAWC, QueryAWC, WaitRobotQueryDone, _delay_1s)
|
|
|
- .Run(PlaceStep.LiftUpWafer, NotifyPMPlaceWafer, WaitPMWaferLiftUp, _delay_30s)
|
|
|
- .Delay(PlaceStep.PlaceDelay, _placeDelayTime)
|
|
|
- .Run(PlaceStep.ArmRetract, ArmRetract, WaitRobotRetractDone, _delay_30s)
|
|
|
- .Run(PlaceStep.SavePlaceData, RecordAWCData, NullFun)
|
|
|
- .End(PlaceStep.NotifyDone, NotifyPMDone, _delay_50ms);
|
|
|
+ Runner.Wait(PlaceStep.WaitPMReady, () => _pmModule.IsIdle, _delay_60s)
|
|
|
+ .RunIf(PlaceStep.PreRotation, _rotateModules.ContainsKey(_targetModule), RotateArm, WaitRotateDone)
|
|
|
+ .Run(PlaceStep.PMPrepare, ModulePrepare, IsModulePrepareReady, _delay_60s)
|
|
|
+ .Run(PlaceStep.ArmExtend, ArmExtend, WaitRobotExtendDone, _placingTimeout)
|
|
|
+ .Run(PlaceStep.QueryAWC, QueryAWC, WaitRobotQueryDone, _delay_1s)
|
|
|
+ .Run(PlaceStep.LiftUpWafer, NotifyPMPlaceWafer, WaitPMWaferLiftUp, _delay_30s)
|
|
|
+ .Delay(PlaceStep.PlaceDelay, _placeDelayTime)
|
|
|
+ .Run(PlaceStep.ArmRetract, ArmRetract, WaitRobotRetractDone, _delay_30s)
|
|
|
+ .Run(PlaceStep.SavePlaceData, RecordAWCData, NullFun)
|
|
|
+ .End(PlaceStep.NotifyDone, NotifyPMDone, _delay_50ms);
|
|
|
+
|
|
|
return Runner.Status;
|
|
|
}
|
|
|
|
|
@@ -125,6 +142,29 @@ namespace Venus_RT.Modules.TM
|
|
|
return _pmModule.Status == PMEntity.PMStatus.Ready_For_Place && _pmModule.IsSlitDoorOpen;
|
|
|
}
|
|
|
|
|
|
+ private bool RotateArm()
|
|
|
+ {
|
|
|
+ _pmModule.PostMsg(PMEntity.MSG.PreparePlace); // Notify PM to Serv pressure in advance for throughput enhancement
|
|
|
+ return _robot.Goto(_rotateModules[_targetModule], 0, _hand);
|
|
|
+ }
|
|
|
+
|
|
|
+ private bool WaitRotateDone()
|
|
|
+ {
|
|
|
+ if (_robot.Status == RState.Running)
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ else if (_robot.Status == RState.End)
|
|
|
+ {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Runner.Stop($"TM Robot Rotate Arm failed, {_robot.Status}");
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private bool ArmExtend()
|
|
|
{
|
|
|
return _robot.PlaceExtend(_targetModule, _targetSlot, _hand);
|
|
@@ -138,7 +178,7 @@ namespace Venus_RT.Modules.TM
|
|
|
if (!_queryAwc)
|
|
|
return true;
|
|
|
else
|
|
|
- return _robot.QueryAwc(); ;
|
|
|
+ return _robot.QueryAwc();
|
|
|
}
|
|
|
private bool WaitRobotExtendDone()
|
|
|
{
|