|
@@ -33,36 +33,28 @@ namespace CyberX8_RT.Modules.Transporter
|
|
|
private enum PickUpStep
|
|
|
{
|
|
|
CheckPreCondition,
|
|
|
- TargetCellUnclamp,
|
|
|
- TargetCellUnclampWait,
|
|
|
- VerticalLow,
|
|
|
- VerticalLowWait,
|
|
|
+ DropBlockLockoff,
|
|
|
+ ElevatorGotoUp,
|
|
|
+ ElevatorGotoUpWait,
|
|
|
SafeMoveTo,
|
|
|
CheckMoveToStatus,
|
|
|
GantryPosition,
|
|
|
- GantryPoisitiolWait,
|
|
|
- UnlockTransporterClamp,
|
|
|
- UnlockTransporterClampWait,
|
|
|
- CellClampRetract,
|
|
|
- //CellClampRetractWait,
|
|
|
+ GantryPoisitionWait,
|
|
|
LoopPickupRetry,
|
|
|
- LoopRetryUnlock,
|
|
|
- LoopRetryUnlockWait,
|
|
|
- LoopRetryBackToLow,
|
|
|
- LoopRetryBackToLowWait,
|
|
|
- ElevatorPosition,
|
|
|
- ElevatorPositionWait,
|
|
|
+ LoopRetryLockoff,
|
|
|
+ LoopRetryElevatorBackToUp,
|
|
|
+ LoopRetryElevatorBackToUpWait,
|
|
|
+ ElevatorPositionToCell,
|
|
|
+ ElevatorPositionToCellWait,
|
|
|
Delay,
|
|
|
- ReadyToLockCheck,
|
|
|
- LockTransporterClamp,
|
|
|
- LockTransporterClampWait,
|
|
|
+ DropBlockLockOn,
|
|
|
LoopPickupRetryEnd,
|
|
|
CalculateLiftupSpeed,
|
|
|
PickupDelay,
|
|
|
- VerticalUp,
|
|
|
- VerticalUpWait,
|
|
|
- UpdateWaferHolder,
|
|
|
- CheckWHPresentAndLock,
|
|
|
+ ElevatorPositionToUp,
|
|
|
+ ElevatorPositionToUpWait,
|
|
|
+ UpdateWaferShuttle,
|
|
|
+ CheckWSPresent,
|
|
|
//ReadBarcodeConfirm,
|
|
|
End
|
|
|
}
|
|
@@ -74,11 +66,8 @@ namespace CyberX8_RT.Modules.Transporter
|
|
|
private LoaderEntity _loaderEntity;
|
|
|
private JetAxisBase _loaderRotationAxis;
|
|
|
private SystemFacilities _facilities;
|
|
|
- private TransporterUnlockRoutine _unlockRoutine;
|
|
|
- private TransporterLockRoutine _lockRoutine;
|
|
|
private TransporterConflictRoutine _conflictRoutine;
|
|
|
private TransporterCommon _transporterCommon;
|
|
|
- private LoaderPreTransferUnclampRoutine _preTransferUnclampRoutine;
|
|
|
private LoaderCommonDevice _loaderCommonDevice;
|
|
|
ProcessLayoutCellItem _cellItem;
|
|
|
private int _pickupTime;
|
|
@@ -109,175 +98,80 @@ namespace CyberX8_RT.Modules.Transporter
|
|
|
public RState Monitor()
|
|
|
{
|
|
|
Runner.Run(PickUpStep.CheckPreCondition, CheckStartPreConfition, _delay_1ms)
|
|
|
- //确认cell clamp Retracted
|
|
|
- .Run(PickUpStep.TargetCellUnclamp, TargetCellUnclamp, _delay_1ms)
|
|
|
- .WaitWithStopCondition(PickUpStep.TargetCellUnclampWait, TargetCellUnclampEndStatus, TargetCellUnclampStopStatus)
|
|
|
- .Run(PickUpStep.VerticalLow, ElevatorGotoLow, _delay_1ms)
|
|
|
- .WaitWithStopCondition(PickUpStep.VerticalLowWait, CheckVerticalPositionStatus, CheckVerticalPositionRunStop)
|
|
|
- //1.2 Move to 安全
|
|
|
+ //1. 确认DropBlockLock是否off
|
|
|
+ .Run(PickUpStep.DropBlockLockoff, DropBlockLockoff, NullFun, _delay_1ms)
|
|
|
+ //2. Elevator go to up
|
|
|
+ .Run(PickUpStep.ElevatorGotoUp, ElevatorGotoUP, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(PickUpStep.ElevatorGotoUpWait, CheckElevatorPositionEndStatus, CheckElevatorPositionEndStatus)
|
|
|
+ //3. other Transporter Safe Move
|
|
|
.Run(PickUpStep.SafeMoveTo, SafeMoveTo, _delay_1ms)
|
|
|
.WaitWithStopCondition(PickUpStep.CheckMoveToStatus, () => CommonFunction.CheckRoutineEndState(_conflictRoutine),
|
|
|
CheckSafeMoveToStopStatus)
|
|
|
- //1.2 Gantry 移动
|
|
|
+ //4. Gantry 移动到目标位置
|
|
|
.Run(PickUpStep.GantryPosition, GantryPositionToCell, _delay_1ms)
|
|
|
- .WaitWithStopCondition(PickUpStep.GantryPoisitiolWait, CheckGantryPositionStatus, CheckGantryPositionRunStop)
|
|
|
- //1.3 Unlock Transporter clamp
|
|
|
- .Run(PickUpStep.UnlockTransporterClamp, () => { return _unlockRoutine.Start(null) == RState.Running; }, NullFun, _delay_1ms)
|
|
|
- .WaitWithStopCondition(PickUpStep.UnlockTransporterClampWait, () => CommonFunction.CheckRoutineEndState(_unlockRoutine),
|
|
|
- CheckUnlockRoutineStopStatus)
|
|
|
- //.WaitWithStopCondition(PickUpStep.CellClampRetractWait,CheckCellRetractRoutineEndState,CheckGantryPositionRunStop)
|
|
|
+ .WaitWithStopCondition(PickUpStep.GantryPoisitionWait, CheckGantryPositionStatus, CheckGantryPositionRunStop)
|
|
|
+ //5. Pick up Retry
|
|
|
.LoopRetryStart(PickUpStep.LoopPickupRetry,"Pick up loop retry",_pickMaxRetries,NullFun,_delay_1ms)
|
|
|
- .LoopRetrySecondRun(PickUpStep.LoopRetryUnlock, () => { return _unlockRoutine.Start(null) == RState.Running; }, NullFun, _delay_1ms)
|
|
|
- .LoopRetrySecondRunWithStopStatus(PickUpStep.LoopRetryUnlockWait, () => CommonFunction.CheckRoutineEndState(_unlockRoutine),
|
|
|
- CheckUnlockRoutineStopStatus)
|
|
|
- .LoopRetrySecondRun(PickUpStep.LoopRetryBackToLow,ElevatorGotoLow,NullFun,_delay_1ms)
|
|
|
- .LoopRetrySecondRunWithStopStatus(PickUpStep.LoopRetryBackToLowWait, CheckVerticalPositionStatus, CheckVerticalPositionRunStop)
|
|
|
- //1.4 Elevator 移动至cell
|
|
|
- .LoopRetryRun(PickUpStep.ElevatorPosition, () => { return VerticalPositionToCell(); }, NullFun, _delay_1ms)
|
|
|
- .LoopRetryRunWithStopStatus(PickUpStep.ElevatorPositionWait, CheckVerticalPositionStatus, CheckVerticalPositionRunStop)
|
|
|
+ .LoopRetrySecondRun(PickUpStep.LoopRetryLockoff, DropBlockLockoff, NullFun, _delay_1ms)
|
|
|
+ .LoopRetrySecondRun(PickUpStep.LoopRetryElevatorBackToUp, ElevatorGotoUp, NullFun,_delay_1ms)
|
|
|
+ .LoopRetrySecondRunWithStopStatus(PickUpStep.LoopRetryElevatorBackToUpWait, CheckElevatorPositionEndStatus, CheckElevatorPositionStopStatus)
|
|
|
+ //6. Elevator 移动至对应cell位
|
|
|
+ .LoopRetryRun(PickUpStep.ElevatorPositionToCell, ElevatorPositionToCell, NullFun, _delay_1ms)
|
|
|
+ .LoopRetryRunWithStopStatus(PickUpStep.ElevatorPositionToCellWait, CheckElevatorPositionEndStatus, CheckElevatorPositionStopStatus)
|
|
|
.LoopRetryDelay(PickUpStep.Delay,500)
|
|
|
- //1.5 确认Ready to Lock Sensor
|
|
|
- .LoopRetryWaitBack(PickUpStep.ReadyToLockCheck,CheckReadyToLock,_delay_1s)
|
|
|
- //1.6 Unlock Transporter clamp
|
|
|
- .LoopRetryRun(PickUpStep.LockTransporterClamp, () => { return _lockRoutine.Start(null) == RState.Running; }, NullFun, _delay_1ms)
|
|
|
- .LoopRetryRunWithStopStatusBack(PickUpStep.LockTransporterClampWait, () => { return CommonFunction.CheckRoutineEndState(_lockRoutine); },
|
|
|
- CheckLockRoutineStopStatus)
|
|
|
+ //7. Drop Block Lock on,抓取WS
|
|
|
+ .LoopRetryRun(PickUpStep.DropBlockLockOn, DropBlockLockon, NullFun, _delay_1ms)
|
|
|
.LoopRetryEnd(PickUpStep.LoopPickupRetryEnd, _delay_1ms)
|
|
|
- //1.7 确认Elevator lift speed
|
|
|
+ //8. 确认Elevator lift speed
|
|
|
.Run(PickUpStep.CalculateLiftupSpeed,CalculateLiftupSpeed,_delay_1ms)
|
|
|
- //1.8 Pickup delay
|
|
|
- .Delay(PickUpStep.PickupDelay,_pickupDelayTime*1000)
|
|
|
- //1.9 Elevator goto Up
|
|
|
- .Run(PickUpStep.VerticalUp, ElevatorGotoUP, 100)
|
|
|
- .WaitWithStopCondition(PickUpStep.VerticalUpWait, CheckVerticalPositionStatus, CheckVerticalPositionRunStop)
|
|
|
- //2.0 Material Tracking Update
|
|
|
- .Run(PickUpStep.UpdateWaferHolder, WaferHolderTransfer,_delay_1ms)
|
|
|
- //2.0 确认WSPresent与Lock
|
|
|
- .Wait(PickUpStep.CheckWHPresentAndLock,CheckWHPresentAndLock,_delay_2s)
|
|
|
- //2.1 Read Barcode 确认与Material Tracking的转移是否一致
|
|
|
+ //9. Pickup delay
|
|
|
+ .Delay(PickUpStep.PickupDelay,_pickupDelayTime * 1000)
|
|
|
+ //10. Elevator goto Up
|
|
|
+ .Run(PickUpStep.ElevatorPositionToUp, ElevatorGotoUP, 100)
|
|
|
+ .WaitWithStopCondition(PickUpStep.ElevatorPositionToUpWait, CheckElevatorPositionEndStatus, CheckElevatorPositionStopStatus)
|
|
|
+ //11. Material Tracking Update
|
|
|
+ .Run(PickUpStep.UpdateWaferShuttle, WaferShuttleTransfer,_delay_1ms)
|
|
|
+ //12. 确认Transporter的Wafer shuttle hold present信号为on
|
|
|
+ .Wait(PickUpStep.CheckWSPresent,CheckWSPresent, _delay_2s)
|
|
|
+ //13. Read Barcode 确认与Material Tracking的转移是否一致
|
|
|
//.Run(PickUpStep.ReadBarcodeConfirm,ReadBarcode,_delay_1ms)
|
|
|
.End(PickUpStep.End,NullFun,100);
|
|
|
return Runner.Status;
|
|
|
}
|
|
|
/// <summary>
|
|
|
- /// 目标cell unclamp
|
|
|
+ /// 关闭DropBlockLock
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
- private bool TargetCellUnclamp()
|
|
|
+ private bool DropBlockLockoff()
|
|
|
{
|
|
|
- if (_cellName == "Loader")
|
|
|
+ if (_transporterCommon.TransporterData.Lock)
|
|
|
{
|
|
|
- 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)
|
|
|
- {
|
|
|
- bool result = false;
|
|
|
- if(Enum.TryParse(_cellItem.ModuleName,out ModuleName cellModuleName))
|
|
|
- {
|
|
|
- if (ModuleHelper.IsRinse(cellModuleName))
|
|
|
- {
|
|
|
- RinseDevice rinseDevice = DEVICE.GetDevice<RinseDevice>(_cellItem.ModuleName);
|
|
|
- if (rinseDevice != null)
|
|
|
- {
|
|
|
- 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)
|
|
|
- {
|
|
|
- result= metalCellDevice.WaferHolderClampOff();
|
|
|
- if (!result)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_TRANSPORTER, $"{_cellItem.ModuleName} Clamp off failed",0);
|
|
|
- }
|
|
|
- return result;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ return _transporterCommon.UnlockOperation("", null);
|
|
|
+ }
|
|
|
return true;
|
|
|
}
|
|
|
/// <summary>
|
|
|
- /// 目标Cell Unclamp状态
|
|
|
+ /// 打开DropBlockLock
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
- private bool TargetCellUnclampEndStatus()
|
|
|
+ private bool DropBlockLockon()
|
|
|
{
|
|
|
- if (_cellName == "Loader")
|
|
|
+ if (!_transporterCommon.TransporterData.Lock)
|
|
|
{
|
|
|
- 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;
|
|
|
- }
|
|
|
- }
|
|
|
- else if (ModuleHelper.IsMetal(cellModuleName))
|
|
|
- {
|
|
|
- MetalCellDevice metalCellDevice = DEVICE.GetDevice<MetalCellDevice>(_cellItem.ModuleName);
|
|
|
- if (metalCellDevice != null)
|
|
|
- {
|
|
|
- return metalCellDevice.ClampOff;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ return _transporterCommon.LockOperation("", null);
|
|
|
}
|
|
|
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运动至LOW
|
|
|
+ /// Elevator运动至UP
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
- private bool ElevatorGotoLow()
|
|
|
+ private bool ElevatorGotoUp()
|
|
|
{
|
|
|
- bool result = _elevatorAxis.PositionStation("LOW");
|
|
|
+ bool result = _elevatorAxis.PositionStation("UP");
|
|
|
if(!result)
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_TRANSPORTER, "Elevator goto LOW failed",0);
|
|
|
+ NotifyError(eEvent.ERR_TRANSPORTER, "Elevator goto UP failed",0);
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
@@ -364,7 +258,7 @@ namespace CyberX8_RT.Modules.Transporter
|
|
|
/// Elevator Position to cell
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
- private bool VerticalPositionToCell()
|
|
|
+ private bool ElevatorPositionToCell()
|
|
|
{
|
|
|
bool result = false;
|
|
|
if( _cellItem != null )
|
|
@@ -393,7 +287,7 @@ namespace CyberX8_RT.Modules.Transporter
|
|
|
/// 检验Vertical移动状态
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
- private bool CheckVerticalPositionStatus()
|
|
|
+ private bool CheckElevatorPositionEndStatus()
|
|
|
{
|
|
|
return _elevatorAxis.Status == RState.End;
|
|
|
}
|
|
@@ -401,7 +295,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)
|
|
@@ -430,51 +324,7 @@ namespace CyberX8_RT.Modules.Transporter
|
|
|
NotifyError(eEvent.ERR_TRANSPORTER, "Gantry Motion 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>
|
|
|
- /// 检验Ready to lock
|
|
|
- /// </summary>
|
|
|
- /// <returns></returns>
|
|
|
- private bool CheckReadyToLock()
|
|
|
- {
|
|
|
- if(! _transporterCommon.TransporterData.ReadyToLock1)
|
|
|
- {
|
|
|
- NotifyError(eEvent.WARN_TRANSPORTER, $"{Module} Ready to lock1 is off",0);
|
|
|
- return false;
|
|
|
- }
|
|
|
- if (!_transporterCommon.TransporterData.ReadyToLock2)
|
|
|
- {
|
|
|
- NotifyError(eEvent.WARN_TRANSPORTER, $"{Module} Ready to lock2 is off",0);
|
|
|
- return false;
|
|
|
- }
|
|
|
- return true;
|
|
|
- }
|
|
|
- /// <summary>
|
|
|
- /// 检验Lock Routine异常状态
|
|
|
- /// </summary>
|
|
|
- /// <returns></returns>
|
|
|
- private bool CheckLockRoutineStopStatus()
|
|
|
- {
|
|
|
- bool result = CommonFunction.CheckRoutineStopState(_lockRoutine);
|
|
|
- if(result)
|
|
|
- {
|
|
|
- NotifyError(eEvent.WARN_TRANSPORTER, "lock failed", 0);
|
|
|
- }
|
|
|
- return result;
|
|
|
- }
|
|
|
+ }
|
|
|
/// <summary>
|
|
|
/// 计算提升速度
|
|
|
/// </summary>
|
|
@@ -541,7 +391,7 @@ namespace CyberX8_RT.Modules.Transporter
|
|
|
/// 更新WaferHolder移动信息
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
- private bool WaferHolderTransfer()
|
|
|
+ private bool WaferShuttleTransfer()
|
|
|
{
|
|
|
bool isMetal = false;
|
|
|
DateTime lastMetalRecipeTime = DateTime.Now;
|
|
@@ -593,10 +443,10 @@ namespace CyberX8_RT.Modules.Transporter
|
|
|
/// 检验WHPresent与Lock状态
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
- private bool CheckWHPresentAndLock()
|
|
|
+ private bool CheckWSPresent()
|
|
|
{
|
|
|
- bool locked = _transporterCommon.TransporterData.Locked1 && _transporterCommon.TransporterData.Locked2;
|
|
|
- bool whPresent= _transporterCommon.TransporterData.WhPresent1 && _transporterCommon.TransporterData.WhPresent2;
|
|
|
+ bool locked = _transporterCommon.TransporterData.Lock;
|
|
|
+ bool whPresent= _transporterCommon.TransporterData.WSHoldPresent;
|
|
|
bool result= locked && (whPresent||_bypassWaferHolderPresent);
|
|
|
if (!result)
|
|
|
{
|
|
@@ -641,18 +491,14 @@ namespace CyberX8_RT.Modules.Transporter
|
|
|
public RState Start(params object[] objs)
|
|
|
{
|
|
|
_cellName = objs[0].ToString();
|
|
|
- _elevatorAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Elevator");
|
|
|
+ _elevatorAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Elevator");;
|
|
|
_gantryAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Gantry");
|
|
|
_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);
|
|
|
_conflictRoutine = new TransporterConflictRoutine(Module);
|
|
|
_transporterCommon = DEVICE.GetDevice<TransporterCommon>($"{Module}.Common");
|
|
|
_loaderCommonDevice = DEVICE.GetDevice<LoaderCommonDevice>($"{ModuleName.Loader1}.Common");
|
|
|
_bypassWaferHolderPresent = SC.GetValue<bool>("Transporter.BypassWaferHolderPresent");
|
|
|
- _preTransferUnclampRoutine = new LoaderPreTransferUnclampRoutine(ModuleName.Loader1.ToString());
|
|
|
_velocity = 0;
|
|
|
_acceleration = 0;
|
|
|
_pickMaxRetries = SC.GetValue<int>("Transporter.MaxPickTries");
|
|
@@ -674,24 +520,32 @@ 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") &&
|
|
|
- !_elevatorAxis.CheckPositionIsInStation(elevatorPosition, "Low"))
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_TRANSPORTER, $"{Module} elevator axis {elevatorPosition} is not in Up or Low station",-1);
|
|
|
+ //Transporter Elevator在UP位
|
|
|
+ //double elevatorPosition = _elevatorAxis.MotionData.MotorPosition;
|
|
|
+ //if (!_elevatorAxis.CheckPositionIsInStation(elevatorPosition, "UP"))
|
|
|
+ //{
|
|
|
+ // NotifyError(eEvent.ERR_TRANSPORTER, $"{Module} elevator axis {elevatorPosition} is not in Up station", -1);
|
|
|
+ // return false;
|
|
|
+ //}
|
|
|
+ //Transporter的Wafer shuttle hold present信号为off
|
|
|
+ if (_transporterCommon.TransporterData.WSHoldPresent)
|
|
|
+ {
|
|
|
+ NotifyError(eEvent.ERR_TRANSPORTER, $"{Module} WaferShuttleHoldPresent is on", -1);
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
+ //Loader is Home
|
|
|
if (!_loaderEntity.IsHomed)
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_TRANSPORTER, $"{ModuleName.Loader1} is not homed",-1);
|
|
|
+ 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;
|
|
@@ -701,23 +555,27 @@ 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 off", -1);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
- if (!WaferHolderManager.Instance.HasWaferHolder(_cellName))
|
|
|
+ //Transporter没有WS信息
|
|
|
+ if (!WaferHolderManager.Instance.HasWaferHolder(Module))
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_TRANSPORTER, $"{_cellName} does not has wafer Shuttle", -1);
|
|
|
+ NotifyError(eEvent.ERR_TRANSPORTER, $"{Module} already has wafer Shuttle", -1);
|
|
|
return false;
|
|
|
}
|
|
|
- //检验Facilities
|
|
|
- var faciltiesResult = _facilities.CheckCDA();
|
|
|
- if (!faciltiesResult.result)
|
|
|
+ //目标Cell应有WS信息
|
|
|
+ if (!WaferHolderManager.Instance.HasWaferHolder(_cellName))
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_TRANSPORTER, faciltiesResult.reason,-1);
|
|
|
+ NotifyError(eEvent.ERR_TRANSPORTER, $"{_cellName} does not has wafer shuttle", -1);
|
|
|
return false;
|
|
|
}
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
-
|
|
|
/// <summary>
|
|
|
/// 检验前置条件
|
|
|
/// </summary>
|