|
@@ -32,54 +32,47 @@ namespace CyberX8_RT.Modules.Transporter
|
|
|
private enum PutDownStep
|
|
|
{
|
|
|
CheckPreStatus,
|
|
|
- TargetCellUnclamp,
|
|
|
- TargetCellUnclampWait,
|
|
|
ElevatorUp,
|
|
|
ElevatorUpWait,
|
|
|
- ImmobilizeExtend,
|
|
|
- ImmobilizeExtendWait,
|
|
|
SafeMoveTo,
|
|
|
CheckMoveToStatus,
|
|
|
GantryPosition,
|
|
|
GantryPositiolWait,
|
|
|
CalculatePlaceSpeed,
|
|
|
- PlaceDelay,
|
|
|
- ImmobilizeRetract,
|
|
|
- ImmobilizeRetractWait,
|
|
|
- ElevatorPosition,
|
|
|
- ElevatorPositionWait,
|
|
|
- UnlockClamp,
|
|
|
- UnlockClampWait,
|
|
|
- ElevatorLow,
|
|
|
- ElevatorLowWait,
|
|
|
- ConfirmWHPresent,
|
|
|
- LockClamp,
|
|
|
- LockClampWait,
|
|
|
+ PlaceDelay,
|
|
|
+ ElevatorPositionToCellTop,
|
|
|
+ ElevatorPositionToCellTopWait,
|
|
|
+ Delay,
|
|
|
+ ElevatorPositionToCell,
|
|
|
+ ElevatorPositionToCellWait,
|
|
|
+ DropBlockLockoff,
|
|
|
+ ElevatorGotoUp,
|
|
|
+ ElevatorGotoUpWait,
|
|
|
+ ConfirmWSPresent,
|
|
|
UpdateWaferHolder,
|
|
|
GantryPositionPark,
|
|
|
GantryPositionParkWait,
|
|
|
- End
|
|
|
+ End
|
|
|
}
|
|
|
|
|
|
#region 内部变量
|
|
|
private string _cellName;
|
|
|
+ private string _otherModule;
|
|
|
private JetAxisBase _gantryAxis;
|
|
|
private JetAxisBase _elevatorAxis;
|
|
|
+ private JetAxisBase _otherElevatorAxis;
|
|
|
private LoaderEntity _loaderEntity;
|
|
|
private JetAxisBase _loaderRotationAxis;
|
|
|
private SystemFacilities _facilities;
|
|
|
- private TransporterUnlockRoutine _unlockRoutine;
|
|
|
- private TransporterLockRoutine _lockRoutine;
|
|
|
private TransporterCommon _transporterCommon;
|
|
|
- private TransporterExtendRoutine _extendRoutine;
|
|
|
- private TransporterRetractRoutine _retractRoutine;
|
|
|
private TransporterConflictRoutine _conflictRoutine;
|
|
|
- private LoaderPreTransferUnclampRoutine _preTransferUnclampRoutine;
|
|
|
+ private LoaderCommonDevice _loaderCommonDevice;
|
|
|
ProcessLayoutCellItem _cellItem;
|
|
|
private int _placeTime;
|
|
|
private int _placeDelayTime;
|
|
|
private int _velocity;
|
|
|
private int _acceleration;
|
|
|
+ private bool _bypassWaferHolderPresent;
|
|
|
#endregion
|
|
|
/// <summary>
|
|
|
/// 构造函数
|
|
@@ -102,163 +95,42 @@ namespace CyberX8_RT.Modules.Transporter
|
|
|
public RState Monitor()
|
|
|
{
|
|
|
Runner.Run(PutDownStep.CheckPreStatus,CheckStartPreConfition,_delay_1ms)
|
|
|
- .Run(PutDownStep.TargetCellUnclamp, TargetCellUnclamp, _delay_1ms)
|
|
|
- .WaitWithStopCondition(PutDownStep.TargetCellUnclampWait,TargetCellUnclampEndStatus,TargetCellUnclampStopStatus)
|
|
|
- //1.1 Elevator Position Up
|
|
|
+ //1. Elevator 移动至Up
|
|
|
.Run(PutDownStep.ElevatorUp, ElevatorGotoUp, _delay_1ms)
|
|
|
- .WaitWithStopCondition(PutDownStep.ElevatorUpWait, CheckVerticalPositionStatus, CheckVerticalPositionRunStop)
|
|
|
- //1.2 Immobilized Extend
|
|
|
- .Run(PutDownStep.ImmobilizeExtend, () => { return _extendRoutine.Start(null) == RState.Running; }, NullFun, _delay_1ms)
|
|
|
- .WaitWithStopCondition(PutDownStep.ImmobilizeExtendWait, () => { return CommonFunction.CheckRoutineEndState(_extendRoutine); },
|
|
|
- CheckImmobilizeRoutineStopStatus)
|
|
|
- //1.3 Move to 安全
|
|
|
+ .WaitWithStopCondition(PutDownStep.ElevatorUpWait, CheckElevatorPositionEndStatus, CheckElevatorPositionStopStatus)
|
|
|
+ //2. other Transporter Safe Move
|
|
|
.Run(PutDownStep.SafeMoveTo, SafeMoveTo, _delay_1ms)
|
|
|
.WaitWithStopCondition(PutDownStep.CheckMoveToStatus, () => CommonFunction.CheckRoutineEndState(_conflictRoutine),
|
|
|
CheckSafeMoveToStopStatus)
|
|
|
- //1.3 Gantry 移动
|
|
|
+ //3. Gantry 移动
|
|
|
.Run(PutDownStep.GantryPosition, GantryPositionToCell, _delay_1ms)
|
|
|
.WaitWithStopCondition(PutDownStep.GantryPositiolWait, CheckGantryPositionStatus, CheckGantryPositionRunStop)
|
|
|
- //1.4 确认Place 速度和加速度
|
|
|
+ //4. 确认Place 速度和加速度
|
|
|
.Run(PutDownStep.CalculatePlaceSpeed, CalculatePownDownSpeed, _delay_1ms)
|
|
|
- //1.5 Pickup delay
|
|
|
- .Delay(PutDownStep.PlaceDelay, _placeDelayTime * 1000)
|
|
|
- //1.6 Immobilize Retract
|
|
|
- .Run(PutDownStep.ImmobilizeRetract, () => { return _retractRoutine.Start(null) == RState.Running; }, NullFun, _delay_1ms)
|
|
|
- .WaitWithStopCondition(PutDownStep.ImmobilizeRetractWait, ()=> CommonFunction.CheckRoutineEndState(_retractRoutine),
|
|
|
- CheckRetractStopStatus)
|
|
|
- //.WaitWithStopCondition(PutDownStep.CellRetractedWait, CheckCellRetractRoutineEndState, CheckCellRetractRoutineStopState)
|
|
|
- //1.7 Elevator 移动至cell
|
|
|
- .Run(PutDownStep.ElevatorPosition, () => { return VerticalPositionToCell(); }, NullFun, _delay_1ms)
|
|
|
- .WaitWithStopCondition(PutDownStep.ElevatorPositionWait, CheckVerticalPositionStatus, CheckVerticalPositionRunStop)
|
|
|
- //1.8 Unlock clamp
|
|
|
- .Run(PutDownStep.UnlockClamp, () => { return _unlockRoutine.Start(null) == RState.Running; },_delay_1ms)
|
|
|
- .WaitWithStopCondition(PutDownStep.UnlockClampWait,()=>CommonFunction.CheckRoutineEndState(_unlockRoutine),
|
|
|
- CheckUnlockRoutineStopStatus)
|
|
|
- //1.9 Elevator Position Low
|
|
|
- .Run(PutDownStep.ElevatorLow, ElevatorGotoLow, _delay_1ms)
|
|
|
- .WaitWithStopCondition(PutDownStep.ElevatorLowWait, CheckVerticalPositionStatus, CheckVerticalPositionRunStop)
|
|
|
- //2.0 确认WhPresent信号
|
|
|
- .Wait(PutDownStep.ConfirmWHPresent,ConfirmWHPresentSensorOff,_delay_2s)
|
|
|
- //2.1 Lock clamp
|
|
|
- .Run(PutDownStep.LockClamp, () => { return _lockRoutine.Start(null) == RState.Running; },_delay_1ms)
|
|
|
- .WaitWithStopCondition(PutDownStep.LockClampWait,()=>CommonFunction.CheckRoutineEndState(_lockRoutine),
|
|
|
- CheckLockRoutineStopStatus)
|
|
|
- //2.2 Wafer Holder location update
|
|
|
+ //5. Pickup delay
|
|
|
+ .Delay(PutDownStep.PlaceDelay, _placeDelayTime * 1000)
|
|
|
+ //6. Elevator 移动至cellTop
|
|
|
+ .Run(PutDownStep.ElevatorPositionToCellTop, ElevatorPositionToCellTop, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(PutDownStep.ElevatorPositionToCellTopWait, CheckElevatorPositionEndStatus, CheckElevatorPositionStopStatus)
|
|
|
+ .Delay(PutDownStep.Delay, 500)
|
|
|
+ //7. Elevator 移动至cell
|
|
|
+ .Run(PutDownStep.ElevatorPositionToCell, ElevatorPositionToCell, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(PutDownStep.ElevatorPositionToCellWait, CheckElevatorPositionEndStatus, CheckElevatorPositionStopStatus)
|
|
|
+ //8. DropBlockLock off
|
|
|
+ .Run(PutDownStep.DropBlockLockoff, DropBlockLockoff , _delay_1ms)
|
|
|
+ //9. Elevator移动至Up
|
|
|
+ .Run(PutDownStep.ElevatorGotoUp, ElevatorGotoUp, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(PutDownStep.ElevatorGotoUpWait, CheckElevatorPositionEndStatus, CheckElevatorPositionStopStatus)
|
|
|
+ //10. 确认WSPresent信号
|
|
|
+ .Wait(PutDownStep.ConfirmWSPresent,ConfirmWSPresentSensorOff,_delay_2s)
|
|
|
+ //11. Wafer Holder location update
|
|
|
.Run(PutDownStep.UpdateWaferHolder,WaferHolderTransfer,_delay_1ms)
|
|
|
- //2.3 Gantry Position To Park
|
|
|
- .Run(PutDownStep.GantryPositionPark,GantryBackToPark,_delay_1ms)
|
|
|
- .WaitWithStopCondition(PutDownStep.GantryPositionParkWait,CheckGantryParkPositionStatus,CheckGantryParkPositionRunStop)
|
|
|
+ //12. Gantry Position To Park
|
|
|
+ .Run(PutDownStep.GantryPositionPark, GantryBackToPark, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(PutDownStep.GantryPositionParkWait, CheckGantryParkPositionStatus, CheckGantryParkPositionRunStop)
|
|
|
.End(PutDownStep.End,NullFun,100);
|
|
|
return Runner.Status;
|
|
|
- }
|
|
|
- /// <summary>
|
|
|
- /// 目标cell unclamp
|
|
|
- /// </summary>
|
|
|
- /// <returns></returns>
|
|
|
- private bool TargetCellUnclamp()
|
|
|
- {
|
|
|
- if (_cellName == "Loader")
|
|
|
- {
|
|
|
- bool result= _preTransferUnclampRoutine.Start() == RState.Running;
|
|
|
- if (!result)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_TRANSPORTER, "Loader Unclamp failed", 0);
|
|
|
- }
|
|
|
- return result;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- _cellItem = ProcessLayoutManager.Instance.GetProcessLayoutCellItemByModuleName(_cellName);
|
|
|
- if (_cellItem != null)
|
|
|
- {
|
|
|
- if (Enum.TryParse(_cellItem.ModuleName, out ModuleName cellModuleName))
|
|
|
- {
|
|
|
- if (ModuleHelper.IsRinse(cellModuleName))
|
|
|
- {
|
|
|
- RinseDevice rinseDevice = DEVICE.GetDevice<RinseDevice>(_cellItem.ModuleName);
|
|
|
- if (rinseDevice != null)
|
|
|
- {
|
|
|
- bool result = rinseDevice.WaferHolderClampValveOff();
|
|
|
- if (!result)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_TRANSPORTER, $"{_cellItem.ModuleName} Clamp off failed", 0);
|
|
|
- }
|
|
|
- return result;
|
|
|
- }
|
|
|
- }
|
|
|
- else if (ModuleHelper.IsMetal(cellModuleName))
|
|
|
- {
|
|
|
- MetalCellDevice metalCellDevice = DEVICE.GetDevice<MetalCellDevice>(_cellItem.ModuleName);
|
|
|
- if (metalCellDevice != null)
|
|
|
- {
|
|
|
- bool result = metalCellDevice.WaferHolderClampOff();
|
|
|
- if (!result)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_TRANSPORTER, $"{_cellItem.ModuleName} Clamp off failed", 0);
|
|
|
- }
|
|
|
- return result;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return true;
|
|
|
- }
|
|
|
- /// <summary>
|
|
|
- /// 目标Cell Unclamp状态
|
|
|
- /// </summary>
|
|
|
- /// <returns></returns>
|
|
|
- private bool TargetCellUnclampEndStatus()
|
|
|
- {
|
|
|
- if(_cellName=="Loader")
|
|
|
- {
|
|
|
- return CommonFunction.CheckRoutineEndState(_preTransferUnclampRoutine);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- _cellItem = ProcessLayoutManager.Instance.GetProcessLayoutCellItemByModuleName(_cellName);
|
|
|
- if (_cellItem != null)
|
|
|
- {
|
|
|
- if (Enum.TryParse(_cellItem.ModuleName, out ModuleName cellModuleName))
|
|
|
- {
|
|
|
- if (ModuleHelper.IsRinse(cellModuleName))
|
|
|
- {
|
|
|
- RinseDevice rinseDevice = DEVICE.GetDevice<RinseDevice>(_cellItem.ModuleName);
|
|
|
- if (rinseDevice != null)
|
|
|
- {
|
|
|
- return rinseDevice.RinseData.WaferHolderClamp==false;
|
|
|
- }
|
|
|
- }
|
|
|
- else if (ModuleHelper.IsMetal(cellModuleName))
|
|
|
- {
|
|
|
- MetalCellDevice metalCellDevice = DEVICE.GetDevice<MetalCellDevice>(_cellItem.ModuleName);
|
|
|
- if (metalCellDevice != null)
|
|
|
- {
|
|
|
- return metalCellDevice.ClampOff;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return true;
|
|
|
- }
|
|
|
- /// <summary>
|
|
|
- /// 目标Cell Unclamp运行中止状态
|
|
|
- /// </summary>
|
|
|
- /// <returns></returns>
|
|
|
- private bool TargetCellUnclampStopStatus()
|
|
|
- {
|
|
|
- if (_cellName == "Loader")
|
|
|
- {
|
|
|
- bool result = CommonFunction.CheckRoutineStopState(_preTransferUnclampRoutine);
|
|
|
- if (result)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_TRANSPORTER, "Loader Unclamp failed", 0);
|
|
|
- }
|
|
|
- return result;
|
|
|
- }
|
|
|
- return false;
|
|
|
- }
|
|
|
+ }
|
|
|
/// <summary>
|
|
|
/// Elevator goto Up
|
|
|
/// </summary>
|
|
@@ -381,10 +253,23 @@ namespace CyberX8_RT.Modules.Transporter
|
|
|
}
|
|
|
}
|
|
|
/// <summary>
|
|
|
+ /// Elevator Position to cellTop
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ private bool ElevatorPositionToCellTop()
|
|
|
+ {
|
|
|
+ bool result = _elevatorAxis.PositionStation("CELLTOP", false, _velocity, _acceleration, _acceleration);
|
|
|
+ if (!result)
|
|
|
+ {
|
|
|
+ NotifyError(eEvent.ERR_TRANSPORTER, "elevator goto CELLTOP failed", 0);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ /// <summary>
|
|
|
/// Elevator Position to cell
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
- private bool VerticalPositionToCell()
|
|
|
+ private bool ElevatorPositionToCell()
|
|
|
{
|
|
|
bool result= false;
|
|
|
if( _cellItem != null )
|
|
@@ -410,10 +295,10 @@ namespace CyberX8_RT.Modules.Transporter
|
|
|
}
|
|
|
}
|
|
|
/// <summary>
|
|
|
- /// 检验Vertical移动状态
|
|
|
+ /// 检验Elevator移动状态
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
- private bool CheckVerticalPositionStatus()
|
|
|
+ private bool CheckElevatorPositionEndStatus()
|
|
|
{
|
|
|
return _elevatorAxis.Status == RState.End;
|
|
|
}
|
|
@@ -421,7 +306,7 @@ namespace CyberX8_RT.Modules.Transporter
|
|
|
/// 检验Vertical是否还在运动
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
- private bool CheckVerticalPositionRunStop()
|
|
|
+ private bool CheckElevatorPositionStopStatus()
|
|
|
{
|
|
|
bool result= _elevatorAxis.Status == RState.Failed||_elevatorAxis.Status==RState.Timeout;
|
|
|
if(result)
|
|
@@ -429,46 +314,7 @@ namespace CyberX8_RT.Modules.Transporter
|
|
|
NotifyError(eEvent.ERR_TRANSPORTER, "elevator axis motion failed", 0);
|
|
|
}
|
|
|
return result;
|
|
|
- }
|
|
|
- /// <summary>
|
|
|
- /// 检验Immobile异常状态
|
|
|
- /// </summary>
|
|
|
- /// <returns></returns>
|
|
|
- private bool CheckImmobilizeRoutineStopStatus()
|
|
|
- {
|
|
|
- bool result= CommonFunction.CheckRoutineStopState(_extendRoutine);
|
|
|
- if (result)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_TRANSPORTER, "extend failed", 0);
|
|
|
- }
|
|
|
- return result;
|
|
|
- }
|
|
|
- /// <summary>
|
|
|
- /// 检验unlock异常状态
|
|
|
- /// </summary>
|
|
|
- /// <returns></returns>
|
|
|
- private bool CheckUnlockRoutineStopStatus()
|
|
|
- {
|
|
|
- bool result = CommonFunction.CheckRoutineStopState(_unlockRoutine);
|
|
|
- if (result)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_TRANSPORTER, "unlock failed", 0);
|
|
|
- }
|
|
|
- return result;
|
|
|
- }
|
|
|
- /// <summary>
|
|
|
- /// Elevator goto low
|
|
|
- /// </summary>
|
|
|
- /// <returns></returns>
|
|
|
- private bool ElevatorGotoLow()
|
|
|
- {
|
|
|
- bool result= _elevatorAxis.PositionStation("LOW", false);
|
|
|
- if(!result)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_TRANSPORTER, "elevator goto low failed", 0);
|
|
|
- }
|
|
|
- return result;
|
|
|
- }
|
|
|
+ }
|
|
|
/// <summary>
|
|
|
/// 检验Gantry移动状态
|
|
|
/// </summary>
|
|
@@ -537,20 +383,7 @@ namespace CyberX8_RT.Modules.Transporter
|
|
|
_acceleration = _elevatorAxis.CalculateMultiplyAccelerationRatio(_elevatorAxis.CalculateValueMultiplyScale(tmpAccelaration));
|
|
|
LOG.WriteBackgroundLog(eEvent.INFO_TRANSPORTER, Module, "adjust profile speed");
|
|
|
return true;
|
|
|
- }
|
|
|
- /// <summary>
|
|
|
- /// 检验Retract 异常状态
|
|
|
- /// </summary>
|
|
|
- /// <returns></returns>
|
|
|
- private bool CheckRetractStopStatus()
|
|
|
- {
|
|
|
- bool result = CommonFunction.CheckRoutineStopState(_retractRoutine);
|
|
|
- if (result)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_TRANSPORTER, "retract failed", 0);
|
|
|
- }
|
|
|
- return result;
|
|
|
- }
|
|
|
+ }
|
|
|
/// <summary>
|
|
|
/// 更新WaferHolder移动信息
|
|
|
/// </summary>
|
|
@@ -580,28 +413,17 @@ namespace CyberX8_RT.Modules.Transporter
|
|
|
/// 确认WH Present Sensor off
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
- private bool ConfirmWHPresentSensorOff()
|
|
|
+ private bool ConfirmWSPresentSensorOff()
|
|
|
{
|
|
|
- bool result= !_transporterCommon.TransporterData.WhPresent1 &&!_transporterCommon.TransporterData.WhPresent2;
|
|
|
+ if (_bypassWaferHolderPresent) return true;
|
|
|
+ bool result= !_transporterCommon.TransporterData.WSHoldPresent;
|
|
|
if(!result)
|
|
|
{
|
|
|
NotifyError(eEvent.ERR_TRANSPORTER, "confirm WS Present sensor failed",0);
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
- /// <summary>
|
|
|
- /// 检验Lock异常状态
|
|
|
- /// </summary>
|
|
|
- /// <returns></returns>
|
|
|
- private bool CheckLockRoutineStopStatus()
|
|
|
- {
|
|
|
- bool result = CommonFunction.CheckRoutineStopState(_lockRoutine);
|
|
|
- if(result)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_TRANSPORTER, "lock failed", 0);
|
|
|
- }
|
|
|
- return result;
|
|
|
- }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// Gabtry是否需要回到
|
|
|
/// </summary>
|
|
@@ -673,6 +495,18 @@ namespace CyberX8_RT.Modules.Transporter
|
|
|
}
|
|
|
}
|
|
|
/// <summary>
|
|
|
+ /// 关闭DropBlockLock
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ private bool DropBlockLockoff()
|
|
|
+ {
|
|
|
+ if (_transporterCommon.TransporterData.Lock)
|
|
|
+ {
|
|
|
+ return _transporterCommon.UnlockOperation("", null);
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ /// <summary>
|
|
|
/// 启动
|
|
|
/// </summary>
|
|
|
/// <param name="objs"></param>
|
|
@@ -684,6 +518,7 @@ namespace CyberX8_RT.Modules.Transporter
|
|
|
_acceleration = 0;
|
|
|
InitializeParameters();
|
|
|
string preConfig = SC.GetConfigPreContent(_cellName);
|
|
|
+ _bypassWaferHolderPresent = SC.GetValue<bool>("Transporter.BypassWaferHolderPresent");
|
|
|
if (SC.ContainsItem($"{preConfig}.PlaceTimeSeconds"))
|
|
|
{
|
|
|
_placeTime = SC.GetValue<int>($"{preConfig}.PlaceTimeSeconds");
|
|
@@ -692,6 +527,7 @@ namespace CyberX8_RT.Modules.Transporter
|
|
|
{
|
|
|
_placeDelayTime = SC.GetValue<int>($"{preConfig}.PlaceDelaySeconds");
|
|
|
}
|
|
|
+
|
|
|
return Runner.Start(Module, $"Pun Down To {_cellName}");
|
|
|
}
|
|
|
/// <summary>
|
|
@@ -704,13 +540,11 @@ namespace CyberX8_RT.Modules.Transporter
|
|
|
_loaderEntity = Singleton<RouteManager>.Instance.GetModule<LoaderEntity>(ModuleName.Loader1.ToString());
|
|
|
_loaderRotationAxis = DEVICE.GetDevice<JetAxisBase>($"{ModuleName.Loader1}.Rotation");
|
|
|
_facilities = DEVICE.GetDevice<SystemFacilities>("System.Facilities");
|
|
|
- _unlockRoutine = new TransporterUnlockRoutine(Module);
|
|
|
- _lockRoutine = new TransporterLockRoutine(Module);
|
|
|
- _extendRoutine = new TransporterExtendRoutine(Module);
|
|
|
- _retractRoutine = new TransporterRetractRoutine(Module);
|
|
|
_conflictRoutine = new TransporterConflictRoutine(Module);
|
|
|
_transporterCommon = DEVICE.GetDevice<TransporterCommon>($"{Module}.Common");
|
|
|
- _preTransferUnclampRoutine = new LoaderPreTransferUnclampRoutine(ModuleName.Loader1.ToString());
|
|
|
+ _otherModule = Module == "Transporter2" ? "Transporter1" : "Transporter2";
|
|
|
+ _otherElevatorAxis = DEVICE.GetDevice<JetAxisBase>($"{_otherModule}.Elevator");
|
|
|
+ _loaderCommonDevice = DEVICE.GetDevice<LoaderCommonDevice>($"{ModuleName.Loader1}.Common");
|
|
|
}
|
|
|
/// <summary>
|
|
|
/// 启动校验条件
|
|
@@ -718,23 +552,20 @@ namespace CyberX8_RT.Modules.Transporter
|
|
|
/// <returns></returns>
|
|
|
private bool CheckStartPreConfition()
|
|
|
{
|
|
|
+ //所有轴上电并Homed
|
|
|
bool result = CheckPreCondition();
|
|
|
if(!result)
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
- double elevatorPosition = _elevatorAxis.MotionData.MotorPosition;
|
|
|
- if (!_elevatorAxis.CheckPositionIsInStation(elevatorPosition, "Up"))
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_TRANSPORTER, $"{Module} elevator axis {elevatorPosition} is not int Up station",-1);
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
+
|
|
|
+ //Loader is Home
|
|
|
if (!_loaderEntity.IsHomed)
|
|
|
{
|
|
|
NotifyError(eEvent.ERR_TRANSPORTER, $"{ModuleName.Loader1} is not homed", -1);
|
|
|
return false;
|
|
|
}
|
|
|
+ //若目标Cell为Loader, 则Loader需在TRNA或TRANB位置且WaferShuttlePresent信号on
|
|
|
if (_cellName == "Loader")
|
|
|
{
|
|
|
double loaderRotationPosition = _loaderRotationAxis.MotionData.MotorPosition;
|
|
@@ -744,47 +575,44 @@ namespace CyberX8_RT.Modules.Transporter
|
|
|
NotifyError(eEvent.ERR_TRANSPORTER, $"{ModuleName.Loader1} rotation axis {loaderRotationPosition} is not int TRNPA or TRNPB station", -1);
|
|
|
return false;
|
|
|
}
|
|
|
+ if (_loaderCommonDevice.CommonData.WaferHolderPresent)
|
|
|
+ {
|
|
|
+ NotifyError(eEvent.ERR_TRANSPORTER, $"{ModuleName.Loader1} WaferShuttlePresent is on", -1);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
+ //Transporter应有WS信息
|
|
|
if (!WaferHolderManager.Instance.HasWaferHolder(Module))
|
|
|
{
|
|
|
NotifyError(eEvent.ERR_TRANSPORTER, $"{Module} does not has wafer Shuttle",-1);
|
|
|
return false;
|
|
|
}
|
|
|
+ //目标Cell没有WS信息
|
|
|
if (WaferHolderManager.Instance.HasWaferHolder(_cellName))
|
|
|
{
|
|
|
NotifyError(eEvent.ERR_TRANSPORTER, $"Cell {_cellName} already has wafer Shuttle", -1);
|
|
|
return false;
|
|
|
- }
|
|
|
- //检验Facilities
|
|
|
- var faciltiesResult = _facilities.CheckCDA();
|
|
|
- if (!faciltiesResult.result)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_TRANSPORTER, faciltiesResult.reason, -1);
|
|
|
- return false;
|
|
|
- }
|
|
|
- //检验Lock和WH Present Sensor
|
|
|
- if (!_transporterCommon.TransporterData.Locked1)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_TRANSPORTER, $"{Module} lock1 sensor is off ", -1);
|
|
|
- return false;
|
|
|
- }
|
|
|
- if (!_transporterCommon.TransporterData.Locked2)
|
|
|
+ }
|
|
|
+ //检验Lock
|
|
|
+ if (!_transporterCommon.TransporterData.Lock)
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_TRANSPORTER, $"{Module} lock2 sensor is off ",-1);
|
|
|
+ NotifyError(eEvent.ERR_TRANSPORTER, $"{Module} Drop block lock is off ", -1);
|
|
|
return false;
|
|
|
}
|
|
|
- if (!_transporterCommon.TransporterData.WhPresent1)
|
|
|
+ //检验Wafer shuttle hold present
|
|
|
+ if (!_bypassWaferHolderPresent && !_transporterCommon.TransporterData.WSHoldPresent)
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_TRANSPORTER, $"{Module} WS Present1 sensor is off ", -1);
|
|
|
- return false;
|
|
|
- }
|
|
|
- if (!_transporterCommon.TransporterData.WhPresent2)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_TRANSPORTER, $"{Module} WS Present2 sensor is off ",-1);
|
|
|
+ NotifyError(eEvent.ERR_TRANSPORTER, $"{Module} Wafer shuttle hold present sensor is off ",-1);
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ //检验Facilities
|
|
|
+ //var faciltiesResult = _facilities.CheckCDA();
|
|
|
+ //if (!faciltiesResult.result)
|
|
|
+ //{
|
|
|
+ // NotifyError(eEvent.ERR_TRANSPORTER, faciltiesResult.reason, -1);
|
|
|
+ // return false;
|
|
|
+ //}
|
|
|
return true;
|
|
|
}
|
|
|
/// <summary>
|