|
@@ -17,6 +17,7 @@ using System.Text;
|
|
|
using System.Threading.Tasks;
|
|
|
using MECF.Framework.Common.CommonData.Loader;
|
|
|
using CyberX8_RT.Modules.Transporter;
|
|
|
+using Aitex.Core.RT.SCCore;
|
|
|
|
|
|
namespace CyberX8_RT.Devices.Loader
|
|
|
{
|
|
@@ -26,71 +27,62 @@ namespace CyberX8_RT.Devices.Loader
|
|
|
{
|
|
|
CheckPreCondition,
|
|
|
WSClampOn,
|
|
|
- WSSideClampOn,
|
|
|
- WSSideClampOnCheck,
|
|
|
- TranslateBladderOff,
|
|
|
- TranslateBladderOffCheck,
|
|
|
- CRSGotoSetUp,
|
|
|
- CRSGotoSetUpWait,
|
|
|
+ LSGotoLock,
|
|
|
+ LSGotoLockWait,
|
|
|
+ ShuttleGotoIN,
|
|
|
+ ShuttleGotoINWait,
|
|
|
BernoulliBladderOn,
|
|
|
BernoulliBladderOnCheck,
|
|
|
BernoulliN2On,
|
|
|
- TransBladderOn,
|
|
|
- TransBladderOnCheck,
|
|
|
- TranslateHighOff,
|
|
|
- TranslateHighOffCheck,
|
|
|
- CRSVacuumOn,
|
|
|
- CRSVacuumOnCheck,
|
|
|
WSBladderOn,
|
|
|
WSBladderOnCheck,
|
|
|
- ConditionCRSVacuumLevel,
|
|
|
- ConditionCRSVacuumLevelCheck,
|
|
|
- CRSGotoUnlock,
|
|
|
- CRSGotoUnlockWait,
|
|
|
- ReTranslateBladderOff,
|
|
|
- ReTranslateBladderOffCheck,
|
|
|
- ReTranslateHighOff,
|
|
|
- ReTranslateHighOffCheck,
|
|
|
- DoorUnlock,
|
|
|
- DoorUnlockCheck,
|
|
|
- ShuttleGotoOpen,
|
|
|
- ShuttleGotoOpenWait,
|
|
|
- VacuumLevel,
|
|
|
- VacuumLevelCheck,
|
|
|
+ LSVacuumOn,
|
|
|
+ LSVacuumOnCheck,
|
|
|
+ LSVacuumLevelCheck,
|
|
|
+ LSVacuumLevelCheckWait,
|
|
|
+ ShuttleGotoLS,
|
|
|
+ ShuttleGotoLSWait,
|
|
|
+ LSGotoSetup,
|
|
|
+ LSGotoSetupWait,
|
|
|
+ LSGotoUnlock,
|
|
|
+ LSGotoUnlockWait,
|
|
|
+ ReLSVacuumLevelCheck,
|
|
|
+ ReLSVacuumLevelCheckWait,
|
|
|
+ ShuttleGotoOUT,
|
|
|
+ ShuttleGotoOUTWait,
|
|
|
TiltGotoHori,
|
|
|
TiltGotoHoriCheck,
|
|
|
- BernoulliBladderOff,
|
|
|
- BernoulliBladderOffCheck,
|
|
|
- ReBernoulliBladderOn,
|
|
|
- ReBernoulliBladderOnCheck,
|
|
|
BernoulliN2Off,
|
|
|
+ WSBladderOff,
|
|
|
+ WSBladderOffCheck,
|
|
|
End
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
#region 内部变量
|
|
|
private string _side = "";
|
|
|
- private LoaderCommonWaferHolderSideClampRoutine _waferHolderSideClampRoutine;
|
|
|
- private LoaderSideTransBladderRoutine _transBladderRoutine;
|
|
|
- private JetAxisBase _crsAxis;
|
|
|
+ private JetAxisBase _lsAxis;
|
|
|
private LoaderSideBernoulliBladderRoutine _bernoulliBladderRoutine;
|
|
|
- private LoaderSideTransHighRoutine _transHightRoutine;
|
|
|
private LoaderSideVacuumRoutine _vacuumRoutine;
|
|
|
private LoaderSideVacuumLevelCheckRoutine _vacuumLevelCheckRoutine;
|
|
|
private LoaderSideWhBladderRoutine _whBladderRoutine;
|
|
|
- private LoaderSideUnloadVacuumLevelCheckRoutine _unloadVacuumLevelCheckRoutine;
|
|
|
- private LoaderSideDoorLockRoutine _doorLockRoutine;
|
|
|
private JetAxisBase _shuttleAxis;
|
|
|
private JetAxisBase _tiltAxis;
|
|
|
private JetAxisBase _rotationAxis;
|
|
|
private LoaderSideDevice _sideDevice;
|
|
|
private LoaderCommonDevice _loaderCommonDevice;
|
|
|
+ /// <summary>
|
|
|
+ /// WaferSize
|
|
|
+ /// </summary>
|
|
|
+ private int _waferSize;
|
|
|
#endregion
|
|
|
/// <summary>
|
|
|
/// 构造函数
|
|
|
/// </summary>
|
|
|
/// <param name="module"></param>
|
|
|
- public LoaderUnloadRoutine(string module,string side) : base(module)
|
|
|
+ public LoaderUnloadRoutine(string module, string side) : base(module)
|
|
|
{
|
|
|
- _side = side;
|
|
|
+ _side = side;
|
|
|
}
|
|
|
/// <summary>
|
|
|
/// 中止
|
|
@@ -106,102 +98,69 @@ namespace CyberX8_RT.Devices.Loader
|
|
|
public RState Monitor()
|
|
|
{
|
|
|
Runner.Run(UnloadStep.CheckPreCondition,CheckPreCondition,_delay_1ms)
|
|
|
- //1.0 WS Clamp On
|
|
|
- .Run(UnloadStep.WSClampOn, WaferHolderClampOn, _delay_1ms)
|
|
|
- //1.1 WSSideClampOn
|
|
|
- .Run(UnloadStep.WSSideClampOn, () => { return _waferHolderSideClampRoutine.Start(true) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(UnloadStep.WSSideClampOnCheck, () => { return CommonFunction.CheckRoutineEndState(_waferHolderSideClampRoutine); },
|
|
|
- ()=>CheckRoutineStopStatus(_waferHolderSideClampRoutine,"Wafer Shuttle Side Clamp on failed"))
|
|
|
- //1.2 TranslateBladderOff
|
|
|
- .Run(UnloadStep.TranslateBladderOff, () => { return _transBladderRoutine.Start(false) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(UnloadStep.TranslateBladderOffCheck, () => { return CommonFunction.CheckRoutineEndState(_transBladderRoutine); },
|
|
|
- ()=>CheckRoutineStopStatus(_transBladderRoutine,"TransBladder off failed"))
|
|
|
- //1.3 CRS Goto Setup
|
|
|
- .Run(UnloadStep.CRSGotoSetUp, () => { return AxisPosition(_crsAxis,"Setup"); }, NullFun, _delay_1ms)
|
|
|
- .WaitWithStopCondition(UnloadStep.CRSGotoSetUpWait, () => { return _crsAxis.Status == RState.End; },
|
|
|
- ()=>CheckAxisMotionStopStatus(_crsAxis))
|
|
|
- //1.4 BernoulliBladderOn
|
|
|
+ //1. WS Clamp on
|
|
|
+ .Run(UnloadStep.WSClampOn, WSClampOnAction, () => { return _loaderCommonDevice.CommonData.WaferHolderClamp; }, _delay_5s)
|
|
|
+ //2. LS Goto Lock位
|
|
|
+ .Run(UnloadStep.LSGotoLock, () => { return AxisPosition(_lsAxis,$"Lock{_waferSize}"); }, NullFun, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(UnloadStep.LSGotoLockWait, () => { return _lsAxis.Status == RState.End; },
|
|
|
+ ()=>CheckAxisMotionStopStatus(_lsAxis))
|
|
|
+ //3. Shuttle Goto OPEN
|
|
|
+ .Run(UnloadStep.ShuttleGotoIN, () => { return AxisPosition(_shuttleAxis, "IN"); }, NullFun, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(UnloadStep.ShuttleGotoINWait, () => { return _shuttleAxis.Status == RState.End; },
|
|
|
+ () => CheckAxisMotionStopStatus(_shuttleAxis))
|
|
|
+ //4. BernoulliBladderOn
|
|
|
.Run(UnloadStep.BernoulliBladderOn, () => { return _bernoulliBladderRoutine.Start(true) == RState.Running; }, _delay_1ms)
|
|
|
.WaitWithStopCondition(UnloadStep.BernoulliBladderOnCheck, () => { return CommonFunction.CheckRoutineEndState(_bernoulliBladderRoutine); },
|
|
|
() => CheckRoutineStopStatus(_bernoulliBladderRoutine, "BernoulliBladder On failed"))
|
|
|
- //1.5 BernoulliN2 On
|
|
|
- .Run(UnloadStep.BernoulliN2On, BernoulliN2On, _delay_1ms)
|
|
|
- //1.6 Trans Bladder On
|
|
|
- .Run(UnloadStep.TransBladderOn, () => { return _transBladderRoutine.Start(true) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(UnloadStep.TransBladderOnCheck, () => { return CommonFunction.CheckRoutineEndState(_transBladderRoutine); },
|
|
|
- () => CheckRoutineStopStatus(_transBladderRoutine,"TransBladder On failed"))
|
|
|
- //1.6 Trans High Off
|
|
|
- .Run(UnloadStep.TranslateHighOff, () => { return _transHightRoutine.Start(false) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(UnloadStep.TranslateHighOffCheck, () => { return CommonFunction.CheckRoutineEndState(_transHightRoutine); },
|
|
|
- () => CheckRoutineStopStatus(_transHightRoutine,"TransHigh off failed"))
|
|
|
- //1.7 CRS Vacuum On
|
|
|
- .Run(UnloadStep.CRSVacuumOn, () => { return _vacuumRoutine.Start(true) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(UnloadStep.CRSVacuumOnCheck, () => { return CommonFunction.CheckRoutineEndState(_vacuumRoutine); },
|
|
|
- () => CheckRoutineStopStatus(_vacuumRoutine,"Vaccum On failed"))
|
|
|
- //1.8 WS Bladder On
|
|
|
+ //5. BernoulliN2 On
|
|
|
+ .Run(UnloadStep.BernoulliN2On, BernoulliN2On, () => { return _sideDevice.SideData.BernoulliN2; }, _delay_5s)
|
|
|
+ //6. WS Bladder On
|
|
|
.Run(UnloadStep.WSBladderOn, () => { return _whBladderRoutine.Start(true) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(UnloadStep.WSBladderOnCheck, () => { return CommonFunction.CheckRoutineEndState(_whBladderRoutine); },
|
|
|
- () => CheckRoutineStopStatus(_whBladderRoutine,"WSBladder On failed"))
|
|
|
- //1.9 condition vacuum level check
|
|
|
- .Run(UnloadStep.ConditionCRSVacuumLevel, () => { return _unloadVacuumLevelCheckRoutine.Start(true) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(UnloadStep.ConditionCRSVacuumLevelCheck, () => { return CommonFunction.CheckRoutineEndState(_unloadVacuumLevelCheckRoutine); },
|
|
|
- () => CheckRoutineStopStatus(_unloadVacuumLevelCheckRoutine," Vacuum Level Check failed"))
|
|
|
- //2.0 CRS Goto Unlock
|
|
|
- .Run(UnloadStep.CRSGotoUnlock, () => { return AxisPosition(_crsAxis,"Unlock"); }, NullFun, _delay_1ms)
|
|
|
- .WaitWithStopCondition(UnloadStep.CRSGotoUnlockWait, () => { return _crsAxis.Status == RState.End; },
|
|
|
- () => CheckAxisMotionStopStatus(_crsAxis))
|
|
|
- //2.1 Trans Bladder Off
|
|
|
- .Run(UnloadStep.ReTranslateBladderOff, () => { return _transBladderRoutine.Start(false) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(UnloadStep.ReTranslateBladderOffCheck, () => { return CommonFunction.CheckRoutineEndState(_transBladderRoutine); },
|
|
|
- () => CheckRoutineStopStatus(_transBladderRoutine,"ReTransBladder Off failed"))
|
|
|
- //2.2 Trans High Off
|
|
|
- .Run(UnloadStep.ReTranslateHighOff, () => { return _transHightRoutine.Start(false) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(UnloadStep.ReTranslateHighOffCheck, () => { return CommonFunction.CheckRoutineEndState(_transHightRoutine); },
|
|
|
- () => CheckRoutineStopStatus(_transHightRoutine,"ReTransHigh Off failed"))
|
|
|
- //2.3 Dor Lock On
|
|
|
- .Run(UnloadStep.DoorUnlock, () => { return _doorLockRoutine.Start(false) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(UnloadStep.DoorUnlockCheck, () => { return CommonFunction.CheckRoutineEndState(_doorLockRoutine); },
|
|
|
- () => CheckRoutineStopStatus(_doorLockRoutine,"door unlock failed"))
|
|
|
- //2.4 Shuttle Goto OPEN
|
|
|
- .Run(UnloadStep.ShuttleGotoOpen, () => { return AxisPosition(_shuttleAxis,"OPEN"); }, NullFun, _delay_1ms)
|
|
|
- .WaitWithStopCondition(UnloadStep.ShuttleGotoOpenWait, () => { return _shuttleAxis.Status == RState.End; },
|
|
|
+ .WaitWithStopCondition(UnloadStep.WSBladderOnCheck, () => { return CommonFunction.CheckRoutineEndState(_whBladderRoutine); },
|
|
|
+ () => CheckRoutineStopStatus(_whBladderRoutine, "WSBladder On failed"))
|
|
|
+ //7. LS Vacuum On
|
|
|
+ .Run(UnloadStep.LSVacuumOn, () => { return _vacuumRoutine.Start(true) == RState.Running; }, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(UnloadStep.LSVacuumOnCheck, () => { return CommonFunction.CheckRoutineEndState(_vacuumRoutine); },
|
|
|
+ () => CheckRoutineStopStatus(_vacuumRoutine, "LS Vaccum On failed"))
|
|
|
+ //8. LS vacuum level check
|
|
|
+ .Run(UnloadStep.LSVacuumLevelCheck, () => { return _vacuumLevelCheckRoutine.Start(true) == RState.Running; }, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(UnloadStep.LSVacuumLevelCheckWait, () => { return CommonFunction.CheckRoutineEndState(_vacuumLevelCheckRoutine); },
|
|
|
+ () => CheckRoutineStopStatus(_vacuumLevelCheckRoutine, "LS Vacuum Level Check failed"))
|
|
|
+ //9. Shuttle Goto LS
|
|
|
+ .Run(UnloadStep.ShuttleGotoLS, () => { return AxisPosition(_shuttleAxis, "LS"); }, NullFun, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(UnloadStep.ShuttleGotoLSWait, () => { return _shuttleAxis.Status == RState.End; },
|
|
|
+ () => CheckAxisMotionStopStatus(_shuttleAxis))
|
|
|
+ //10. LS Goto Setup
|
|
|
+ .Run(UnloadStep.LSGotoSetup, () => { return AxisPosition(_lsAxis, $"Setup{_waferSize}"); }, NullFun, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(UnloadStep.LSGotoSetupWait, () => { return _lsAxis.Status == RState.End; },
|
|
|
+ () => CheckAxisMotionStopStatus(_lsAxis))
|
|
|
+ //11. LS Goto Unlock
|
|
|
+ .Run(UnloadStep.LSGotoUnlock, () => { return AxisPosition(_lsAxis, $"Unlock{_waferSize}"); }, NullFun, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(UnloadStep.LSGotoUnlockWait, () => { return _lsAxis.Status == RState.End; },
|
|
|
+ () => CheckAxisMotionStopStatus(_lsAxis))
|
|
|
+ //12. Re LS Vacuum level Check
|
|
|
+ .Run(UnloadStep.ReLSVacuumLevelCheck, () => { return _vacuumLevelCheckRoutine.Start(true) == RState.Running; }, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(UnloadStep.ReLSVacuumLevelCheckWait, () => { return CommonFunction.CheckRoutineEndState(_vacuumLevelCheckRoutine); },
|
|
|
+ () => CheckRoutineStopStatus(_vacuumLevelCheckRoutine,"LS Vacuum Level check failed"))
|
|
|
+ //13. Shuttle Goto OUT
|
|
|
+ .Run(UnloadStep.ShuttleGotoOUT, () => { return AxisPosition(_shuttleAxis, $"OUT{_waferSize}"); }, NullFun, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(UnloadStep.ShuttleGotoOUTWait, () => { return _shuttleAxis.Status == RState.End; },
|
|
|
() => CheckAxisMotionStopStatus(_shuttleAxis))
|
|
|
- //2.5 CRS Vacuum Check
|
|
|
- .Run(UnloadStep.VacuumLevel, () => { return _vacuumLevelCheckRoutine.Start(true) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(UnloadStep.VacuumLevelCheck, () => { return CommonFunction.CheckRoutineEndState(_vacuumLevelCheckRoutine); },
|
|
|
- () => CheckRoutineStopStatus(_vacuumLevelCheckRoutine,"Vacuum Level check failed"))
|
|
|
- //2.6 Tilt Goto HORI
|
|
|
+ //14. Tilt Goto HORI
|
|
|
.Run(UnloadStep.TiltGotoHori, () => { return AxisPosition(_tiltAxis,"HORI"); }, NullFun, _delay_1ms)
|
|
|
.WaitWithStopCondition(UnloadStep.TiltGotoHoriCheck, () => { return _tiltAxis.Status == RState.End; },
|
|
|
() => CheckAxisMotionStopStatus(_tiltAxis))
|
|
|
- //2.7 BernoulliBladderOff
|
|
|
- .Run(UnloadStep.BernoulliBladderOff, () => { return _bernoulliBladderRoutine.Start(false) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(UnloadStep.BernoulliBladderOffCheck, () => { return CommonFunction.CheckRoutineEndState(_bernoulliBladderRoutine); },
|
|
|
- () => CheckRoutineStopStatus(_bernoulliBladderRoutine,"BernoulliBladder Off failed"))
|
|
|
- //2.8 Re BernoulliBladderOn
|
|
|
- .Run(UnloadStep.ReBernoulliBladderOn, () => { return _bernoulliBladderRoutine.Start(true) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(UnloadStep.ReBernoulliBladderOnCheck, () => { return CommonFunction.CheckRoutineEndState(_bernoulliBladderRoutine); },
|
|
|
- () => CheckRoutineStopStatus(_bernoulliBladderRoutine, "BernoulliBladder On failed"))
|
|
|
- //2.9 Bernoulli N2 Off
|
|
|
- .Run(UnloadStep.BernoulliN2Off, BernoulliN2Off, _delay_1ms)
|
|
|
+ //15. Bernoulli N2 Off
|
|
|
+ .Run(UnloadStep.BernoulliN2Off, BernoulliN2Off, () => { return !_sideDevice.SideData.BernoulliN2; }, _delay_5s)
|
|
|
+ //16. WS Bladder Off
|
|
|
+ .Run(UnloadStep.WSBladderOff, () => { return _whBladderRoutine.Start(false) == RState.Running; }, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(UnloadStep.WSBladderOffCheck, () => { return CommonFunction.CheckRoutineEndState(_whBladderRoutine); },
|
|
|
+ () => CheckRoutineStopStatus(_whBladderRoutine, "WSBladder Off failed"))
|
|
|
.End(UnloadStep.End, NullFun, 10);
|
|
|
return Runner.Status;
|
|
|
}
|
|
|
/// <summary>
|
|
|
- /// Wafer Holder Clamp On
|
|
|
- /// </summary>
|
|
|
- /// <returns></returns>
|
|
|
- private bool WaferHolderClampOn()
|
|
|
- {
|
|
|
- bool result = _loaderCommonDevice.WaferHolderClampOnAction();
|
|
|
- if(!result)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_LOADER, "Wafer Shuttle Clamp on faied", 0);
|
|
|
- }
|
|
|
- return result;
|
|
|
- }
|
|
|
- /// <summary>
|
|
|
- /// 检验TranslateBladderOff异常状态
|
|
|
+ /// 检验Routine异常状态
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
private bool CheckRoutineStopStatus(IRoutine routine,string error)
|
|
@@ -269,6 +228,32 @@ namespace CyberX8_RT.Devices.Loader
|
|
|
return result;
|
|
|
}
|
|
|
/// <summary>
|
|
|
+ /// Wafer Holder Clamp Off
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ public bool WSClampOffAction()
|
|
|
+ {
|
|
|
+ bool result = _loaderCommonDevice.WaferHolderClampOffAction();
|
|
|
+ if (!result)
|
|
|
+ {
|
|
|
+ NotifyError(eEvent.ERR_LOADER, "Wafer Shuttle Clamp Off failed", 2);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ /// <summary>
|
|
|
+ /// Wafer Holder Clamp On
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ public bool WSClampOnAction()
|
|
|
+ {
|
|
|
+ bool result = _loaderCommonDevice.WaferHolderClampOnAction();
|
|
|
+ if (!result)
|
|
|
+ {
|
|
|
+ NotifyError(eEvent.ERR_LOADER, "Wafer Shuttle Clamp On failed", 2);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ /// <summary>
|
|
|
/// 启动
|
|
|
/// </summary>
|
|
|
/// <param name="objs"></param>
|
|
@@ -276,21 +261,21 @@ namespace CyberX8_RT.Devices.Loader
|
|
|
/// <exception cref="NotImplementedException"></exception>
|
|
|
public RState Start(params object[] objs)
|
|
|
{
|
|
|
+ if (SC.ContainsItem($"Loader1.{_side}WaferSize"))
|
|
|
+ {
|
|
|
+ _waferSize = SC.GetValue<int>($"Loader1.{_side}WaferSize");
|
|
|
+ }
|
|
|
_shuttleAxis = GetShuttleAxis();
|
|
|
- _crsAxis = GetCrsAxis();
|
|
|
+ _lsAxis = GetCrsAxis();
|
|
|
_tiltAxis = GetTiltAxis();
|
|
|
_loaderCommonDevice = DEVICE.GetDevice<LoaderCommonDevice>($"Loader1.Common");
|
|
|
_rotationAxis = DEVICE.GetDevice<JetAxisBase>($"{ModuleName.Loader1}.Rotation");
|
|
|
_sideDevice = DEVICE.GetDevice<LoaderSideDevice>($"{Module}.{_side}");
|
|
|
- _waferHolderSideClampRoutine = new LoaderCommonWaferHolderSideClampRoutine($"{Module}");
|
|
|
_vacuumRoutine = new LoaderSideVacuumRoutine($"{Module}.{_side}");
|
|
|
_vacuumLevelCheckRoutine = new LoaderSideVacuumLevelCheckRoutine($"{Module}.{_side}");
|
|
|
- _unloadVacuumLevelCheckRoutine = new LoaderSideUnloadVacuumLevelCheckRoutine($"{Module}.{_side}");
|
|
|
- _doorLockRoutine = new LoaderSideDoorLockRoutine($"{Module}.{_side}");
|
|
|
+ //_unloadVacuumLevelCheckRoutine = new LoaderSideUnloadVacuumLevelCheckRoutine($"{Module}.{_side}");
|
|
|
_whBladderRoutine = new LoaderSideWhBladderRoutine($"{Module}.{_side}");
|
|
|
- _transHightRoutine = new LoaderSideTransHighRoutine($"{Module}.{_side}");
|
|
|
_bernoulliBladderRoutine = new LoaderSideBernoulliBladderRoutine($"{Module}.{_side}");
|
|
|
- _transBladderRoutine = new LoaderSideTransBladderRoutine($"{Module}.{_side}");
|
|
|
Runner.Start(Module, $"Unload {_side}");
|
|
|
return RState.Running;
|
|
|
}
|
|
@@ -357,10 +342,6 @@ namespace CyberX8_RT.Devices.Loader
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- if (!UnloadCRSVacuumCheck())
|
|
|
- {
|
|
|
- return false;
|
|
|
- }
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -371,25 +352,25 @@ namespace CyberX8_RT.Devices.Loader
|
|
|
private bool CheckHomeCondition()
|
|
|
{
|
|
|
//检验PUF、Loader Transporter,Robot均Homed
|
|
|
- if (ModuleHelper.IsInstalled(ModuleName.PUF1))
|
|
|
+ //Efem Home
|
|
|
+ if (ModuleHelper.IsInstalled(ModuleName.EFEM))
|
|
|
{
|
|
|
- PUFEntity puf1Entity = Singleton<RouteManager>.Instance.GetModule<PUFEntity>(ModuleName.PUF1.ToString());
|
|
|
- if (!puf1Entity.IsHomed)
|
|
|
+ EfemEntity efemEntity = Singleton<RouteManager>.Instance.GetModule<EfemEntity>(ModuleName.EFEM.ToString());
|
|
|
+ if (!efemEntity.IsHomed)
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_LOADER, "PUF1 is not homed",-1);
|
|
|
+ LOG.WriteLog(eEvent.ERR_EFEM_ROBOT, Module, $"{ModuleName.EFEM.ToString()} is not home, Cannot execute GotoSavedPosition");
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
- if (ModuleHelper.IsInstalled(ModuleName.PUF2))
|
|
|
+ if (ModuleHelper.IsInstalled(ModuleName.PUF1))
|
|
|
{
|
|
|
- PUFEntity puf2Entity = Singleton<RouteManager>.Instance.GetModule<PUFEntity>(ModuleName.PUF2.ToString());
|
|
|
-
|
|
|
- if (!puf2Entity.IsHomed)
|
|
|
+ PUFEntity puf1Entity = Singleton<RouteManager>.Instance.GetModule<PUFEntity>(ModuleName.PUF1.ToString());
|
|
|
+ if (!puf1Entity.IsHomed)
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_LOADER,"PUF2 is not homed",-1);
|
|
|
+ NotifyError(eEvent.ERR_LOADER, "PUF1 is not homed",-1);
|
|
|
return false;
|
|
|
}
|
|
|
- }
|
|
|
+ }
|
|
|
if (ModuleHelper.IsInstalled(ModuleName.Transporter2))
|
|
|
{
|
|
|
TransporterEntity loaderTransportEntity = Singleton<RouteManager>.Instance.GetModule<TransporterEntity>(ModuleName.Transporter2.ToString());
|
|
@@ -403,7 +384,7 @@ namespace CyberX8_RT.Devices.Loader
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
- /// 检验Axis我们的
|
|
|
+ /// 检验Axis条件
|
|
|
/// </summary>
|
|
|
/// <param name="side"></param>
|
|
|
/// <returns></returns>
|
|
@@ -411,7 +392,7 @@ namespace CyberX8_RT.Devices.Loader
|
|
|
{
|
|
|
if (!_rotationAxis.IsHomed)
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_LOADER, $"rotation is not homed",-1);
|
|
|
+ NotifyError(eEvent.ERR_LOADER, $"Rotation is not homed",-1);
|
|
|
return false;
|
|
|
}
|
|
|
if (!_shuttleAxis.IsHomed)
|
|
@@ -424,110 +405,103 @@ namespace CyberX8_RT.Devices.Loader
|
|
|
NotifyError(eEvent.ERR_LOADER, $"{_tiltAxis.Name} is not homed",-1);
|
|
|
return false;
|
|
|
}
|
|
|
- if (!_crsAxis.IsHomed)
|
|
|
+ if (!_lsAxis.IsHomed)
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_LOADER, $"{_crsAxis.Name} is not homed", -1);
|
|
|
+ NotifyError(eEvent.ERR_LOADER, $"{_lsAxis.Name} is not homed", -1);
|
|
|
return false;
|
|
|
}
|
|
|
- double rotationPosition = _rotationAxis.MotionData.MotorPosition;
|
|
|
- if (!_rotationAxis.CheckPositionIsInStation(rotationPosition, "LOAD") &&
|
|
|
- !_rotationAxis.CheckPositionIsInStation(rotationPosition, "SERVICEB"))
|
|
|
+ //LS已经运动到 Setup 位
|
|
|
+ double crsPosition = _lsAxis.MotionData.MotorPosition;
|
|
|
+ if (!_lsAxis.CheckPositionIsInStation(crsPosition, $"Setup{_waferSize}"))
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_LOADER, $"rotation {rotationPosition} not in LOAD and SERVICEB",-1);
|
|
|
+ NotifyError(eEvent.ERR_LOADER, $"LS {crsPosition} not in Setup{_waferSize}", -1);
|
|
|
return false;
|
|
|
}
|
|
|
- double shuttlePosition=_shuttleAxis.MotionData.MotorPosition;
|
|
|
- if (!_shuttleAxis.CheckPositionIsInStation(shuttlePosition, "CLOSED"))
|
|
|
+ //Rotation已经运动到 loaderA 位(sideA 下片时)或 loaderB 位(sideB 下片时)
|
|
|
+ double rotationPosition = _rotationAxis.MotionData.MotorPosition;
|
|
|
+ if(_side == "SideA")
|
|
|
+ {
|
|
|
+
|
|
|
+ if (!_rotationAxis.CheckPositionIsInStation(rotationPosition, $"LOADA{_waferSize}"))
|
|
|
+ {
|
|
|
+ NotifyError(eEvent.ERR_LOADER, $"Rotation {rotationPosition} not in LOADA{_waferSize}", -1);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (!_rotationAxis.CheckPositionIsInStation(rotationPosition, $"LOADB{_waferSize}"))
|
|
|
+ {
|
|
|
+ NotifyError(eEvent.ERR_LOADER, $"Rotation {rotationPosition} not in LOADB{_waferSize}", -1);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //Shuttle已经运动到 MID 位
|
|
|
+ double shuttlePosition =_shuttleAxis.MotionData.MotorPosition;
|
|
|
+ if (!_shuttleAxis.CheckPositionIsInStation(shuttlePosition, "MID"))
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_LOADER, $"shuttle {shuttlePosition} not in CLOSE", -1);
|
|
|
+ NotifyError(eEvent.ERR_LOADER, $"Shuttle {shuttlePosition} not in MID", -1);
|
|
|
return false;
|
|
|
}
|
|
|
+ //Tilt已经运动到 VERT 位
|
|
|
double tiltPosition = _tiltAxis.MotionData.MotorPosition;
|
|
|
if (!_tiltAxis.CheckPositionIsInStation(tiltPosition, "VERT"))
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_LOADER, $"tilt {tiltPosition} not in VERT", -1);
|
|
|
- return false;
|
|
|
- }
|
|
|
- double crsPosition = _crsAxis.MotionData.MotorPosition;
|
|
|
- if (_crsAxis.CheckPositionIsEmpty(crsPosition))
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_LOADER, $"crs {crsPosition} not at station", -1);
|
|
|
+ NotifyError(eEvent.ERR_LOADER, $"Tilt {tiltPosition} not in VERT", -1);
|
|
|
return false;
|
|
|
}
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/// <summary>
|
|
|
- /// Unload Status Check
|
|
|
+ /// 检验状态条件
|
|
|
/// </summary>
|
|
|
/// <param name="side"></param>
|
|
|
/// <returns></returns>
|
|
|
private bool UnloadStatusCheck()
|
|
|
{
|
|
|
- //Facility:CDA,N2,Vaccum均Enable且在正常范围
|
|
|
-
|
|
|
- //Side WaferPresent
|
|
|
- LoaderSideData sideData = _sideDevice.SideData;
|
|
|
- //if (sideData.WaferPresent)
|
|
|
- //{
|
|
|
- // NotifyError(eEvent.ERR_LOADER, "side wafer is not present");
|
|
|
- // return false;
|
|
|
- //}
|
|
|
- if (sideData.DoorLowerUnlocked || sideData.DoorUpperUnlocked)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_LOADER, "Door Lock is off", -1);
|
|
|
- return false;
|
|
|
- }
|
|
|
- return true;
|
|
|
- }
|
|
|
- /// <summary>
|
|
|
- /// CRS Vacuum Check
|
|
|
- /// </summary>
|
|
|
- /// <param name="side"></param>
|
|
|
- /// <returns></returns>
|
|
|
- private bool UnloadCRSVacuumCheck()
|
|
|
- {
|
|
|
- //CRS Vacuum检验
|
|
|
LoaderSideData sideData = _sideDevice.SideData;
|
|
|
- if (sideData.CRSVacuum)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_LOADER, "LS Vacuum is on",-1);
|
|
|
- return false;
|
|
|
- }
|
|
|
- //WS Bladder
|
|
|
- if (sideData.WHBladder)
|
|
|
+ LoaderCommonData commonData = _loaderCommonDevice.CommonData;
|
|
|
+
|
|
|
+ //Bernoulli Bladder(WS Bladder on)
|
|
|
+ if (!sideData.BernoulliBladder)
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_LOADER, "WS Bladder is on", -1);
|
|
|
+ NotifyError(eEvent.ERR_LOADER, "Bernoulli Bladder is off", -1);
|
|
|
return false;
|
|
|
}
|
|
|
- //Translate Bladder/High Pres,且Sensor处于Retracted
|
|
|
- if (sideData.TransBladder)
|
|
|
+ //Bernoulli N2(BernoulliN2 off)
|
|
|
+ if (sideData.BernoulliN2)
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_LOADER, "TransBladder is on",-1);
|
|
|
+ NotifyError(eEvent.ERR_LOADER, "Bernoulli N2 is on",-1);
|
|
|
return false;
|
|
|
}
|
|
|
- if (sideData.TransHigh)
|
|
|
+ //LS Vacuum检验(LS Vaccum off)
|
|
|
+ if (sideData.CRSVacuum)
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_LOADER, "Trans High is on", -1);
|
|
|
+ NotifyError(eEvent.ERR_LOADER, "LS Vacuum is on", -1);
|
|
|
return false;
|
|
|
}
|
|
|
- //Bernoulli N2
|
|
|
- if (sideData.BernoulliN2)
|
|
|
+
|
|
|
+ //Wafer Shuttle Present(WS present)
|
|
|
+ if (!commonData.WaferHolderPresent)
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_LOADER, "Bernoulli N2 is on",-1);
|
|
|
+ NotifyError(eEvent.ERR_LOADER, "Wafer Shuttle is absent", -1);
|
|
|
return false;
|
|
|
}
|
|
|
- //Wafer Shuttle Present
|
|
|
- LoaderCommonData commonData = _loaderCommonDevice.CommonData;
|
|
|
- if (!commonData.WaferHolderPresent)
|
|
|
+
|
|
|
+ //Wafer Shuttle Clamp(Clamp on/off均可)
|
|
|
+
|
|
|
+ //Wafer Shuttle Bladder(Bladder off)
|
|
|
+ if (sideData.WHBladder)
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_LOADER, "Wafer Shuttle is absent", -1);
|
|
|
+ NotifyError(eEvent.ERR_LOADER, "Wafer Shuttle Bladder is on", -1);
|
|
|
return false;
|
|
|
}
|
|
|
- //Drip Tray Fluid
|
|
|
+ //Drip Tray Fluid(Drip Tray Fluid正常)
|
|
|
if (commonData.DripTrayFluid)
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_LOADER, "Drip Tray Fluid is on",-1);
|
|
|
+ NotifyError(eEvent.ERR_LOADER, "Drip Tray Fluid is on", -1);
|
|
|
return false;
|
|
|
}
|
|
|
return true;
|