Browse Source

1.Add LL pump preemptive lock
2.Add drivers of Honghu VCE, VPA

zhouhr 1 year ago
parent
commit
038e0b984a

+ 95 - 12
Venus/Framework/RTModuleLibrary/VceModules/VceModuleBase.cs

@@ -1,21 +1,25 @@
 using Aitex.Core.RT.Device;
+using Aitex.Core.RT.Log;
 using Aitex.Sorter.Common;
 using MECF.Framework.Common.Equipment;
 using MECF.Framework.Common.Schedulers;
 using MECF.Framework.Common.SubstrateTrackings;
 using MECF.Framework.RT.EquipmentLibrary.LogicUnits;
 using MECF.Framework.RT.ModuleLibrary.Commons;
+using Venus_Core;
 
 namespace MECF.Framework.RT.ModuleLibrary.VceModules
 {
     public abstract class VceModuleBase : ModuleFsmDevice, ITransferTarget, IModuleDevice
     {
         private int _slot = 25;
+        private ModuleName _moduleName;
         //private bool isJobDone;
-
-        public VceModuleBase(int slot)
+        public virtual RState Status { get; }
+        public VceModuleBase(int slot, ModuleName moduleName)
         {
             _slot = slot;
+            _moduleName = moduleName;
         }
 
         public override bool Initialize()
@@ -35,19 +39,98 @@ namespace MECF.Framework.RT.ModuleLibrary.VceModules
         {
             //isJobDone = true;
         }
-        
+
         //IModuleDevice
+        public abstract bool IsConnected { get; }
         public abstract bool IsReady { get; }
         public abstract bool IsError { get; }
         public abstract bool IsInit { get; }
-        public abstract bool Home(out string reason);
-
-        //Transfer
-        public abstract bool PrepareTransfer(ModuleName robot, Hand blade, int targetSlot, EnumTransferType transferType, out string reason);
-        public abstract bool TransferHandoff(ModuleName robot, Hand blade, int targetSlot, EnumTransferType transferType, out string reason);
-        public abstract bool PostTransfer(ModuleName robot, Hand blade, int targetSlot, EnumTransferType transferType, out string reason);
-        public abstract bool CheckReadyForTransfer(ModuleName robot, Hand blade, int targetSlot, EnumTransferType transferType, out string reason);
-        public abstract void NoteTransferStart(ModuleName robot, Hand blade, int targetSlot, EnumTransferType transferType);
-        public abstract void NoteTransferStop(ModuleName robot, Hand blade, int targetSlot, EnumTransferType transferType);
+
+        //Home
+        public abstract bool Home(string axis);
+        public abstract bool HomeALL();
+
+        //Door
+        public abstract bool OpenDoor();
+        public abstract bool CloseDoor();
+
+        //Load
+        public abstract bool Load();
+        public abstract bool UnLoad();
+        //Goto
+        public abstract bool Goto(int Targetslot);
+
+        //Map
+        public abstract bool Map();
+
+        //Read
+        public abstract bool ReadMap();
+
+        //Halt
+        //public abstract bool Halt();
+        protected bool CheckVceStatus()
+        {
+
+            if (Status == RState.Init)
+            {
+                LOG.Write(eEvent.ERR_DEVICE_INFO, _moduleName, "VCE is not homed, please home first.");
+                return false;
+            }
+            else if (Status == RState.Running)
+            {
+                LOG.Write(eEvent.ERR_DEVICE_INFO, _moduleName, "VCE is busy, please wait a minute");
+                return false;
+            }
+            else if (Status == RState.Failed || Status == RState.Timeout)
+            {
+                LOG.Write(eEvent.ERR_DEVICE_INFO, _moduleName, "VCE has a error, please check and fix the hardware issue and home it");
+                return false;
+            }
+
+            return true;
+        }
+
+        //transfer
+        public bool PrepareTransfer(ModuleName robot, Hand blade, int targetSlot, EnumTransferType transferType, out string reason)
+        {
+            reason = "";
+            return false;
+        }
+
+        public bool TransferHandoff(ModuleName robot, Hand blade, int targetSlot, EnumTransferType transferType, out string reason)
+        {
+            reason = "";
+            return false;
+        }
+
+        public bool PostTransfer(ModuleName robot, Hand blade, int targetSlot, EnumTransferType transferType, out string reason)
+        {
+            reason = "";
+            return false;
+        }
+
+        public bool CheckReadyForTransfer(ModuleName robot, Hand blade, int targetSlot, EnumTransferType transferType, out string reason)
+        {
+            reason = "";
+            return false;
+        }
+
+        public void NoteTransferStart(ModuleName robot, Hand blade, int targetSlot, EnumTransferType transferType)
+        {
+            return;
+        }
+
+        public void NoteTransferStop(ModuleName robot, Hand blade, int targetSlot, EnumTransferType transferType)
+        {
+            return;
+        }
+
+        public bool Home(out string reason)
+        {
+            reason = "";
+            return false;
+        }
+
+
     }
 }

+ 4 - 2
Venus/Venus_RT/Config/System.sccfg

@@ -175,7 +175,8 @@
 		<config default="60" name="PumpingTimeout" nameView="Pumping Timeout" description="" max="3000" min="0" paramter="" tag="" unit="s" type="Integer" />
 		<config default="60" name="VentingTimeout" nameView="Venting Timeout" description="" max="3000" min="0" paramter="" tag="" unit="s" type="Integer" />
 		<config default="100" name="SoftVentEndPressure" nameView="Soft Vent End Pressure" description="" max="300" min="0" paramter="" tag="" unit="s" type="Integer" />
-
+		<config default="500" name="SwitchLLPumpDelay" nameView="Switch LL Pump Delay" description="让渡LL Pump前延迟" max="50000" min="0" paramter="" tag="" unit="ms" type="Integer" />
+		
 		<config default="2000" name="PurgeVentPressure" description="Purge Vent Pressure" max="760000" min="0" paramter="" tag="" unit="mTorr" type="Double" />
 		<config default="30" name="PurgeCycleCount" description="Purge Cycle Count" max="200" min="0" paramter="" tag="" unit="" type="Integer" />
 		<config default="120" name="PurgePumpTime" description="Purge Pump Time" max="7200" min="0" paramter="" tag="" unit="second" type="Integer" />
@@ -200,7 +201,8 @@
 		<config default="60" name="PumpingTimeout" nameView="Pumping Timeout" description="" max="3000" min="0" paramter="" tag="" unit="s" type="Integer" />
 		<config default="60" name="VentingTimeout" nameView="Venting Timeout" description="" max="3000" min="0" paramter="" tag="" unit="s" type="Integer" />
 		<config default="100" name="SoftVentEndPressure" nameView="Soft Vent End Pressure" description="" max="300" min="0" paramter="" tag="" unit="s" type="Integer" />
-
+		<config default="500" name="SwitchLLPumpDelay" nameView="Switch LL Pump Delay" description="让渡LL Pump前延迟" max="50000" min="0" paramter="" tag="" unit="ms" type="Integer" />
+		
 		<config default="2000" name="PurgeVentPressure" description="Purge Vent Pressure" max="760000" min="0" paramter="" tag="" unit="mTorr" type="Double" />
 		<config default="30" name="PurgeCycleCount" description="Purge Cycle Count" max="200" min="0" paramter="" tag="" unit="" type="Integer" />
 		<config default="120" name="PurgePumpTime" description="Purge Pump Time" max="7200" min="0" paramter="" tag="" unit="second" type="Integer" />

+ 174 - 162
Venus/Venus_RT/Config/TM/TMInterlock.xml

