Browse Source

Modify LoaderRotationAxisInterLock and LoaderShuttleAxisInterLock; Add LoaderUnloadRoutine and LoaderInstallCRSRoutine;

niuyx 3 months ago
parent
commit
ca10919375

+ 2 - 0
CyberX8_RT/Config/System.sccfg

@@ -170,6 +170,8 @@
 
 	<!--Loader1-->
 	<configs name="Loader1" nameView="Loader1">
+		<config default="200" name="SideAWaferSize" nameView="SideA Wafer Size" description="SideA Wafer尺寸" max="200" min="0" paramter="" tag="" unit="" type="Integer" visible="true"/>
+		<config default="200" name="SideBWaferSize" nameView="SideB Wafer Size" description="SideB Wafer尺寸" max="200" min="0" paramter="" tag="" unit="" type="Integer" visible="true"/>
 		<config default="30000" name="DoorLockTimeout" nameView="DoorLockTimeout" description="Max amount of time to wait for doors to be opened/closed. (ms)" max="60000" min="1000" paramter="" tag="" unit="ms" type="Integer" />
 		<config default="10000" name="LSVacuumTimeout" nameView="LSVacuumTimeout" description="Max amount of time to wait for LS vacuum to be enabled/disabled. (ms)" max="60000" min="1000" paramter="" tag="" unit="ms" type="Integer" />
 		<config default="30000" name="WSBladderEnableTimeout" nameView="WSBladderEnableTimeout" description="Max amount of time to wait for WS bladder to be enabled. (ms)" max="60000" min="1000" paramter="" tag="" unit="ms" type="Integer" />

+ 161 - 201
CyberX8_RT/Devices/Loader/LoaderInstallCRSRoutine.cs

@@ -12,11 +12,8 @@ using CyberX8_RT.Devices.AXIS.CANOpen;
 using CyberX8_RT.Modules.PUF;
 using CyberX8_RT.Modules;
 using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 using CyberX8_RT.Modules.Transporter;
