Bladeren bron

add Aligner plat type

chenkui 3 dagen geleden
bovenliggende
commit
81f8544042

+ 3 - 0
CyberX8_Core/DeviceName.cs

@@ -27,6 +27,9 @@ namespace CyberX8_Core
         Extend,
         Retract,
         Align,
+        AlignWaferSize,
+        AlignFlatType,
+        AlignDistance,
         Light,
         TurnOffBuzzer,
         //SwitchOnBuzzerAndRed,

+ 15 - 10
CyberX8_RT/Config/System.sccfg

@@ -74,7 +74,8 @@
 		<config default="false" name="IsLoadPort1Unable" nameView="Is LoadPort1 Unable" description="LP1是否无法使用" max="" min="" paramter="" tag="" unit="" type="Bool" />
 		<config default="false" name="IsLoadPort2Unable" nameView="Is LoadPort2 Unable" description="LP2是否无法使用" max="" min="" paramter="" tag="" unit="" type="Bool" />
 		<config default="false" name="IsLoadPort3Unable" nameView="Is LoadPort3 Unable" description="LP3是否无法使用" max="" min="" paramter="" tag="" unit="" type="Bool" />
-		
+		<config default="false" name="IsLoadPort3Unable" nameView="Is LoadPort3 Unable" description="LP3是否无法使用" max="" min="" paramter="" tag="" unit="" type="Bool" />
+		<config default="-500" name="ChuckVacuumIsValid" nameView="ChuckVacuumIsValid" description="EFEM is invalid when vacuum level is less than this value" max="0" min="-1000" paramter="" tag="" unit="mmHg" type="Double" />
 		<config default="0" name="AlignerOffsetAngle" nameView="Aligner Offset Angle" description="Aligner Offset Angle" max="360" min="0" paramter="" tag="" unit="deg" type="Integer" />
 		
 		<configs name="LoadPort" nameView="LoadPort" >
@@ -89,47 +90,51 @@
 		<configs name="LP1" nameView="LP1" visible="false">
 			<config default="50" name="Cassete200Station" nameView="Cassete200Station" description="Wafer 200 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
 			<config default="51" name="Cassete150Station" nameView="Cassete150Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
-			<config default="52" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="52" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 100 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
 		</configs>
 		<configs name="LP2" nameView="LP2" visible="false">
 			<config default="53" name="Cassete200Station" nameView="Cassete200Station" description="Wafer 200 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
 			<config default="54" name="Cassete150Station" nameView="Cassete150Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
-			<config default="55" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="55" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 100 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
 		</configs>
 		<configs name="LP3" nameView="LP3" visible="false">
 			<config default="56" name="Cassete200Station" nameView="Cassete200Station" description="Wafer 200 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
 			<config default="57" name="Cassete150Station" nameView="Cassete150Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
-			<config default="58" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="58" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 100 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
 		</configs>
 		<configs name="Dummy1" nameView="Dummy1" visible="false">
 			<config default="64" name="Cassete200Station" nameView="Cassete200Station" description="Wafer 200 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
 			<config default="65" name="Cassete150Station" nameView="Cassete150Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
-			<config default="66" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="66" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 100 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
 		</configs>
 		<configs name="Dummy2" nameView="Dummy2" visible="false">
 			<config default="62" name="Cassete200Station" nameView="Cassete200Station" description="Wafer 200 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
 			<config default="63" name="Cassete150Station" nameView="Cassete150Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
-			<config default="64" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="64" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 100 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
 		</configs>
 		<configs name="SRD1" nameView="SRD1" visible="false">
 			<config default="6" name="Cassete200Station" nameView="Cassete200Station" description="Wafer 200 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
 			<config default="6" name="Cassete150Station" nameView="Cassete150Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
-			<config default="6" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="6" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 100 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
 		</configs>
 		<configs name="SRD2" nameView="SRD2" visible="false">
 			<config default="7" name="Cassete200Station" nameView="Cassete200Station" description="Wafer 200 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
 			<config default="7" name="Cassete150Station" nameView="Cassete150Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
-			<config default="7" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="7" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 100 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
 		</configs>
 		<configs name="PUF1" nameView="PUF1" visible="false">
 			<config default="8" name="Cassete200Station" nameView="Cassete200Station" description="Wafer 200 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
 			<config default="8" name="Cassete150Station" nameView="Cassete150Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
-			<config default="8" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="8" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 100 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
 		</configs>