@@ -1,192 +1,204 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Interlock xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-  
-
-   <!--TM-->
-  <Action do="DO_N2_Valve"					value="true" tip="N2 Valve"	tip.zh-CN="" tip.en-US="DO-00" >
-    <Limit di="DI_TM_CHB_Door_Closed"			value="true" tip="TM CHB Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-17" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
-    <Limit di="DI_N2_Pressure_Switch"			value="true" tip="N2 Pressure Switch"		tip.zh-CN="" tip.en-US="DI-21" />
-  </Action>
-  
-  <Action do="DO_Soft_Pumping_Valve_TM"					value="true" tip="Soft Pumping Valve TM"	tip.zh-CN="" tip.en-US="DO-01" >
-    <Limit di="DI_TM_CHB_Door_Closed"			value="true" tip="TM CHB Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-17" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
-    <Limit di="DI_LLA_E_Slit_Door_close_Position"			value="true" tip="LLA In Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-23" />
-    <Limit di="DI_LLA_T_Slit_Door_close_Position"			value="true" tip="LLA Out Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-25" />
-    <Limit di="DI_LLA_Lid_Door_Closed"			value="true" tip="LLA Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-26" />
-    <Limit di="DI_LLB_E_Slit_Door_close_Position"			value="true" tip="LLB In Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-28" />
-    <Limit di="DI_LLB_T_Slit_Door_close_Position"			value="true" tip="LLB Out Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-30" />    
-    <Limit di="DI_LLB_Lid_Door_Closed"			value="true" tip="LLB Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-31" />
-   
-  </Action>
-  
-  <Action do="DO_Fast_Pumping_Valve_TM"					value="true" tip="Fast Pumping Valve TM"	tip.zh-CN="" tip.en-US="DO-02" >
-    <Limit di="DI_TM_CHB_Door_Closed"	value="true" tip="TM CHB Lid Door Closed"			tip.zh-CN="" tip.en-US="DI-17" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
-    <Limit di="DI_LLA_E_Slit_Door_close_Position"			value="true" tip="LLA In Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-23" />
-    <Limit di="DI_LLA_T_Slit_Door_close_Position"			value="true" tip="LLA Out Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-25" />
-    <Limit di="DI_LLA_Lid_Door_Closed"			value="true" tip="LLA Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-26" />
-    <Limit di="DI_LLB_E_Slit_Door_close_Position"			value="true" tip="LLB In Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-28" />
-    <Limit di="DI_LLB_T_Slit_Door_close_Position"			value="true" tip="LLB Out Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-30" />
-    <Limit di="DI_LLB_Lid_Door_Closed"			value="true" tip="LLB Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-31" />
-   
-  </Action>
-
-  <Action do="DO_Purge_Valve_TM"					value="true" tip="Purge Valve TM"	tip.zh-CN="" tip.en-US="DO-03" >
-    <Limit di="DI_TM_CHB_Door_Closed"	value="true" tip="TM CHB Lid Door Closed"			tip.zh-CN="" tip.en-US="DI-17" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
-    <Limit di="DI_N2_Pressure_Switch"			value="true" tip="N2 Pressure Switch"		tip.zh-CN="" tip.en-US="DI-21" />
-    
-  </Action>
-
-  <Action do="DO_Vent_Valve_TM"					value="true" tip="Soft Vent Valve TM"	tip.zh-CN="" tip.en-US="DO-04" >
-    <Limit di="DI_TM_CHB_Door_Closed"	value="true" tip="TM CHB Lid Door Closed"			tip.zh-CN="" tip.en-US="DI-17" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
-    <Limit di="DI_N2_Pressure_Switch"			value="true" tip="N2 Pressure Switch"		tip.zh-CN="" tip.en-US="DI-21" />
-   
-  </Action>
-
-  <Action do="DO_Soft_Pumping_Valve_LLA"					value="true" tip="Soft Pumping Valve LLA"	tip.zh-CN="" tip.en-US="DO-06" >
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
-    <Limit di="DI_LLA_E_Slit_Door_close_Position"			value="true" tip="LLA In Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-23" />
-    <Limit di="DI_LLA_Lid_Door_Closed"			value="true" tip="LLA Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-26" />
-    <Limit do="DO_Purge_Valve_LLA"					value="false" tip="Purge Valve LLA"	tip.zh-CN="" tip.en-US="DO-08" />
-    <Limit do="DO_Vent_Valve_LLA"					value="false" tip="Vent Valve LLA"	tip.zh-CN="" tip.en-US="DO-09" />
-  </Action>
-
-  <Action do="DO_Fast_Pumping_Valve_LLA"					value="true" tip="Fast Pumping Valve LLA"	tip.zh-CN="" tip.en-US="DO-07" >
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
-    <Limit di="DI_LLA_E_Slit_Door_close_Position"			value="true" tip="LLA In Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-23" />
-    <Limit di="DI_LLA_Lid_Door_Closed"			value="true" tip="LLA Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-26" />
-    <Limit do="DO_Purge_Valve_LLA"					value="false" tip="Purge Valve LLA"	tip.zh-CN="" tip.en-US="DO-08" />
-    <Limit do="DO_Vent_Valve_LLA"					value="false" tip="Vent Valve LLA"	tip.zh-CN="" tip.en-US="DO-09" />
-  </Action>
-
-  <Action do="DO_Purge_Valve_LLA"					value="true" tip="Purge Valve LLA"	tip.zh-CN="" tip.en-US="DO-08" >
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
-    <Limit di="DI_N2_Pressure_Switch"			value="true" tip="N2 Pressure Switch"		tip.zh-CN="" tip.en-US="DI-21" />
-    <Limit di="DI_LLA_Lid_Door_Closed"			value="true" tip="LLA Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-26" />
-    <Limit do="DO_Soft_Pumping_Valve_LLA"					value="false" tip="Soft Pumping Valve LLA"	tip.zh-CN="" tip.en-US="DO-06" />
-    <Limit do="DO_Fast_Pumping_Valve_LLA"					value="false" tip="Fast Pumping Valve LLA"	tip.zh-CN="" tip.en-US="DO-07" />
-  </Action>
-
-  <Action do="DO_Vent_Valve_LLA"					value="true" tip="Vent Valve LLA"	tip.zh-CN="" tip.en-US="DO-09" >
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
-    <Limit di="DI_N2_Pressure_Switch"			value="true" tip="N2 Pressure Switch"		tip.zh-CN="" tip.en-US="DI-21" />
-    <Limit di="DI_LLA_Lid_Door_Closed"			value="true" tip="LLA Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-26" />
-    <Limit do="DO_Soft_Pumping_Valve_LLA"					value="false" tip="Soft Pumping Valve LLA"	tip.zh-CN="" tip.en-US="DO-06" />
-    <Limit do="DO_Fast_Pumping_Valve_LLA"					value="false" tip="Fast Pumping Valve LLA"	tip.zh-CN="" tip.en-US="DO-07" />
-  </Action>
-  
+
+
+	<!--TM-->
+	<Action do="DO_N2_Valve"					value="true" tip="N2 Valve"	tip.zh-CN="" tip.en-US="DO-00" >
+		<Limit di="DI_TM_CHB_Door_Closed"			value="true" tip="TM CHB Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-17" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
+		<Limit di="DI_N2_Pressure_Switch"			value="true" tip="N2 Pressure Switch"		tip.zh-CN="" tip.en-US="DI-21" />
+	</Action>
+
+	<Action do="DO_Soft_Pumping_Valve_TM"					value="true" tip="Soft Pumping Valve TM"	tip.zh-CN="" tip.en-US="DO-01" >
+		<Limit di="DI_TM_CHB_Door_Closed"			value="true" tip="TM CHB Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-17" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
+		<Limit di="DI_LLA_E_Slit_Door_close_Position"			value="true" tip="LLA In Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-23" />
+		<Limit di="DI_LLA_T_Slit_Door_close_Position"			value="true" tip="LLA Out Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-25" />
+		<Limit di="DI_LLA_Lid_Door_Closed"			value="true" tip="LLA Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-26" />
+		<Limit di="DI_LLB_E_Slit_Door_close_Position"			value="true" tip="LLB In Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-28" />
+		<Limit di="DI_LLB_T_Slit_Door_close_Position"			value="true" tip="LLB Out Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-30" />
+		<Limit di="DI_LLB_Lid_Door_Closed"			value="true" tip="LLB Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-31" />
+		<Limit do="DO_Purge_Valve_TM"	value="false" tip="Purge Valve TM"			tip.zh-CN="" tip.en-US="D0-03" />
+		<Limit do="DO_Vent_Valve_TM"				value="false" tip="Soft Vent Valve TM"					tip.zh-CN="" tip.en-US="DO-04" />
+	</Action>
+
+	<Action do="DO_Fast_Pumping_Valve_TM"					value="true" tip="Fast Pumping Valve TM"	tip.zh-CN="" tip.en-US="DO-02" >
+		<Limit di="DI_TM_CHB_Door_Closed"	value="true" tip="TM CHB Lid Door Closed"			tip.zh-CN="" tip.en-US="DI-17" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
+		<Limit di="DI_LLA_E_Slit_Door_close_Position"			value="true" tip="LLA In Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-23" />
+		<Limit di="DI_LLA_T_Slit_Door_close_Position"			value="true" tip="LLA Out Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-25" />
+		<Limit di="DI_LLA_Lid_Door_Closed"			value="true" tip="LLA Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-26" />
+		<Limit di="DI_LLB_E_Slit_Door_close_Position"			value="true" tip="LLB In Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-28" />
+		<Limit di="DI_LLB_T_Slit_Door_close_Position"			value="true" tip="LLB Out Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-30" />
+		<Limit di="DI_LLB_Lid_Door_Closed"			value="true" tip="LLB Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-31" />
+		<Limit do="DO_Purge_Valve_TM"	value="false" tip="Purge Valve TM"			tip.zh-CN="" tip.en-US="D0-03" />
+		<Limit do="DO_Vent_Valve_TM"				value="false" tip="Soft Vent Valve TM"					tip.zh-CN="" tip.en-US="DO-04" />
+	</Action>
+
+	<Action do="DO_Purge_Valve_TM"					value="true" tip="Purge Valve TM"	tip.zh-CN="" tip.en-US="DO-03" >
+		<Limit di="DI_TM_CHB_Door_Closed"	value="true" tip="TM CHB Lid Door Closed"			tip.zh-CN="" tip.en-US="DI-17" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
+		<Limit di="DI_N2_Pressure_Switch"			value="true" tip="N2 Pressure Switch"		tip.zh-CN="" tip.en-US="DI-21" />
+		<Limit do="DO_Soft_Pumping_Valve_TM"			value="false" tip="Soft Pumping Valve TM"		tip.zh-CN="" tip.en-US="DO-01" />
+		<Limit do="DO_Fast_Pumping_Valve_TM"			value="false" tip="Fast Pumping Valve TM"		tip.zh-CN="" tip.en-US="DO-02" />
+	</Action>
+
+	<Action do="DO_Vent_Valve_TM"					value="true" tip="Soft Vent Valve TM"	tip.zh-CN="" tip.en-US="DO-04" >
+		<Limit di="DI_TM_CHB_Door_Closed"	value="true" tip="TM CHB Lid Door Closed"			tip.zh-CN="" tip.en-US="DI-17" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
+		<Limit di="DI_N2_Pressure_Switch"			value="true" tip="N2 Pressure Switch"		tip.zh-CN="" tip.en-US="DI-21" />
+		<Limit do="DO_Soft_Pumping_Valve_TM"			value="false" tip="Soft Pumping Valve TM"		tip.zh-CN="" tip.en-US="DO-01" />
+		<Limit do="DO_Fast_Pumping_Valve_TM"			value="false" tip="Fast Pumping Valve TM"		tip.zh-CN="" tip.en-US="DO-02" />
+	</Action>
+
+	<Action do="DO_Soft_Pumping_Valve_LLA"					value="true" tip="Soft Pumping Valve LLA"	tip.zh-CN="" tip.en-US="DO-06" >
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
+		<Limit di="DI_LLA_E_Slit_Door_close_Position"			value="true" tip="LLA In Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-23" />
+		<Limit di="DI_LLA_Lid_Door_Closed"			value="true" tip="LLA Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-26" />
+		<Limit do="DO_Purge_Valve_LLA"					value="false" tip="Purge Valve LLA"	tip.zh-CN="" tip.en-US="DO-08" />
+		<Limit do="DO_Vent_Valve_LLA"					value="false" tip="Vent Valve LLA"	tip.zh-CN="" tip.en-US="DO-09" />
+		<Limit do="DO_Soft_Pumping_Valve_LLB"	value="false" tip="Soft Pumping Valve LLB"		tip.zh-CN="" tip.en-US="DO-16" />
+		<Limit do="DO_Fast_Pumping_Valve_LLB"				value="false" tip="Fast Pumping Valve LLB"			tip.zh-CN="" tip.en-US="DO-17" />
+	</Action>
+
+	<Action do="DO_Fast_Pumping_Valve_LLA"					value="true" tip="Fast Pumping Valve LLA"	tip.zh-CN="" tip.en-US="DO-07" >
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
+		<Limit di="DI_LLA_E_Slit_Door_close_Position"			value="true" tip="LLA In Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-23" />
+		<Limit di="DI_LLA_Lid_Door_Closed"			value="true" tip="LLA Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-26" />
+		<Limit do="DO_Purge_Valve_LLA"					value="false" tip="Purge Valve LLA"	tip.zh-CN="" tip.en-US="DO-08" />
+		<Limit do="DO_Vent_Valve_LLA"					value="false" tip="Vent Valve LLA"	tip.zh-CN="" tip.en-US="DO-09" />
+		<Limit do="DO_Soft_Pumping_Valve_LLB"					value="false" tip="Soft Pumping Valve LLB"	tip.zh-CN="" tip.en-US="DO-16" />
+		<Limit do="DO_Fast_Pumping_Valve_LLB"					value="false" tip="Fast Pumping Valve LLB"	tip.zh-CN="" tip.en-US="DO-17" />
+	</Action>
+
+	<Action do="DO_Purge_Valve_LLA"					value="true" tip="Purge Valve LLA"	tip.zh-CN="" tip.en-US="DO-08" >
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
+		<Limit di="DI_N2_Pressure_Switch"			value="true" tip="N2 Pressure Switch"		tip.zh-CN="" tip.en-US="DI-21" />
+		<Limit di="DI_LLA_Lid_Door_Closed"			value="true" tip="LLA Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-26" />
+		<Limit do="DO_Soft_Pumping_Valve_LLA"					value="false" tip="Soft Pumping Valve LLA"	tip.zh-CN="" tip.en-US="DO-06" />
+		<Limit do="DO_Fast_Pumping_Valve_LLA"					value="false" tip="Fast Pumping Valve LLA"	tip.zh-CN="" tip.en-US="DO-07" />
+	</Action>
+
+	<Action do="DO_Vent_Valve_LLA"					value="true" tip="Vent Valve LLA"	tip.zh-CN="" tip.en-US="DO-09" >
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
+		<Limit di="DI_N2_Pressure_Switch"			value="true" tip="N2 Pressure Switch"		tip.zh-CN="" tip.en-US="DI-21" />
+		<Limit di="DI_LLA_Lid_Door_Closed"			value="true" tip="LLA Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-26" />
+		<Limit do="DO_Soft_Pumping_Valve_LLA"					value="false" tip="Soft Pumping Valve LLA"	tip.zh-CN="" tip.en-US="DO-06" />
+		<Limit do="DO_Fast_Pumping_Valve_LLA"					value="false" tip="Fast Pumping Valve LLA"	tip.zh-CN="" tip.en-US="DO-07" />
+	</Action>
+
 	<Action do="DO_LLA_Slit_Door_E_Open"					value="true" tip="LLA Slit Door/I Open"	tip.zh-CN="" tip.en-US="DO-11" >