+using Aitex.Core.RT.SCCore;
 
 namespace CyberX8_RT.Devices.Loader
 {
@@ -24,76 +21,59 @@ namespace CyberX8_RT.Devices.Loader
     {
         private enum InstallStep
         {
-            DoorUnlock,
-            DoorUnlockCheck,
+            CheckPreCondition,
             TiltGotoVertical,
             TiltGotoVerticalCheck,
-            SwingGotoOpen,
-            SwingGotoOpenWait,
-            CRSGotoUnlock,
-            CRSGotoUnlockWait,
-            SwingGotoClose,
-            SwingGotoCloseWait,
-            DoorLockOn,
-            DoorLockOnCheck,
-            WSSideClampOn,
-            WSSideClampOnCheck,
-            WSClampOn,
-            BernoulliN2On,
-            BernoulliN2OnCheck,
+            LSGotoUnlock,
+            LSGotoUnlockWait,
+            ShuttleGotoIN,
+            ShuttleGotoINWait,
             BernoulliBladderOn,
             BernoulliBladderOnCheck,
-            TransBladderOn,
-            TransBladderOnCheck,
-            TranslateHighOff,
-            TranslateHighOffCheck,
-            CRSVacuumOn,
-            CRSVacuumOnCheck,
+            BernoulliN2On,
+            BernoulliN2OnCheck,
             WSBladderOn,
             WSBladderOnCheck,
-            VacuumLevel,
+            LSVacuumOn,
+            LSVacuumOnCheck,
             VacuumLevelCheck,
-            CRSGotoLock,
-            CRSGotoLockWait,
-            CRSVacuumOff,
-            CRSVacuumOffCheck,
-            WSBladderOff,
-            WSBladderOffCheck,
-            VacuumOffLevel,
-            VacuumOffLevelCheck,
-            CRSSwitchOn,
-            CRSSwitchOnCheck,
-            TransBladderOff,
-            TransBladderOffCheck,
-            LastTranslateHighOff,
-            LastTranslateHighOffCheck,
+            VacuumLevelCheckWait,
+            ShuttleGotoLS,
+            ShuttleGotoLSWait,
+            LSGotoLock,
+            LSGotoLockWait,
             BernoulliN2Off,
             BernoulliN2OffCheck,
-            HomingCRSAxis,
-            HomingCRSAxisWait,
-            CRSHomedGotoSetUp,
-            CRSHomedGotoSetUpCheck,
+            WSBladderOff,
+            WSBladderOffCheck,
+            Wait500MS,
+            LSVacuumOff,
+            LSVacuumOffCheck,
+            ReWait500MS,
+            ShuttleGotoMID,
+            ShuttleGotoMIDWait,
+            HomingLSAxis,
+            HomingLSAxisWait,
             End
         }
 
         #region 内部变量
         private string _side = "";
-        private LoaderCommonWaferHolderSideClampRoutine _waferHolderSideClampRoutine;
-        private LoaderSideTransBladderRoutine _transBladderRoutine;
-        private JetAxisBase _crsAxis;
+        private JetAxisBase _lsAxis;
         private LoaderSideBernoulliBladderRoutine _bernoulliBladderRoutine;
         private LoaderSideBernoulliN2PressureRoutine _bernoulliN2PressureRoutine;
-        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 LoaderCommonDevice _loaderCommonDevice;
         private LoaderSideDevice _sideDevice;
+        /// <summary>
+        /// WaferSize
+        /// </summary>
+        private int _waferSize;
         #endregion
 
         /// <summary>
@@ -117,80 +97,57 @@ namespace CyberX8_RT.Devices.Loader
         /// <returns></returns>
         public RState Monitor()
         {
-            //1.0 Door UnLock 
-            Runner.Run(InstallStep.DoorUnlock, () => { return _doorLockRoutine.Start(false) == RState.Running; }, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.DoorUnlockCheck, () => { return CommonFunction.CheckRoutineEndState(_doorLockRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_doorLockRoutine); })
-            //1.1 Tilt Goto Vertical
-            .Run(InstallStep.TiltGotoVertical, () => { return _tiltAxis.PositionStation("VERT",false); }, NullFun, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.TiltGotoVerticalCheck, () => { return _tiltAxis.Status == RState.End; }, () => { return _tiltAxis.Status == RState.Failed; })
-            //1.2 Swing Goto OPEN
-            .Run(InstallStep.SwingGotoOpen, () => { return _shuttleAxis.PositionStation("OPEN", false); }, NullFun, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.SwingGotoOpenWait, () => { return _shuttleAxis.Status == RState.End; }, () => { return _shuttleAxis.Status == RState.Failed; })
-            //1.3 CRS Goto Unlock
-            .Run(InstallStep.CRSGotoUnlock, () => { return _crsAxis.PositionStation("Unlock",false); }, NullFun, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.CRSGotoUnlockWait, () => { return _crsAxis.Status == RState.End; }, () => { return _crsAxis.Status == RState.Failed; })
-            //1.4 Swing Goto CLOSE
-            .Run(InstallStep.SwingGotoClose, () => { return _shuttleAxis.PositionStation("CLOSED", false); }, NullFun, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.SwingGotoCloseWait, () => { return _shuttleAxis.Status == RState.End; }, () => { return _shuttleAxis.Status == RState.Failed; })
-            //1.5 Door Lock On
-            .Run(InstallStep.DoorLockOn, () => { return _doorLockRoutine.Start(true) == RState.Running; }, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.DoorLockOnCheck, () => { return CommonFunction.CheckRoutineEndState(_doorLockRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_doorLockRoutine); })
-            //1.6 WSSideClampOn
-            .Run(InstallStep.WSSideClampOn, () => { return _waferHolderSideClampRoutine.Start(true) == RState.Running; }, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.WSSideClampOnCheck, () => { return CommonFunction.CheckRoutineEndState(_waferHolderSideClampRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_waferHolderSideClampRoutine); })
-            //1.7 WSClampOn
-            .Run(InstallStep.WSClampOn, () => { return _loaderCommonDevice.WaferHolderClampOnAction(); }, _delay_1ms)
-            //1.8 BernoulliN2 On
-            .Run(InstallStep.BernoulliN2On, () => { return _bernoulliN2PressureRoutine.Start(true) == RState.Running; }, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.BernoulliN2OnCheck, () => { return CommonFunction.CheckRoutineEndState(_bernoulliN2PressureRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_bernoulliN2PressureRoutine); })
-            //1.9 BernoulliBladderOn
-            .Run(InstallStep.BernoulliBladderOn, () => { return _bernoulliBladderRoutine.Start(true) == RState.Running; }, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.BernoulliBladderOnCheck, () => { return CommonFunction.CheckRoutineEndState(_bernoulliBladderRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_bernoulliBladderRoutine); })
-            //2.0 Trans Bladder On
-            .Run(InstallStep.TransBladderOn, () => { return _transBladderRoutine.Start(true) == RState.Running; }, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.TransBladderOnCheck, () => { return CommonFunction.CheckRoutineEndState(_transBladderRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_transBladderRoutine); })
-            //2.0 Trans High Off
-            .Run(InstallStep.TranslateHighOff, () => { return _transHightRoutine.Start(false) == RState.Running; }, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.TranslateHighOffCheck, () => { return CommonFunction.CheckRoutineEndState(_transHightRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_transHightRoutine); })
-            //2.1 CRS Vacuum On
-            .Run(InstallStep.CRSVacuumOn, () => { return _vacuumRoutine.Start(true) == RState.Running; }, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.CRSVacuumOnCheck, () => { return CommonFunction.CheckRoutineEndState(_vacuumRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_vacuumRoutine); })
-            //2.2 WS Bladder On
-            .Run(InstallStep.WSBladderOn, () => { return _whBladderRoutine.Start(true) == RState.Running; }, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.WSBladderOnCheck, () => { return CommonFunction.CheckRoutineEndState(_whBladderRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_whBladderRoutine); })
-            //2.3 CRS Vacuum Check
-            .Run(InstallStep.VacuumLevel, () => { return _vacuumLevelCheckRoutine.Start(true) == RState.Running; }, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.VacuumLevelCheck, () => { return CommonFunction.CheckRoutineEndState(_vacuumLevelCheckRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_vacuumLevelCheckRoutine); })
-            //2.4 CRS Goto Lock
-            .Run(InstallStep.CRSGotoLock, () => { return _crsAxis.PositionStation("Lock", false,0, 0, 0, false); }, NullFun, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.CRSGotoLockWait, () => { return _crsAxis.Status == RState.End; }, () => { return _crsAxis.Status == RState.Failed; })
-            //2.5 CRS Vacuum Off
-            .Run(InstallStep.CRSVacuumOff, () => { return _vacuumRoutine.Start(false) == RState.Running; }, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.CRSVacuumOffCheck, () => { return CommonFunction.CheckRoutineEndState(_vacuumRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_vacuumRoutine); })
-            //2.6 WS Bladder Off
-            .Run(InstallStep.WSBladderOff, () => { return _whBladderRoutine.Start(false) == RState.Running; }, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.WSBladderOffCheck, () => { return CommonFunction.CheckRoutineEndState(_whBladderRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_whBladderRoutine); })
-            //2.7 CRS Vacuum Check
-            .Run(InstallStep.VacuumOffLevel, () => { return _vacuumLevelCheckRoutine.Start(false) == RState.Running; }, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.VacuumOffLevelCheck, () => { return CommonFunction.CheckRoutineEndState(_vacuumLevelCheckRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_vacuumLevelCheckRoutine); })
-            //2.8 CRS Switch On
-            .Run(InstallStep.CRSSwitchOn, () => { _crsAxis.SwitchOn(); return true; }, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.CRSSwitchOnCheck, () => { return _crsAxis.Status == RState.End; }, () => { return _crsAxis.Status == RState.Failed; })
-            //2.9 Trans Bladder Off
-            .Run(InstallStep.TransBladderOff, () => { return _transBladderRoutine.Start(false) == RState.Running; }, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.TransBladderOff, () => { return CommonFunction.CheckRoutineEndState(_transBladderRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_transBladderRoutine); })
-            //2.9 Trans High Off
-            .Run(InstallStep.LastTranslateHighOff, () => { return _transHightRoutine.Start(false) == RState.Running; }, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.LastTranslateHighOffCheck, () => { return CommonFunction.CheckRoutineEndState(_transHightRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_transHightRoutine); })
-            //3.0 BernoulliN2 Off
-            .Run(InstallStep.BernoulliN2Off, () => { return _bernoulliN2PressureRoutine.Start(false) == RState.Running; }, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.BernoulliN2OffCheck, () => { return CommonFunction.CheckRoutineEndState(_bernoulliN2PressureRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_bernoulliN2PressureRoutine); })
-            //3.1 Home CRS Axis
-            .Run(InstallStep.HomingCRSAxis, () => { return _crsAxis.Home(); }, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.HomingCRSAxisWait, () => { return _crsAxis.Status == RState.End; }, () => { return _crsAxis.Status == RState.Failed; })
-            .Run(InstallStep.CRSHomedGotoSetUp, () => { return _crsAxis.PositionStation("Setup",false); }, _delay_1ms)
-            .WaitWithStopCondition(InstallStep.CRSHomedGotoSetUpCheck, () => { return _crsAxis.Status == RState.End; }, () => { return _crsAxis.Status == RState.Failed; })
-            .End(InstallStep.End, NullFun, 10);
+            Runner.Run(InstallStep.CheckPreCondition, CheckPreCondition, _delay_1ms)
+                //1. Tilt Goto Vertical
+                .Run(InstallStep.TiltGotoVertical, () => { return _tiltAxis.PositionStation("VERT",false); }, NullFun, _delay_1ms)
+                .WaitWithStopCondition(InstallStep.TiltGotoVerticalCheck, () => { return _tiltAxis.Status == RState.End; }, () => { return _tiltAxis.Status == RState.Failed; })
+                //2. LS Goto Unlock
+                .Run(InstallStep.LSGotoUnlock, () => { return _lsAxis.PositionStation($"Unlock{_waferSize}", false); }, NullFun, _delay_1ms)
+                .WaitWithStopCondition(InstallStep.LSGotoUnlockWait, () => { return _lsAxis.Status == RState.End; }, () => { return _lsAxis.Status == RState.Failed; })
+                //3. Shuttle Goto IN
+                .Run(InstallStep.ShuttleGotoIN, () => { return _shuttleAxis.PositionStation("IN", false); }, NullFun, _delay_1ms)
+                .WaitWithStopCondition(InstallStep.ShuttleGotoINWait, () => { return _shuttleAxis.Status == RState.End; }, () => { return _shuttleAxis.Status == RState.Failed; })
+                //4. BernoulliBladder On
+                .Run(InstallStep.BernoulliBladderOn, () => { return _bernoulliBladderRoutine.Start(true) == RState.Running; }, _delay_1ms)
+                .WaitWithStopCondition(InstallStep.BernoulliBladderOnCheck, () => { return CommonFunction.CheckRoutineEndState(_bernoulliBladderRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_bernoulliBladderRoutine); })
+                //5. Bernoulli N2 On
+                .Run(InstallStep.BernoulliN2On, () => { return _bernoulliN2PressureRoutine.Start(true) == RState.Running; }, _delay_1ms)
+                .WaitWithStopCondition(InstallStep.BernoulliN2OnCheck, () => { return CommonFunction.CheckRoutineEndState(_bernoulliN2PressureRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_bernoulliN2PressureRoutine); })
+                //6. WS Bladder On
+                .Run(InstallStep.WSBladderOn, () => { return _whBladderRoutine.Start(true) == RState.Running; }, _delay_1ms)
+                .WaitWithStopCondition(InstallStep.WSBladderOnCheck, () => { return CommonFunction.CheckRoutineEndState(_whBladderRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_whBladderRoutine); })
+                //7. LS Vacuum On
+                .Run(InstallStep.LSVacuumOn, () => { return _vacuumRoutine.Start(true) == RState.Running; }, _delay_1ms)
+                .WaitWithStopCondition(InstallStep.LSVacuumOnCheck, () => { return CommonFunction.CheckRoutineEndState(_vacuumRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_vacuumRoutine); })
+                //8. LS Vacuum Level Check
+                .Run(InstallStep.VacuumLevelCheck, () => { return _vacuumLevelCheckRoutine.Start(true) == RState.Running; }, _delay_1ms)
+                .WaitWithStopCondition(InstallStep.VacuumLevelCheckWait, () => { return CommonFunction.CheckRoutineEndState(_vacuumLevelCheckRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_vacuumLevelCheckRoutine); })
+                //9. Shutle Goto LS
+                .Run(InstallStep.ShuttleGotoLS, () => { return _shuttleAxis.PositionStation("LS", false); }, NullFun, _delay_1ms)
+                .WaitWithStopCondition(InstallStep.ShuttleGotoLSWait, () => { return _shuttleAxis.Status == RState.End; }, () => { return _shuttleAxis.Status == RState.Failed; })
+                //10. LS Goto Lock
+                .Run(InstallStep.LSGotoLock, () => { return _lsAxis.PositionStation($"Lock{_waferSize}", false, 0, 0, 0, false); }, NullFun, _delay_1ms)
+                .WaitWithStopCondition(InstallStep.LSGotoLockWait, () => { return _lsAxis.Status == RState.End; }, () => { return _lsAxis.Status == RState.Failed; })
+                //11. Bernoulli N2 Off
+                .Run(InstallStep.BernoulliN2Off, () => { return _bernoulliN2PressureRoutine.Start(false) == RState.Running; }, _delay_1ms)
+                .WaitWithStopCondition(InstallStep.BernoulliN2OffCheck, () => { return CommonFunction.CheckRoutineEndState(_bernoulliN2PressureRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_bernoulliN2PressureRoutine); })
+                //12. WS Bladder Off
+                .Run(InstallStep.WSBladderOff, () => { return _whBladderRoutine.Start(false) == RState.Running; }, _delay_1ms)
+                .WaitWithStopCondition(InstallStep.WSBladderOffCheck, () => { return CommonFunction.CheckRoutineEndState(_whBladderRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_whBladderRoutine); })
+                //13. Wait 0.5s for WS Bladder
+                .Delay(InstallStep.Wait500MS, 500)
+                //14. LS Vacuum Off
+                .Run(InstallStep.LSVacuumOff, () => { return _vacuumRoutine.Start(false) == RState.Running; }, _delay_1ms)
+                .WaitWithStopCondition(InstallStep.LSVacuumOffCheck, () => { return CommonFunction.CheckRoutineEndState(_vacuumRoutine); }, () => { return CommonFunction.CheckRoutineStopState(_vacuumRoutine); })
+                //15. Wait 0.5s 
+                .Delay(InstallStep.ReWait500MS, 500)
+                //16. Shuttle Goto MID
+                .Run(InstallStep.ShuttleGotoMID, () => { return _shuttleAxis.PositionStation("MID", false); }, NullFun, _delay_1ms)
+                .WaitWithStopCondition(InstallStep.ShuttleGotoMIDWait, () => { return _shuttleAxis.Status == RState.End; }, () => { return _shuttleAxis.Status == RState.Failed; })
+                //17. Home LS Axis
+                .Run(InstallStep.HomingLSAxis, () => { return _lsAxis.Home(); }, _delay_1ms)
+                .WaitWithStopCondition(InstallStep.HomingLSAxisWait, () => { return _lsAxis.Status == RState.End; }, () => { return _lsAxis.Status == RState.Failed; })
+                .End(InstallStep.End, NullFun, 10);
             return Runner.Status;
         }
         /// <summary>
@@ -201,21 +158,20 @@ 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>($"{Module}.Common");
             _rotationAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.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}");
             _whBladderRoutine = new LoaderSideWhBladderRoutine($"{Module}.{_side}");
-            _transHightRoutine = new LoaderSideTransHighRoutine($"{Module}.{_side}");
             _bernoulliBladderRoutine = new LoaderSideBernoulliBladderRoutine($"{Module}.{_side}");
-            _transBladderRoutine = new LoaderSideTransBladderRoutine($"{Module}.{_side}");
             _bernoulliN2PressureRoutine = new LoaderSideBernoulliN2PressureRoutine($"{Module}.{_side}");
             if(!CheckPreCondition())
             {
@@ -281,19 +237,12 @@ namespace CyberX8_RT.Devices.Loader
             {
                 return false;
             }
-
             if (!InstallCRSStatusCheck())
             {
                 return false;
             }
-
-            if (!InstallCRSVacuumCheck())
-            {
-                return false;
-            }
             return true;
         }
-
         /// <summary>
         /// 检验Home条件
         /// </summary>
@@ -301,134 +250,145 @@ namespace CyberX8_RT.Devices.Loader
         private bool CheckHomeCondition()
         {
             //检验PUF、Loader Transporter,Robot均Homed
+            //Efem Home
+            if (ModuleHelper.IsInstalled(ModuleName.EFEM))
+            {
+                EfemEntity efemEntity = Singleton<RouteManager>.Instance.GetModule<EfemEntity>(ModuleName.EFEM.ToString());
+                if (!efemEntity.IsHomed)
+                {
+                    LOG.WriteLog(eEvent.ERR_EFEM_ROBOT, Module, $"{ModuleName.EFEM.ToString()} is not home, Cannot execute GotoSavedPosition");
+                    return false;
+                }
+            }
             if (ModuleHelper.IsInstalled(ModuleName.PUF1))
             {
                 PUFEntity puf1Entity = Singleton<RouteManager>.Instance.GetModule<PUFEntity>(ModuleName.PUF1.ToString());
                 if (!puf1Entity.IsHomed)
                 {
-                    LOG.WriteLog(eEvent.ERR_LOADER, Module.ToString(), "PUF1 is not homed");
+                    NotifyError(eEvent.ERR_LOADER, "PUF1 is not homed", -1);
                     return false;
                 }
             }
-            if (ModuleHelper.IsInstalled(ModuleName.PUF2))
+            if (ModuleHelper.IsInstalled(ModuleName.Transporter2))
             {
-                PUFEntity puf2Entity = Singleton<RouteManager>.Instance.GetModule<PUFEntity>(ModuleName.PUF2.ToString());
-
-                if (!puf2Entity.IsHomed)
+                TransporterEntity loaderTransportEntity = Singleton<RouteManager>.Instance.GetModule<TransporterEntity>(ModuleName.Transporter2.ToString());
+                if (!loaderTransportEntity.IsHomed)
                 {
-                    LOG.WriteLog(eEvent.ERR_LOADER, Module.ToString(), "PUF2 is not homed");
+                    NotifyError(eEvent.ERR_LOADER, "Loader Transporter is not homed", -1);
                     return false;
                 }
             }
             return true;
         }
-
-
-
         /// <summary>
-        /// 检验Install Axis条件
+        /// 检验Axis条件
         /// </summary>
         /// <param name="side"></param>
         /// <returns></returns>
         private bool CheckInstallCRSAxisCondition()
         {
-            double rotationPosition = _rotationAxis.MotionData.MotorPosition;
-            if (!_rotationAxis.CheckPositionIsInStation(rotationPosition, "LOADA") &&
-                !_rotationAxis.CheckPositionIsInStation(rotationPosition, "SERVICEB"))
+            if (!_rotationAxis.IsHomed)
             {
-                LOG.WriteLog(eEvent.ERR_LOADER, Module, $"rotation {rotationPosition} not in LOADA and SERVICEB");
+                NotifyError(eEvent.ERR_LOADER, $"Rotation is not homed", -1);
                 return false;
             }
-            double shuttlePosition=_shuttleAxis.MotionData.MotorPosition;
-            if (!_shuttleAxis.CheckPositionIsInStation(shuttlePosition, "OPEN") && 
-                !_shuttleAxis.CheckPositionIsInStation(shuttlePosition, "OPENB"))
+            if (!_shuttleAxis.IsHomed)
             {
-                LOG.WriteLog(eEvent.ERR_LOADER, Module, $"shuttle {shuttlePosition} not in OPEN or OPENB");
+                NotifyError(eEvent.ERR_LOADER, $"{_shuttleAxis.Name} is not homed", -1);
                 return false;
             }
-            double tiltPosition=_tiltAxis.MotionData.MotorPosition;
-            if (!_tiltAxis.CheckPositionIsInStation(tiltPosition, "HORI"))
+            if (!_tiltAxis.IsHomed)
             {
-                LOG.WriteLog(eEvent.ERR_LOADER, Module, $"tilt {tiltPosition} not in HORI");
+                NotifyError(eEvent.ERR_LOADER, $"{_tiltAxis.Name} is not homed", -1);
                 return false;
             }
-            double crsPosition= _crsAxis.MotionData.MotorPosition;
-            if (_crsAxis.CheckPositionIsEmpty(crsPosition))
+            if (!_lsAxis.IsHomed)
             {
-                LOG.WriteLog(eEvent.ERR_LOADER, Module, $"crs {crsPosition} not at station");
+                NotifyError(eEvent.ERR_LOADER, $"{_lsAxis.Name} is not homed", -1);
                 return false;
             }
-            return true;
-        }
-
-        /// <summary>
-        /// Install CRS Status Check
-        /// </summary>
-        /// <param name="side"></param>
-        /// <returns></returns>
-        private bool InstallCRSStatusCheck()
-        {
-            //Facility:CDA,N2,Vaccum均Enable且在正常范围
-
-            //Side WaferPresent
-            LoaderSideData sideData = _sideDevice.SideData;
-            if (sideData.WaferPresent)
+            //LS已经运动到 Setup 位
+            double crsPosition = _lsAxis.MotionData.MotorPosition;
+            if (!_lsAxis.CheckPositionIsInStation(crsPosition, $"Setup{_waferSize}"))
             {
-                LOG.WriteLog(eEvent.ERR_LOADER, Module, "side wafer is present");
+                NotifyError(eEvent.ERR_LOADER, $"LS {crsPosition} not in Setup{_waferSize}", -1);
                 return false;
             }
-            if (sideData.DoorLowerLocked || sideData.DoorUpperLocked)
+            //Rotation已经运动到 loaderA 位(sideA 下片时)或 loaderB 位(sideB 下片时)
+            double rotationPosition = _rotationAxis.MotionData.MotorPosition;
+            if (_side == "SideA")
             {
-                LOG.WriteLog(eEvent.ERR_LOADER, Module, "Door Lock is on");
-                return false;
+
+                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已经运动到除 IN 外任何位置
+            double shuttlePosition = _shuttleAxis.MotionData.MotorPosition;
+            if (_shuttleAxis.CheckPositionIsInStation(shuttlePosition, "IN"))
+            {
+                NotifyError(eEvent.ERR_LOADER, $"Shuttle {shuttlePosition} not in IN", -1);
+                return false;
+            }           
+            
             return true;
         }
         /// <summary>
-        /// CRS Vacuum Check
+        /// 检验Status条件
         /// </summary>
         /// <param name="side"></param>
         /// <returns></returns>
-        private bool InstallCRSVacuumCheck()
+        private bool InstallCRSStatusCheck()
         {
-            //CRS Vacuum检验
             LoaderSideData sideData = _sideDevice.SideData;
-            if (sideData.CRSVacuum)
+            LoaderCommonData commonData = _loaderCommonDevice.CommonData;
+            //Bernoulli Bladder(WS Bladder on)
+            if (!sideData.BernoulliBladder)
             {
-                LOG.WriteLog(eEvent.ERR_LOADER, Module, "LS Vacuum is on");
+                NotifyError(eEvent.ERR_LOADER, "Bernoulli Bladder is off", -1);
                 return false;
             }
-            //WS Bladder
-            if (sideData.WHBladder)
+            //Bernoulli N2(BernoulliN2 off)
+            if (sideData.BernoulliN2)
             {
-                LOG.WriteLog(eEvent.ERR_LOADER, Module, "WS Bladder is on");
+                NotifyError(eEvent.ERR_LOADER, "Bernoulli N2 is on", -1);
                 return false;
             }
-            //Translate Bladder/High Pres,且Sensor处于Retracted
-            if (sideData.TransBladder)
+            //CRS Vacuum检验(Vacuum off)
+            if (sideData.CRSVacuum)
             {
-                LOG.WriteLog(eEvent.ERR_LOADER, Module, "TransBladder is on");
+                LOG.WriteLog(eEvent.ERR_LOADER, Module, "LS Vacuum is on");
                 return false;
             }
-            if (sideData.TransHigh)
+            //Wafer Shuttle Present
+            if (!commonData.WaferHolderPresent)
             {
-                LOG.WriteLog(eEvent.ERR_LOADER, Module, "Trans High is on");
+                LOG.WriteLog(eEvent.ERR_LOADER, Module, "Wafer Shuttle is absent");
                 return false;
             }
-            //Bernoulli N2
-            if (sideData.BernoulliN2)
+            //WS Clamp On
+            if (!commonData.WaferHolderClamp)
             {
-                LOG.WriteLog(eEvent.ERR_LOADER, Module, "Bernoulli N2 is on");
+                NotifyError(eEvent.ERR_LOADER, "Wafer Shuttle Clamp is off", -1);
                 return false;
             }
-            //Wafer Shuttle Present
-            LoaderCommonData commonData = _loaderCommonDevice.CommonData;
-            if (!commonData.WaferHolderPresent)
+            //WS Bladder off
+            if (sideData.WHBladder)
             {
-                LOG.WriteLog(eEvent.ERR_LOADER, Module, "Wafer Shuttle is absent");
+                LOG.WriteLog(eEvent.ERR_LOADER, Module, "WS Bladder is on");
                 return false;
             }
-            //Drip Tray Fluid
+            //Drip Tray Fluid(正常)
             if (commonData.DripTrayFluid)
             {
                 LOG.WriteLog(eEvent.ERR_LOADER, Module, "Drip Tray Fluid is on");

+ 63 - 0
CyberX8_RT/Devices/Loader/LoaderRotationAxisInterLock.cs

@@ -3,6 +3,10 @@ using Aitex.Core.RT.Log;
 using MECF.Framework.Common.Equipment;
 using CyberX8_RT.Devices.AXIS;
 using System;
+using Aitex.Core.Util;
+using CyberX8_RT.Modules;
+using CyberX8_RT.Modules.Transporter;
+using CyberX8_RT.Modules.PUF;
 
 
 namespace CyberX8_RT.Devices.Loader
@@ -39,6 +43,12 @@ namespace CyberX8_RT.Devices.Loader
         /// <exception cref="NotImplementedException"></exception>
         public bool CheckGotoPosition(string station)
         {
+            //Check Home
+            if (!CheckHomeCondition())
+            {
+                return false;
+            }
+
             //Rotation is homed
             if (!_axis.IsHomed)
             {
@@ -154,5 +164,58 @@ namespace CyberX8_RT.Devices.Loader
             }
             return true;
         }
+        /// <summary>
+        /// Check Home
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckHomeCondition()
+        {
+            //Efem Home
+            if (ModuleHelper.IsInstalled(ModuleName.EFEM))
+            {
+                EfemEntity efemEntity = Singleton<RouteManager>.Instance.GetModule<EfemEntity>(ModuleName.EFEM.ToString());
+                if (efemEntity == null)
+                {
+                    LOG.WriteLog(eEvent.ERR_EFEM_ROBOT, Module, $"{ModuleName.EFEM.ToString()} entity is null");
+                    return false;
+                }
+                if (!efemEntity.IsHomed)
+                {
+                    LOG.WriteLog(eEvent.ERR_EFEM_ROBOT, Module, $"{ModuleName.EFEM.ToString()} is not home, Cannot execute GotoSavedPosition");
+                    return false;
+                }
+            }
+            //Transporter2 Home
+            if (ModuleHelper.IsInstalled(ModuleName.Transporter2))
+            {
+                TransporterEntity loaderTransporterEntity = Singleton<RouteManager>.Instance.GetModule<TransporterEntity>(ModuleName.Transporter2.ToString());
+                if (loaderTransporterEntity == null)
+                {
+                    LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module, $"{ModuleName.Transporter2.ToString()} entity is null");
+                    return false;
+                }
+                if (!loaderTransporterEntity.IsHomed)
+                {
+                    LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module, $"{ModuleName.Transporter2.ToString()} is not home, Cannot execute GotoSavedPosition");
+                    return false;
+                }
+            }
+            //Puf1 Home
+            if (ModuleHelper.IsInstalled(ModuleName.PUF1))
+            {
+                PUFEntity puf1Entity = Singleton<RouteManager>.Instance.GetModule<PUFEntity>(ModuleName.PUF1.ToString());
+                if (puf1Entity == null)
+                {
+                    LOG.WriteLog(eEvent.ERR_PUF, Module, $"{ModuleName.PUF1.ToString()} entity is null");
+                    return false;
+                }
+                if (!puf1Entity.IsHomed)
+                {
+                    LOG.WriteLog(eEvent.ERR_PUF, Module, $"{ModuleName.PUF1.ToString()} is not home, Cannot execute GotoSavedPosition");
+                    return false;
+                }
+            }
+            return true;
+        }
     }
 }