-		<configs name="Aligner1" nameView="Aligner1" visible="false">
+		<configs name="Aligner1" nameView="Aligner1">
 			<config default="9" name="Cassete200Station" nameView="Cassete200Station" description="Wafer 200 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
 			<config default="9" name="Cassete150Station" nameView="Cassete150Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
 			<config default="9" name="Cassete100Station" nameView="Cassete100Station" description="Wafer 150 Cassete station number" max="120" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="86000" name="Aligner200Distance" nameView="Aligner200Distance" description="Wafer 200 aligner distance" max="9999999" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="61000" name="Aligner150Distance" nameView="Aligner150Distance" description="Wafer 150 aligner distance" max="9999999" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="31000" name="Aligner100Distance" nameView="Aligner100Distance" description="Wafer 100 aligner distance" max="9999999" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
+			<config default="0" name="AlignerPlatType" nameView="AlignerPlatType" description="aligner default plat type" max="10" min="0" paramter="" tag="" unit="" type="Integer" visible="true"/>
 		</configs>
 	</configs>
 	<!--DualPUF-->

+ 3 - 1
CyberX8_RT/Devices/EFEM/EfemBase.cs

@@ -111,7 +111,9 @@ namespace CyberX8_RT.Devices.EFEM
         public abstract bool Vacuum(ModuleName mod,bool VacuumState);
         public abstract bool SetPinUp(ModuleName mod);
         public abstract bool SetPinDown(ModuleName mod);
-
+        public abstract bool SetAlignWaferSize();
+        public abstract bool SetAlignFlatType(int flatType);
+        public abstract bool SetAlignDistance();
         public abstract bool SetAlignAngle(ModuleName mod,double angle);
         public abstract bool SetRobotSpeed(ModuleName mod,int speed);
         public abstract bool RobotPowerOn(ModuleName mod,bool status);

+ 15 - 1
CyberX8_RT/Devices/EFEM/JetEfem.cs

@@ -475,7 +475,21 @@ namespace CyberX8_RT.Devices.EFEM
             return _socket.Write(_currentMsg.ToString());
         }
 
-
+        public override bool SetAlignWaferSize()
+        {
+            LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support aligner wafer size");
+            return false;
+        }
+        public override bool SetAlignFlatType(int flatType)
+        {
+            LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support aligner flat type");
+            return false;
+        }
+        public override bool SetAlignDistance()
+        {
+            LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support aligner distance");
+            return false;
+        }
         public override bool GotoMap(ModuleName mod, Hand hand, string extend = "EX")
         {
             LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support GotoMap");

+ 15 - 0
CyberX8_RT/Devices/EFEM/SunWayEfem.cs

@@ -353,6 +353,21 @@ namespace CyberX8_RT.Devices.EFEM
             return false;
         }
 
+        public override bool SetAlignWaferSize()
+        {
+            LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support aligner wafer size");
+            return false;
+        }
+        public override bool SetAlignFlatType(int flatType)
+        {
+            LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support aligner flat type");
+            return false;
+        }
+        public override bool SetAlignDistance()
+        {
+            LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support aligner distance");
+            return false;
+        }
         public override bool GotoMap(ModuleName mod, Hand hand,string extend="EX")
         {
             LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"System cannot support GotoMap");

+ 111 - 0
CyberX8_RT/Devices/EFEM/SunWayRobot.cs

@@ -641,6 +641,117 @@ namespace CyberX8_RT.Devices.EFEM
             return false;
         }
 