-    <Limit di="DI_TM_RB_Not_Extend_LLA"			value="true" tip="TM RB Not Extend LLA"		tip.zh-CN="" tip.en-US="DI-8" />
-    <Limit di="DI_EFEM_RB_Not_Extend_LLA"			value="true" tip="EFEM Robot Net Extend to LLA"		tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_EFEM_Side_Door_Closed"				value="true" tip="EFEM Side Panel Closed"			tip.zh-CN="" tip.en-US="DI-13" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
-    <Limit di="DI_LLA_T_Slit_Door_close_Position"	value="true" tip="LLA TM Side Door Closed"			tip.zh-CN="" tip.en-US="DI-25" />
+		<Limit di="DI_TM_RB_Not_Extend_LLA"			value="true" tip="TM RB Not Extend LLA"		tip.zh-CN="" tip.en-US="DI-8" />
+		<Limit di="DI_EFEM_RB_Not_Extend_LLA"			value="true" tip="EFEM Robot Net Extend to LLA"		tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_EFEM_Side_Door_Closed"				value="true" tip="EFEM Side Panel Closed"			tip.zh-CN="" tip.en-US="DI-13" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
+		<Limit di="DI_LLA_T_Slit_Door_close_Position"	value="true" tip="LLA TM Side Door Closed"			tip.zh-CN="" tip.en-US="DI-25" />
 		<Limit di="DI_LLA_Lid_Door_Closed"				value="true" tip="LLA Lid Closed"					tip.zh-CN="" tip.en-US="DI-26" />
-    <Limit di="DI_LLA_ATM_Switch"				value="true" tip="LLA ATM Switch"					tip.zh-CN="" tip.en-US="DI-35" />
+		<Limit di="DI_LLA_ATM_Switch"				value="true" tip="LLA ATM Switch"					tip.zh-CN="" tip.en-US="DI-35" />
 	</Action>
-	
+
 	<Action do="DO_LLA_Slit_Door_E_Close"				value="true" tip="LLA Slit Door/I Close"	tip.zh-CN="" tip.en-US="DO-12" >
-    <Limit di="DI_TM_RB_Not_Extend_LLA"			value="true" tip="TM RB Not Extend LLA"		tip.zh-CN="" tip.en-US="DI-8" />
-    <Limit di="DI_EFEM_RB_Not_Extend_LLA"			value="true" tip="EFEM Robot Net Extend to LLA"		tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_EFEM_Side_Door_Closed"				value="true" tip="EFEM Side Panel Closed"			tip.zh-CN="" tip.en-US="DI-13" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
-    <Limit di="DI_LLA_Lid_Door_Closed"				value="true" tip="LLA Lid Closed"					tip.zh-CN="" tip.en-US="DI-26" />
+		<Limit di="DI_TM_RB_Not_Extend_LLA"			value="true" tip="TM RB Not Extend LLA"		tip.zh-CN="" tip.en-US="DI-8" />
+		<Limit di="DI_EFEM_RB_Not_Extend_LLA"			value="true" tip="EFEM Robot Net Extend to LLA"		tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_EFEM_Side_Door_Closed"				value="true" tip="EFEM Side Panel Closed"			tip.zh-CN="" tip.en-US="DI-13" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
+		<Limit di="DI_LLA_Lid_Door_Closed"				value="true" tip="LLA Lid Closed"					tip.zh-CN="" tip.en-US="DI-26" />
 	</Action>
-	
+
 
 
 	<Action do="DO_LLA_Slit_Door_T_Open"					value="true" tip="Loadlock A TM Side Door Open"		tip.zh-CN="" tip.en-US="DO-13" >
 		<Limit di="DI_TM_RB_Not_Extend_LLA"				value="true" tip="TM Robot Net Extend to LLA"		tip.zh-CN="" tip.en-US="DI-8" />
-    <Limit di="DI_EFEM_RB_Not_Extend_LLA"			value="true" tip="EFEM Robot Net Extend to LLA"		tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_TM_CHB_Door_Closed"	value="true" tip="TM CHB Lid Door Closed"			tip.zh-CN="" tip.en-US="DI-17" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
+		<Limit di="DI_EFEM_RB_Not_Extend_LLA"			value="true" tip="EFEM Robot Net Extend to LLA"		tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_TM_CHB_Door_Closed"	value="true" tip="TM CHB Lid Door Closed"			tip.zh-CN="" tip.en-US="DI-17" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
 		<Limit di="DI_LLA_E_Slit_Door_close_Position"	value="true" tip="LLA EFEM Side Door Closed"		tip.zh-CN="" tip.en-US="DI-23" />
 		<Limit di="DI_LLA_Lid_Door_Closed"				value="true" tip="LLA Lid Closed"					tip.zh-CN="" tip.en-US="DI-26" />
 	</Action>
 