+ 63 - 0
CyberX8_RT/Devices/Loader/LoaderShuttleAxisInterLock.cs

@@ -3,6 +3,10 @@ using Aitex.Core.RT.Log;
 using MECF.Framework.Common.Equipment;
 using CyberX8_RT.Devices.AXIS;
 using System;
+using Aitex.Core.Util;
+using CyberX8_RT.Modules.PUF;
+using CyberX8_RT.Modules.Transporter;
+using CyberX8_RT.Modules;
 
 namespace CyberX8_RT.Devices.Loader
 {
@@ -59,6 +63,12 @@ namespace CyberX8_RT.Devices.Loader
         /// <exception cref="NotImplementedException"></exception>
         public bool CheckGotoPosition(string station)
         {
+            //Check Home
+            if (!CheckHomeCondition())
+            {
+                return false;
+            }
+            //Shuttle Home
             if (!_axis.IsHomed)
             {
                 LOG.WriteLog(eEvent.ERR_LOADER, Module, $"{Name} is not home, Cannot execute GotoSavedPosition");
@@ -132,5 +142,58 @@ namespace CyberX8_RT.Devices.Loader
             }
             return true;
         }
+        /// <summary>
+        /// Check Home
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckHomeCondition()
+        {
+            //Efem Home
+            if (ModuleHelper.IsInstalled(ModuleName.EFEM))
+            {
+                EfemEntity efemEntity = Singleton<RouteManager>.Instance.GetModule<EfemEntity>(ModuleName.EFEM.ToString());
+                if (efemEntity == null)
+                {
+                    LOG.WriteLog(eEvent.ERR_EFEM_ROBOT, Module, $"{ModuleName.EFEM.ToString()} entity is null");
+                    return false;
+                }
+                if (!efemEntity.IsHomed)
+                {
+                    LOG.WriteLog(eEvent.ERR_EFEM_ROBOT, Module, $"{ModuleName.EFEM.ToString()} is not home, Cannot execute GotoSavedPosition");
+                    return false;
+                }
+            }
+            //Transporter2 Home
+            if (ModuleHelper.IsInstalled(ModuleName.Transporter2))
+            {
+                TransporterEntity loaderTransporterEntity = Singleton<RouteManager>.Instance.GetModule<TransporterEntity>(ModuleName.Transporter2.ToString());
+                if (loaderTransporterEntity == null)
+                {
+                    LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module, $"{ModuleName.Transporter2.ToString()} entity is null");
+                    return false;
+                }
+                if (!loaderTransporterEntity.IsHomed)
+                {
+                    LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module, $"{ModuleName.Transporter2.ToString()} is not home, Cannot execute GotoSavedPosition");
+                    return false;
+                }
+            }
+            //Puf1 Home
+            if (ModuleHelper.IsInstalled(ModuleName.PUF1))
+            {
+                PUFEntity puf1Entity = Singleton<RouteManager>.Instance.GetModule<PUFEntity>(ModuleName.PUF1.ToString());
+                if (puf1Entity == null)
+                {
+                    LOG.WriteLog(eEvent.ERR_PUF, Module, $"{ModuleName.PUF1.ToString()} entity is null");
+                    return false;
+                }
+                if (!puf1Entity.IsHomed)
+                {
+                    LOG.WriteLog(eEvent.ERR_PUF, Module, $"{ModuleName.PUF1.ToString()} is not home, Cannot execute GotoSavedPosition");
+                    return false;
+                }
+            }
+            return true;
+        }
     }
 }

+ 182 - 208
CyberX8_RT/Devices/Loader/LoaderUnloadRoutine.cs

@@ -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;