+        public override bool SetAlignWaferSize()
+        {
+            if (_status == RState.Running && _currentMessage != null)
+            {
+                LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"Current Msg {_currentMessage.Operation} is Running,cannot Align Wafer Size");
+                return false;
+            }
+            if (!CheckEfemStatus())
+                return false;
+            if (!WaferManager.Instance.CheckHasWafer(ModuleName.Aligner1, 0))
+            {
+                LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"{ModuleName.Aligner1} has no wafer, Cannot Execute Set aligner wafersize");
+                return false;
+            }
+            int waferSize = GetModuleSlotWaferSize(ModuleName.Aligner1, 0);
+            if (waferSize == 0)
+            {
+                LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"{ModuleName.Aligner1} wafer size is 0, Cannot Execute Set aligner wafersize");
+                return false;
+            }
+            //判断socket是否链接
+            if (!_socket.IsConnected)
+            {
+                LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
+                return false;
+            }
+            _currentMessage = new EfemMessage()
+            {
+                Operation = EfemOperation.AlignWaferSize
+            };
+
+            string cmd = $"SET ALIGNER WAFERSIZE {waferSize}\r";
+            _status = RState.Running;
+            return WriteCommand(cmd);
+        }
+
+        public override bool SetAlignFlatType(int flatType)
+        {
+            if (_status == RState.Running && _currentMessage != null)
+            {
+                LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"Current Msg {_currentMessage.Operation} is Running,cannot Align flat type");
+                return false;
+            }
+            if (!CheckEfemStatus())
+                return false;
+            //判断socket是否链接
+            if (!_socket.IsConnected)
+            {
+                LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
+                return false;
+            }
+            _currentMessage = new EfemMessage()
+            {
+                Operation = EfemOperation.AlignFlatType
+            };
+
+            string cmd = $"SET ALIGNER WAFERTYPE {flatType}\r";
+            _status = RState.Running;
+            return WriteCommand(cmd);
+        }
+
+        public override bool SetAlignDistance()
+        {
+            int distance200 = SC.GetValue<int>("EFEM.Aligner1.Aligner200Distance");
+            int distance150 = SC.GetValue<int>("EFEM.Aligner1.Aligner150Distance");
+            int distance100 = SC.GetValue<int>("EFEM.Aligner1.Aligner100Distance");
+
+            if (_status == RState.Running && _currentMessage != null)
+            {
+                LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"Current Msg {_currentMessage.Operation} is Running,cannot Align flat type");
+                return false;
+            }
+            if (!CheckEfemStatus())
+                return false;
+            //判断socket是否链接
+            if (!_socket.IsConnected)
+            {
+                LOG.WriteLog(eEvent.ERROR_EFEM_COMMUNICATION, Module.ToString(), $"Socket is not Conntected");
+                return false;
+            }
+            if (!WaferManager.Instance.CheckHasWafer(ModuleName.Aligner1, 0))
+            {
+                LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"{ModuleName.Aligner1} has no wafer, Cannot Execute Set aligner wafersize");
+                return false;
+            }
+            int waferSize = GetModuleSlotWaferSize(ModuleName.Aligner1, 0);
+            if (waferSize == 0)
+            {
+                LOG.WriteLog(eEvent.ERR_EFEM_COMMON_FAILED, Module.ToString(), $"{ModuleName.Aligner1} wafer size is 0, Cannot Execute Set aligner wafersize");
+                return false;
+            }
+            _currentMessage = new EfemMessage()
+            {
+                Operation = EfemOperation.AlignDistance
+            };
+            int distance = distance200;
+            if (waferSize == (int)WaferSize.WS6)
+            {
+                distance = distance150;
+            }
+            else if (waferSize == (int)WaferSize.WS4)
+            {
+                distance = distance100;
+            }
+
+            string cmd = $"SET ALIGNER WAFERDISTANCE {distance}\r";
+            _status = RState.Running;
+            return WriteCommand(cmd);
+        }
+
+
         public override bool SetAlignAngle(ModuleName mod, double angle)
         {
             if (_status == RState.Running && _currentMessage != null)

+ 30 - 7
CyberX8_RT/Modules/EFEM/EFEMAlignRoutine.cs

@@ -17,9 +17,13 @@ namespace CyberX8_RT.Modules.EFEM
     {
         private enum AlignStep
         {
-            WaitVacuumIdle,
-            VacuumOn,
             WaitIdle,
+            SetAlignWaferSize,
+            WaitWaferSizeIdle,
+            SetAlignFlatType,
+            WaitAlignFlatTypeIdle,
+            SetAlignDistance,
+            WaitAlignDistanceIdle,
             SetAngle,
             ReWaitIdle,
             Rotate,
@@ -33,6 +37,7 @@ namespace CyberX8_RT.Modules.EFEM
         private double angle = 25;
         private WaferSize ws = WaferSize.WS12;
         private int _angleOffset = 0;
+        private int _platType = 0;
 
         public EFEMAlignRoutine(EfemBase efem) : base(ModuleName.Aligner1.ToString())
         {
@@ -57,6 +62,10 @@ namespace CyberX8_RT.Modules.EFEM
                 }
                
             }
+            if (objs.Length >= 4)
+            {
+                _platType=(int)objs[3];
+            }
 
             if (!CheckPreCondition())
             {
@@ -79,9 +88,13 @@ namespace CyberX8_RT.Modules.EFEM
         }
         public RState Monitor()
         {
-            Runner.Wait(AlignStep.WaitVacuumIdle, WaitEFEMIdle)
-                //.Run(AlignStep.VacuumOn, VacuumOn,CheckAlignDone,_delay_5s)
-                .Wait(AlignStep.WaitIdle, WaitEFEMIdle)
+            Runner.Wait(AlignStep.WaitIdle, WaitEFEMIdle)
+                .Run(AlignStep.SetAlignWaferSize, SetAlignerWaferSize,CheckAlignDone,_delay_5s)
+                .Wait(AlignStep.WaitWaferSizeIdle, WaitEFEMIdle)
+                .Run(AlignStep.SetAlignFlatType, SetAlignerFlatType, CheckAlignDone, _delay_5s)
+                .Wait(AlignStep.WaitAlignFlatTypeIdle, WaitEFEMIdle)
+                .Run(AlignStep.SetAlignDistance, SetAlignerDistance, CheckAlignDone, _delay_5s)
+                .Wait(AlignStep.WaitAlignDistanceIdle, WaitEFEMIdle)
                 .Run(AlignStep.SetAngle, SetAlignAngle, CheckAlignDone, _delay_5s)
                 .Wait(AlignStep.ReWaitIdle, WaitEFEMIdle)
                 .Run(AlignStep.Rotate, Align, CheckAlignDone, _moveTimeout)
@@ -91,9 +104,19 @@ namespace CyberX8_RT.Modules.EFEM
             return Runner.Status;
         }
 
-        private bool VacuumOn()
+        private bool SetAlignerWaferSize()
+        {
+            return _efem.SetAlignWaferSize();
+        }
+
+        private bool SetAlignerFlatType()
+        {
+            return _efem.SetAlignFlatType(_platType);
+        }
+
+        private bool SetAlignerDistance()
         {
-            return _efem.Vacuum(ModuleName.Aligner1, true);
+            return _efem.SetAlignDistance();
         }
 
         private bool VacuumOff() 

+ 5 - 1
CyberX8_RT/Modules/EFEM/EfemEntity.cs

@@ -193,6 +193,11 @@ namespace CyberX8_RT.Modules
             }
         }
 