-  
+
 	<Action do="DO_LLA_Slit_Door_T_Close"				value="true" tip="Loadlock A TM Side Door Close"	tip.zh-CN="" tip.en-US="DO-14" >
 		<Limit di="DI_TM_RB_Not_Extend_LLA"				value="true" tip="TM Robot Net Extend to LLA"		tip.zh-CN="" tip.en-US="DI-8" />
-    <Limit di="DI_EFEM_RB_Not_Extend_LLA"			value="true" tip="EFEM Robot Net Extend to LLA"		tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_TM_CHB_Door_Closed"	value="true" tip="TM CHB Lid Door Closed"			tip.zh-CN="" tip.en-US="DI-17" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
+		<Limit di="DI_EFEM_RB_Not_Extend_LLA"			value="true" tip="EFEM Robot Net Extend to LLA"		tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_TM_CHB_Door_Closed"	value="true" tip="TM CHB Lid Door Closed"			tip.zh-CN="" tip.en-US="DI-17" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
 		<Limit di="DI_LLA_Lid_Door_Closed"				value="true" tip="LLA Lid Closed"					tip.zh-CN="" tip.en-US="DI-26" />
 	</Action>
-  
-  <Action do="DO_Soft_Pumping_Valve_LLB"				value="true" tip="Soft Pumping Valve LLB"	tip.zh-CN="" tip.en-US="DO-16" >
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
-    <Limit di="DI_LLB_E_Slit_Door_close_Position"	value="true" tip="LLB In Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-28" />
-    <Limit di="DI_EFEM_Side_Door_Closed"				value="true" tip="EFEM Side Panel Closed"			tip.zh-CN="" tip.en-US="DI-31" />
-    <Limit do="DO_Purge_Valve_LLB"	value="false" tip="Purge Valve LLB"		tip.zh-CN="" tip.en-US="DO-18" />
-    <Limit do="DO_Vent_Valve_LLB"				value="false" tip="Vent Valve LLB"			tip.zh-CN="" tip.en-US="DO-19" />
-  </Action>
-
-  <Action do="DO_Fast_Pumping_Valve_LLB"					value="true" tip="Fast Pumping Valve LLB"		tip.zh-CN="" tip.en-US="DO-17" >
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
-    <Limit di="DI_LLB_E_Slit_Door_close_Position"	value="true" tip="LLB EFEM Side Door Closed"		tip.zh-CN="" tip.en-US="DI-28" />
-    <Limit di="DI_LLB_Lid_Door_Closed"				value="true" tip="LLB Lid Closed"					tip.zh-CN="" tip.en-US="DI-31" />
-    <Limit do="DO_Purge_Valve_LLB"	value="false" tip="Purge Valve LLB"		tip.zh-CN="" tip.en-US="DO-18" />
-    <Limit do="DO_Vent_Valve_LLB"				value="false" tip="Vent Valve LLB"			tip.zh-CN="" tip.en-US="DO-19" />
-  </Action>
-
-  <Action do="DO_Purge_Valve_LLB"					value="true" tip="Purge Valve LLB"		tip.zh-CN="" tip.en-US="DO-18" >
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
-    <Limit di="DI_N2_Pressure_Switch"			value="true" tip="N2 Pressure Switch"		tip.zh-CN="" tip.en-US="DI-21" />
-    <Limit di="DI_LLB_Lid_Door_Closed"				value="true" tip="LLB Lid Closed"					tip.zh-CN="" tip.en-US="DI-31" />
-    <Limit do="DO_Soft_Pumping_Valve_LLB"	value="false" tip="Soft Pumping Valve LLB"		tip.zh-CN="" tip.en-US="DO-16" />
-    <Limit do="DO_Fast_Pumping_Valve_LLB"				value="false" tip="Fast Pumping Valve LLB"			tip.zh-CN="" tip.en-US="DO-17" />
-  </Action>
-
-  <Action do="DO_Vent_Valve_LLB"					value="true" tip="Vent Valve LLB"		tip.zh-CN="" tip.en-US="DO-19" >
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
-    <Limit di="DI_N2_Pressure_Switch"			value="true" tip="N2 Pressure Switch"		tip.zh-CN="" tip.en-US="DI-21" />
-    <Limit di="DI_LLB_Lid_Door_Closed"				value="true" tip="LLB Lid Closed"					tip.zh-CN="" tip.en-US="DI-31" />
-    <Limit do="DO_Soft_Pumping_Valve_LLB"	value="false" tip="Soft Pumping Valve LLB"		tip.zh-CN="" tip.en-US="DO-16" />
-    <Limit do="DO_Fast_Pumping_Valve_LLB"				value="false" tip="Fast Pumping Valve LLB"			tip.zh-CN="" tip.en-US="DO-17" />
-  </Action>
-
-  <Action do="DO_LLB_Slit_Door_E_Open"					value="true" tip="LLB Slit Door/I Open"		tip.zh-CN="" tip.en-US="DO-21" >
-    <Limit di="DI_TM_RB_Not_Extend_LLB"			value="true" tip="TM RB Not Extend LLB"		tip.zh-CN="" tip.en-US="DI-09" />
-    <Limit di="DI_EFEM_RB_Not_Extend_LLB"				value="true" tip="EFEM RB Not Extend LLB"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit di="DI_EFEM_Side_Door_Closed"				value="true" tip="EFEM Side Panel Closed"			tip.zh-CN="" tip.en-US="DI-13" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
-    <Limit di="DI_LLB_T_Slit_Door_close_Position"			value="true" tip="LLB Out Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-30" />
-    <Limit di="DI_LLB_Lid_Door_Closed"				value="true" tip="LLB Lid Closed"					tip.zh-CN="" tip.en-US="DI-31" />
-    <Limit di="DI_LLB_ATM_Switch"	value="true" tip="LLB ATM Switch"		tip.zh-CN="" tip.en-US="DI-37" />
-  </Action>
-
-  <Action do="DO_LLB_Slit_Door_E_Close"					value="true" tip="LLB Slit Door/I Close"		tip.zh-CN="" tip.en-US="DO-22" >
-    <Limit di="DI_TM_RB_Not_Extend_LLB"			value="true" tip="TM RB Not Extend LLB"		tip.zh-CN="" tip.en-US="DI-09" />
-    <Limit di="DI_EFEM_RB_Not_Extend_LLB"				value="true" tip="EFEM RB Not Extend LLB"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit di="DI_EFEM_Side_Door_Closed"				value="true" tip="EFEM Side Panel Closed"			tip.zh-CN="" tip.en-US="DI-13" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
-    <Limit di="DI_LLB_Lid_Door_Closed"				value="true" tip="LLB Lid Closed"					tip.zh-CN="" tip.en-US="DI-31" />
-  </Action>
-  
+
+	<Action do="DO_Soft_Pumping_Valve_LLB"				value="true" tip="Soft Pumping Valve LLB"	tip.zh-CN="" tip.en-US="DO-16" >
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
+		<Limit di="DI_LLB_E_Slit_Door_close_Position"	value="true" tip="LLB In Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-28" />
+		<Limit di="DI_EFEM_Side_Door_Closed"				value="true" tip="EFEM Side Panel Closed"			tip.zh-CN="" tip.en-US="DI-31" />
+		<Limit do="DO_Soft_Pumping_Valve_LLA"					value="false" tip="Soft Pumping Valve LLA"	tip.zh-CN="" tip.en-US="DO-06" />
+		<Limit do="DO_Fast_Pumping_Valve_LLA"					value="false" tip="Fast Pumping Valve LLA"	tip.zh-CN="" tip.en-US="DO-07" />
+		<Limit do="DO_Purge_Valve_LLB"	value="false" tip="Purge Valve LLB"		tip.zh-CN="" tip.en-US="DO-18" />
+		<Limit do="DO_Vent_Valve_LLB"				value="false" tip="Vent Valve LLB"			tip.zh-CN="" tip.en-US="DO-19" />
+	</Action>
+
+	<Action do="DO_Fast_Pumping_Valve_LLB"			value="true"  tip="Fast Pumping Valve LLB"		tip.zh-CN="" tip.en-US="DO-17" >
+		<Limit di="DI_CDA_Pressure_Switch"			    value="true"  tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
+		<Limit di="DI_LLB_E_Slit_Door_close_Position"	value="true"  tip="LLB EFEM Side Door Closed"		tip.zh-CN="" tip.en-US="DI-28" />
+		<Limit di="DI_LLB_Lid_Door_Closed"				value="true"  tip="LLB Lid Closed"					tip.zh-CN="" tip.en-US="DI-31" />
+		<Limit do="DO_Soft_Pumping_Valve_LLA"			value="false" tip="Soft Pumping Valve LLA"	tip.zh-CN="" tip.en-US="DO-06" />
+		<Limit do="DO_Fast_Pumping_Valve_LLA"			value="false" tip="Fast Pumping Valve LLA"	tip.zh-CN="" tip.en-US="DO-07" />
+		<Limit do="DO_Purge_Valve_LLB"	                value="false" tip="Purge Valve LLB"		tip.zh-CN="" tip.en-US="DO-18" />
+		<Limit do="DO_Vent_Valve_LLB"				    value="false" tip="Vent Valve LLB"			tip.zh-CN="" tip.en-US="DO-19" />
+	</Action>
+
+	<Action do="DO_Purge_Valve_LLB"					value="true" tip="Purge Valve LLB"		tip.zh-CN="" tip.en-US="DO-18" >
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
+		<Limit di="DI_N2_Pressure_Switch"			value="true" tip="N2 Pressure Switch"		tip.zh-CN="" tip.en-US="DI-21" />
+		<Limit di="DI_LLB_Lid_Door_Closed"				value="true" tip="LLB Lid Closed"					tip.zh-CN="" tip.en-US="DI-31" />
+		<Limit do="DO_Soft_Pumping_Valve_LLB"	value="false" tip="Soft Pumping Valve LLB"		tip.zh-CN="" tip.en-US="DO-16" />
+		<Limit do="DO_Fast_Pumping_Valve_LLB"				value="false" tip="Fast Pumping Valve LLB"			tip.zh-CN="" tip.en-US="DO-17" />
+	</Action>
+
+	<Action do="DO_Vent_Valve_LLB"					value="true" tip="Vent Valve LLB"		tip.zh-CN="" tip.en-US="DO-19" >
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
+		<Limit di="DI_N2_Pressure_Switch"			value="true" tip="N2 Pressure Switch"		tip.zh-CN="" tip.en-US="DI-21" />
+		<Limit di="DI_LLB_Lid_Door_Closed"				value="true" tip="LLB Lid Closed"					tip.zh-CN="" tip.en-US="DI-31" />
+		<Limit do="DO_Soft_Pumping_Valve_LLB"	value="false" tip="Soft Pumping Valve LLB"		tip.zh-CN="" tip.en-US="DO-16" />
+		<Limit do="DO_Fast_Pumping_Valve_LLB"				value="false" tip="Fast Pumping Valve LLB"			tip.zh-CN="" tip.en-US="DO-17" />
+	</Action>
+
+	<Action do="DO_LLB_Slit_Door_E_Open"					value="true" tip="LLB Slit Door/I Open"		tip.zh-CN="" tip.en-US="DO-21" >
+		<Limit di="DI_TM_RB_Not_Extend_LLB"			value="true" tip="TM RB Not Extend LLB"		tip.zh-CN="" tip.en-US="DI-09" />
+		<Limit di="DI_EFEM_RB_Not_Extend_LLB"				value="true" tip="EFEM RB Not Extend LLB"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_EFEM_Side_Door_Closed"				value="true" tip="EFEM Side Panel Closed"			tip.zh-CN="" tip.en-US="DI-13" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
+		<Limit di="DI_LLB_T_Slit_Door_close_Position"			value="true" tip="LLB Out Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-30" />
+		<Limit di="DI_LLB_Lid_Door_Closed"				value="true" tip="LLB Lid Closed"					tip.zh-CN="" tip.en-US="DI-31" />
+		<Limit di="DI_LLB_ATM_Switch"	value="true" tip="LLB ATM Switch"		tip.zh-CN="" tip.en-US="DI-37" />
+	</Action>
+
+	<Action do="DO_LLB_Slit_Door_E_Close"					value="true" tip="LLB Slit Door/I Close"		tip.zh-CN="" tip.en-US="DO-22" >
+		<Limit di="DI_TM_RB_Not_Extend_LLB"			value="true" tip="TM RB Not Extend LLB"		tip.zh-CN="" tip.en-US="DI-09" />
+		<Limit di="DI_EFEM_RB_Not_Extend_LLB"				value="true" tip="EFEM RB Not Extend LLB"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_EFEM_Side_Door_Closed"				value="true" tip="EFEM Side Panel Closed"			tip.zh-CN="" tip.en-US="DI-13" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
+		<Limit di="DI_LLB_Lid_Door_Closed"				value="true" tip="LLB Lid Closed"					tip.zh-CN="" tip.en-US="DI-31" />
+	</Action>
+
 	<Action do="DO_LLB_Slit_Door_T_Open"					value="true" tip="LLB Slit Door/O Open"		tip.zh-CN="" tip.en-US="DO-23" >
 		<Limit di="DI_TM_RB_Not_Extend_LLB"				value="true" tip="TM Robot Net Extend to LLB"		tip.zh-CN="" tip.en-US="DI-9" />
