|
@@ -19,6 +19,8 @@ using System.Threading.Tasks;
|
|
|
using MECF.Framework.Common.CommonData.Loader;
|
|
|
using CyberX8_RT.Modules.Transporter;
|
|
|
using MECF.Framework.Common.WaferHolder;
|
|
|
+using CyberX8_RT.Modules.Loader;
|
|
|
+using Aitex.Core.Common;
|
|
|
|
|
|
namespace CyberX8_RT.Devices.Loader
|
|
|
{
|
|
@@ -28,38 +30,25 @@ namespace CyberX8_RT.Devices.Loader
|
|
|
{
|
|
|
CheckPreCondition,
|
|
|
WSClampOn,
|
|
|
- WSSideClampOn,
|
|
|
- WSSideClampOnCheck,
|
|
|
- BernoulliBladderOn,
|
|
|
- BernoulliBladderOnCheck,
|
|
|
- TranslateBladderOff,
|
|
|
- TranslateBladderOffCheck,
|
|
|
- CRSGotoUnlock,
|
|
|
- CRSGotoUnlockWait,
|
|
|
BernoulliN2On,
|
|
|
BernoulliN2OnCheck,
|
|
|
BernoulliBladderOff,
|
|
|
BernoulliBladderOffCheck,
|
|
|
TiltGotoFloat,
|
|
|
TiltGotoFloatWait,
|
|
|
- ReBernoulliBladderOn,
|
|
|
- ReBernoulliBladderOnCheck,
|
|
|
+ Wait1,
|
|
|
+ BernoulliBladderOn,
|
|
|
+ BernoulliBladderOnCheck,
|
|
|
+ CRSVacuumValue,
|
|
|
+ CRSVacuumValueCheck,
|
|
|
TiltGotoVertical,
|
|
|
TiltGotoVerticalWait,
|
|
|
- CRSVacuumValue,
|
|
|
- CRSVacuumValueCheck,
|
|
|
- ShuttleGotoClose,
|
|
|
- ShuttleGotoCloseWait,
|
|
|
- ReCRSVacuumValue,
|
|
|
- ReCRSVacuumValueCheck,
|
|
|
- DoorLockOn,
|
|
|
- DoorLockOnCheck,
|
|
|
+ CRSGotoUnlock,
|
|
|
+ CRSGotoUnlockWait,
|
|
|
+ ShuttleGotoCRS,
|
|
|
+ ShuttleGotoCRSWait,
|
|
|
WSBladderOn,
|
|
|
WSBladderOnCheck,
|
|
|
- TransBladderOn,
|
|
|
- TransBladderOnCheck,
|
|
|
- TransHighOff,
|
|
|
- TransHighOffCheck,
|
|
|
CRSGotoSetUp,
|
|
|
CRSGotoSetUpWait,
|
|
|
CRSGotoLock,
|
|
@@ -68,39 +57,35 @@ namespace CyberX8_RT.Devices.Loader
|
|
|
BernoulliN2OffCheck,
|
|
|
WSBladderOff,
|
|
|
WSBladderOffCheck,
|
|
|
- CRSReleaseDelay,
|
|
|
+ Wait2,
|
|
|
CRSVacuumOff,
|
|
|
CRSVacuumOffCheck,
|
|
|
- TranslateBladderReleaseDelay,
|
|
|
- ReTranslateBladderOff,
|
|
|
- ReTranslateBladderOffCheck,
|
|
|
- TranslateHighPresOff,
|
|
|
- TranslateHighPresOffCheck,
|
|
|
+ Wait3,
|
|
|
+ ShuttleGotoMID,
|
|
|
+ ShuttleGotoMIDWait,
|
|
|
HomingCRSAxis,
|
|
|
HomingCRSAxisWait,
|
|
|
CRSHomedGotoSetUp,
|
|
|
CRSHomedGotoSetUpCheck,
|
|
|
End
|
|
|
+
|
|
|
}
|
|
|
#region 内部变量
|
|
|
private string _side = "";
|
|
|
private int _crsVacuumReleaseDelayInMilliseconds = 250;
|
|
|
private int _translateOutDelayInMilliseconds = 250;
|
|
|
+ private int _waferSize = 200;
|
|
|
private JetAxisBase _crsAxis;
|
|
|
private JetAxisBase _tiltAxis;
|
|
|
private JetAxisBase _shuttleAxis;
|
|
|
private JetAxisBase _rotationAxis;
|
|
|
private LoaderCommonDevice _loaderCommonDevice;
|
|
|
private LoaderSideDevice _sideDevice;
|
|
|
- private LoaderCommonWaferHolderSideClampRoutine _waferHolderSideClampRoutine;
|
|
|
private LoaderSideBernoulliBladderRoutine _bernoulliBladderRoutine;
|
|
|
- private LoaderSideTransBladderRoutine _transBladderRoutine;
|
|
|
private LoaderSideBernoulliN2PressureRoutine _bernoulliN2PressureRoutine;
|
|
|
private LoaderSideVacuumAndLevelCheckRoutineRoutine _vacuumAndLevelCheckRoutineRoutine;
|
|
|
private LoaderSideVacuumLevelCheckRoutine _vacuumLevelCheckRoutine;
|
|
|
- private LoaderSideDoorLockRoutine _doorLockRoutine;
|
|
|
private LoaderSideWhBladderRoutine _whBladderRoutine;
|
|
|
- private LoaderSideTransHighRoutine _transHighPressureRoutine;
|
|
|
|
|
|
#endregion
|
|
|
/// <summary>
|
|
@@ -125,143 +110,87 @@ namespace CyberX8_RT.Devices.Loader
|
|
|
/// <returns></returns>
|
|
|
public RState Monitor()
|
|
|
{
|
|
|
- Runner.Run(LoadStep.CheckPreCondition,CheckPreCondition,_delay_1ms)
|
|
|
- //1.0 WS Clamp On
|
|
|
- .Run(LoadStep.WSClampOn, WaferHolderClampOn,_delay_1ms)
|
|
|
- //1.1 WSSideClampOn
|
|
|
- .Run(LoadStep.WSSideClampOn, () => { return _waferHolderSideClampRoutine.Start(true) == RState.Running; },_delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.WSSideClampOnCheck, () => { return CommonFunction.CheckRoutineEndState(_waferHolderSideClampRoutine); },
|
|
|
- () => CheckRoutineStopStatus(_waferHolderSideClampRoutine,"WaferHolder Side Clamp on failed"))
|
|
|
- //1.2 BernoulliBladderOn
|
|
|
- .Run(LoadStep.BernoulliBladderOn, () => { return _bernoulliBladderRoutine.Start(true) == RState.Running; },_delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.BernoulliBladderOnCheck, () => { return CommonFunction.CheckRoutineEndState(_bernoulliBladderRoutine); },
|
|
|
- () => CheckRoutineStopStatus(_bernoulliBladderRoutine, "BernoulliBladder On failed"))
|
|
|
- //1.3 TranslateBladderOff
|
|
|
- .Run(LoadStep.TranslateBladderOff, () => { return _transBladderRoutine.Start(false) == RState.Running; },_delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.TranslateBladderOffCheck, () => { return CommonFunction.CheckRoutineEndState(_transBladderRoutine); },
|
|
|
- () => CheckRoutineStopStatus(_transBladderRoutine,"TransBladder Off failed"))
|
|
|
- //1.4 CRS Goto Unlock
|
|
|
- .Run(LoadStep.CRSGotoUnlock, () => { return AxisPosition(_crsAxis,"Unlock"); }, NullFun, _delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.CRSGotoUnlockWait, () => { return _crsAxis.Status == RState.End; },
|
|
|
- ()=>CheckAxisMotionStopStatus(_crsAxis))
|
|
|
- //1.5 BernoulliN2 On
|
|
|
- .Run(LoadStep.BernoulliN2On, () => { return _bernoulliN2PressureRoutine.Start(true)==RState.Running; },_delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.BernoulliN2OnCheck, () => { return CommonFunction.CheckRoutineEndState(_bernoulliN2PressureRoutine); },
|
|
|
+ Runner.Run(LoadStep.CheckPreCondition, CheckPreCondition, _delay_1ms)
|
|
|
+ //1 WSClamp On
|
|
|
+ .Run(LoadStep.WSClampOn, WaferHolderClampOn, _delay_1ms)
|
|
|
+ //2 BernoulliN2 On
|
|
|
+ .Run(LoadStep.BernoulliN2On, () => { return _bernoulliN2PressureRoutine.Start(true) == RState.Running; }, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(LoadStep.BernoulliN2OnCheck, () => { return CommonFunction.CheckRoutineEndState(_bernoulliN2PressureRoutine); },
|
|
|
() => CheckRoutineStopStatus(_bernoulliN2PressureRoutine, "BernoulliN2 On failed"))
|
|
|
- //1.6 Bernoulli Bladder Off
|
|
|
+ //3 Bernoulli Bladder Off
|
|
|
.Run(LoadStep.BernoulliBladderOff, () => { return _bernoulliBladderRoutine.Start(false) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.BernoulliBladderOffCheck, () => { return CommonFunction.CheckRoutineEndState(_bernoulliBladderRoutine); },
|
|
|
+ .WaitWithStopCondition(LoadStep.BernoulliBladderOffCheck, () => { return CommonFunction.CheckRoutineEndState(_bernoulliBladderRoutine); },
|
|
|
() => CheckRoutineStopStatus(_bernoulliBladderRoutine, "BernoulliBladder Off failed"))
|
|
|
- //1.7 Tilt Goto Float
|
|
|
- .Run(LoadStep.TiltGotoFloat, () => { return AxisPosition(_tiltAxis,"FLOAT"); }, NullFun, _delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.TiltGotoFloatWait, () => { return _tiltAxis.Status == RState.End; },
|
|
|
- () => CheckAxisMotionStopStatus(_tiltAxis))
|
|
|
- //1.8 Re Bernoulli Bladder On
|
|
|
- .Run(LoadStep.ReBernoulliBladderOn, () => { return _bernoulliBladderRoutine.Start(true) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.ReBernoulliBladderOnCheck, () => { return CommonFunction.CheckRoutineEndState(_bernoulliBladderRoutine); },
|
|
|
- () => CheckRoutineStopStatus(_bernoulliBladderRoutine, "ReBernoulliBladder On failed"))
|
|
|
- //1.9 Tilt Goto Vertical
|
|
|
- .Run(LoadStep.TiltGotoVertical, () => { return AxisPosition(_tiltAxis,"VERT"); }, NullFun, _delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.TiltGotoVerticalWait, () => { return _tiltAxis.Status == RState.End; },
|
|
|
+ //4 Tilt Goto Float
|
|
|
+ .Run(LoadStep.TiltGotoFloat, () => { return AxisPosition(_tiltAxis, "FLOAT"); }, NullFun, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(LoadStep.TiltGotoFloatWait, () => { return _tiltAxis.Status == RState.End; },
|
|
|
() => CheckAxisMotionStopStatus(_tiltAxis))
|
|
|
- //2.0 CRS Vacuum Check
|
|
|
+ //5 等待0.5秒
|
|
|
+ .Delay(LoadStep.Wait1, 500)
|
|
|
+ //6 BernoulliBladder On
|
|
|
+ .Run(LoadStep.BernoulliBladderOn, () => { return _bernoulliBladderRoutine.Start(true) == RState.Running; }, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(LoadStep.BernoulliBladderOnCheck, () => { return CommonFunction.CheckRoutineEndState(_bernoulliBladderRoutine); },
|
|
|
+ () => CheckRoutineStopStatus(_bernoulliBladderRoutine, "BernoulliBladder On failed"))
|
|
|
+ //7 CRS Vacuum Check
|
|
|
.Run(LoadStep.CRSVacuumValue, () => { return _vacuumLevelCheckRoutine.Start(true) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.CRSVacuumValueCheck, () => { return CommonFunction.CheckRoutineEndState(_vacuumLevelCheckRoutine); },
|
|
|
+ .WaitWithStopCondition(LoadStep.CRSVacuumValueCheck, () => { return CommonFunction.CheckRoutineEndState(_vacuumLevelCheckRoutine); },
|
|
|
() => CheckRoutineStopStatus(_vacuumLevelCheckRoutine, "CRS Vacuum Check failed"))
|
|
|
- //2.1 Shuttle Goto CLOSED
|
|
|
- .Run(LoadStep.ShuttleGotoClose, () => { return AxisPosition(_shuttleAxis,"CLOSED"); }, NullFun, _delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.ShuttleGotoCloseWait, () => { return _shuttleAxis.Status == RState.End; },
|
|
|
+ //8 Tilt Goto Vertical
|
|
|
+ .Run(LoadStep.TiltGotoVertical, () => { return AxisPosition(_tiltAxis, "VERT"); }, NullFun, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(LoadStep.TiltGotoVerticalWait, () => { return _tiltAxis.Status == RState.End; },
|
|
|
+ () => CheckAxisMotionStopStatus(_tiltAxis))
|
|
|
+ //9 CRS Goto Unlock
|
|
|
+ .Run(LoadStep.CRSGotoUnlock, () => { return AxisPosition(_crsAxis, $"Unlock{_waferSize}"); }, NullFun, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(LoadStep.CRSGotoUnlockWait, () => { return _crsAxis.Status == RState.End; },
|
|
|
+ () => CheckAxisMotionStopStatus(_crsAxis))
|
|
|
+ //10 Shuttle Goto CRS
|
|
|
+ .Run(LoadStep.ShuttleGotoCRS, () => { return AxisPosition(_shuttleAxis, "LS"); }, NullFun, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(LoadStep.ShuttleGotoCRSWait, () => { return _shuttleAxis.Status == RState.End; },
|
|
|
() => CheckAxisMotionStopStatus(_shuttleAxis))
|
|
|
- //2.2 Re CRS Vacuum Check
|
|
|
- .Run(LoadStep.ReCRSVacuumValue, () => { return _vacuumLevelCheckRoutine.Start(true) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.ReCRSVacuumValueCheck, () => { return CommonFunction.CheckRoutineEndState(_vacuumLevelCheckRoutine); },
|
|
|
- () => CheckRoutineStopStatus(_vacuumLevelCheckRoutine, "Re CRS Vacuum Check failed"))
|
|
|
- //2.3 Dor Lock On
|
|
|
- .Run(LoadStep.DoorLockOn, () => { return _doorLockRoutine.Start(true) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.DoorLockOnCheck, () => { return CommonFunction.CheckRoutineEndState(_doorLockRoutine); },
|
|
|
- () => CheckRoutineStopStatus(_doorLockRoutine,"Door lock failed"))
|
|
|
- //2.4 WS Bladder On
|
|
|
+ //11 WS Bladder On
|
|
|
.Run(LoadStep.WSBladderOn, () => { return _whBladderRoutine.Start(true) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.WSBladderOnCheck, () => { return CommonFunction.CheckRoutineEndState(_whBladderRoutine); },
|
|
|
- () => CheckRoutineStopStatus(_whBladderRoutine,"WSBladder On failed"))
|
|
|
- //2.5 Trans Bladder On
|
|
|
- .Run(LoadStep.TransBladderOn, () => { return _transBladderRoutine.Start(true) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.TransBladderOnCheck, () => { return CommonFunction.CheckRoutineEndState(_transBladderRoutine); },
|
|
|
- () => CheckRoutineStopStatus(_transBladderRoutine,"TransBladder On failed"))
|
|
|
- //2.5 Trans High Off
|
|
|
- .Run(LoadStep.TransHighOff, () => { return _transHighPressureRoutine.Start(false) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.TransHighOffCheck, () => { return CommonFunction.CheckRoutineEndState(_transHighPressureRoutine); },
|
|
|
- () => CheckRoutineStopStatus(_transHighPressureRoutine, "Trans High Off failed"))
|
|
|
- //2.6 CRS Goto SetUp
|
|
|
- .Run(LoadStep.CRSGotoSetUp, () => { return AxisPosition(_crsAxis,"Setup"); }, NullFun, _delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.CRSGotoSetUpWait, () => { return _crsAxis.Status == RState.End; },
|
|
|
+ .WaitWithStopCondition(LoadStep.WSBladderOnCheck, () => { return CommonFunction.CheckRoutineEndState(_whBladderRoutine); },
|
|
|
+ () => CheckRoutineStopStatus(_whBladderRoutine, "WSBladder On failed"))
|
|
|
+ //12 CRS Goto SetUp
|
|
|
+ .Run(LoadStep.CRSGotoSetUp, () => { return AxisPosition(_crsAxis, $"Setup{_waferSize}"); }, NullFun, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(LoadStep.CRSGotoSetUpWait, () => { return _crsAxis.Status == RState.End; },
|
|
|
() => CheckAxisMotionStopStatus(_crsAxis))
|
|
|
- //2.7 CRS Goto Lock
|
|
|
- .Run(LoadStep.CRSGotoLock, () => { return AxisPosition(_crsAxis,"Lock"); }, NullFun, _delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.CRSGotoLockWait, () => { return _crsAxis.Status == RState.End; },
|
|
|
+ //13 CRS Goto Lock
|
|
|
+ .Run(LoadStep.CRSGotoLock, () => { return AxisPosition(_crsAxis, $"Lock{_waferSize}"); }, NullFun, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(LoadStep.CRSGotoLockWait, () => { return _crsAxis.Status == RState.End; },
|
|
|
() => CheckAxisMotionStopStatus(_crsAxis))
|
|
|
- //2.8 Bernoulli N2 Off
|
|
|
+ //14 Bernoulli N2 Off
|
|
|
.Run(LoadStep.BernoulliN2Off, () => { return _bernoulliN2PressureRoutine.Start(false) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.BernoulliN2OffCheck, () => { return CommonFunction.CheckRoutineEndState(_bernoulliN2PressureRoutine); },
|
|
|
+ .WaitWithStopCondition(LoadStep.BernoulliN2OffCheck, () => { return CommonFunction.CheckRoutineEndState(_bernoulliN2PressureRoutine); },
|
|
|
() => CheckRoutineStopStatus(_bernoulliN2PressureRoutine, "Bernoulli N2 Off failed"))
|
|
|
- //2.9 WS Bladder Off
|
|
|
+ //15 WS Bladder Off
|
|
|
.Run(LoadStep.WSBladderOff, () => { return _whBladderRoutine.Start(false) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.WSBladderOffCheck, () => { return CommonFunction.CheckRoutineEndState(_whBladderRoutine); },
|
|
|
+ .WaitWithStopCondition(LoadStep.WSBladderOffCheck, () => { return CommonFunction.CheckRoutineEndState(_whBladderRoutine); },
|
|
|
() => CheckRoutineStopStatus(_whBladderRoutine, "WS Bladder Off failed"))
|
|
|
- //3.0 CRS Release Delay
|
|
|
- .Delay(LoadStep.CRSReleaseDelay,_crsVacuumReleaseDelayInMilliseconds)
|
|
|
- //3.1 CRS Vacuum Off
|
|
|
+ //16 等待0.5秒
|
|
|
+ .Delay(LoadStep.Wait2, 500)
|
|
|
+ //17 CRS Vacuum Off
|
|
|
.Run(LoadStep.CRSVacuumOff, () => { return _vacuumAndLevelCheckRoutineRoutine.Start(false) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.CRSVacuumOffCheck, () => { return CommonFunction.CheckRoutineEndState(_vacuumAndLevelCheckRoutineRoutine); },
|
|
|
+ .WaitWithStopCondition(LoadStep.CRSVacuumOffCheck, () => { return CommonFunction.CheckRoutineEndState(_vacuumAndLevelCheckRoutineRoutine); },
|
|
|
() => CheckRoutineStopStatus(_vacuumAndLevelCheckRoutineRoutine, "LS Vacuum Off failed"))
|
|
|
- //3.2 Translate Bladder Release Delay
|
|
|
- .Delay(LoadStep.TranslateBladderReleaseDelay,_translateOutDelayInMilliseconds)
|
|
|
- //3.3 Trans Bladder Off
|
|
|
- .Run(LoadStep.ReTranslateBladderOff, () => { return _transBladderRoutine.Start(false) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.ReTranslateBladderOffCheck, () => { return CommonFunction.CheckRoutineEndState(_transBladderRoutine); },
|
|
|
- () => CheckRoutineStopStatus(_transBladderRoutine, "Trans Bladder Off failed"))
|
|
|
- //3.3 Trans High Off
|
|
|
- .Run(LoadStep.TranslateHighPresOff, () => { return _transHighPressureRoutine.Start(false) == RState.Running; }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.TranslateHighPresOffCheck, () => { return CommonFunction.CheckRoutineEndState(_transHighPressureRoutine); },
|
|
|
- () => CheckRoutineStopStatus(_transHighPressureRoutine, "Trans High Off failed"))
|
|
|
- //3.4 Home CRS Axis
|
|
|
- .Run(LoadStep.HomingCRSAxis, CRSHome,_delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.HomingCRSAxisWait, () => { return _crsAxis.Status == RState.End; },
|
|
|
+ //18 等待0.5秒
|
|
|
+ .Delay(LoadStep.Wait3, 500)
|
|
|
+ //19 Shuttle Goto Mid
|
|
|
+ .Run(LoadStep.ShuttleGotoMID, () => { return AxisPosition(_shuttleAxis, "MID"); }, NullFun, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(LoadStep.ShuttleGotoMIDWait, () => { return _shuttleAxis.Status == RState.End; },
|
|
|
+ () => CheckAxisMotionStopStatus(_shuttleAxis))
|
|
|
+ //20 Home CRS Axis
|
|
|
+ .Run(LoadStep.HomingCRSAxis, CRSHome, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(LoadStep.HomingCRSAxisWait, () => { return _crsAxis.Status == RState.End; },
|
|
|
() => CheckCRSHomeStopStatus())
|
|
|
- .Run(LoadStep.CRSHomedGotoSetUp, () => { return AxisPosition(_crsAxis,"Setup"); }, _delay_1ms)
|
|
|
- .WaitWithStopCondition(LoadStep.CRSHomedGotoSetUpCheck, () => { return _crsAxis.Status == RState.End; },
|
|
|
- ()=>CheckAxisMotionStopStatus(_crsAxis))
|
|
|
- .End(LoadStep.End,UpdateWaferHolderLipCRSUsed);
|
|
|
+ .Run(LoadStep.CRSHomedGotoSetUp, () => { return AxisPosition(_crsAxis, $"Setup{_waferSize}"); }, _delay_1ms)
|
|
|
+ .WaitWithStopCondition(LoadStep.CRSHomedGotoSetUpCheck, () => { return _crsAxis.Status == RState.End; },
|
|
|
+ () => CheckAxisMotionStopStatus(_crsAxis))
|
|
|
+ .End(LoadStep.End, UpdateWaferHolderLipCRSUsed);
|
|
|
|
|
|
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>
|
|
|
- /// 检验WSSideClampOn异常状态
|
|
|
- /// </summary>
|
|
|
- /// <returns></returns>
|
|
|
- private bool CheckWSSideClampOnStopStatus()
|
|
|
- {
|
|
|
- bool result = CommonFunction.CheckRoutineStopState(_waferHolderSideClampRoutine);
|
|
|
- if (result)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_LOADER, "WS Clamp On failed", 0);
|
|
|
- }
|
|
|
- return result;
|
|
|
- }
|
|
|
- /// <summary>
|
|
|
/// 检验TranslateBladderOff异常状态
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
@@ -336,20 +265,19 @@ namespace CyberX8_RT.Devices.Loader
|
|
|
/// <returns></returns>
|
|
|
public RState Start(params object[] objs)
|
|
|
{
|
|
|
+ if (SC.ContainsItem($"Loader1.{_side}WaferSize"))
|
|
|
+ {
|
|
|
+ _waferSize = SC.GetValue<int>($"Loader1.{_side}WaferSize");
|
|
|
+ }
|
|
|
_crsAxis = GetCrsAxis();
|
|
|
_tiltAxis = GetTiltAxis();
|
|
|
_shuttleAxis= GetShuttleAxis();
|
|
|
_loaderCommonDevice = DEVICE.GetDevice<LoaderCommonDevice>($"Loader1.Common");
|
|
|
_rotationAxis = DEVICE.GetDevice<JetAxisBase>($"{ModuleName.Loader1}.Rotation");
|
|
|
_sideDevice = DEVICE.GetDevice<LoaderSideDevice>($"{Module}.{_side}");
|
|
|
-
|
|
|
- _waferHolderSideClampRoutine = new LoaderCommonWaferHolderSideClampRoutine(ModuleName.Loader1.ToString());
|
|
|
_vacuumLevelCheckRoutine = new LoaderSideVacuumLevelCheckRoutine($"{Module}.{_side}");
|
|
|
- _doorLockRoutine = new LoaderSideDoorLockRoutine($"{Module}.{_side}");
|
|
|
_whBladderRoutine = new LoaderSideWhBladderRoutine($"{Module}.{_side}");
|
|
|
- _transHighPressureRoutine = new LoaderSideTransHighRoutine($"{Module}.{_side}");
|
|
|
_bernoulliBladderRoutine = new LoaderSideBernoulliBladderRoutine($"{Module}.{_side}");
|
|
|
- _transBladderRoutine = new LoaderSideTransBladderRoutine($"{Module}.{_side}");
|
|
|
_bernoulliN2PressureRoutine = new LoaderSideBernoulliN2PressureRoutine($"{Module}.{_side}");
|
|
|
_vacuumAndLevelCheckRoutineRoutine = new LoaderSideVacuumAndLevelCheckRoutineRoutine($"{Module}.{_side}");
|
|
|
|
|
@@ -420,12 +348,10 @@ namespace CyberX8_RT.Devices.Loader
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
if(!StatusCheck())
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
if(!CRSVacuumCheck())
|
|
|
{
|
|
|
return false;
|
|
@@ -449,13 +375,12 @@ namespace CyberX8_RT.Devices.Loader
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
- if (ModuleHelper.IsInstalled(ModuleName.PUF2))
|
|
|
+ if (ModuleHelper.IsInstalled(ModuleName.Loader1))
|
|
|
{
|
|
|
- PUFEntity puf2Entity = Singleton<RouteManager>.Instance.GetModule<PUFEntity>(ModuleName.PUF2.ToString());
|
|
|
-
|
|
|
- if (!puf2Entity.IsHomed)
|
|
|
+ LoaderEntity loaderEntity = Singleton<RouteManager>.Instance.GetModule<LoaderEntity>(ModuleName.Loader1.ToString());
|
|
|
+ if (!loaderEntity.IsHomed)
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_LOADER, "PUF2 is not homed",-1);
|
|
|
+ NotifyError(eEvent.ERR_LOADER, "Loader is not homed", -1);
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
@@ -468,11 +393,12 @@ namespace CyberX8_RT.Devices.Loader
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
- /// 检验Axis我们的
|
|
|
+ /// 检验Axis位置
|
|
|
/// </summary>
|
|
|
/// <param name="side"></param>
|
|
|
/// <returns></returns>
|
|
@@ -498,36 +424,45 @@ namespace CyberX8_RT.Devices.Loader
|
|
|
NotifyError(eEvent.ERR_LOADER, $"{_crsAxis.Name} is not homed",-1);
|
|
|
return false;
|
|
|
}
|
|
|
- double rotationPosition = _rotationAxis.MotionData.MotorPosition;
|
|
|
- if (!_rotationAxis.CheckPositionIsInStation(rotationPosition, "LOADA") &&
|
|
|
- !_rotationAxis.CheckPositionIsInStation(rotationPosition, "SERVICEB"))
|
|
|
+ double rotationPosition = _rotationAxis.MotionData.MotorPosition; //校验rotation是否再load位置
|
|
|
+ if (!_rotationAxis.CheckPositionIsInStation(rotationPosition, $"LOAD{_side.Substring(_side.Length- 1)}{_waferSize}"))
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_LOADER, $"rotation {rotationPosition} not in LOADA and SERVICEB", -1);
|
|
|
+ NotifyError(eEvent.ERR_LOADER, $"rotation {rotationPosition} not in LOAD{_side.Substring(_side.Length - 1)}{_waferSize}", -1);
|
|
|
return false;
|
|
|
}
|
|
|
- double shuttlePosition=_shuttleAxis.MotionData.MotorPosition;
|
|
|
- if (!_shuttleAxis.CheckPositionIsInStation(shuttlePosition, "OPEN") &&
|
|
|
- !_shuttleAxis.CheckPositionIsInStation(shuttlePosition, "OPENB"))
|
|
|
+ double shuttlePosition=_shuttleAxis.MotionData.MotorPosition;//校验shuttle位置是否再out位置
|
|
|
+ if (!_shuttleAxis.CheckPositionIsInStation(shuttlePosition, $"OUT{_waferSize}"))
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_LOADER, $"shuttle {shuttlePosition} not in OPEN and OPENB",-1);
|
|
|
+ NotifyError(eEvent.ERR_LOADER, $"shuttle {shuttlePosition} not in $OUT{_waferSize}",-1);
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
- double tiltPosition = _tiltAxis.MotionData.MotorPosition;
|
|
|
+ double tiltPosition = _tiltAxis.MotionData.MotorPosition;//校验tilt是否在hori位置
|
|
|
if (!_tiltAxis.CheckPositionIsInStation(tiltPosition, "HORI"))
|
|
|
{
|
|
|
NotifyError(eEvent.ERR_LOADER, $"tilt {tiltPosition} not in HORI", -1);
|
|
|
return false;
|
|
|
}
|
|
|
- double crsPosition=_crsAxis.MotionData.MotorPosition;
|
|
|
- if (_crsAxis.CheckPositionIsEmpty(crsPosition))
|
|
|
+ double crsPosition=_crsAxis.MotionData.MotorPosition;//校验crs是否在setup位置
|
|
|
+ if (_crsAxis.CheckPositionIsInStation(tiltPosition, $"Setup{_waferSize}"))
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_LOADER, $"crs {crsPosition} not at station",-1);
|
|
|
+ NotifyError(eEvent.ERR_LOADER, $"crs {crsPosition} not at Setup{_waferSize}",-1);
|
|
|
return false;
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
-
|
|
|
+ /// <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>
|
|
|
/// Status Check
|
|
|
/// </summary>
|
|
@@ -535,19 +470,10 @@ namespace CyberX8_RT.Devices.Loader
|
|
|
/// <returns></returns>
|
|
|
private bool StatusCheck()
|
|
|
{
|
|
|
- //Facility:CDA,N2,Vaccum均Enable且在正常范围
|
|
|
-
|
|
|
- //Side WaferPresent
|
|
|
- LoaderSideData sideData = _sideDevice.SideData;
|
|
|
- bool isSimulator = SC.GetValue<bool>("System.IsSimulatorMode");
|
|
|
- if (!sideData.WaferPresent&&!isSimulator)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_LOADER, "side wafer not present", -1);
|
|
|
- return false;
|
|
|
- }
|
|
|
- if (sideData.DoorUpperLocked || sideData.DoorLowerLocked)
|
|
|
+ //判断是否放置wafershuttle
|
|
|
+ if (!_loaderCommonDevice.CommonData.WaferHolderPresent)
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_LOADER, "Door Lock is not off", -1);
|
|
|
+ NotifyError(eEvent.ERR_LOADER, "There is no wafer shuttle, can not do load", -1);
|
|
|
return false;
|
|
|
}
|
|
|
return true;
|
|
@@ -560,14 +486,32 @@ namespace CyberX8_RT.Devices.Loader
|
|
|
/// <returns></returns>
|
|
|
private bool CRSVacuumCheck()
|
|
|
{
|
|
|
- //CRS Vacuum检验
|
|
|
LoaderSideData sideData = _sideDevice.SideData;
|
|
|
+ LoaderCommonData commonData = _loaderCommonDevice.CommonData;
|
|
|
+ //Bernoulli Bladder
|
|
|
+ if (!sideData.BernoulliBladder)
|
|
|
+ {
|
|
|
+ NotifyError(eEvent.ERR_LOADER, "BernoulliBladder is off", -1);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (sideData.BernoulliExtended)
|
|
|
+ {
|
|
|
+ NotifyError(eEvent.ERR_LOADER, "Bernoulli is Extended", -1);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ //Bernoulli N2
|
|
|
+ if (sideData.BernoulliN2)
|
|
|
+ {
|
|
|
+ NotifyError(eEvent.ERR_LOADER, "Bernoulli N2 is On", -1);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ //CRS Vacuum检验
|
|
|
if (!sideData.CRSVacuum)
|
|
|
{
|
|
|
NotifyError(eEvent.ERR_LOADER, "LS Vacuum is off",-1);
|
|
|
return false;
|
|
|
}
|
|
|
- if (SC.ContainsItem($"{Module}.LSVacuumHighLimit"))
|
|
|
+ if (SC.ContainsItem($"{Module}.LSVacuumHighLimit")) //真空值要大于最小设定值
|
|
|
{
|
|
|
double crsVacuumHighLimit = SC.GetValue<double>($"{Module}.LSVacuumHighLimit");
|
|
|
if (sideData.CRSVacuumValue >= crsVacuumHighLimit || sideData.CRSVacuumValue >= 0)
|
|
@@ -576,20 +520,23 @@ namespace CyberX8_RT.Devices.Loader
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
- //WS Bladder,WS Bladder Pressure压力应该大于设定值WSBladderPressure
|
|
|
- if (!sideData.WHBladder)
|
|
|
+ //WS Clamp
|
|
|
+ if (!commonData.WaferHolderClamp)
|
|
|
{
|
|
|
- NotifyError(eEvent.ERR_LOADER, "WS Bladder is off",-1);
|
|
|
+ NotifyError(eEvent.ERR_LOADER, "Wafer Shuttle Clamp is off", -1);
|
|
|
return false;
|
|
|
}
|
|
|
- if (SC.ContainsItem($"{Module}.WSBladderPressure"))
|
|
|
+ //WS Bladder
|
|
|
+ if (sideData.WHBladder)
|
|
|
{
|
|
|
- double wsBladderPressure = SC.GetValue<double>($"{Module}.WSBladderPressure");
|
|
|
- if (sideData.WHBladderPressure <= wsBladderPressure)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_LOADER, $"WS Bladder Pressure value should be more than {wsBladderPressure}", -1);
|
|
|
- return false;
|
|
|
- }
|
|
|
+ NotifyError(eEvent.ERR_LOADER, "WS Bladder is on", -1);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ //Drip Tray Fluid
|
|
|
+ if (commonData.DripTrayFluid)
|
|
|
+ {
|
|
|
+ NotifyError(eEvent.ERR_LOADER, "Drip Tray Fluid is on", -1);
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
//Translate Bladder/High Pres,且Sensor处于Retracted
|
|
@@ -608,46 +555,12 @@ namespace CyberX8_RT.Devices.Loader
|
|
|
NotifyError(eEvent.ERR_LOADER, "Translate Retracted is off",-1);
|
|
|
return false;
|
|
|
}
|
|
|
- //Bernoulli Bladder
|
|
|
- if (!sideData.BernoulliBladder)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_LOADER, "BernoulliBladder is off", -1);
|
|
|
- return false;
|
|
|
- }
|
|
|
- if (sideData.BernoulliExtended)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_LOADER, "Bernoulli is Extended",-1);
|
|
|
- return false;
|
|
|
- }
|
|
|
- //Bernoulli N2
|
|
|
- if (sideData.BernoulliN2)
|
|
|
- {
|
|
|
- double minBernoulliN2Pressure = SC.GetValue<double>($"{Module}.MinBernoulliN2Pressure");
|
|
|
- if (sideData.BernoulliPressure <= minBernoulliN2Pressure)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_LOADER, "Bernoulli N2 is On,but N2 Pressure is less min setting parameter", -1);
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
//Wafer Shuttle Present
|
|
|
- LoaderCommonData commonData = _loaderCommonDevice.CommonData;
|
|
|
if (!commonData.WaferHolderPresent)
|
|
|
{
|
|
|
NotifyError(eEvent.ERR_LOADER, "Wafer Shuttle is absent",-1);
|
|
|
return false;
|
|
|
}
|
|
|
- //WS Clamp
|
|
|
- if (!commonData.WaferHolderClamp)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_LOADER, "Wafer Shuttle Clamp is off", -1);
|
|
|
- return false;
|
|
|
- }
|
|
|
- //Drip Tray Fluid
|
|
|
- if (commonData.DripTrayFluid)
|
|
|
- {
|
|
|
- NotifyError(eEvent.ERR_LOADER, "Drip Tray Fluid is on",-1);
|
|
|
- return false;
|
|
|
- }
|
|
|
return true;
|
|
|
}
|
|
|
/// <summary>
|