+        public double VacuumValue
+        {
+            get { return _vacuumValue; }
+        }
+
         public bool Check(int msg, out string reason, params object[] args)
         {
             throw new NotImplementedException();
@@ -244,7 +249,6 @@ namespace CyberX8_RT.Modules
 
             Name = ModuleName.EFEM.ToString();
 
-
             InitFsmMap();
 
             _efemType = (EfemType)SC.GetValue<int>($"EFEM.EfemType");

+ 17 - 2
CyberX8_RT/Modules/EFEM/EfemHomeRoutine.cs

@@ -22,6 +22,7 @@ namespace CyberX8_RT.Modules.EFEM
         {
             PowerOn,
             SetHomeSpeed,
+            CheckVacuum,
             InitAligner,
             HomeAll,
             CheckWaferPresence,
@@ -49,8 +50,8 @@ namespace CyberX8_RT.Modules.EFEM
         bool _isLP1Unable = SC.GetValue<bool>("EFEM.IsLoadPort1Unable");
         bool _isLP2Unable = SC.GetValue<bool>("EFEM.IsLoadPort2Unable");
         bool _isLP3Unable = SC.GetValue<bool>("EFEM.IsLoadPort3Unable");
-        private 
-        Hand _hand = Hand.Blade1;
+        double _chuckVacuumIsValid = SC.GetValue<double>("EFEM.ChuckVacuumIsValid");
+        private Hand _hand = Hand.Blade1;
         private EfemMapDummyRoutine _mapDummyRoutine;
         
         public EfemHomeRoutine(EfemBase efem) : base(ModuleName.EfemRobot)
@@ -75,6 +76,7 @@ namespace CyberX8_RT.Modules.EFEM
             
             _targetModule = (ModuleName)objs[0];
             _homeTimeout = SC.GetValue<int>($"EFEM.HomeTimeout") * 1000;
+            _chuckVacuumIsValid = SC.GetValue<double>("EFEM.ChuckVacuumIsValid");
             return Runner.Start(Module, $"Home {_targetModule}");
         }
 
@@ -85,6 +87,7 @@ namespace CyberX8_RT.Modules.EFEM
             {
                 Runner.Run(HomeStep.PowerOn, PowerOn, IsStepComplete, _delay_5s)
                     .Run(HomeStep.SetHomeSpeed,            SetHomeSpeed,           IsStepComplete,         _delay_5s)
+                    .Run(HomeStep.CheckVacuum,CheckVacuumIsValid,_delay_1ms)
                     .Run(HomeStep.InitAligner, HomeAligner, IsStepComplete, _homeTimeout)
                     .Run(HomeStep.HomeAll,          HomeAll,   IsStepComplete, _homeTimeout)
                     .Run(HomeStep.CheckWaferPresence,      CheckWaferPresence,     VerifyWaferPresence,    _delay_5s)
@@ -105,6 +108,18 @@ namespace CyberX8_RT.Modules.EFEM
             return Runner.Status;
         }
 
+        private bool CheckVacuumIsValid()
+        {
+            EfemEntity efemEntity = Singleton<RouteManager>.Instance.EFEM;
+            double vacuumValue=efemEntity.VacuumValue;
+            bool result = vacuumValue < _chuckVacuumIsValid;
+            if (!result)
+            {
+                LOG.WriteLog(eEvent.ERROR_EFEM_AIR, Module.ToString(), $"Vacumm {vacuumValue} is over {_chuckVacuumIsValid}");
+            }
+            return result;
+        }
+
         private bool StartMapDummy()
         {
             return _mapDummyRoutine.Start() == RState.Running;

+ 2 - 0
CyberX8_RT/Modules/EFEM/RobotCycleMoveRoutine.cs

@@ -1,4 +1,5 @@
 using Aitex.Core.RT.Routine;
+using Aitex.Core.RT.SCCore;
 using CyberX8_Core;
 using CyberX8_RT.Devices.EFEM;
 using MECF.Framework.Common.Equipment;
@@ -82,6 +83,7 @@ namespace CyberX8_RT.Modules.EFEM
                     alignerParamater[0] = ModuleName.Aligner1;
                     alignerParamater[1] = 0;
                     alignerParamater[2] = action.Parameter;
+                    alignerParamater[3] = SC.GetValue<int>("EFEM.Aligner1.AlignerPlatType");
                     return _efemAlignRoutine.Start(alignerParamater) ==RState.Running;
 
             }

+ 2 - 1
CyberX8_RT/Modules/EFEM/RobotCycleRoutine.cs

@@ -100,7 +100,7 @@ namespace CyberX8_RT.Modules.EFEM
         {
             _lpWaferIndex.Clear();//初始化LP 有wafer的slot号
             _waferCount = 0; //初始化wafercount的数量
-            
+            int platType = SC.GetValue<int>("EFEM.Aligner1.AlignerPlatType");
             alignerParamater = new object[3];//初始化Align参数
             alignerParamater[0] = ModuleName.Aligner1;
             alignerParamater[1] = 0;
@@ -112,6 +112,7 @@ namespace CyberX8_RT.Modules.EFEM
                 _targetDummy = (ModuleName)objs[2];
                 _targetSrd = (ModuleName)objs[3];
                 alignerParamater[2] = (int)objs[5];
+                alignerParamater[3] = platType;
             }
             else
             {

+ 6 - 0
Framework/Common/RecipeCenter/SequenceRecipe.cs

@@ -42,6 +42,10 @@ namespace MECF.Framework.Common.RecipeCenter
         /// </summary>
         private double _alignmentAngle;
         /// <summary>
+        /// 类型:0-nortch模式,1-flat模式
+        /// </summary>
+        private int _platType;
+        /// <summary>
         /// CRS类型
         /// </summary>
         private string _crsType;
@@ -80,6 +84,8 @@ namespace MECF.Framework.Common.RecipeCenter
         [JsonProperty]
         public double AlignmentAngle { get { return _alignmentAngle; } set { _alignmentAngle = value; InvokePropertyChanged(nameof(AlignmentAngle)); } }
         [JsonProperty]
+        public int PlatType { get { return _platType; } set { _platType = value; InvokePropertyChanged(nameof(PlatType)); } }
+        [JsonProperty]
         public string CrsType { get { return _crsType; } set { _crsType = value;  InvokePropertyChanged(nameof(CrsType)); } }
         [JsonProperty]
         public string FiducialType { get { return _fiducialType; } set { _fiducialType = value;InvokePropertyChanged(nameof(FiducialType)); } }