-    <Limit di="DI_EFEM_RB_Not_Extend_LLB"				value="true" tip="EFEM RB Not Extend LLB"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit di="DI_TM_CHB_Door_Closed"	value="true" tip="TM CHB Lid Door Closed"			tip.zh-CN="" tip.en-US="DI-17" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
+		<Limit di="DI_EFEM_RB_Not_Extend_LLB"				value="true" tip="EFEM RB Not Extend LLB"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_TM_CHB_Door_Closed"	value="true" tip="TM CHB Lid Door Closed"			tip.zh-CN="" tip.en-US="DI-17" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
 		<Limit di="DI_LLB_E_Slit_Door_close_Position"	value="true" tip="LLB EFEM Side Door Closed"		tip.zh-CN="" tip.en-US="DI-28" />
 		<Limit di="DI_LLB_Lid_Door_Closed"				value="true" tip="LLB Lid Closed"					tip.zh-CN="" tip.en-US="DI-31" />
 	</Action>
 
-	
+
 	<Action do="DO_LLB_Slit_Door_T_Close"				value="true" tip="LLB Slit Door/O Close"	tip.zh-CN="" tip.en-US="DO-24" >
 		<Limit di="DI_TM_RB_Not_Extend_LLB"				value="true" tip="TM Robot Net Extend to LLB"		tip.zh-CN="" tip.en-US="DI-9" />
-    <Limit di="DI_EFEM_RB_Not_Extend_LLB"				value="true" tip="EFEM RB Not Extend LLB"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit di="DI_TM_CHB_Door_Closed"	value="true" tip="TM CHB Lid Door Closed"			tip.zh-CN="" tip.en-US="DI-17" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
+		<Limit di="DI_EFEM_RB_Not_Extend_LLB"				value="true" tip="EFEM RB Not Extend LLB"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_TM_CHB_Door_Closed"	value="true" tip="TM CHB Lid Door Closed"			tip.zh-CN="" tip.en-US="DI-17" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
 		<Limit di="DI_LLB_Lid_Door_Closed"				value="true" tip="LLB Lid Closed"					tip.zh-CN="" tip.en-US="DI-31" />
 	</Action>
-  
-  <Action do="DO_Water_Valve_Relay"				value="true" tip="Water Valve Relay"	tip.zh-CN="" tip.en-US="DO-26" >
-    <Limit di="DI_Water_Leak_Sensor"				value="true" tip="Water Leak Sensor"		tip.zh-CN="" tip.en-US="DI-3" />
-  </Action>
-	
+
+	<Action do="DO_Water_Valve_Relay"				value="true" tip="Water Valve Relay"	tip.zh-CN="" tip.en-US="DO-26" >
+		<Limit di="DI_Water_Leak_Sensor"				value="true" tip="Water Leak Sensor"		tip.zh-CN="" tip.en-US="DI-3" />
+	</Action>
+
 </Interlock>

+ 7 - 1
Venus/Venus_RT/Devices/EFEM/JetEfem.cs

@@ -776,7 +776,13 @@ namespace Venus_RT.Devices.EFEM
 
         private void OnCommandUpdated(EfemMessage message)
         {
-            if(message.Operation != EfemOperation.ClearError && message.Operation != EfemOperation.Ready && _currentMsg?.Operation != message.Operation && _backroundMsg.Operation != message.Operation)
+            if(message.Operation != EfemOperation.ClearError && 
+                message.Operation != EfemOperation.Ready && 
+                _currentMsg?.Operation != message.Operation && 
+                _backroundMsg.Operation != message.Operation &&
+                message.Operation != EfemOperation.Home &&
+                message.Operation != EfemOperation.Orgsh
+                )
             {
                 LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EfemRobot, $"OnCommandUpdated() unexpected return: {message.Operation}, backround: {_backroundMsg.Operation}");
                 return;

+ 232 - 0
Venus/Venus_RT/Devices/PreAligner/HongHuVPA.cs

@@ -0,0 +1,232 @@
+using Aitex.Core.RT.Log;
+using Aitex.Core.RT.SCCore;
+using Aitex.Core.Util;
+using MECF.Framework.Common.Communications;
+using MECF.Framework.Common.Equipment;
+using MECF.Framework.RT.ModuleLibrary.VceModules;
+using System;
+using System.Collections.Generic;
+using System.IO.Ports;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using Venus_Core;
+
+namespace Venus_RT.Devices.PreAligner
+{
+    public class HongHuVPA : IPreAlign
+    {
+        private AsyncSerialPort _serialport;//串口
+        private string _newLine = "\r";//结束符号
+        private object _locker = new object();//锁变量
+        private bool _IsAsciiMode = true;
+        private PeriodicJob _thread;
+        private string _CurrentMsg;
+        private RState _state;
+        private Regex _catchErrorCode = new Regex(@"(?<=_ERR )(.*)");
+        private LinkedList<string> _lstMessage = new LinkedList<string>();
+        private ModuleName _module;
+        private enum VPAAction
+        {
+            Home,
+            Align,
+            AlignWithAngle,
+            Reset,
+            Scan,
+        }
+        private Dictionary<int, string> _ErrorCode2Msg = new Dictionary<int, string>()
+        {
+            { 16 , "" },
+        };
+        private Dictionary<VPAAction, string> _Command2Msg = new Dictionary<VPAAction, string>()
+        {
+            //Action
+            { VPAAction.Align         , "ALGN" },//旋转到预设的站点方向
+            { VPAAction.AlignWithAngle, "MOVT REL" },//旋转到指定的角度
+            { VPAAction.Home          , "HOME" },//Home 初始化时 error时用
+            { VPAAction.Reset         , "RSET" },//重置 error时用
+            { VPAAction.Scan          , "SCAN" },//扫描整个Wafer参数
+            //Read
+            //{ "" , "RQCD" },
+            //{ "" , "RQCCDPOS" },
+            //{ "" , "RQID" },
+            //{ "" , "RQPS" },
+            //Set
+            //{ "" , "" },
+            //Welding
+            //{ "" , "SVCD" },
+        };
+
+        public ModuleName Module => _module;
+        public bool IsConnect => _serialport.IsOpen();
+        public RState Status => _state;//状态
+
+        public bool IsError => _state == RState.Failed || _state == RState.Timeout;
+
+        public HongHuVPA(ModuleName module)
+        {
+            _module = module;
+            string port = SC.GetStringValue("VPA.Port");
+            _serialport = new AsyncSerialPort(port, 9600, 8, Parity.None, StopBits.One, _newLine, _IsAsciiMode);
+            _serialport.Open();
+            _serialport.OnDataChanged += OnReceiveData;
+            _state = RState.Init;
+            _thread = new PeriodicJob(50, OnTimer, "OnTimer->VPA", true);
+        }
+
+        //收到新消息时的处理
+        private void OnReceiveData(string obj)
+        {
+            lock (_locker)
+            {
+                if (string.IsNullOrEmpty(_newLine))//没有CR
+                {
+                    _lstMessage.AddLast(obj);//将消息添加到最后
+                    return;
+                }
+                string[] array = obj.Split(_newLine.ToCharArray());//按照cr分开通讯数据
+                foreach (string text in array)
+                {
+                    if (!string.IsNullOrEmpty(text))
+                    {
+                        _lstMessage.AddLast(text + _newLine);//存进list中等待处理
+                    }
+                }
+            }
+        }
+
+        //定时器处理新信息为状态
+        private bool OnTimer()
+        {
+            //锁
+            lock (_locker)
+            {
+                //采用ascii码模式处理
+                if (_IsAsciiMode)
+                {
+                    //存在尚未处理的信息
+                    while (_lstMessage.Count > 0)
+                    {
+                        //获取头上的数据
+                        string handlemsg = _lstMessage.First.Value;
+                        Handlemessage(handlemsg);
+                        _lstMessage.RemoveFirst();
+                    }
+                }
+                //采用binary模式处理
+                else
+                {
+
+                }
+
+            }
+            return true;
+        }
+
+        //处理单条信息
+        private void Handlemessage(string handlemsg)
+        {
+            //需要按类型进行处理 Action需要将其error
+            bool IsAction = true;
+            if (IsAction)
+            {
+                switch (handlemsg)
+                {
+                    //正确执行
+                    case "_RDY":
+                        _state = RState.End;
+                        break;
+                    //返回
+                    default:
+                        _state = RState.Failed;
+                        //分两种 1、不按格式的未知错误 2、有错误码的
+                        if (_catchErrorCode.IsMatch(handlemsg))
+                        {
+                            int errorcode = Convert.ToInt32(_catchErrorCode.Match(handlemsg).Value);
+                            if (_ErrorCode2Msg.ContainsKey(errorcode))
+                            {
+                                LOG.Write(eEvent.ERR_DEVICE_INFO, Module, _ErrorCode2Msg[errorcode]);
+                            }
+                        }
+                        else
+                        {
+                            LOG.Write(eEvent.ERR_DEVICE_INFO, Module, "未收录相关错误");
+                        }
+                        break;
+                }
+            }
+
+        }
+
+        //发送消息
+        private bool SendMessage(string msg, params string[] args)
+        {
+            _state = RState.Running;
+            if (args.Length > 0)//含参
+            {
+                foreach (string arg in args)
+                    msg = msg + " " + arg;
+                LOG.WriteSingeLine(eEvent.EV_DEVICE_INFO, _module, $"Send Command to HongHu VPA: {msg}");
+                return _serialport.Write(msg + _newLine);
+            }
+            else//空参
+            {
+                LOG.WriteSingeLine(eEvent.EV_DEVICE_INFO, _module, $"Send Command to HongHu VPA: {msg}");
+                return _serialport.Write(msg + _newLine);
+            }
+        }
+
+        public bool Home()
+        {
+            return SendMessage(_Command2Msg[VPAAction.Home]);
+        }
+        public bool Align()
+        {
+            if (!CanSendCommand())
+                return false;
+            return SendMessage(_Command2Msg[VPAAction.Align]);
+        }
+        public bool AlignWithAngle(float angle)
+        {
+            if (!CanSendCommand())
+                return false;
+            int ang = (int)Math.Floor(angle);//不能用Convert.toInt32("angle") 其遵守四舍五入 此处需向上取整
+            return SendMessage(_Command2Msg[VPAAction.AlignWithAngle], ang.ToString());
+        }
+        public bool ReSet()
+        {
+            if (!IsError)
+                return false;
+            return SendMessage(_Command2Msg[VPAAction.Reset]);
+        }
+        public bool SCAN()
+        {
+            if (!CanSendCommand())
+                return false;
+            return SendMessage(_Command2Msg[VPAAction.Scan]);
+        }
+
+        public bool CanSendCommand()
+        {
+            if (Status == RState.Init)
+            {
+                LOG.Write(eEvent.ERR_DEVICE_INFO, _module, "VPA is not homed, please home first.");
+                return false;
+            }
+            else if (Status == RState.Running)
+            {
+                LOG.Write(eEvent.ERR_DEVICE_INFO, _module, "VPA is busy, please wait a minute");
+                return false;
+            }
+            else if (Status == RState.Failed || Status == RState.Timeout)
+            {
+                LOG.Write(eEvent.ERR_DEVICE_INFO, _module, "VPA has a error, please check and fix the hardware issue and home it");
+                return false;
+            }
+
+            return true;
+        }
+
+    }
+}

+ 25 - 0
Venus/Venus_RT/Devices/PreAligner/IPreAlign.cs

@@ -0,0 +1,25 @@
+using MECF.Framework.Common.Equipment;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Venus_Core;
+
+namespace Venus_RT.Devices.PreAligner
+{
+    public interface IPreAlign
+    {
+        ModuleName Module { get; }
+        bool IsConnect { get; }
+        bool IsError { get; }
+        RState Status { get; }
+        bool Home();
+        bool Align();
+        bool AlignWithAngle(float angle);
+        bool ReSet();
+        bool SCAN();
+
+        bool CanSendCommand();
+    }
+}

+ 41 - 0
Venus/Venus_RT/Devices/TM/JetTM.cs

@@ -162,6 +162,16 @@ namespace Venus_RT.Devices
 
         public  bool? TMPumpIsRunning => _TMPump?.IsRunning;
         public  bool? LLPumpIsRunning => _LLPump?.IsRunning;
+
+        enum LLPumpState
+        {
+            Idle,
+            LLAUsing,
+            LLBUsing,
+        }
+
+        LLPumpState _llPumpingState = LLPumpState.Idle;
+
         private string _allInstalledModules { get { return SC.GetStringValue("System.InstalledModules").ToString(); } }
         public bool PMASlitDoorClosed
         {
@@ -816,5 +826,36 @@ namespace Venus_RT.Devices
             return true;
         }
 
+        public bool TryGetLLPump(ModuleName LLname)
+        {
+            //Self
+            if ((LLname == ModuleName.LLA && _llPumpingState == LLPumpState.LLAUsing) || (LLname == ModuleName.LLB && _llPumpingState == LLPumpState.LLBUsing))
+                return true;
+
+            //Idle
+            if (LLname == ModuleName.LLA && !IsLLBFastPumpOpen && !IsLLBSoftPumpOpen && _llPumpingState == LLPumpState.Idle)
+            {
+                _llPumpingState = LLPumpState.LLAUsing;
+                return true;
+            }
+
+            if (LLname == ModuleName.LLB && !IsLLAFastPumpOpen && !IsLLASoftPumpOpen && _llPumpingState == LLPumpState.Idle)
+            {
+                _llPumpingState = LLPumpState.LLBUsing;
+                return true;
+            }
+            LOG.Write(eEvent.WARN_DEFAULT_WARN, LLname, "无法打开,另一个泵正在用!");
+            //locked
+            return false;
+        }
+
+        public void ReleasePump(ModuleName Module)
+        {
+            //release pump (must do it by user)
+            if ((Module == ModuleName.LLA && _llPumpingState == LLPumpState.LLAUsing) || (Module == ModuleName.LLB && _llPumpingState == LLPumpState.LLBUsing))
+                _llPumpingState = LLPumpState.Idle;
+        }
+
+
     }
 }

+ 318 - 0
Venus/Venus_RT/Devices/VCE/HongHuVce.cs

@@ -0,0 +1,318 @@
+using Aitex.Core.RT.Log;
+using Aitex.Core.RT.SCCore;
+using Aitex.Core.Util;
+using MECF.Framework.Common.Communications;
+using MECF.Framework.Common.Equipment;
+using MECF.Framework.RT.ModuleLibrary.VceModules;
+using System;
+using System.Collections.Generic;
+using System.IO.Ports;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using Venus_Core;
+
+namespace Venus_RT.Devices.VCE
+{
+    //定义Vce动作
+    public enum VceCommand
+    {
+        Home,
+        DoorClose,
+        DoorOpen,
+        Goto,
+        Load,
+        UnLoad,
+        Map,
+        ReadMap,
+    }
+    public enum VceMessageHead
+    {
+        Action,
+        Read,
+        Set,
+        Petrify
+    }
+    /// <summary>
+    /// 泓浒Vce驱动 下发指令等
+    /// </summary>
+    public class HongHuVce : VceModuleBase
+    {
+        #region 私有变量
+        private AsyncSerialPort _serialport;
+        private string _portname;
+        private string _newline = "\n\r";//终止符 0A 0D
+        private object _locker = new object();
+        private bool _IsAsciiMode;
+        private LinkedList<string> _lstAsciiMsgs = new LinkedList<string>();
+        private PeriodicJob _thread;
+        private Regex _matchErrorCode = new Regex(@"(?<=_BKGERR )(.*)");
+        private ModuleName _moduleName;
+        private RState _status;
+        private string _currentMsg;
+        //后期补充
+        private Dictionary<string, string> _ErrorCode2Reason = new Dictionary<string, string>()
+        {
+            {"A6","设备动作,但是发生异常" },
+            {"A8","设备检查互锁,发现无法执行" },
+        };
+        //
+        private Dictionary<VceCommand, string> _Command2Msg = new Dictionary<VceCommand, string>()
+        {
+            //Action
+            {VceCommand.Home,    "HM"    },
+            {VceCommand.Load,    "LOAD"  },
+            {VceCommand.UnLoad,  "UNLOAD"},
+            {VceCommand.Map,     "MP"    },
+            {VceCommand.Goto,    "GC"    },
+            //Read
+            {VceCommand.ReadMap,  "MI" },
+            //Set
+            
+        };
+        private Dictionary<VceMessageHead, string> _Type2Head = new Dictionary<VceMessageHead, string>()
+        {
+            {VceMessageHead.Action,  "A"},
+            {VceMessageHead.Read,    "R"},
+            {VceMessageHead.Set,     "S"},
+            {VceMessageHead.Petrify, "P"},
+        };
+        #endregion
+
+        #region 暴露变量
+        public override bool IsConnected => _serialport.IsOpen();
+        public override RState Status => _status;
+        public override bool IsReady => _status == RState.Init || _status == RState.End;
+        public override bool IsError => _status == RState.Failed || _status == RState.Timeout;
+        public override bool IsInit => _status == RState.Init;
+        #endregion
+
+        //传入slot数量
+        public HongHuVce(int slot, ModuleName moduleName) : base(slot, moduleName)
+        {
+            _moduleName = moduleName;
+            _IsAsciiMode = true;
+            _portname = SC.GetStringValue("VCE.Port");
+            _serialport = new AsyncSerialPort(_portname, 9600, 8, Parity.None, StopBits.One, _newline, _IsAsciiMode);
+            _serialport.Open();
+            _status = RState.Init;
+            _serialport.OnDataChanged += onDataChange;
+            _thread = new PeriodicJob(50, fnTimer, "VCE", true);
+        }
+
+        /// <summary>
+        /// 对处理过的数据list进行处理
+        /// 将每条数据进行解析
+        /// </summary>
+        /// <returns></returns>
+        private bool fnTimer()
+        {
+            lock (_locker)
+            {
+                //采用ascii传输
+                if (_IsAsciiMode)
+                {
+                    //有数据尚未处理
+                    while (_lstAsciiMsgs.Count > 0)
+                    {
+                        string _needHandle = _lstAsciiMsgs.First.Value;
+                        HandleSingleMsg(_needHandle);
+                        _lstAsciiMsgs.RemoveFirst();
+                    }
+                }
+                //采用binary
+                else
+                {
+
+                }
+            }
+            return true;
+        }
+
+        /// <summary>
+        /// 处理单条信息的函数
+        /// 1、判断结束 2、判断错误
+        /// </summary>
+        /// <param name="msg">需要处理的单条回复</param>
+        private void HandleSingleMsg(string msg)
+        {
+            //
+            if (!string.IsNullOrEmpty(msg))
+            {
+                //动作
+                if (_currentMsg.Contains(",A,"))
+                {
+                    switch (msg)
+                    {
+                        //设备收到 开始运行 目前状态在下发
+                        case "_RDY":
+                            break;
+                        //设备执行完毕
+                        case "_BKGRDY":
+                            _status = RState.End;
+                            break;
+                        //异常处理
+                        default:
+                            _status = RState.Failed;
+                            string reason = string.Empty;
+                            if (_matchErrorCode.IsMatch(msg))
+                            {
+                                //若是匹配
+                                //包含原因
+                                string errorcode = _matchErrorCode.Match(msg).Value;
+                                if (_ErrorCode2Reason.ContainsKey(errorcode))
+                                {
+                                    reason = _ErrorCode2Reason[errorcode];
+                                }
+                                else
+                                {
+                                    reason = "未找到相关Error Code";
+                                }
+                            }
+                            else
+                            {
+                                //若不匹配
+                                reason = "回复消息不符合标准格式";
+                            }
+                            LOG.Write(eEvent.ERR_DEVICE_INFO, _moduleName, reason);
+                            break;
+                    }
+                }
+                //读取
+                if (_currentMsg.Contains(",R,") && msg.Contains(",X,"))
+                {
+                    string readtype = msg.Split(',')[2];
+                    switch (readtype)
+                    {
+                        //处理wafer 信息为map数据
+                        case "MI":
+                            string waferinfo = "";
+                            string[] waferitems = msg.Split(',');
+                            for (int i = 3; i < waferitems.Length - 1; i++)
+                            {
+                                //从16进制字符转义回二进制
+                                string wafersingleinfo = Convert.ToString(Convert.ToInt32(waferitems[i], 16), 2);
+                                if (wafersingleinfo.Length < 4)
+                                    wafersingleinfo = '0' * (4 - wafersingleinfo.Length) + wafersingleinfo;//补位
+                                waferinfo = wafersingleinfo + waferinfo;//添加到数据中
+                            }
+                            //请将数据按照反向槽位进行解析存入到wafermanager中
+
+                            break;
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// 处理新到的数据
+        /// 利用linkedlist处理拆包 粘包情况
+        /// </summary>
+        /// <param name="newline">新到数据</param>
+        private void onDataChange(string oneLineMessage)
+        {
+            lock (_locker)
+            {
+                if (string.IsNullOrEmpty(_newline))//没有CR
+                {
+                    _lstAsciiMsgs.AddLast(oneLineMessage);//将消息添加到最后
+                    return;
+                }
+                string[] array = oneLineMessage.Split(_newline.ToCharArray());//按照cr分开通讯数据
+                foreach (string text in array)
+                {
+                    if (!string.IsNullOrEmpty(text))
+                    {
+                        _lstAsciiMsgs.AddLast(text + _newline);//存进list中等待处理
+                    }
+                }
+            }
+        }
+
+        public string Option2Message(VceMessageHead msgtype, VceCommand name, string param = "")
+        {
+            if (string.IsNullOrEmpty(param))//含尾参
+                return $"00,{_Type2Head[msgtype]},{_Command2Msg[name]}{_newline}";
+            else//不含尾参 目前只允许一个
+                return $"00,{_Type2Head[msgtype]},{_Command2Msg[name]},{param},{_newline}";
+        }
+
+        public override bool CloseDoor()
+        {
+            if (!CheckVceStatus())
+                return false;
+            _currentMsg = Option2Message(VceMessageHead.Action, VceCommand.DoorClose);
+            _status = RState.Running;
+            return _serialport.Write(_currentMsg);
+        }
+
+        public override bool HomeALL()
+        {
+            _currentMsg = Option2Message(VceMessageHead.Action, VceCommand.Home, "ALL");
+            _status = RState.Running;
+            return _serialport.Write(_currentMsg);
+        }
+
+        public override bool Home(string axis)
+        {
+            _currentMsg = Option2Message(VceMessageHead.Action, VceCommand.Home, axis);
+            _status = RState.Running;
+            return _serialport.Write(_currentMsg);
+        }
+
+        public override bool OpenDoor()
+        {
+            if (!CheckVceStatus())
+                return false;
+            _currentMsg = Option2Message(VceMessageHead.Action, VceCommand.DoorOpen);
+            _status = RState.Running;
+            return _serialport.Write(_currentMsg);
+        }
+
+        public override bool Load()
+        {
+            if (!CheckVceStatus())
+                return false;
+            _currentMsg = Option2Message(VceMessageHead.Action, VceCommand.Load);
+            _status = RState.Running;
+            return _serialport.Write(_currentMsg);
+        }
+
+        public override bool UnLoad()
+        {
+            if (!CheckVceStatus())
+                return false;
+            _currentMsg = Option2Message(VceMessageHead.Action, VceCommand.UnLoad);
+            _status = RState.Running;
+            return _serialport.Write(_currentMsg);
+        }
+
+        public override bool Map()
+        {
+            if (!CheckVceStatus())
+                return false;
+            _currentMsg = Option2Message(VceMessageHead.Action, VceCommand.Map);
+            _status = RState.Running;
+            return _serialport.Write(_currentMsg);
+        }
+
+        public override bool ReadMap()
+        {
+            if (!CheckVceStatus())
+                return false;
+            _currentMsg = Option2Message(VceMessageHead.Read, VceCommand.ReadMap);
+            _status = RState.Running;
+            return _serialport.Write(_currentMsg);
+        }
+
+        public override bool Goto(int Targetslot)
+        {
+            if (!CheckVceStatus())
+                return false;
+            _currentMsg = Option2Message(VceMessageHead.Action, VceCommand.Goto, Targetslot.ToString());
+            _status = RState.Running;
+            return _serialport.Write(_currentMsg);
+        }
+    }
+}

+ 8 - 8
Venus/Venus_RT/Modules/RouteManager.cs

@@ -651,14 +651,14 @@ namespace Venus_RT.Modules
                 return true;
             }
 
-            return CheckHomed("PMA", PMA != null, PMA != null&&PMA.IsIdle) &&
-                CheckHomed("PMB", PMB != null, PMB != null&&PMA.IsIdle) &&
-                CheckHomed("PMC", PMC != null, PMC != null&&PMC.IsIdle) &&
-                CheckHomed("PMD", PMD != null, PMD != null&&PMD.IsIdle) &&
-                CheckHomed("LLA", LLA != null, LLA != null&&LLA.IsIdle) &&
-                CheckHomed("LLB", LLB != null, LLB != null&&LLB.IsIdle) &&
-                CheckHomed("TM", TM != null, TM != null&&TM.IsIdle) &&
-                CheckHomed("EFEM", EFEM != null, EFEM != null && EFEM.IsIdle);
+            return CheckHomed("PMA", ModuleHelper.IsInstalled(ModuleName.PMA) && PMA != null, ModuleHelper.IsInstalled(ModuleName.PMA) && PMA != null&&PMA.IsIdle) &&
+                CheckHomed("PMB", ModuleHelper.IsInstalled(ModuleName.PMB) && PMB != null, ModuleHelper.IsInstalled(ModuleName.PMB) && PMB != null&&PMB.IsIdle) &&
+                CheckHomed("PMC", ModuleHelper.IsInstalled(ModuleName.PMC) && PMC != null, ModuleHelper.IsInstalled(ModuleName.PMC) && PMC != null&&PMC.IsIdle) &&
+                CheckHomed("PMD", ModuleHelper.IsInstalled(ModuleName.PMD) && PMD != null, ModuleHelper.IsInstalled(ModuleName.PMD) && PMD != null&&PMD.IsIdle) &&
+                CheckHomed("LLA", ModuleHelper.IsInstalled(ModuleName.LLA) && LLA != null, ModuleHelper.IsInstalled(ModuleName.LLA) && LLA != null&&LLA.IsIdle) &&
+                CheckHomed("LLB", ModuleHelper.IsInstalled(ModuleName.LLB) && LLB != null, ModuleHelper.IsInstalled(ModuleName.LLB) && LLB != null&&LLB.IsIdle) &&
+                CheckHomed("TM", ModuleHelper.IsInstalled(ModuleName.TM) && TM != null, ModuleHelper.IsInstalled(ModuleName.TM) && TM != null&&TM.IsIdle) &&
+                CheckHomed("EFEM", ModuleHelper.IsInstalled(ModuleName.EFEM) && EFEM != null, ModuleHelper.IsInstalled(ModuleName.EFEM) && EFEM != null && EFEM.IsIdle);
         }
 
 

+ 29 - 15
Venus/Venus_RT/Modules/TM/MFPumpRoutine.cs

@@ -4,6 +4,7 @@ using Venus_RT.Devices;
 using MECF.Framework.Common.Routine;
 using MECF.Framework.Common.Equipment;
 using Venus_Core;
+using System.Threading;
 
 namespace Venus_RT.Modules.TM
 {
@@ -15,11 +16,14 @@ namespace Venus_RT.Modules.TM
             kSoftPump,
             kFastPump,
             kClosePumpValves,
+            kDelayForSwitchPump,
+            kSwitchLLPump
         }
 
         private double _pumpBasePressure;
         private double _pumpCrossingPressure;
         private int _pumpingTimeout;
+        private int _switchLLPumpDelay;
         private readonly JetTM _JetTM;
         public MFPumpRoutine(JetTM jetTM, ModuleName mod) : base(mod)
         {
@@ -37,7 +41,10 @@ namespace Venus_RT.Modules.TM
                 _pumpBasePressure = SC.GetValue<double>($"{Module}.PumpBasePressure");
                 _pumpCrossingPressure = SC.GetValue<double>($"{Module}.PumpCrossingPressure");
                 _pumpingTimeout = SC.GetValue<int>($"{Module}.PumpingTimeout") * 1000;
-
+                if (Module == ModuleName.LLA || Module == ModuleName.LLB)
+                    _switchLLPumpDelay = SC.GetValue<int>($"{Module}.SwitchLLPumpDelay");
+                else
+                    _switchLLPumpDelay = 0;
                 return Runner.Start(Module, Name);
             }
 
@@ -46,31 +53,31 @@ namespace Venus_RT.Modules.TM
 
         public RState Monitor()
         {
-            Runner.Wait((int)PumpStep.kWaitPeerModule,  WaitPeerModule)
-                .Run((int)PumpStep.kSoftPump,           OpenSoftPump,                       () => { return _JetTM.GetModulePressure(Module) < _pumpCrossingPressure; }, _pumpingTimeout)
-                .Run((int)PumpStep.kFastPump,           SwitchFastPump,                     IsPressureReady,                                                            _pumpingTimeout)
-                .End((int)PumpStep.kClosePumpValves,    ClosePumpValves,                    _delay_50ms);
+            Runner.Wait((int)PumpStep.kWaitPeerModule,      WaitPeerModule,                                                                                             _delay_60s)
+                .Run((int)PumpStep.kSoftPump,               OpenSoftPump,           () => { return _JetTM.GetModulePressure(Module) < _pumpCrossingPressure; },         _pumpingTimeout)
+                .Run((int)PumpStep.kFastPump,               SwitchFastPump,         IsPressureReady,                                                                    _pumpingTimeout)
+                .Run((int)PumpStep.kClosePumpValves,        ClosePumpValves,        NullFun)
+                .Delay((int)PumpStep.kDelayForSwitchPump,                                                                                                               _switchLLPumpDelay)
+                .End((int)PumpStep.kSwitchLLPump,           ReleaseLLPump,          NullFun);
 
             return Runner.Status;
         }
 
         private bool WaitPeerModule()
         {
-            if(!IsPressureReady())
+            if (!IsPressureReady() && IsLLModule())
             {
-                if (Module == ModuleName.LLA)
-                {
-                    return !_JetTM.IsLLBFastPumpOpen && !_JetTM.IsLLBSoftPumpOpen;
-                }
-                else if (Module == ModuleName.LLB)
-                {
-                    return !_JetTM.IsLLAFastPumpOpen && !_JetTM.IsLLASoftPumpOpen;
-                }
+                return _JetTM.TryGetLLPump(Module);
             }
-            
+
             return true;
         }
 
+        private bool IsLLModule()
+        {
+            return Module == ModuleName.LLA || Module == ModuleName.LLB;
+        }
+
         private bool IsPressureReady()
         {
             return _JetTM.GetModulePressure(Module) < _pumpBasePressure;
@@ -104,6 +111,13 @@ namespace Venus_RT.Modules.TM
             return true;
         }
 
+        private bool ReleaseLLPump()
+        {
+            if (Module == ModuleName.LLA || Module == ModuleName.LLB)
+                _JetTM.ReleasePump(Module);
+            return true;
+        }
+
         public void Abort()
         {
             ClosePumpValves();

+ 3 - 0
Venus/Venus_RT/Venus_RT.csproj

@@ -154,11 +154,14 @@
     <Compile Include="Devices\JetKepler2300PM.cs" />
     <Compile Include="Devices\PendulumValve.cs" />
     <Compile Include="Devices\PlasmaController.cs" />
+    <Compile Include="Devices\PreAligner\HongHuVPA.cs" />
+    <Compile Include="Devices\PreAligner\IPreAlign.cs" />
     <Compile Include="Devices\SkyPump.cs" />
     <Compile Include="Devices\SMCChiller.cs" />
     <Compile Include="Devices\TM\ITransferRobot.cs" />
     <Compile Include="Devices\TM\JetTM.cs" />
     <Compile Include="Devices\TM\SIASUNRobot.cs" />
+    <Compile Include="Devices\VCE\HongHuVce.cs" />
     <Compile Include="Devices\VirgoSignalTower.cs" />
     <Compile Include="FAs\FaEvent.cs" />
     <Compile Include="FAs\FaEventItem.cs" />