Browse Source

update puf interlock

chenkui 1 month ago
parent
commit
4c2922bfe9

+ 5 - 0
CyberX8_Core/EventDefine.cs

@@ -171,5 +171,10 @@ namespace Aitex.Core.RT.Log{
 		ERROR_PUF_HAS_WAFER = 20101004,
 		ERROR_PUF_OTHER_AXIS_EMPTY = 20101005,
 		ERROR_PUF_OTHER_AXIS_STATION = 20101005,
+		ERROR_PUF_CHUCK_ON = 20101006,
+		ERROR_PUF_SIDEA_CHUCK_OUT_ON = 20101007,
+		ERROR_PUF_SIDEA_CHUCK_IN_OFF = 20101008,
+		ERROR_PUF_SIDEB_CHUCK_OUT_ON = 20101009,
+		ERROR_PUF_SIDEB_CHUCK_IN_OFF = 20101010,
 	}
 }

+ 53 - 1
CyberX8_RT/Config/Devices/AxisProviderCfg.xml

@@ -77,7 +77,7 @@
 	<Driver>Beckhoff</Driver>
     <!-- <Driver>Sim</Driver> -->
     <Units>deg</Units>
-    <ScaleFactor>810</ScaleFactor>
+    <ScaleFactor>806.77</ScaleFactor>
     <JogLimit>5</JogLimit>
 	<MinMoveTime>0.5</MinMoveTime>
     <Inputs>
@@ -161,6 +161,58 @@
     <Outputs>
     </Outputs>
   </Axis>
+  <Axis Name="PUF1.Vertical">
+    <Driver>Beckhoff</Driver>
+    <!-- <Driver>Sim</Driver> -->
+    <Units>mm</Units>
+    <!-- 104,857.6 counts/mm -->
+    <ScaleFactor>1</ScaleFactor>
+    <JogLimit>10</JogLimit>
+	<MinMoveTime>0.5</MinMoveTime>
+    <Inputs>
+    </Inputs>
+    <Outputs>
+    </Outputs>
+  </Axis>
+  <Axis Name="PUF2.Rotation">
+    <Driver>Beckhoff</Driver>
+    <!-- <Driver>Sim</Driver> -->
+    <Units>deg</Units>
+    <!-- 2222.2222 counts/degree -->
+    <ScaleFactor>2222.2222</ScaleFactor>
+    <JogLimit>5</JogLimit>
+	<MinMoveTime>0.5</MinMoveTime>
+    <Inputs>
+    </Inputs>
+    <Outputs>
+    </Outputs>
+  </Axis>
+  <Axis Name="PUF2.Flip">
+    <Driver>Beckhoff</Driver>
+    <!-- <Driver>Sim</Driver> -->
+    <Units>deg</Units>
+    <!-- 2222.2222 counts/degree -->
+    <ScaleFactor>2222.2222</ScaleFactor>
+    <JogLimit>5</JogLimit>
+	<MinMoveTime>0.5</MinMoveTime>
+    <Inputs>
+    </Inputs>
+    <Outputs>
+    </Outputs>
+  </Axis>
+  <Axis Name="PUF2.Vertical">
+    <Driver>Beckhoff</Driver>
+    <!-- <Driver>Sim</Driver> -->
+    <Units>mm</Units>
+    <!-- 104,857.6 counts/mm -->
+    <ScaleFactor>104857.6</ScaleFactor>
+    <JogLimit>10</JogLimit>
+	<MinMoveTime>0.5</MinMoveTime>
+    <Inputs>
+    </Inputs>
+    <Outputs>
+    </Outputs>
+  </Axis>
   <Axis Name="SRD1.Arm">
     <Driver>Beckhoff</Driver>
     <!-- <Driver>Sim</Driver> -->

+ 0 - 116
CyberX8_RT/Config/Devices/FestoControllerCfg.xml

@@ -1,121 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <FestoControllerConfig>
-	<FestoDeviceConfig Name="Festo1" IpAddress="10.0.0.40" Port="502" SendTimeout="2000" RecvTimeout="2000" DIStartAddress="45395" Channel="1">
-		<DO Name="c_METAL1_CIRCULATION"  Address="40003" Invert="false" Bit="0"/>
-		<DO Name="Festo.DO1"  Address="40003" Invert="false" Bit="1"/>
-		<DO Name="c_METAL2_CIRCULATION"  Address="40003" Invert="false" Bit="2"/>
-		<DO Name="Festo.DO3"  Address="40003" Invert="false" Bit="3"/>
-		<DO Name="Festo.DO4"  Address="40003" Invert="false" Bit="4"/>
-		<DO Name="Festo.DO5"  Address="40003" Invert="false" Bit="5"/>
-		<DO Name="Festo.DO6"  Address="40003" Invert="false" Bit="6"/>
-		<DO Name="Festo.DO7"  Address="40003" Invert="false" Bit="7"/>
-		<DO Name="Festo.DO8"  Address="40004" Invert="false" Bit="0"/>
-		<DO Name="Festo.DO9"  Address="40004" Invert="false" Bit="1"/>
-		<DO Name="c_QDRD1_DI_FILL" Address="40004" Invert="false" Bit="2"/>
-		<DO Name="c_QDRD1_DUMP" Address="40004" Invert="false" Bit="3"/>
-		<DO Name="c_RESERVOIR1_DI_REPLEN" Address="40004" Invert="false" Bit="4"/>
-		<DO Name="c_QDRD2_DI_FILL" Address="40004" Invert="false" Bit="5"/>
-		<DO Name="c_QDRD2_DUMP" Address="40004" Invert="false" Bit="6"/>
-		<DO Name="c_RESERVOIR2_DI_REPLEN" Address="40004" Invert="false" Bit="7"/>
-		<DO Name="c_QDRD3_DI_FILL" Address="40005" Invert="false" Bit="0"/>
-		<DO Name="c_QDRD3_DUMP" Address="40005" Invert="false" Bit="1"/>
-		<DO Name="c_RESERVOIR3_DI_REPLEN" Address="40005" Invert="false" Bit="2"/>
-		<DO Name="c_PH2_FLOW_VALVE" Address="40005" Invert="false" Bit="3"/>
-		<DO Name="Festo.DO20" Address="40005" Invert="false" Bit="4"/>
-		<DO Name="Festo.DO21" Address="40005" Invert="false" Bit="5"/>
-		<DO Name="c_FILTER_PURGE_ENABLE" Address="40005" Invert="false" Bit="6"/>
-		<DO Name="c_SAMPLE_SYSTEM_ENABLE" Address="40005" Invert="false" Bit="7"/>
-		<DO Name="c_QDRD1_WH_CLAMP" Address="40006" Invert="false" Bit="0"/>
-		<DO Name="Festo.DO25" Address="40006" Invert="false" Bit="1"/>
-		<DO Name="c_METAL1_WH_CLAMP" Address="40006" Invert="false" Bit="2"/>
-		<DO Name="Festo.DO27" Address="40006" Invert="false" Bit="3"/>
-		<DO Name="c_QDRD2_WH_CLAMP" Address="40006" Invert="false" Bit="4"/>
-		<DO Name="Festo.DO29" Address="40006" Invert="false" Bit="5"/>
-		<DO Name="c_METAL2_WH_CLAMP" Address="40006" Invert="false" Bit="6"/>
-		<DO Name="Festo.DO31" Address="40006" Invert="false" Bit="7"/>
-		<DO Name="c_QDRD3_WH_CLAMP" Address="40007" Invert="false" Bit="0"/>
-		<DO Name="Festo.DO33" Address="40007" Invert="false" Bit="1"/>
-		<DO Name="Festo.DO34" Address="40007" Invert="false" Bit="2"/>
-		<DO Name="Festo.DO35" Address="40007" Invert="false" Bit="3"/>
-		<DO Name="Festo.DO36" Address="40007" Invert="false" Bit="4"/>
-		<DO Name="Festo.DO37" Address="40007" Invert="false" Bit="5"/>
-		<DO Name="Festo.DO38" Address="40007" Invert="false" Bit="6"/>
-		<DO Name="Festo.DO39" Address="40007" Invert="false" Bit="7"/>
-		<DO Name="Festo.DO40" Address="40008" Invert="false" Bit="0"/>
-		<DO Name="Festo.DO41" Address="40008" Invert="false" Bit="1"/>
-		<DO Name="Festo.DO42" Address="40008" Invert="false" Bit="2"/>
-		<DO Name="Festo.DO43" Address="40008" Invert="false" Bit="3"/>
-		<DO Name="c_QDRD1_MDRAIN" Address="40008" Invert="false" Bit="4"/>
-		<DO Name="c_QDRD2_MDRAIN" Address="40008" Invert="false" Bit="5"/>
-		<DO Name="c_QDRD3_MDRAIN" Address="40008" Invert="false" Bit="6"/>
-		<DO Name="Festo.DO47" Address="40008" Invert="false" Bit="7"/>
-		<DO Name="Festo.DO48" Address="40009" Invert="false" Bit="0"/>
-		<DO Name="Festo.DO49" Address="40009" Invert="false" Bit="1"/>
-		<DO Name="Festo.DO50" Address="40009" Invert="false" Bit="2"/>
-		<DO Name="Festo.DO51" Address="40009" Invert="false" Bit="3"/>
-		<DO Name="Festo.DO52" Address="40009" Invert="false" Bit="4"/>
-		<DO Name="Festo.DO53" Address="40009" Invert="false" Bit="5"/>
-		<DO Name="Festo.DO54" Address="40009" Invert="false" Bit="6"/>
-		<DO Name="Festo.DO55" Address="40009" Invert="false" Bit="7"/>
-	</FestoDeviceConfig>
-	<FestoDeviceConfig Name="Festo2" IpAddress="10.0.0.41" Port="502" SendTimeout="2000" RecvTimeout="2000" DIStartAddress="45395" Channel="1">
-		<DO Name="c_QDRD4_DI_FILL"  Address="40003" Invert="false" Bit="0"/>
-		<DO Name="c_QDRD4_DUMP"  Address="40003" Invert="false" Bit="1"/>
-		<DO Name="Festo.DO2"  Address="40003" Invert="false" Bit="2"/>
-		<DO Name="Festo.DO3"  Address="40003" Invert="false" Bit="3"/>
-		<DO Name="Festo.DO4"  Address="40003" Invert="false" Bit="4"/>
-		<DO Name="Festo.DO5"  Address="40003" Invert="false" Bit="5"/>
-		<DO Name="c_RESERVOIR4_DI_REPLEN"  Address="40003" Invert="false" Bit="6"/>
-		<DO Name="Festo.DO7"  Address="40003" Invert="false" Bit="7"/>
-		<DO Name="c_METAL3_CIRCULATION"  Address="40004" Invert="false" Bit="0"/>
-		<DO Name="Festo.DO9"  Address="40004" Invert="false" Bit="1"/>
-		<DO Name="c_METAL4_CIRCULATION" Address="40004" Invert="false" Bit="2"/>
-		<DO Name="Festo.DO11" Address="40004" Invert="false" Bit="3"/>
-		<DO Name="Festo.DO12" Address="40004" Invert="false" Bit="4"/>
-		<DO Name="Festo.DO13" Address="40004" Invert="false" Bit="5"/>
-		<DO Name="Festo.DO14" Address="40004" Invert="false" Bit="6"/>
-		<DO Name="Festo.DO15" Address="40004" Invert="false" Bit="7"/>
-		<DO Name="Festo.DO16" Address="40005" Invert="false" Bit="0"/>
-		<DO Name="Festo.DO17" Address="40005" Invert="false" Bit="1"/>
-		<DO Name="Festo.DO18" Address="40005" Invert="false" Bit="2"/>
-		<DO Name="Festo.DO19" Address="40005" Invert="false" Bit="3"/>
-		<DO Name="Festo.DO20" Address="40005" Invert="false" Bit="4"/>
-		<DO Name="c_PREWET_DI_FILL" Address="40005" Invert="false" Bit="5"/>
-		<DO Name="Festo.DO22" Address="40005" Invert="false" Bit="6"/>
-		<DO Name="c_SRD_DI_ENABLE" Address="40005" Invert="false" Bit="7"/>
-		<DO Name="c_METAL3_WH_CLAMP" Address="40006" Invert="false" Bit="0"/>
-		<DO Name="Festo.DO25" Address="40006" Invert="false" Bit="1"/>
-		<DO Name="c_METAL4_WH_CLAMP" Address="40006" Invert="false" Bit="2"/>
-		<DO Name="Festo.DO27" Address="40006" Invert="false" Bit="3"/>
-		<DO Name="Festo.DO28" Address="40006" Invert="false" Bit="4"/>
-		<DO Name="Festo.DO29" Address="40006" Invert="false" Bit="5"/>
-		<DO Name="Festo.DO30" Address="40006" Invert="false" Bit="6"/>
-		<DO Name="Festo.DO31" Address="40006" Invert="false" Bit="7"/>
-		<DO Name="Festo.DO32" Address="40007" Invert="false" Bit="0"/>
-		<DO Name="Festo.DO33" Address="40007" Invert="false" Bit="1"/>
-		<DO Name="Festo.DO34" Address="40007" Invert="false" Bit="2"/>
-		<DO Name="Festo.DO35" Address="40007" Invert="false" Bit="3"/>
-		<DO Name="c_QDRD4_WH_CLAMP" Address="40007" Invert="false" Bit="4"/>
-		<DO Name="Festo.DO37" Address="40007" Invert="false" Bit="5"/>
-		<DO Name="Festo.DO38" Address="40007" Invert="false" Bit="6"/>
-		<DO Name="Festo.DO39" Address="40007" Invert="false" Bit="7"/>
-		<DO Name="Festo.DO40" Address="40008" Invert="false" Bit="0"/>
-		<DO Name="Festo.DO41" Address="40008" Invert="false" Bit="1"/>
-		<DO Name="Festo.DO42" Address="40008" Invert="false" Bit="2"/>
-		<DO Name="Festo.DO43" Address="40008" Invert="false" Bit="3"/>
-		<DO Name="c_QDRD4_MDRAIN" Address="40008" Invert="false" Bit="4"/>
-		<DO Name="Festo.DO45" Address="40008" Invert="false" Bit="5"/>
-		<DO Name="Festo.DO46" Address="40008" Invert="false" Bit="6"/>
-		<DO Name="Festo.DO47" Address="40008" Invert="false" Bit="7"/>
-		<DO Name="Festo.DO48" Address="40009" Invert="false" Bit="0"/>
-		<DO Name="Festo.DO49" Address="40009" Invert="false" Bit="1"/>
-		<DO Name="Festo.DO50" Address="40009" Invert="false" Bit="2"/>
-		<DO Name="Festo.DO51" Address="40009" Invert="false" Bit="3"/>
-		<DO Name="Festo.DO52" Address="40009" Invert="false" Bit="4"/>
-		<DO Name="Festo.DO53" Address="40009" Invert="false" Bit="5"/>
-		<DO Name="Festo.DO54" Address="40009" Invert="false" Bit="6"/>
-		<DO Name="Festo.DO55" Address="40009" Invert="false" Bit="7"/>
-	</FestoDeviceConfig>
 	<FestoDeviceConfig Name="Festo3" IpAddress="10.0.0.42" Port="502" SendTimeout="2000" RecvTimeout="2000" DIStartAddress="45395" Channel="1">
 		<DO Name="c_Transporter_Clamp"  Address="40003" Invert="false" Bit="0"/>
 		<DO Name="Festo.DO1" Address="40003" Invert="false" Bit="1"/>

+ 25 - 39
CyberX8_RT/Config/Devices/GalilControllerCfg.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <GalilControllerConfig>
-  <GalilDeviceConfig Module="PUF1" IpAddress="127.0.0.1" Port="58678" SendTimeout="2000" RecvTimeout="2000">
+  <GalilDeviceConfig Module="PUF1" IpAddress="10.0.0.22" Port="58678" SendTimeout="2000" RecvTimeout="2000">
 	<GalilAxisConfig Name="Flip" Index="0" Type="Galil">
 		<Speed>100</Speed>
 		<Acceleration>100</Acceleration>
@@ -10,8 +10,8 @@
 		<HomingTimeOut>20000</HomingTimeOut>
 		<HomingAcceleration>100</HomingAcceleration>
 		<HomingDeceleration>100</HomingDeceleration>
-		<ReverseSoftwareLimit>-1190000</ReverseSoftwareLimit>
-		<ForwardSoftwareLimit>28000000</ForwardSoftwareLimit>
+		<ReverseSoftwareLimit>0</ReverseSoftwareLimit>
+		<ForwardSoftwareLimit>0</ForwardSoftwareLimit>
 		<NegativeTorqueLimit>130</NegativeTorqueLimit>
 		<PositiveTorqueLimit>20</PositiveTorqueLimit>
 	</GalilAxisConfig>
@@ -24,28 +24,14 @@
 		<HomingTimeOut>20000</HomingTimeOut>
 		<HomingAcceleration>100</HomingAcceleration>
 		<HomingDeceleration>100</HomingDeceleration>
-		<ReverseSoftwareLimit>-1190000</ReverseSoftwareLimit>
-		<ForwardSoftwareLimit>28000000</ForwardSoftwareLimit>
-		<NegativeTorqueLimit>130</NegativeTorqueLimit>
-		<PositiveTorqueLimit>20</PositiveTorqueLimit>
-	</GalilAxisConfig>
-	<GalilAxisConfig Name="Vertical" Index="2" Type="Galil">
-		<Speed>100</Speed>
-		<Acceleration>100</Acceleration>
-		<Deceleration>100</Deceleration>
-		<HomingSpeed>100</HomingSpeed>
-		<HomingOffset>0</HomingOffset>
-		<HomingTimeOut>20000</HomingTimeOut>
-		<HomingAcceleration>100</HomingAcceleration>
-		<HomingDeceleration>100</HomingDeceleration>
-		<ReverseSoftwareLimit>-1190000</ReverseSoftwareLimit>
-		<ForwardSoftwareLimit>28000000</ForwardSoftwareLimit>
+		<ReverseSoftwareLimit>0</ReverseSoftwareLimit>
+		<ForwardSoftwareLimit>0</ForwardSoftwareLimit>
 		<NegativeTorqueLimit>130</NegativeTorqueLimit>
 		<PositiveTorqueLimit>20</PositiveTorqueLimit>
 	</GalilAxisConfig>
   </GalilDeviceConfig>
 	<GalilDeviceConfig Module="Loader1" IpAddress="10.0.0.20" Port="58678" SendTimeout="2000" RecvTimeout="2000">
-		<GalilAxisConfig Name="LSA" Index="0" Type="GalilLipsel">
+		<GalilAxisConfig Name="LSA" Index="4" Type="GalilLipsel">
 			<Speed>150000</Speed>
 			<Acceleration>200000</Acceleration>
 			<Deceleration>200000</Deceleration>
@@ -54,12 +40,12 @@
 			<HomingTimeOut>60000</HomingTimeOut>
 			<HomingAcceleration>200000</HomingAcceleration>
 			<HomingDeceleration>60000000</HomingDeceleration>
-			<ReverseSoftwareLimit>-100</ReverseSoftwareLimit>
-			<ForwardSoftwareLimit>100</ForwardSoftwareLimit>
+			<ReverseSoftwareLimit>-48400</ReverseSoftwareLimit>
+			<ForwardSoftwareLimit>352000</ForwardSoftwareLimit>
 			<NegativeTorqueLimit>130</NegativeTorqueLimit>
 			<PositiveTorqueLimit>20</PositiveTorqueLimit>
 		</GalilAxisConfig>
-		<GalilAxisConfig Name="TiltA" Index="1" Type="Galil">
+		<GalilAxisConfig Name="TiltA" Index="5" Type="Galil">
 			<Speed>150000</Speed>
 			<Acceleration>200000</Acceleration>
 			<Deceleration>200000</Deceleration>
@@ -68,12 +54,12 @@
 			<HomingTimeOut>60000</HomingTimeOut>
 			<HomingAcceleration>200000</HomingAcceleration>
 			<HomingDeceleration>10000000</HomingDeceleration>
-			<ReverseSoftwareLimit>-100</ReverseSoftwareLimit>
-			<ForwardSoftwareLimit>100</ForwardSoftwareLimit>
+			<ReverseSoftwareLimit>-20000</ReverseSoftwareLimit>
+			<ForwardSoftwareLimit>236130</ForwardSoftwareLimit>
 			<NegativeTorqueLimit>130</NegativeTorqueLimit>
 			<PositiveTorqueLimit>20</PositiveTorqueLimit>
 		</GalilAxisConfig>
-		<GalilAxisConfig Name="ShuttleA" Index="2" Type="Galil">
+		<GalilAxisConfig Name="ShuttleA" Index="6" Type="Galil">
 			<Speed>200000</Speed>
 			<Acceleration>200000</Acceleration>
 			<Deceleration>200000</Deceleration>
@@ -82,8 +68,8 @@
 			<HomingTimeOut>60000</HomingTimeOut>
 			<HomingAcceleration>200000</HomingAcceleration>
 			<HomingDeceleration>10000000</HomingDeceleration>
-			<ReverseSoftwareLimit>-100</ReverseSoftwareLimit>
-			<ForwardSoftwareLimit>100</ForwardSoftwareLimit>
+			<ReverseSoftwareLimit>-25000</ReverseSoftwareLimit>
+			<ForwardSoftwareLimit>270000</ForwardSoftwareLimit>
 			<NegativeTorqueLimit>130</NegativeTorqueLimit>
 			<PositiveTorqueLimit>20</PositiveTorqueLimit>
 		</GalilAxisConfig>
@@ -96,12 +82,12 @@
 			<HomingTimeOut>60000</HomingTimeOut>
 			<HomingAcceleration>10000</HomingAcceleration>
 			<HomingDeceleration>1000000</HomingDeceleration>
-			<ReverseSoftwareLimit>-100</ReverseSoftwareLimit>
-			<ForwardSoftwareLimit>100</ForwardSoftwareLimit>
+			<ReverseSoftwareLimit>-1600</ReverseSoftwareLimit>
+			<ForwardSoftwareLimit>162000</ForwardSoftwareLimit>
 			<NegativeTorqueLimit>130</NegativeTorqueLimit>
 			<PositiveTorqueLimit>20</PositiveTorqueLimit>
 		</GalilAxisConfig>
-		<GalilAxisConfig Name="LSB" Index="4" Type="GalilLipsel">
+		<GalilAxisConfig Name="LSB" Index="0" Type="GalilLipsel">
 			<Speed>150000</Speed>
 			<Acceleration>200000</Acceleration>
 			<Deceleration>200000</Deceleration>
@@ -110,12 +96,12 @@
 			<HomingTimeOut>60000</HomingTimeOut>
 			<HomingAcceleration>200000</HomingAcceleration>
 			<HomingDeceleration>60000000</HomingDeceleration>
-			<ReverseSoftwareLimit>-100</ReverseSoftwareLimit>
-			<ForwardSoftwareLimit>100</ForwardSoftwareLimit>
+			<ReverseSoftwareLimit>-48400</ReverseSoftwareLimit>
+			<ForwardSoftwareLimit>352000</ForwardSoftwareLimit>
 			<NegativeTorqueLimit>130</NegativeTorqueLimit>
 			<PositiveTorqueLimit>20</PositiveTorqueLimit>
 		</GalilAxisConfig>
-		<GalilAxisConfig Name="TiltB" Index="5" Type="Galil">
+		<GalilAxisConfig Name="TiltB" Index="1" Type="Galil">
 			<Speed>150000</Speed>
 			<Acceleration>200000</Acceleration>
 			<Deceleration>200000</Deceleration>
@@ -124,12 +110,12 @@
 			<HomingTimeOut>60000</HomingTimeOut>
 			<HomingAcceleration>200000</HomingAcceleration>
 			<HomingDeceleration>10000000</HomingDeceleration>
-			<ReverseSoftwareLimit>-100</ReverseSoftwareLimit>
-			<ForwardSoftwareLimit>100</ForwardSoftwareLimit>
+			<ReverseSoftwareLimit>-20000</ReverseSoftwareLimit>
+			<ForwardSoftwareLimit>236130</ForwardSoftwareLimit>
 			<NegativeTorqueLimit>130</NegativeTorqueLimit>
 			<PositiveTorqueLimit>20</PositiveTorqueLimit>
 		</GalilAxisConfig>
-		<GalilAxisConfig Name="ShuttleB" Index="6" Type="Galil">
+		<GalilAxisConfig Name="ShuttleB" Index="2" Type="Galil">
 			<Speed>200000</Speed>
 			<Acceleration>200000</Acceleration>
 			<Deceleration>200000</Deceleration>
@@ -138,8 +124,8 @@
 			<HomingTimeOut>60000</HomingTimeOut>
 			<HomingAcceleration>200000</HomingAcceleration>
 			<HomingDeceleration>10000000</HomingDeceleration>
-			<ReverseSoftwareLimit>-100</ReverseSoftwareLimit>
-			<ForwardSoftwareLimit>100</ForwardSoftwareLimit>
+			<ReverseSoftwareLimit>-25000</ReverseSoftwareLimit>
+			<ForwardSoftwareLimit>270000</ForwardSoftwareLimit>
 			<NegativeTorqueLimit>130</NegativeTorqueLimit>
 			<PositiveTorqueLimit>20</PositiveTorqueLimit>
 		</GalilAxisConfig>

+ 246 - 246
CyberX8_RT/Config/Devices/ModuleIOCfg.xml

@@ -33,276 +33,276 @@
 		<IO Name="LightTower.BlueLight" IOName="c_Pole_Blue"/>
 	</Module>
 	<Module Name="PUF1">
-		<IO Name="PUF1.Chuck" IOName="c_PUF_CHUCK" />
-		<IO Name="PUF1.SideAChuckOut" IOName="r_PUF_A_CHUCK_OUT" />
-		<IO Name="PUF1.SideAChuckIn" IOName="r_PUF_A_CHUCK_IN" />
-		<IO Name="PUF1.SideBChuckOut" IOName="r_PUF_B_CHUCK_OUT" />
-		<IO Name="PUF1.SideBChuckIn" IOName="r_PUF_B_CHUCK_IN" />
-		<IO Name="PUF1.ChuckAVac" IOName="r_DPUF_A_CHUCK_A_VAC" />
-		<IO Name="PUF1.ChuckBVac" IOName="r_DPUF_A_CHUCK_B_VAC" />
-		<IO Name="PUF1.ChuckARelease" IOName="c_DPUF_A_CHUCK_A_RELEASE" />
-		<IO Name="PUF1.ChuckBRelease" IOName="c_DPUF_A_CHUCK_B_RELEASE" />
-		<IO Name="PUF1.DistanceSensor1" IOName="r_DPUF_A_CHUCK_A_WFER_SNS_1" />
-		<IO Name="PUF1.DistanceSensor2" IOName="r_DPUF_A_CHUCK_A_WFER_SNS_2" />		
+	<IO Name="PUF1.Chuck" IOName="c_PUF_CHUCK" />
+	<IO Name="PUF1.SideAChuckOut" IOName="r_PUF_A_CHUCK_OUT" />
+	<IO Name="PUF1.SideAChuckIn" IOName="r_PUF_A_CHUCK_IN" />
+	<IO Name="PUF1.SideBChuckOut" IOName="r_PUF_B_CHUCK_OUT" />
+	<IO Name="PUF1.SideBChuckIn" IOName="r_PUF_B_CHUCK_IN" />
+	<IO Name="PUF1.ChuckAVac" IOName="r_DPUF_A_CHUCK_A_VAC" />
+	<IO Name="PUF1.ChuckBVac" IOName="r_DPUF_A_CHUCK_B_VAC" />
+	<IO Name="PUF1.ChuckARelease" IOName="c_DPUF_A_CHUCK_A_RELEASE" />
+	<IO Name="PUF1.ChuckBRelease" IOName="c_DPUF_A_CHUCK_B_RELEASE" />
+	<IO Name="PUF1.DistanceSensor1" IOName="r_DPUF_A_CHUCK_A_WFER_SNS_1" />
+	<IO Name="PUF1.DistanceSensor2" IOName="r_DPUF_A_CHUCK_A_WFER_SNS_2" />		
 	</Module>
 	<Module Name="Loader1">
-		<IO Name="Loader1.SideA.WaferPresent" IOName="r_LoaderA_Wafer_Present" />
-		<IO Name="Loader1.SideA.DoorUnlock" IOName="c_LOADERA_DOOR_UNLOCK" />
-		<IO Name="Loader1.SideA.DoorUpperLocked" IOName="r_LOADERA_DOOR_UPPER_LOCKED" />
-		<IO Name="Loader1.SideA.DoorUpperUnlocked" IOName="r_LOADERA_DOOR_UPPER_UNLOCKED" />
-		<IO Name="Loader1.SideA.DoorLowerLocked" IOName="r_LOADERA_DOOR_LOWER_LOCKED" />
-		<IO Name="Loader1.SideA.DoorLowerUnlocked" IOName="r_LOADERA_DOOR_LOWER_UNLOCKED" />
-		<IO Name="Loader1.SideA.TransRetracted" IOName="r_LOADERA_TRANSLATION_RETRACTED" />
-		<IO Name="Loader1.SideA.BernoulliExtended" IOName="r_LOADERA_BERNOULLI_EXTENDED" />
-		<IO Name="Loader1.SideA.CRSVacuumValue" IOName="r_LoaderA_LS_Vacuum_anlg" />
-		<IO Name="Loader1.SideA.WHBladderPressure" IOName="r_LOADERA_WS_BLADDER_PRESSURE" />
-		<IO Name="Loader1.SideA.TransPressure" IOName="r_LOADERA_TRANSLATION_PRESSURE" />
-		<IO Name="Loader1.SideA.BernoulliPressure" IOName="r_LOADERA_BERNOULLI_PRESSURE" />
-		<IO Name="Loader1.SideA.BernoulliBladderPressure" IOName="r_LOADERA_CHUCK_BLADDER" />
-		<IO Name="Loader1.SideA.CRSVacuum" IOName="c_LoaderA_LS_Vacuum" />	
-		<IO Name="Loader1.SideA.WHBladder" IOName="c_LOADERA_WS_BLADDER" />	
-		<IO Name="Loader1.SideA.TransBladder" IOName="c_LOADERA_TRANS_BLADDER" />	
-		<IO Name="Loader1.SideA.TransHigh" IOName="c_LOADERA_TRANS_HIGH" />	
-		<IO Name="Loader1.SideA.BernoulliBladder" IOName="c_LOADERA_BERNOULLI_BLADDER" />	
-		<IO Name="Loader1.SideA.BernoulliN2" IOName="c_LOADERA_BERNOULLI_N2" />	
-		<IO Name="Loader1.SideA.BernoulliN2Second" IOName="c_LOADERA_BERNOULLI_N2_SECOND" />	
-		<IO Name="Loader1.SideB.WaferPresent" IOName="r_LoaderB_Wafer_Present" />
-		<IO Name="Loader1.SideB.DoorUpperLocked" IOName="r_LOADERB_DOOR_UPPER_LOCKED" />
-		<IO Name="Loader1.SideB.DoorUpperUnlocked" IOName="r_LOADERB_DOOR_UPPER_UNLOCKED" />	
-		<IO Name="Loader1.SideB.DoorLowerLocked" IOName="r_LOADERB_DOOR_LOWER_LOCKED" />	
-		<IO Name="Loader1.SideB.DoorLowerUnlocked" IOName="r_LOADERB_DOOR_LOWER_UNLOCKED" />	
-		<IO Name="Loader1.SideB.TransRetracted" IOName="r_LOADERB_TRANSLATION_RETRACTED" />	
-		<IO Name="Loader1.SideB.BernoulliExtended" IOName="r_LOADERB_BERNOULLI_EXTENDED" />	
-		<IO Name="Loader1.SideB.CRSVacuumValue" IOName="r_LoaderB_LS_Vacuum_anlg" />
-		<IO Name="Loader1.SideB.WHBladderPressure" IOName="r_LOADERB_WS_BLADDER_PRESSURE" />
-		<IO Name="Loader1.SideB.TransPressure" IOName="r_LOADERB_TRANSLATION_PRESSURE" />		
-		<IO Name="Loader1.SideB.BernoulliPressure" IOName="r_LOADERB_BERNOULLI_PRESSURE" />	
-		<IO Name="Loader1.SideB.BernoulliBladderPressure" IOName="r_LOADERB_CHUCK_BLADDER" />	
-		<IO Name="Loader1.SideB.DoorUnlock" IOName="c_LOADERB_DOOR_UNLOCK" />	
-		<IO Name="Loader1.SideB.CRSVacuum" IOName="c_LoaderB_LS_Vacuum" />	
-		<IO Name="Loader1.SideB.WHBladder" IOName="c_LOADERB_WS_BLADDER" />	
-		<IO Name="Loader1.SideB.TransBladder" IOName="c_LOADERB_TRANS_BLADDER" />	
-		<IO Name="Loader1.SideB.TransHigh" IOName="c_LOADERB_TRANS_HIGH" />	
-		<IO Name="Loader1.SideB.BernoulliBladder" IOName="c_LOADERB_BERNOULLI_BLADDER" />	
-		<IO Name="Loader1.SideB.BernoulliN2" IOName="c_LOADERB_BERNOULLI_N2" />	
-		<IO Name="Loader1.SideB.BernoulliN2Second" IOName="c_LOADERB_BERNOULLI_N2_SECOND" />	
-		<IO Name="Loader1.WaferHolderPresent" IOName="r_Cathode_Present" />	
-		<IO Name="Loader1.DripTrayFluid" IOName="r_DRIP_TRAY_FLUID_DETECTION" />	
-		<IO Name="Loader1.WaferHolderClamp" IOName="c_Cathode_Clamp" />	
-		<IO Name="Loader1.WSSideABClamp" IOName="c_WAFER_HOLDER_CLAMPED" />	
-		<IO Name="Loader1.SideAWaferHolderClamp" IOName="r_LOADERA_WS_LOCKED" />
-		<IO Name="Loader1.SideBWaferHolderClamp" IOName="r_LOADERB_WS_LOCKED" />
-		<IO Name="Loader1.LeakFlow" IOName="r_LOADER_GasFlowSensor_FLOW" />
-		<IO Name="Loader1.LeakVacuumValue" IOName="r_LOADER_GasFlowSensor_VACUUM" />
-		<IO Name="Loader1.LeakFlowClamp" IOName="c_Flow_Test_Clamp" />
-		<IO Name="Loader1.LeakVacuum" IOName="c_VACUUM_TEST" />
+	<IO Name="Loader1.SideA.WaferPresent" IOName="r_LoaderA_Wafer_Present" />
+	<IO Name="Loader1.SideA.DoorUnlock" IOName="c_LOADERA_DOOR_UNLOCK" />
+	<IO Name="Loader1.SideA.DoorUpperLocked" IOName="r_LOADERA_DOOR_UPPER_LOCKED" />
+	<IO Name="Loader1.SideA.DoorUpperUnlocked" IOName="r_LOADERA_DOOR_UPPER_UNLOCKED" />
+	<IO Name="Loader1.SideA.DoorLowerLocked" IOName="r_LOADERA_DOOR_LOWER_LOCKED" />
+	<IO Name="Loader1.SideA.DoorLowerUnlocked" IOName="r_LOADERA_DOOR_LOWER_UNLOCKED" />
+	<IO Name="Loader1.SideA.TransRetracted" IOName="r_LOADERA_TRANSLATION_RETRACTED" />
+	<IO Name="Loader1.SideA.BernoulliExtended" IOName="r_LOADERA_BERNOULLI_EXTENDED" />
+	<IO Name="Loader1.SideA.CRSVacuumValue" IOName="r_LoaderA_LS_Vacuum_anlg" />
+	<IO Name="Loader1.SideA.WHBladderPressure" IOName="r_LOADERA_WS_BLADDER_PRESSURE" />
+	<IO Name="Loader1.SideA.TransPressure" IOName="r_LOADERA_TRANSLATION_PRESSURE" />
+	<IO Name="Loader1.SideA.BernoulliPressure" IOName="r_LOADERA_BERNOULLI_PRESSURE" />
+	<IO Name="Loader1.SideA.BernoulliBladderPressure" IOName="r_LOADERA_CHUCK_BLADDER" />
+	<IO Name="Loader1.SideA.CRSVacuum" IOName="c_LoaderA_LS_Vacuum" />	
+	<IO Name="Loader1.SideA.WHBladder" IOName="c_LOADERA_WS_BLADDER" />	
+	<IO Name="Loader1.SideA.TransBladder" IOName="c_LOADERA_TRANS_BLADDER" />	
+	<IO Name="Loader1.SideA.TransHigh" IOName="c_LOADERA_TRANS_HIGH" />	
+	<IO Name="Loader1.SideA.BernoulliBladder" IOName="c_LOADERA_BERNOULLI_BLADDER" />	
+	<IO Name="Loader1.SideA.BernoulliN2" IOName="c_LOADERA_BERNOULLI_N2" />	
+	<IO Name="Loader1.SideA.BernoulliN2Second" IOName="c_LOADERA_BERNOULLI_N2_SECOND" />	
+	<IO Name="Loader1.SideB.WaferPresent" IOName="r_LoaderB_Wafer_Present" />
+	<IO Name="Loader1.SideB.DoorUpperLocked" IOName="r_LOADERB_DOOR_UPPER_LOCKED" />
+	<IO Name="Loader1.SideB.DoorUpperUnlocked" IOName="r_LOADERB_DOOR_UPPER_UNLOCKED" />	
+	<IO Name="Loader1.SideB.DoorLowerLocked" IOName="r_LOADERB_DOOR_LOWER_LOCKED" />	
+	<IO Name="Loader1.SideB.DoorLowerUnlocked" IOName="r_LOADERB_DOOR_LOWER_UNLOCKED" />	
+	<IO Name="Loader1.SideB.TransRetracted" IOName="r_LOADERB_TRANSLATION_RETRACTED" />	
+	<IO Name="Loader1.SideB.BernoulliExtended" IOName="r_LOADERB_BERNOULLI_EXTENDED" />	
+	<IO Name="Loader1.SideB.CRSVacuumValue" IOName="r_LoaderB_LS_Vacuum_anlg" />
+	<IO Name="Loader1.SideB.WHBladderPressure" IOName="r_LOADERB_WS_BLADDER_PRESSURE" />
+	<IO Name="Loader1.SideB.TransPressure" IOName="r_LOADERB_TRANSLATION_PRESSURE" />		
+	<IO Name="Loader1.SideB.BernoulliPressure" IOName="r_LOADERB_BERNOULLI_PRESSURE" />	
+	<IO Name="Loader1.SideB.BernoulliBladderPressure" IOName="r_LOADERB_CHUCK_BLADDER" />	
+	<IO Name="Loader1.SideB.DoorUnlock" IOName="c_LOADERB_DOOR_UNLOCK" />	
+	<IO Name="Loader1.SideB.CRSVacuum" IOName="c_LoaderB_LS_Vacuum" />	
+	<IO Name="Loader1.SideB.WHBladder" IOName="c_LOADERB_WS_BLADDER" />	
+	<IO Name="Loader1.SideB.TransBladder" IOName="c_LOADERB_TRANS_BLADDER" />	
+	<IO Name="Loader1.SideB.TransHigh" IOName="c_LOADERB_TRANS_HIGH" />	
+	<IO Name="Loader1.SideB.BernoulliBladder" IOName="c_LOADERB_BERNOULLI_BLADDER" />	
+	<IO Name="Loader1.SideB.BernoulliN2" IOName="c_LOADERB_BERNOULLI_N2" />	
+	<IO Name="Loader1.SideB.BernoulliN2Second" IOName="c_LOADERB_BERNOULLI_N2_SECOND" />	
+	<IO Name="Loader1.WaferHolderPresent" IOName="r_Cathode_Present" />	
+	<IO Name="Loader1.DripTrayFluid" IOName="r_DRIP_TRAY_FLUID_DETECTION" />	
+	<IO Name="Loader1.WaferHolderClamp" IOName="c_Cathode_Clamp" />	
+	<IO Name="Loader1.WSSideABClamp" IOName="c_WAFER_HOLDER_CLAMPED" />	
+	<IO Name="Loader1.SideAWaferHolderClamp" IOName="r_LOADERA_WS_LOCKED" />
+	<IO Name="Loader1.SideBWaferHolderClamp" IOName="r_LOADERB_WS_LOCKED" />
+	<IO Name="Loader1.LeakFlow" IOName="r_LOADER_GasFlowSensor_FLOW" />
+	<IO Name="Loader1.LeakVacuumValue" IOName="r_LOADER_GasFlowSensor_VACUUM" />
+	<IO Name="Loader1.LeakFlowClamp" IOName="c_Flow_Test_Clamp" />
+	<IO Name="Loader1.LeakVacuum" IOName="c_VACUUM_TEST" />
 	</Module>
 	<Module Name="Facilities">
-		<IO Name="Facilities.N2Enable" IOName="c_N2_ENABLE"/>
-		<IO Name="Facilities.CDAEnable" IOName="c_CDA_ENABLE"/>
-		<IO Name="Facilities.ExternalCDAEnable" IOName="c_EXTERNAL_CDA_ENABLE"/>
-		<IO Name="Facilities.DiWaterEnable" IOName="c_DI_MAIN_ENABLE"/>
-		<IO Name="Facilities.HouseChilledWaterEnable" IOName="c_HCW_ENABLE"/>
-		<IO Name="Facilities.DiReplenEnable" IOName="c_DI_REPLEN_ENABLE"/>
-		<IO Name="Facilities.DiFillEnable" IOName="c_DI_FILL_ENABLE"/>
-		<IO Name="Facilities.LoaderDiEnable" IOName="c_DI_LOADER_ENABLE"/>
-		<IO Name="Facilities.FilterPurgeEnable" IOName="c_FILTER_PURGE_ENABLE"/>
-		<IO Name="Facilities.Nitrogen1BPressure" IOName="r_N2_1B_PRESSURE"/>
-		<IO Name="Facilities.Nitrogen1APressure" IOName="r_N2_1A_PRESSURE"/>
-		<IO Name="Facilities.Nitrogen2BPressure" IOName="r_N2_2B_PRESSURE"/>
-		<IO Name="Facilities.Nitrogen2APressure" IOName="r_N2_2A_PRESSURE"/>
-		<IO Name="Facilities.CDA2Pressure" IOName="r_CDA_HIGH_PRESSURE"/>
-		<IO Name="Facilities.CDA1Pressure" IOName="r_CDA_LOW_PRESSURE"/>
-		<IO Name="Facilities.ExternalCDAPressure" IOName="r_CDA_EXTERNAL_PRESSURE"/>
-		<IO Name="Facilities.DiWaterPressure" IOName="r_DI_WATER_PRESSURE"/>
-		<IO Name="Facilities.HouseChilledWaterPressure" IOName="r_HCW_FLOW"/>
-		<IO Name="Facilities.ExhaustPressure" IOName="r_SYSTEM_EXHAUST"/>
-		<IO Name="Facilities.VacuumPressure" IOName="r_SYSTEM_VACUUM"/>
-		<IO Name="Facilities.N2BlanketPressure" IOName="r_N2_BLANKET_PRESSURE"/>
-		<IO Name="Facilities.SampleEnable" IOName="c_SAMPLE_STATION_ENABLE"/>
-		<IO Name="Facilities.SampleFlow1Enable" IOName="c_SAMPLE_STATION_FLOW_1_ENABLE"/>
-		<IO Name="Facilities.SampleFlow2Enable" IOName="c_SAMPLE_STATION_FLOW_2_ENABLE"/>
-		<IO Name="Facilities.SampleFlow3Enable" IOName="c_SAMPLE_STATION_FLOW_3_ENABLE"/>
-		<IO Name="Facilities.SampleFlow4Enable" IOName="c_SAMPLE_STATION_FLOW_4_ENABLE"/>
-		<IO Name="Facilities.FFULoaderError" IOName="r_FFUFaultLoader"/>
-		<IO Name="Facilities.FFUProcessError" IOName="r_FFUFaultProcess"/>
-		<IO Name="Facilities.FFULoaderPressure" IOName="r_FFUPressureLoader"/>
-		<IO Name="Facilities.FFUProcessPressure" IOName="r_FFUPressureProcess"/>
-		<IO Name="Facilities.ArsFluidDetect" IOName="r_SLIPSTREAM_FLUID_PRESENT"/>
-		<IO Name="Facilities.ProcessFluidDetect" IOName="r_CONTAINMENT_FLUID"/>
-		<IO Name="Facilities.SampleFluidDetect" IOName="r_SAMPLE_SYS_FLUID_PRESENT"/>
+	<IO Name="Facilities.N2Enable" IOName="c_N2_ENABLE"/>
+	<IO Name="Facilities.CDAEnable" IOName="c_CDA_ENABLE"/>
+	<IO Name="Facilities.ExternalCDAEnable" IOName="c_EXTERNAL_CDA_ENABLE"/>
+	<IO Name="Facilities.DiWaterEnable" IOName="c_DI_MAIN_ENABLE"/>
+	<IO Name="Facilities.HouseChilledWaterEnable" IOName="c_HCW_ENABLE"/>
+	<IO Name="Facilities.DiReplenEnable" IOName="c_DI_REPLEN_ENABLE"/>
+	<IO Name="Facilities.DiFillEnable" IOName="c_DI_FILL_ENABLE"/>
+	<IO Name="Facilities.LoaderDiEnable" IOName="c_DI_LOADER_ENABLE"/>
+	<IO Name="Facilities.FilterPurgeEnable" IOName="c_FILTER_PURGE_ENABLE"/>
+	<IO Name="Facilities.Nitrogen1BPressure" IOName="r_N2_1B_PRESSURE"/>
+	<IO Name="Facilities.Nitrogen1APressure" IOName="r_N2_1A_PRESSURE"/>
+	<IO Name="Facilities.Nitrogen2BPressure" IOName="r_N2_2B_PRESSURE"/>
+	<IO Name="Facilities.Nitrogen2APressure" IOName="r_N2_2A_PRESSURE"/>
+	<IO Name="Facilities.CDA2Pressure" IOName="r_CDA_HIGH_PRESSURE"/>
+	<IO Name="Facilities.CDA1Pressure" IOName="r_CDA_LOW_PRESSURE"/>
+	<IO Name="Facilities.ExternalCDAPressure" IOName="r_CDA_EXTERNAL_PRESSURE"/>
+	<IO Name="Facilities.DiWaterPressure" IOName="r_DI_WATER_PRESSURE"/>
+	<IO Name="Facilities.HouseChilledWaterPressure" IOName="r_HCW_FLOW"/>
+	<IO Name="Facilities.ExhaustPressure" IOName="r_SYSTEM_EXHAUST"/>
+	<IO Name="Facilities.VacuumPressure" IOName="r_SYSTEM_VACUUM"/>
+	<IO Name="Facilities.N2BlanketPressure" IOName="r_N2_BLANKET_PRESSURE"/>
+	<IO Name="Facilities.SampleEnable" IOName="c_SAMPLE_STATION_ENABLE"/>
+	<IO Name="Facilities.SampleFlow1Enable" IOName="c_SAMPLE_STATION_FLOW_1_ENABLE"/>
+	<IO Name="Facilities.SampleFlow2Enable" IOName="c_SAMPLE_STATION_FLOW_2_ENABLE"/>
+	<IO Name="Facilities.SampleFlow3Enable" IOName="c_SAMPLE_STATION_FLOW_3_ENABLE"/>
+	<IO Name="Facilities.SampleFlow4Enable" IOName="c_SAMPLE_STATION_FLOW_4_ENABLE"/>
+	<IO Name="Facilities.FFULoaderError" IOName="r_FFUFaultLoader"/>
+	<IO Name="Facilities.FFUProcessError" IOName="r_FFUFaultProcess"/>
+	<IO Name="Facilities.FFULoaderPressure" IOName="r_FFUPressureLoader"/>
+	<IO Name="Facilities.FFUProcessPressure" IOName="r_FFUPressureProcess"/>
+	<IO Name="Facilities.ArsFluidDetect" IOName="r_SLIPSTREAM_FLUID_PRESENT"/>
+	<IO Name="Facilities.ProcessFluidDetect" IOName="r_CONTAINMENT_FLUID"/>
+	<IO Name="Facilities.SampleFluidDetect" IOName="r_SAMPLE_SYS_FLUID_PRESENT"/>
 	</Module>
 	<Module Name="Transporter2">
-		<IO Name="Transporter2.Unlock" IOName="c_ENCLOSED_TRANSPORT2_UNLOCK_SOLENOID"/> 
-		<IO Name="Transporter2.Locked1" IOName="r_ENCLOSED_TRANSPORT2_WS_LOCKED_1"/> 
-		<IO Name="Transporter2.Locked2" IOName="r_ENCLOSED_TRANSPORT2_WS_LOCKED_2"/> 
-		<IO Name="Transporter2.Unlocked1" IOName="r_ENCLOSED_TRANSPORT2_WS_UNLOCKED_1"/> 
-		<IO Name="Transporter2.Unlocked2" IOName="r_ENCLOSED_TRANSPORT2_WS_UNLOCKED_2"/>  
-		<IO Name="Transporter2.ImmobilizeActive" IOName="c_ENCLOSED_TRANSPORT2_UPPER_IMMOBILIZER_ACTIVE"/>  
-		<IO Name="Transporter2.ImmobilizeActive2" IOName="c_ENCLOSED_TRANSPORT2_UPPER_IMMOBILIZER_ACTIVE2"/> 
-		<IO Name="Transporter2.ImmobilizeRetracted1" IOName="r_ENCLOSED_TRANSPORT2_WS_IMMOBILIZER1_RETRACTED"/> 
-		<IO Name="Transporter2.ImmobilizeRetracted2" IOName="r_ENCLOSED_TRANSPORT2_WS_IMMOBILIZER2_RETRACTED"/> 
-		<IO Name="Transporter2.ImmobilizeExtended1" IOName="r_ENCLOSED_TRANSPORT2_WS_IMMOBILIZER1_EXTENDED"/> 
-		<IO Name="Transporter2.ImmobilizeExtended2" IOName="r_ENCLOSED_TRANSPORT2_WS_IMMOBILIZER2_EXTENDED"/> 
-		<IO Name="Transporter2.ReadyToLock1" IOName="r_ENCLOSED_TRANSPORT2_WS_READY_TO_LOCK_1"/> 
-		<IO Name="Transporter2.ReadyToLock2" IOName="r_ENCLOSED_TRANSPORT2_WS_READY_TO_LOCK_2"/> 
-		<IO Name="Transporter2.WhPresent1" IOName="r_ENCLOSED_TRANSPORT2_WS_PRESENT_1"/> 
-		<IO Name="Transporter2.WhPresent2" IOName="r_ENCLOSED_TRANSPORT2_WS_PRESENT_2"/> 
+	<IO Name="Transporter2.Unlock" IOName="c_ENCLOSED_TRANSPORT2_UNLOCK_SOLENOID"/> 
+	<IO Name="Transporter2.Locked1" IOName="r_ENCLOSED_TRANSPORT2_WS_LOCKED_1"/> 
+	<IO Name="Transporter2.Locked2" IOName="r_ENCLOSED_TRANSPORT2_WS_LOCKED_2"/> 
+	<IO Name="Transporter2.Unlocked1" IOName="r_ENCLOSED_TRANSPORT2_WS_UNLOCKED_1"/> 
+	<IO Name="Transporter2.Unlocked2" IOName="r_ENCLOSED_TRANSPORT2_WS_UNLOCKED_2"/>  
+	<IO Name="Transporter2.ImmobilizeActive" IOName="c_ENCLOSED_TRANSPORT2_UPPER_IMMOBILIZER_ACTIVE"/>  
+	<IO Name="Transporter2.ImmobilizeActive2" IOName="c_ENCLOSED_TRANSPORT2_UPPER_IMMOBILIZER_ACTIVE2"/> 
+	<IO Name="Transporter2.ImmobilizeRetracted1" IOName="r_ENCLOSED_TRANSPORT2_WS_IMMOBILIZER1_RETRACTED"/> 
+	<IO Name="Transporter2.ImmobilizeRetracted2" IOName="r_ENCLOSED_TRANSPORT2_WS_IMMOBILIZER2_RETRACTED"/> 
+	<IO Name="Transporter2.ImmobilizeExtended1" IOName="r_ENCLOSED_TRANSPORT2_WS_IMMOBILIZER1_EXTENDED"/> 
+	<IO Name="Transporter2.ImmobilizeExtended2" IOName="r_ENCLOSED_TRANSPORT2_WS_IMMOBILIZER2_EXTENDED"/> 
+	<IO Name="Transporter2.ReadyToLock1" IOName="r_ENCLOSED_TRANSPORT2_WS_READY_TO_LOCK_1"/> 
+	<IO Name="Transporter2.ReadyToLock2" IOName="r_ENCLOSED_TRANSPORT2_WS_READY_TO_LOCK_2"/> 
+	<IO Name="Transporter2.WhPresent1" IOName="r_ENCLOSED_TRANSPORT2_WS_PRESENT_1"/> 
+	<IO Name="Transporter2.WhPresent2" IOName="r_ENCLOSED_TRANSPORT2_WS_PRESENT_2"/> 
 	</Module>
 	<Module Name="Transporter1">
-		<IO Name="Transporter1.Unlock" IOName="c_ENCLOSED_TRANSPORT_UNLOCK_SOLENOID"/>  
-		<IO Name="Transporter1.Unlocked1" IOName="r_ENCLOSED_TRANSPORT_WS_UNLOCKED_1"/> 
-		<IO Name="Transporter1.Locked2" IOName="r_ENCLOSED_TRANSPORT_WS_LOCKED_2"/> 
-		<IO Name="Transporter1.Locked1" IOName="r_ENCLOSED_TRANSPORT_WS_LOCKED_1"/> 
-		<IO Name="Transporter1.Unlocked2" IOName="r_ENCLOSED_TRANSPORT_WS_UNLOCKED_2"/>  
-		<IO Name="Transporter1.ImmobilizeActive" IOName="c_ENCLOSED_TRANSPORT_UPPER_IMMOBILIZER_ACTIVE"/>  
-		<IO Name="Transporter1.ImmobilizeActive2" IOName="c_ENCLOSED_TRANSPORT_UPPER_IMMOBILIZER_ACTIVE2"/>  	
-		<IO Name="Transporter1.ImmobilizeRetracted1" IOName="r_ENCLOSED_TRANSPORT_WS_IMMOBILIZER1_RETRACTED"/> 
-		<IO Name="Transporter1.ImmobilizeRetracted2" IOName="r_ENCLOSED_TRANSPORT_WS_IMMOBILIZER2_RETRACTED"/> 
-		<IO Name="Transporter1.ImmobilizeExtended1" IOName="r_ENCLOSED_TRANSPORT_WS_IMMOBILIZER1_EXTENDED"/> 
-		<IO Name="Transporter1.ImmobilizeExtended2" IOName="r_ENCLOSED_TRANSPORT_WS_IMMOBILIZER2_EXTENDED"/> 
-		<IO Name="Transporter1.ReadyToLock1" IOName="r_ENCLOSED_TRANSPORT_WS_READY_TO_LOCK_1"/> 
-		<IO Name="Transporter1.ReadyToLock2" IOName="r_ENCLOSED_TRANSPORT_WS_READY_TO_LOCK_2"/> 
-		<IO Name="Transporter1.WhPresent1" IOName="r_ENCLOSED_TRANSPORT_WS_PRESENT_1"/> 
-		<IO Name="Transporter1.WhPresent2" IOName="r_ENCLOSED_TRANSPORT_WS_PRESENT_2"/> 
+	<IO Name="Transporter1.Unlock" IOName="c_ENCLOSED_TRANSPORT_UNLOCK_SOLENOID"/>  
+	<IO Name="Transporter1.Unlocked1" IOName="r_ENCLOSED_TRANSPORT_WS_UNLOCKED_1"/> 
+	<IO Name="Transporter1.Locked2" IOName="r_ENCLOSED_TRANSPORT_WS_LOCKED_2"/> 
+	<IO Name="Transporter1.Locked1" IOName="r_ENCLOSED_TRANSPORT_WS_LOCKED_1"/> 
+	<IO Name="Transporter1.Unlocked2" IOName="r_ENCLOSED_TRANSPORT_WS_UNLOCKED_2"/>  
+	<IO Name="Transporter1.ImmobilizeActive" IOName="c_ENCLOSED_TRANSPORT_UPPER_IMMOBILIZER_ACTIVE"/>  
+	<IO Name="Transporter1.ImmobilizeActive2" IOName="c_ENCLOSED_TRANSPORT_UPPER_IMMOBILIZER_ACTIVE2"/>  	
+	<IO Name="Transporter1.ImmobilizeRetracted1" IOName="r_ENCLOSED_TRANSPORT_WS_IMMOBILIZER1_RETRACTED"/> 
+	<IO Name="Transporter1.ImmobilizeRetracted2" IOName="r_ENCLOSED_TRANSPORT_WS_IMMOBILIZER2_RETRACTED"/> 
+	<IO Name="Transporter1.ImmobilizeExtended1" IOName="r_ENCLOSED_TRANSPORT_WS_IMMOBILIZER1_EXTENDED"/> 
+	<IO Name="Transporter1.ImmobilizeExtended2" IOName="r_ENCLOSED_TRANSPORT_WS_IMMOBILIZER2_EXTENDED"/> 
+	<IO Name="Transporter1.ReadyToLock1" IOName="r_ENCLOSED_TRANSPORT_WS_READY_TO_LOCK_1"/> 
+	<IO Name="Transporter1.ReadyToLock2" IOName="r_ENCLOSED_TRANSPORT_WS_READY_TO_LOCK_2"/> 
+	<IO Name="Transporter1.WhPresent1" IOName="r_ENCLOSED_TRANSPORT_WS_PRESENT_1"/> 
+	<IO Name="Transporter1.WhPresent2" IOName="r_ENCLOSED_TRANSPORT_WS_PRESENT_2"/> 
 	</Module>
 	<Module Name="SRD">
-		<IO Name="SRD.FluidContainment" IOName="r_SRD_FLUID_CONTAINMENT"/> 
-		<IO Name="SRD.WaterPressure" IOName="r_SRD_SUPPLY_WATER_PRESS"/>  
+	<IO Name="SRD.FluidContainment" IOName="r_SRD_FLUID_CONTAINMENT"/> 
+	<IO Name="SRD.WaterPressure" IOName="r_SRD_SUPPLY_WATER_PRESS"/>  
 	</Module>
 	<Module Name="SRD1">
-		<IO Name="SRD1.VacuumValue" IOName="r_SRD1_CHUCK_VACUUM_anlg"/>  
-		<IO Name="SRD1.WaferPresence" IOName="r_SRD1_WAFER_PRESENT_anlg"/>  
-		<IO Name="SRD1.DoorClose" IOName="c_SRD1_Shutter_Close"/>  
-		<IO Name="SRD1.DoorClosed" IOName="r_SRD1_SHUTTER_CLOSED"/>  
-		<IO Name="SRD1.DoorOpened" IOName="r_SRD1_SHUTTER_OPEN"/>  
-		<IO Name="SRD1.WaterAbove" IOName="c_SRD1_Water_Above_Wafer"/>  
-		<IO Name="SRD1.WaterBelow" IOName="c_SRD1_Water_Below_Wafer"/>  
-		<IO Name="SRD1.ChuckVacuum" IOName="c_SRD1_CHUCK_VACUUM"/>  
-		<IO Name="SRD1.ExhaustOn" IOName="c_SRD1_Exhaust_Fan_On"/>  
+	<IO Name="SRD1.VacuumValue" IOName="r_SRD1_CHUCK_VACUUM_anlg"/>  
+	<IO Name="SRD1.WaferPresence" IOName="r_SRD1_WAFER_PRESENT_anlg"/>  
+	<IO Name="SRD1.DoorClose" IOName="c_SRD1_Shutter_Close"/>  
+	<IO Name="SRD1.DoorClosed" IOName="r_SRD1_SHUTTER_CLOSED"/>  
+	<IO Name="SRD1.DoorOpened" IOName="r_SRD1_SHUTTER_OPEN"/>  
+	<IO Name="SRD1.WaterAbove" IOName="c_SRD1_Water_Above_Wafer"/>  
+	<IO Name="SRD1.WaterBelow" IOName="c_SRD1_Water_Below_Wafer"/>  
+	<IO Name="SRD1.ChuckVacuum" IOName="c_SRD1_CHUCK_VACUUM"/>  
+	<IO Name="SRD1.ExhaustOn" IOName="c_SRD1_Exhaust_Fan_On"/>  
 	</Module>
 	<Module Name="SRD2">
-		<IO Name="SRD2.VacuumValue" IOName="r_SRD2_CHUCK_VACUUM_anlg"/>  
-		<IO Name="SRD2.WaferPresence" IOName="r_SRD2_WAFER_PRESENT_anlg"/>  
-		<IO Name="SRD2.DoorClose" IOName="c_SRD2_Shutter_Close"/>  
-		<IO Name="SRD2.DoorClosed" IOName="r_SRD2_SHUTTER_CLOSED"/>  
-		<IO Name="SRD2.DoorOpened" IOName="r_SRD2_SHUTTER_OPEN"/>  
-		<IO Name="SRD2.WaterAbove" IOName="c_SRD2_Water_Above_Wafer"/>  
-		<IO Name="SRD2.WaterBelow" IOName="c_SRD2_Water_Below_Wafer"/>  
-		<IO Name="SRD2.ChuckVacuum" IOName="c_SRD2_CHUCK_VACUUM"/>  
-		<IO Name="SRD2.ExhaustOn" IOName="c_SRD2_Exhaust_Fan_On"/> 
+	<IO Name="SRD2.VacuumValue" IOName="r_SRD2_CHUCK_VACUUM_anlg"/>  
+	<IO Name="SRD2.WaferPresence" IOName="r_SRD2_WAFER_PRESENT_anlg"/>  
+	<IO Name="SRD2.DoorClose" IOName="c_SRD2_Shutter_Close"/>  
+	<IO Name="SRD2.DoorClosed" IOName="r_SRD2_SHUTTER_CLOSED"/>  
+	<IO Name="SRD2.DoorOpened" IOName="r_SRD2_SHUTTER_OPEN"/>  
+	<IO Name="SRD2.WaterAbove" IOName="c_SRD2_Water_Above_Wafer"/>  
+	<IO Name="SRD2.WaterBelow" IOName="c_SRD2_Water_Below_Wafer"/>  
+	<IO Name="SRD2.ChuckVacuum" IOName="c_SRD2_CHUCK_VACUUM"/>  
+	<IO Name="SRD2.ExhaustOn" IOName="c_SRD2_Exhaust_Fan_On"/> 
 	</Module>
 	<Module Name="Dryer1">
-		<IO Name="Dryer1.ExhaustPressure" IOName="r_HVD_1_ANALOG"/>
-		<IO Name="Dryer1.PowerControl" IOName="c_HVD_1_ENABLE"/>
-		<IO Name="Dryer1.BlowerHigh" IOName="c_HVD_1_HIGH"/>
+	<IO Name="Dryer1.ExhaustPressure" IOName="r_HVD_1_ANALOG"/>
+	<IO Name="Dryer1.PowerControl" IOName="c_HVD_1_ENABLE"/>
+	<IO Name="Dryer1.BlowerHigh" IOName="c_HVD_1_HIGH"/>
 	</Module>
 	<Module Name="Dryer2">
-		<IO Name="Dryer2.ExhaustPressure" IOName="r_HVD_2_ANALOG"/>
-		<IO Name="Dryer2.PowerControl" IOName="c_HVD_2_ENABLE"/>
-		<IO Name="Dryer2.BlowerHigh" IOName="c_HVD_2_HIGH"/>
+	<IO Name="Dryer2.ExhaustPressure" IOName="r_HVD_2_ANALOG"/>
+	<IO Name="Dryer2.PowerControl" IOName="c_HVD_2_ENABLE"/>
+	<IO Name="Dryer2.BlowerHigh" IOName="c_HVD_2_HIGH"/>
 	</Module>
 	<Module Name="Prewet1">
-		<IO Name="Prewet1.PumpValve" IOName="c_SPW1_LEV_PUMP_VALVE"/>
-		<IO Name="Prewet1.PumpCurrent" IOName="r_SPW1_LEV_PUMP_CURRENT"/>
-		<IO Name="Prewet1.PumpEnable" IOName="c_SPW1_LEV_PUMP_ENB"/>
-		<IO Name="Prewet1.PumpStatus" IOName="r_SPW1_LEV_PUMP_STATUS"/>
-		<IO Name="Prewet1.PumpFlow" IOName="r_SPW1_LEV_PUMP_FLOW"/>
-		<IO Name="Prewet1.PumpPressure" IOName="r_SPW1_LEV_PUMP_PRES"/>
-		<IO Name="Prewet1.PumpSpeed" IOName="c_SPW1_LEV_PUMP_SPEED"/>
+	<IO Name="Prewet1.PumpValve" IOName="c_SPW1_LEV_PUMP_VALVE"/>
+	<IO Name="Prewet1.PumpCurrent" IOName="r_SPW1_LEV_PUMP_CURRENT"/>
+	<IO Name="Prewet1.PumpEnable" IOName="c_SPW1_LEV_PUMP_ENB"/>
+	<IO Name="Prewet1.PumpStatus" IOName="r_SPW1_LEV_PUMP_STATUS"/>
+	<IO Name="Prewet1.PumpFlow" IOName="r_SPW1_LEV_PUMP_FLOW"/>
+	<IO Name="Prewet1.PumpPressure" IOName="r_SPW1_LEV_PUMP_PRES"/>
+	<IO Name="Prewet1.PumpSpeed" IOName="c_SPW1_LEV_PUMP_SPEED"/>
 	</Module>
 	<Module Name="Safety">
-		<IO Name="Safety.MainCommErr" IOName="r_Safety_ComErr"/>
-		<IO Name="Safety.LoaderPufCommErr" IOName="r_Safety_ComErr_LdrPuf"/>
-		<IO Name="Safety.SrdCommErr" IOName="r_Safety_ComErr_Srd"/>
-		<IO Name="Safety.TransportCommErr" IOName="r_Safety_ComErr_Transp"/>
-		<IO Name="Safety.MainFunctionBlockErr" IOName="r_Safety_FbErr"/>
-		<IO Name="Safety.LoaderPufFunctionBlockErr" IOName="r_Safety_FbErr_LdrPuf"/>
-		<IO Name="Safety.SrdFunctionBlockErr" IOName="r_Safety_FbErr_Srd"/>
-		<IO Name="Safety.TransporterFunctionBlockErr" IOName="r_Safety_FbErr_Transp"/>
-		<IO Name="Safety.TwincatState" IOName="r_EtherCat_State"/>
-		<IO Name="Safety.LoaderHotConnectState" IOName="r_EtherCat_State_Loader"/>
-		<IO Name="Safety.LdrHotConnectState" IOName="r_EtherCat_State_LdrTxIO"/>
-		<IO Name="Safety.PrcHotConnectState" IOName="r_EtherCat_State_PrcTxIO"/>
-		<IO Name="Safety.TransporterHotConnectState" IOName="r_EtherCat_State_Transporter"/>
-		<IO Name="Safety.PufHotConnectState" IOName="r_EtherCat_State_Puf"/>
-		<IO Name="Safety.SrdHotConnectState" IOName="r_EtherCat_State_Srd"/>
-		<IO Name="Safety.Reservoir1HotConnectState" IOName="r_EtherCat_State_Reservoir1"/>
-		<IO Name="Safety.Reservoir2HotConnectState" IOName="r_EtherCat_State_Reservoir2"/>
-		<IO Name="Safety.FFUHotConnectState" IOName="r_EtherCat_State_FFU"/>
-		<IO Name="Safety.RunStop" IOName="c_Safety_RunStop"/>
-		<IO Name="Safety.ErrAck" IOName="c_Safety_ErrAck"/>
-		<IO Name="Safety.SlsRestart" IOName="c_Safety_SLS_Restart"/>
-		<IO Name="Safety.TxStoMonRestart" IOName="c_Safety_TX_STO_MON_Restart"/>
-		<IO Name="Safety.TxSto1EstopRestart" IOName="c_Safety_TX_STO1_ESTOP_Restart"/>
-		<IO Name="Safety.TxSto2EstopRestart" IOName="c_Safety_TX_STO2_ESTOP_Restart"/>
-		<IO Name="Safety.LdrPufStoMonRestart" IOName="c_Safety_LDRPUF_STO_MON_Restart"/>
-		<IO Name="Safety.LdrPufSto1EstopRestart" IOName="c_Safety_LDRPUF_STO1_ESTOP_Restart"/>
-		<IO Name="Safety.LdrPufSto2EstopRestart" IOName="c_Safety_LDRPUF_STO2_ESTOP_Restart"/>
-		<IO Name="Safety.SrdStoEstopRestart" IOName="c_Safety_SRD_STO_ESTOP_Restart"/>
-		<IO Name="Safety.PumpStoEstopRestart" IOName="c_Safety_PUMP_STO_ESTOP_Restart"/>
-		<IO Name="Safety.FluidEstopRestart" IOName="c_Safety_FLUID_ESTOP_Restart"/>
-		<IO Name="Safety.LoaderDoorLock" IOName="c_REQUEST_LDR_DOOR_OPEN"/>
-		<IO Name="Safety.LoaderDoorLocked" IOName="r_LDR_Door_Locked"/>
-		<IO Name="Safety.BufferDoorLock" IOName="c_REQUEST_BFFR_DOOR_OPEN"/>
-		<IO Name="Safety.BufferDoorLocked" IOName="r_BFFR_Door_Locked"/>
-		<IO Name="Safety.LowerLoaderPanelRemoved" IOName="r_LWR_LDR_PNL_REMOVED"/>
-		<IO Name="Safety.LoaderPanelRemoved" IOName="r_XPRTR_LDR_PNL_REMOVED"/>	
-		<IO Name="Safety.BufferPanelRemoved" IOName="r_XPRTR_BFFR_PNL_REMOVED"/>	
-		<IO Name="Safety.ProcessDoorLock" IOName="c_REQUEST_PROC_DOORS_OPEN"/>	
-		<IO Name="Safety.ProcessDoor1Locked" IOName="r_PROC_DOOR_1_SAFE_LOCK"/>	
-		<IO Name="Safety.ProcessDoor2Locked" IOName="r_PROC_DOOR_2_SAFE_LOCK"/>	
-		<IO Name="Safety.ProcessDoor3Locked" IOName="r_PROC_DOOR_3_SAFE_LOCK"/>	
-		<IO Name="Safety.ProcessDoor4Locked" IOName="r_PROC_DOOR_4_SAFE_LOCK"/>	
-		<IO Name="Safety.ProcessUpperPanelsOn" IOName="r_PROC_DOORS_UPPR_PNLS_ON"/>		
-		<IO Name="Safety.SrdTopPanelRemoved" IOName="r_SRD_TOP_PNL_REMOVED"/>	
-		<IO Name="Safety.SrdLowerPanelRemoved" IOName="r_SRD_LWR_PNL_REMOVED"/>	
-		<IO Name="Safety.PlumbingDoorClosed" IOName="r_PLUMBING_DOORS_CLOSED"/>	
-		<IO Name="Safety.ProcessHaltButton1" IOName="r_PROCESS_HALT_BUTTON_1"/>	
-		<IO Name="Safety.ProcessHaltButton2" IOName="r_PROCESS_HALT_BUTTON_2"/>	
-		<IO Name="Safety.LoaderHaltButton" IOName="r_HALT_LDR_SECTION"/>	
-		<IO Name="Safety.ModeSelectorSwitch" IOName="r_MODE_SELECTOR_SWITCH"/>	
-		<IO Name="Safety.ModeSiren" IOName="c_MODE_SIREN"/>	
-		<IO Name="Safety.LoaderRotationSls" IOName="r_Rotate_AMP_SLS"/>	
-		<IO Name="Safety.LoaderSwingASls" IOName="r_Door_A_AMP_SLS"/>	
-		<IO Name="Safety.LoaderSwingBSls" IOName="r_Door_B_AMP_SLS"/>	
-		<IO Name="Safety.LoaderTiltASls" IOName="r_SUP_A_AMP_SLS"/>	
-		<IO Name="Safety.LoaderTiltBSls" IOName="r_SUP_B_AMP_SLS"/>	
-		<IO Name="Safety.Puf1VerticalSls" IOName="r_DPUF_A_VERT_SAFE_SLS"/>	
-		<IO Name="Safety.Puf2VerticalSls" IOName="r_DPUF_B_VERT_SAFE_SLS"/>	
-		<IO Name="Safety.LoaderGantrySls" IOName="r_Gantry_Zone_Safe_SLS_1"/>	
-		<IO Name="Safety.LoaderElevatorSls" IOName="r_Gantry_Zone_Safe_SLS_2"/>	
-		<IO Name="Safety.ProcessGantrySls" IOName="r_Gantry_Zone_Safe_SLS_3"/>	
-		<IO Name="Safety.ProcessElevatorSls" IOName="r_Gantry_Zone_Safe_SLS_4"/>	
-		<IO Name="Safety.PufVerticalDisable" IOName="r_DPUF_VERT_SAFE_Disable"/>	
-		<IO Name="Safety.Puf1FlipRotationDisable" IOName="r_DPUF_A_PIVSUP_Disable"/>	
-		<IO Name="Safety.Puf2FlipRotationDisable" IOName="r_DPUF_B_PIVSUP_Disable"/>	
-		<IO Name="Safety.LoaderDisable" IOName="r_Loader_Zone_Safe_Disable"/>	
-		<IO Name="Safety.TransporterDisable" IOName="r_Gantry_Zone_Safe_Disable"/>	
-		<IO Name="Safety.SrdArmDisable" IOName="r_SRD_WASH_ARMS_Disable"/>	
-		<IO Name="Safety.SrdRotationDisable" IOName="r_SRD_ROTATE_Disable"/>	
-		<IO Name="Safety.TransporterSafeSls" IOName="r_Gantry_Zone_Safe_SLS"/>	
-		<IO Name="Safety.LoaderSafeSls" IOName="r_Loader_Zone_Safe_SLS"/>	
-		<IO Name="Safety.PufVerticalSafeSls" IOName="r_DPUF_VERT_SAFE_SLS"/>	
-		<IO Name="Safety.LoaderSafeSto" IOName="r_Loader_Zone_Safe_STO"/>	
-		<IO Name="Safety.PufVerticalSafeSto" IOName="r_DPUF_VERT_SAFE_STO"/>	
-		<IO Name="Safety.Puf1FlipRotationSafeSto" IOName="r_DPUF_A_PIVSUP_STO"/>	
-		<IO Name="Safety.Puf2FlipRotationSafeSto" IOName="r_DPUF_B_PIVSUP_STO"/>	
-		<IO Name="Safety.TransporterSafeSto" IOName="r_Gantry_Zone_Safe_STO"/>	
-		<IO Name="Safety.SrdArmSafeSto" IOName="r_SRD_WASH_STO"/>		
-		<IO Name="Safety.SrdRotationSafeSto" IOName="r_SRD_ROTATE_STO"/>		
-		<IO Name="Safety.PumpEdm" IOName="r_PUMP_EDM"/>		
-		<IO Name="Safety.ReservoirHighLevel" IOName="r_SAFETY_HIGH_LEVEL"/>		
-		<IO Name="Safety.FluidEnableEdm" IOName="r_EXT_FLUID_ENABLE_EDM"/>
-		<IO Name="Safety.SRDArmReset" IOName="c_Safety_SRD_Arm_Reset"/>
+	<IO Name="Safety.MainCommErr" IOName="r_Safety_ComErr"/>
+	<IO Name="Safety.LoaderPufCommErr" IOName="r_Safety_ComErr_LdrPuf"/>
+	<IO Name="Safety.SrdCommErr" IOName="r_Safety_ComErr_Srd"/>
+	<IO Name="Safety.TransportCommErr" IOName="r_Safety_ComErr_Transp"/>
+	<IO Name="Safety.MainFunctionBlockErr" IOName="r_Safety_FbErr"/>
+	<IO Name="Safety.LoaderPufFunctionBlockErr" IOName="r_Safety_FbErr_LdrPuf"/>
+	<IO Name="Safety.SrdFunctionBlockErr" IOName="r_Safety_FbErr_Srd"/>
+	<IO Name="Safety.TransporterFunctionBlockErr" IOName="r_Safety_FbErr_Transp"/>
+	<IO Name="Safety.TwincatState" IOName="r_EtherCat_State"/>
+	<IO Name="Safety.LoaderHotConnectState" IOName="r_EtherCat_State_Loader"/>
+	<IO Name="Safety.LdrHotConnectState" IOName="r_EtherCat_State_LdrTxIO"/>
+	<IO Name="Safety.PrcHotConnectState" IOName="r_EtherCat_State_PrcTxIO"/>
+	<IO Name="Safety.TransporterHotConnectState" IOName="r_EtherCat_State_Transporter"/>
+	<IO Name="Safety.PufHotConnectState" IOName="r_EtherCat_State_Puf"/>
+	<IO Name="Safety.SrdHotConnectState" IOName="r_EtherCat_State_Srd"/>
+	<IO Name="Safety.Reservoir1HotConnectState" IOName="r_EtherCat_State_Reservoir1"/>
+	<IO Name="Safety.Reservoir2HotConnectState" IOName="r_EtherCat_State_Reservoir2"/>
+	<IO Name="Safety.FFUHotConnectState" IOName="r_EtherCat_State_FFU"/>
+	<IO Name="Safety.RunStop" IOName="c_Safety_RunStop"/>
+	<IO Name="Safety.ErrAck" IOName="c_Safety_ErrAck"/>
+	<IO Name="Safety.SlsRestart" IOName="c_Safety_SLS_Restart"/>
+	<IO Name="Safety.TxStoMonRestart" IOName="c_Safety_TX_STO_MON_Restart"/>
+	<IO Name="Safety.TxSto1EstopRestart" IOName="c_Safety_TX_STO1_ESTOP_Restart"/>
+	<IO Name="Safety.TxSto2EstopRestart" IOName="c_Safety_TX_STO2_ESTOP_Restart"/>
+	<IO Name="Safety.LdrPufStoMonRestart" IOName="c_Safety_LDRPUF_STO_MON_Restart"/>
+	<IO Name="Safety.LdrPufSto1EstopRestart" IOName="c_Safety_LDRPUF_STO1_ESTOP_Restart"/>
+	<IO Name="Safety.LdrPufSto2EstopRestart" IOName="c_Safety_LDRPUF_STO2_ESTOP_Restart"/>
+	<IO Name="Safety.SrdStoEstopRestart" IOName="c_Safety_SRD_STO_ESTOP_Restart"/>
+	<IO Name="Safety.PumpStoEstopRestart" IOName="c_Safety_PUMP_STO_ESTOP_Restart"/>
+	<IO Name="Safety.FluidEstopRestart" IOName="c_Safety_FLUID_ESTOP_Restart"/>
+	<IO Name="Safety.LoaderDoorLock" IOName="c_REQUEST_LDR_DOOR_OPEN"/>
+	<IO Name="Safety.LoaderDoorLocked" IOName="r_LDR_Door_Locked"/>
+	<IO Name="Safety.BufferDoorLock" IOName="c_REQUEST_BFFR_DOOR_OPEN"/>
+	<IO Name="Safety.BufferDoorLocked" IOName="r_BFFR_Door_Locked"/>
+	<IO Name="Safety.LowerLoaderPanelRemoved" IOName="r_LWR_LDR_PNL_REMOVED"/>
+	<IO Name="Safety.LoaderPanelRemoved" IOName="r_XPRTR_LDR_PNL_REMOVED"/>	
+	<IO Name="Safety.BufferPanelRemoved" IOName="r_XPRTR_BFFR_PNL_REMOVED"/>	
+	<IO Name="Safety.ProcessDoorLock" IOName="c_REQUEST_PROC_DOORS_OPEN"/>	
+	<IO Name="Safety.ProcessDoor1Locked" IOName="r_PROC_DOOR_1_SAFE_LOCK"/>	
+	<IO Name="Safety.ProcessDoor2Locked" IOName="r_PROC_DOOR_2_SAFE_LOCK"/>	
+	<IO Name="Safety.ProcessDoor3Locked" IOName="r_PROC_DOOR_3_SAFE_LOCK"/>	
+	<IO Name="Safety.ProcessDoor4Locked" IOName="r_PROC_DOOR_4_SAFE_LOCK"/>	
+	<IO Name="Safety.ProcessUpperPanelsOn" IOName="r_PROC_DOORS_UPPR_PNLS_ON"/>		
+	<IO Name="Safety.SrdTopPanelRemoved" IOName="r_SRD_TOP_PNL_REMOVED"/>	
+	<IO Name="Safety.SrdLowerPanelRemoved" IOName="r_SRD_LWR_PNL_REMOVED"/>	
+	<IO Name="Safety.PlumbingDoorClosed" IOName="r_PLUMBING_DOORS_CLOSED"/>	
+	<IO Name="Safety.ProcessHaltButton1" IOName="r_PROCESS_HALT_BUTTON_1"/>	
+	<IO Name="Safety.ProcessHaltButton2" IOName="r_PROCESS_HALT_BUTTON_2"/>	
+	<IO Name="Safety.LoaderHaltButton" IOName="r_HALT_LDR_SECTION"/>	
+	<IO Name="Safety.ModeSelectorSwitch" IOName="r_MODE_SELECTOR_SWITCH"/>	
+	<IO Name="Safety.ModeSiren" IOName="c_MODE_SIREN"/>	
+	<IO Name="Safety.LoaderRotationSls" IOName="r_Rotate_AMP_SLS"/>	
+	<IO Name="Safety.LoaderSwingASls" IOName="r_Door_A_AMP_SLS"/>	
+	<IO Name="Safety.LoaderSwingBSls" IOName="r_Door_B_AMP_SLS"/>	
+	<IO Name="Safety.LoaderTiltASls" IOName="r_SUP_A_AMP_SLS"/>	
+	<IO Name="Safety.LoaderTiltBSls" IOName="r_SUP_B_AMP_SLS"/>	
+	<IO Name="Safety.Puf1VerticalSls" IOName="r_DPUF_A_VERT_SAFE_SLS"/>	
+	<IO Name="Safety.Puf2VerticalSls" IOName="r_DPUF_B_VERT_SAFE_SLS"/>	
+	<IO Name="Safety.LoaderGantrySls" IOName="r_Gantry_Zone_Safe_SLS_1"/>	
+	<IO Name="Safety.LoaderElevatorSls" IOName="r_Gantry_Zone_Safe_SLS_2"/>	
+	<IO Name="Safety.ProcessGantrySls" IOName="r_Gantry_Zone_Safe_SLS_3"/>	
+	<IO Name="Safety.ProcessElevatorSls" IOName="r_Gantry_Zone_Safe_SLS_4"/>	
+	<IO Name="Safety.PufVerticalDisable" IOName="r_DPUF_VERT_SAFE_Disable"/>	
+	<IO Name="Safety.Puf1FlipRotationDisable" IOName="r_DPUF_A_PIVSUP_Disable"/>	
+	<IO Name="Safety.Puf2FlipRotationDisable" IOName="r_DPUF_B_PIVSUP_Disable"/>	
+	<IO Name="Safety.LoaderDisable" IOName="r_Loader_Zone_Safe_Disable"/>	
+	<IO Name="Safety.TransporterDisable" IOName="r_Gantry_Zone_Safe_Disable"/>	
+	<IO Name="Safety.SrdArmDisable" IOName="r_SRD_WASH_ARMS_Disable"/>	
+	<IO Name="Safety.SrdRotationDisable" IOName="r_SRD_ROTATE_Disable"/>	
+	<IO Name="Safety.TransporterSafeSls" IOName="r_Gantry_Zone_Safe_SLS"/>	
+	<IO Name="Safety.LoaderSafeSls" IOName="r_Loader_Zone_Safe_SLS"/>	
+	<IO Name="Safety.PufVerticalSafeSls" IOName="r_DPUF_VERT_SAFE_SLS"/>	
+	<IO Name="Safety.LoaderSafeSto" IOName="r_Loader_Zone_Safe_STO"/>	
+	<IO Name="Safety.PufVerticalSafeSto" IOName="r_DPUF_VERT_SAFE_STO"/>	
+	<IO Name="Safety.Puf1FlipRotationSafeSto" IOName="r_DPUF_A_PIVSUP_STO"/>	
+	<IO Name="Safety.Puf2FlipRotationSafeSto" IOName="r_DPUF_B_PIVSUP_STO"/>	
+	<IO Name="Safety.TransporterSafeSto" IOName="r_Gantry_Zone_Safe_STO"/>	
+	<IO Name="Safety.SrdArmSafeSto" IOName="r_SRD_WASH_STO"/>		
+	<IO Name="Safety.SrdRotationSafeSto" IOName="r_SRD_ROTATE_STO"/>		
+	<IO Name="Safety.PumpEdm" IOName="r_PUMP_EDM"/>		
+	<IO Name="Safety.ReservoirHighLevel" IOName="r_SAFETY_HIGH_LEVEL"/>		
+	<IO Name="Safety.FluidEnableEdm" IOName="r_EXT_FLUID_ENABLE_EDM"/>
+	<IO Name="Safety.SRDArmReset" IOName="c_Safety_SRD_Arm_Reset"/>
 	</Module>
 	<Module Name="Rinse1">
-		<IO Name="Rinse1.WaterLevel" IOName="r_QDRD1_WATER_LEVEL"/>
-		<IO Name="Rinse1.WaferHolderClamp" IOName="c_QDRD1_WS_CLAMP"/>
-		<IO Name="Rinse1.N2Valve" IOName="c_QDRD1_LO_PRESSURE"/>
-		<IO Name="Rinse1.FillValve" IOName="c_QDRD1_DI_FILL"/>
-		<IO Name="Rinse1.DrainValve" IOName="c_QDRD1_DUMP"/>
-		<IO Name="Rinse1.WasteValve" IOName="c_QDRD1_MDRAIN"/>
+	<IO Name="Rinse1.WaterLevel" IOName="r_QDRD1_WATER_LEVEL"/>
+	<IO Name="Rinse1.WaferHolderClamp" IOName="c_QDRD1_WS_CLAMP"/>
+	<IO Name="Rinse1.N2Valve" IOName="c_QDRD1_LO_PRESSURE"/>
+	<IO Name="Rinse1.FillValve" IOName="c_QDRD1_DI_FILL"/>
+	<IO Name="Rinse1.DrainValve" IOName="c_QDRD1_DUMP"/>
+	<IO Name="Rinse1.WasteValve" IOName="c_QDRD1_MDRAIN"/>
 	</Module>  
 	<Module Name="Rinse2">
 	<IO Name="Rinse2.WaterLevel" IOName="r_QDRD2_WATER_LEVEL"/>

+ 12 - 13
CyberX8_RT/Config/Devices/WagoControllerCfg-Simulator.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <WagoControllerConfig>
-	<WagoDeviceConfig Module="Wago0" IpAddress="127.0.0.1" Port="501" SendTimeout="2000" RecvTimeout="2000" Channel="1">
+	<WagoDeviceConfig Module="Wago0" IpAddress="10.0.0.12" Port="502" SendTimeout="2000" RecvTimeout="2000" Channel="1">
 		<Dig_In>
 			<DIGroup Name="N5">
 				<DI Name="r_Cassette_1_150" Address="0" Invert="false"/>
@@ -76,21 +76,20 @@
 				<AI Name="AI1"  Address="0" Scaling="0=3276.7,-757=16383.5" DataType="short"/>
 				<AI Name="AI2"  Address="1" DataType="short"/>
 				<AI Name="AI3"  Address="2" DataType="short"/>
-				<AI Name="AI4"  Address="3" DataType="short"/>
-				<AI Name="r_LoaderA_LS_Vacuum_anlg"  Address="4" Scaling="0=3276.7,-757=16383.5" DataType="short"/>
-				<AI Name="r_LoaderB_LS_Vacuum_anlg"  Address="5" Scaling="0=3276.7,-757=16383.5" DataType="short"/>
-				<AI Name="AI6"  Address="6" DataType="short"/>
-				<AI Name="r_LOADER_GasFlowSensor_FLOW"  Address="7" Scaling="0=3370, 500=17000" DataType="short"/>
+				<AI Name="r_LoaderA_LS_Vacuum_anlg"  Address="4" Scaling="1=0,5=-757.5" DataType="short"/>
+				<AI Name="r_LoaderB_LS_Vacuum_anlg"  Address="5" Scaling="1=0,5=-757.5" DataType="short"/>
+				<AI Name="AI6"  Address="5" DataType="short"/>
+				<AI Name="r_LOADER_GasFlowSensor_FLOW"  Address="7" Scaling="1=0,5=500" DataType="short"/>
 			</AIGroup>
 			<AIGroup Name="N2">
-				<AI Name="r_LOADERA_BERNOULLI_PRESSURE"  Address="8" Scaling="0=3276.7, 145=16383.5" DataType="short"/>
-				<AI Name="r_LOADERB_BERNOULLI_PRESSURE"  Address="9" Scaling="0=3276.7, 145=16383.5" DataType="short"/>
-				<AI Name="r_LOADERA_CHUCK_BLADDER"  Address="10" Scaling="0=3276.7, 145=16383.5" DataType="short"/>
-				<AI Name="r_LOADERB_CHUCK_BLADDER"  Address="11" Scaling="0=3276.7, 145=16383.5" DataType="short"/>
-				<AI Name="r_LOADERA_WS_BLADDER_PRESSURE"  Address="12" Scaling="0=3276.7, 145=16383.5" DataType="short"/>
-				<AI Name="r_LOADERB_WS_BLADDER_PRESSURE"  Address="13" Scaling="0=3276.7, 145=16383.5" DataType="short"/>
+				<AI Name="r_LOADERA_BERNOULLI_PRESSURE"  Address="8" Scaling="1=0,5=145.0" DataType="short"/>
+				<AI Name="r_LOADERB_BERNOULLI_PRESSURE"  Address="9" Scaling="1=0,5=145.0" DataType="short"/>
+				<AI Name="r_LOADERA_CHUCK_BLADDER"  Address="10" Scaling="1=0,5=145.0" DataType="short"/>
+				<AI Name="r_LOADERB_CHUCK_BLADDER"  Address="11" Scaling="1=0,5=145.0" DataType="short"/>
+				<AI Name="r_LOADERA_WS_BLADDER_PRESSURE"  Address="12" Scaling="1=0,5=145.0" DataType="short"/>
+				<AI Name="r_LOADERB_WS_BLADDER_PRESSURE"  Address="13" Scaling="1=0,5=145.0" DataType="short"/>
 				<AI Name="r_SPUF_VAC"  Address="14" Scaling="1=0,5=-757.5" DataType="short"/>
-				<AI Name="r_LOADER_GasFlowSensor_VACUUM"  Address="15" Scaling="0=3276.7,-757=16383.5" DataType="short"/>
+				<AI Name="r_LOADER_GasFlowSensor_VACUUM"  Address="15" Scaling="1=0,5=-101" DataType="short"/>
 			</AIGroup>
 		</Ano_In>
 		<Ano_Out>

+ 45 - 9
CyberX8_RT/Config/Devices/WagoControllerCfg.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <WagoControllerConfig>
-  <WagoDeviceConfig Module="Wago0" IpAddress="127.0.0.1" Port="501" SendTimeout="2000" RecvTimeout="2000" Channel="1"> 
+  <WagoDeviceConfig Module="Loader" IpAddress="10.0.0.10" Port="502" SendTimeout="2000" RecvTimeout="2000" Channel="1"> 
 	<Dig_In>
 		<DIGroup Name="N5">
 			<DI Name="r_Cassette_1_150" Address="0" Invert="false"/>
@@ -20,7 +20,7 @@
 			<DI Name="r_Dummy_2_200"  Address="14" Invert="false"/>
 			<DI Name="DI15"  Address="15" Invert="false"/>
 		</DIGroup>
-		<DIGroup Name="N5">
+		<DIGroup Name="N6">
 			<DI Name="r_LoaderA_Wafer_Present"  Address="16" Invert="false"/>
 			<DI Name="r_LoaderB_Wafer_Present"  Address="17" Invert="false"/>
 			<DI Name="r_Cathode_Present"  Address="18" Invert="false"/>
@@ -31,10 +31,10 @@
 			<DI Name="DI23"  Address="23" Invert="false"/>
 			<DI Name="DI24"  Address="24" Invert="false"/>
 			<DI Name="DI25"  Address="25" Invert="false"/>
-			<DI Name="r_PUF_A_CHUCK_OUT"  Address="26" Invert="false"/>
-			<DI Name="r_PUF_A_CHUCK_IN"  Address="27" Invert="false"/>
-			<DI Name="r_PUF_B_CHUCK_OUT"  Address="28" Invert="false"/>
-			<DI Name="r_PUF_B_CHUCK_IN"  Address="29" Invert="false"/>
+			<DI Name="r_LOADERA_CRS_CURTAIN_1"  Address="26" Invert="false"/>
+			<DI Name="r_LOADERA_CRS_CURTAIN_2"  Address="27" Invert="false"/>
+			<DI Name="r_LOADERA_CRS_CURTAIN_3"  Address="28" Invert="false"/>
+			<DI Name="r_LOADERA_CRS_CURTAIN_4"  Address="29" Invert="false"/>
 			<DI Name="r_LOADERA_CRS_CURTAIN_5"  Address="30" Invert="false"/>
 			<DI Name="r_LOADERA_CRS_CURTAIN_6"  Address="31" Invert="false"/>
 		</DIGroup>
@@ -47,9 +47,9 @@
 			<DO Name="c_Pole_Green"  Address="515" Invert="false"/>
 			<DO Name="c_Pole_Blue"  Address="516" Invert="false"/>
 			<DO Name="c_System_Alarm2"  Address="517" Invert="false"/>
-			<DO Name="c_BACKSIDE_PRESSURE_TEST"  Address="518" Invert="false"/>
-			<DO Name="c_VACUUM_TEST"  Address="519" Invert="false"/>
-			<DO Name="c_PUF_CHUCK"  Address="520" Invert="false"/>
+			<DO Name="c_VACUUM_TEST"  Address="518" Invert="false"/>
+			<DO Name="DO7"  Address="519" Invert="false"/>
+			<DO Name="DO8"  Address="520" Invert="false"/>
 			<DO Name="DO9"  Address="521" Invert="false"/>
 			<DO Name="DO10"  Address="522" Invert="false"/>
 			<DO Name="DO11"  Address="523" Invert="false"/>
@@ -116,4 +116,40 @@
 		</AOGroup>		
 	</Ano_Out>
   </WagoDeviceConfig>
+   <WagoDeviceConfig Module="PUF" IpAddress="10.0.0.13" Port="502" SendTimeout="2000" RecvTimeout="2000" Channel="1"> 
+	<Dig_In>
+		<DIGroup Name="N61">
+			<DI Name="r_PUF_A_CHUCK_OUT"  Address="0" Invert="false"/>
+			<DI Name="r_PUF_A_CHUCK_IN"  Address="1" Invert="false"/>
+			<DI Name="r_PUF_B_CHUCK_OUT"  Address="2" Invert="false"/>
+			<DI Name="r_PUF_B_CHUCK_IN"  Address="3" Invert="false"/>
+			<DI Name="DI4"  Address="4" Invert="false"/>
+			<DI Name="DI5"  Address="5" Invert="false"/>
+			<DI Name="DI6"  Address="6" Invert="false"/>
+			<DI Name="DI7"  Address="7" Invert="false"/>
+		</DIGroup>
+	</Dig_In>
+	<Dig_Out>
+		<DOGroup Name="N62">
+			<DO Name="c_PUF_CHUCK"  Address="512" Invert="false"/>
+			<DO Name="D01"  Address="513" Invert="false"/>
+			<DO Name="D02"  Address="514" Invert="false"/>
+			<DO Name="D03"  Address="515" Invert="false"/>
+			<DO Name="D04"  Address="516" Invert="false"/>
+			<DO Name="D05"  Address="517" Invert="false"/>
+			<DO Name="D06"  Address="518" Invert="false"/>
+			<DO Name="D07"  Address="519" Invert="false"/>
+		</DOGroup>
+	</Dig_Out>
+	<Ano_In>
+		<AIGroup Name="N60">
+			<AI Name="r_DPUF_A_CHUCK_A_VAC"  Address="0" Scaling="0=3276.7,-757.5=16383.5" DataType="short"/>
+			<AI Name="r_DPUF_A_CHUCK_B_VAC"  Address="1" Scaling="0=3276.7,-757.5=16383.5" DataType="short"/>
+			<AI Name="r_DIST_FRONT"  Address="2" Scaling="13=0,150=32767" DataType="short"/>
+			<AI Name="r_DIST_REAR"  Address="3" Scaling="13=0,150=32767" DataType="short"/>
+		</AIGroup>
+	</Ano_In>
+	<Ano_Out>
+	</Ano_Out>
+  </WagoDeviceConfig>
 </WagoControllerConfig>

+ 1 - 1
CyberX8_RT/Config/Layout/ToolLayoutConfiguration.xml

@@ -341,7 +341,7 @@
 		<!-- PUFs -->
 
 		<Item i:type="PUF">
-			<Installed>true</Installed>
+			<Installed>false</Installed>
 			<PufID>1</PufID>
 			<SubType>DualPUF_WithDistanceSensors</SubType>
 		</Item>

+ 45 - 0
CyberX8_RT/Config/LogDefine.json

@@ -1530,5 +1530,50 @@
     "GlobalDescription_en": "{0}",
     "Module": "PUF",
     "Note": "PUF Error"
+  },
+  {
+    "Id": 20101006,
+    "Level": "Error",
+    "LogEnum": "ERROR_PUF_CHUCK_ON",
+    "GlobalDescription_zh": "{0}",
+    "GlobalDescription_en": "{0}",
+    "Module": "PUF",
+    "Note": "PUF Error"
+  },
+  {
+    "Id": 20101007,
+    "Level": "Error",
+    "LogEnum": "ERROR_PUF_SIDEA_CHUCK_OUT_ON",
+    "GlobalDescription_zh": "{0}",
+    "GlobalDescription_en": "{0}",
+    "Module": "PUF",
+    "Note": "PUF Error"
+  },
+  {
+    "Id": 20101008,
+    "Level": "Error",
+    "LogEnum": "ERROR_PUF_SIDEA_CHUCK_IN_OFF",
+    "GlobalDescription_zh": "{0}",
+    "GlobalDescription_en": "{0}",
+    "Module": "PUF",
+    "Note": "PUF Error"
+  },
+  {
+    "Id": 20101009,
+    "Level": "Error",
+    "LogEnum": "ERROR_PUF_SIDEB_CHUCK_OUT_ON",
+    "GlobalDescription_zh": "{0}",
+    "GlobalDescription_en": "{0}",
+    "Module": "PUF",
+    "Note": "PUF Error"
+  },
+  {
+    "Id": 20101010,
+    "Level": "Error",
+    "LogEnum": "ERROR_PUF_SIDEB_CHUCK_IN_OFF",
+    "GlobalDescription_zh": "{0}",
+    "GlobalDescription_en": "{0}",
+    "Module": "PUF",
+    "Note": "PUF Error"
   }
 ]

+ 112 - 71
CyberX8_RT/Config/Station/StationPositionsCfg.xml

@@ -3,84 +3,84 @@
   <Module Name="Loader">
     <Axis Name="Loader1.TiltA">
       <ToleranceDefault>0.1</ToleranceDefault>
-		<Stations>
-			<Station Name="Loader1.TiltA.HORI" Position="82.97" ModifiedDate="2024-08-13 14:39:48.548" />
-			<Station Name="Loader1.TiltA.VERT" Position="-6.299" ModifiedDate="2024-06-21 10:37:50.049" />
-			<Station Name="Loader1.TiltA.FLOAT" Position="79.194" ModifiedDate="5/12/2015 12:51:37 AM" />
-			<Station Name="Loader1.TiltA.HOME" Position="79.194" ModifiedDate="12/10/2020 3:40:44 PM" />
-		</Stations>
+      <Stations>
+        <Station Name="Loader1.TiltA.HORI" Position="82.97" ModifiedDate="2025-02-20 16:51:27.564" />
+        <Station Name="Loader1.TiltA.VERT" Position="-7.03" ModifiedDate="2025-02-21 10:57:45.769" />
+        <Station Name="Loader1.TiltA.FLOAT" Position="79.194" ModifiedDate="5/12/2015 12:51:37 AM" />
+        <Station Name="Loader1.TiltA.HOME" Position="79.19" ModifiedDate="2025-02-20 16:52:03.136" />
+      </Stations>
     </Axis>
     <Axis Name="Loader1.TiltB">
       <ToleranceDefault>0.1</ToleranceDefault>
       <Stations>
-        <Station Name="Loader1.TiltB.HORI" Position="82.97" ModifiedDate="2024-08-13 14:39:48.548" />
-        <Station Name="Loader1.TiltB.VERT" Position="-6.299" ModifiedDate="2024-06-21 10:37:50.049" />
+        <Station Name="Loader1.TiltB.HORI" Position="82.97" ModifiedDate="2025-02-20 16:51:53.944" />
+        <Station Name="Loader1.TiltB.VERT" Position="-6" ModifiedDate="2025-02-25 14:21:15.513" />
         <Station Name="Loader1.TiltB.FLOAT" Position="79.194" ModifiedDate="5/12/2015 12:51:37 AM" />
         <Station Name="Loader1.TiltB.HOME" Position="79.194" ModifiedDate="12/10/2020 3:40:44 PM" />
       </Stations>
     </Axis>
     <Axis Name="Loader1.ShuttleA">
       <ToleranceDefault>0.1</ToleranceDefault>
-		<Stations>
-			<Station Name="Loader1.ShuttleA.IN" Position="64.61" ModifiedDate="2024-06-21 10:37:30.041" />
-			<Station Name="Loader1.ShuttleA.LS" Position="63.46" ModifiedDate="2024-09-24 17:58:50.950" />
-			<Station Name="Loader1.ShuttleA.MID" Position="51.28" ModifiedDate="7/11/2016 6:41:59 PM" />
-			<Station Name="Loader1.ShuttleA.OUT200" Position="-5.913" ModifiedDate="12/10/2020 3:32:26 PM" />
-			<Station Name="Loader1.ShuttleA.OUT150" Position="-5.913" ModifiedDate="12/10/2020 3:32:26 PM" />
-			<Station Name="Loader1.ShuttleA.OUT100" Position="-5.913" ModifiedDate="12/10/2020 3:32:26 PM" />
-		</Stations>
+      <Stations>
+        <Station Name="Loader1.ShuttleA.IN" Position="66.88" ModifiedDate="2025-02-19 14:48:19.009" />
+        <Station Name="Loader1.ShuttleA.LS" Position="64.94" ModifiedDate="2025-02-21 16:40:15.442" />
+        <Station Name="Loader1.ShuttleA.MID" Position="51.29" ModifiedDate="2025-02-25 10:41:11.970" />
+        <Station Name="Loader1.ShuttleA.OUT200" Position="-5.91" ModifiedDate="2025-02-25 10:37:40.511" />
+        <Station Name="Loader1.ShuttleA.OUT150" Position="-5.913" ModifiedDate="12/10/2020 3:32:26 PM" />
+        <Station Name="Loader1.ShuttleA.OUT100" Position="-5.913" ModifiedDate="12/10/2020 3:32:26 PM" />
+      </Stations>
     </Axis>
     <Axis Name="Loader1.ShuttleB">
       <ToleranceDefault>0.1</ToleranceDefault>
-		<Stations>
-			<Station Name="Loader1.ShuttleB.IN" Position="64.61" ModifiedDate="2024-06-21 10:37:30.041" />
-			<Station Name="Loader1.ShuttleB.LS" Position="63.46" ModifiedDate="2024-09-24 17:58:50.950" />
-			<Station Name="Loader1.ShuttleB.MID" Position="51.28" ModifiedDate="7/11/2016 6:41:59 PM" />
-			<Station Name="Loader1.ShuttleB.OUT200" Position="-5.913" ModifiedDate="12/10/2020 3:32:26 PM" />
-			<Station Name="Loader1.ShuttleB.OUT150" Position="-5.913" ModifiedDate="12/10/2020 3:32:26 PM" />
-			<Station Name="Loader1.ShuttleB.OUT100" Position="-5.913" ModifiedDate="12/10/2020 3:32:26 PM" />
-		</Stations>
+      <Stations>
+        <Station Name="Loader1.ShuttleB.IN" Position="66.97" ModifiedDate="2025-02-20 17:44:32.827" />
+        <Station Name="Loader1.ShuttleB.LS" Position="65.25" ModifiedDate="2025-02-25 14:36:13.613" />
+        <Station Name="Loader1.ShuttleB.MID" Position="51.28" ModifiedDate="7/11/2016 6:41:59 PM" />
+        <Station Name="Loader1.ShuttleB.OUT200" Position="-5.913" ModifiedDate="12/10/2020 3:32:26 PM" />
+        <Station Name="Loader1.ShuttleB.OUT150" Position="-5.913" ModifiedDate="12/10/2020 3:32:26 PM" />
+        <Station Name="Loader1.ShuttleB.OUT100" Position="-5.913" ModifiedDate="12/10/2020 3:32:26 PM" />
+      </Stations>
     </Axis>
     <Axis Name="Loader1.LSA">
-      <ToleranceDefault>0.01</ToleranceDefault>
+      <ToleranceDefault>0.04</ToleranceDefault>
       <Stations>
-        <Station Name="Loader1.LSA.Setup200" Position="2.273" />
-        <Station Name="Loader1.LSA.Lock200" Position="1.705" ModifiedDate="3/2/2020 6:21:09 PM" />
-        <Station Name="Loader1.LSA.Unlock200" Position="4.570" ModifiedDate="2/25/2020 2:54:29 PM" />
-		<Station Name="Loader1.LSA.Setup150" Position="2.273" />
-		<Station Name="Loader1.LSA.Lock150" Position="1.591" ModifiedDate="3/2/2020 6:21:09 PM" />
-		<Station Name="Loader1.LSA.Unlock150" Position="5.227" ModifiedDate="2/25/2020 2:54:29 PM" />
-		<Station Name="Loader1.LSA.Setup100" Position="2.273" />
-		<Station Name="Loader1.LSA.Lock100" Position="1.477" ModifiedDate="3/2/2020 6:21:09 PM" />
-		<Station Name="Loader1.LSA.Unlock100" Position="4.364" ModifiedDate="2/25/2020 2:54:29 PM" />
+        <Station Name="Loader1.LSA.Setup200" Position="2.57" ModifiedDate="2025-02-21 16:44:31.056" />
+        <Station Name="Loader1.LSA.Lock200" Position="1.82" ModifiedDate="2025-02-25 10:06:03.656" />
+        <Station Name="Loader1.LSA.Unlock200" Position="3.84" ModifiedDate="2025-02-25 11:00:32.208" />
+        <Station Name="Loader1.LSA.Setup150" Position="2.273" />
+        <Station Name="Loader1.LSA.Lock150" Position="1.591" ModifiedDate="3/2/2020 6:21:09 PM" />
+        <Station Name="Loader1.LSA.Unlock150" Position="5.227" ModifiedDate="2/25/2020 2:54:29 PM" />
+        <Station Name="Loader1.LSA.Setup100" Position="2.273" />
+        <Station Name="Loader1.LSA.Lock100" Position="1.477" ModifiedDate="3/2/2020 6:21:09 PM" />
+        <Station Name="Loader1.LSA.Unlock100" Position="4.364" ModifiedDate="2/25/2020 2:54:29 PM" />
       </Stations>
     </Axis>
     <Axis Name="Loader1.LSB">
-      <ToleranceDefault>0.01</ToleranceDefault>
-		<Stations>
-			<Station Name="Loader1.LSB.Setup200" Position="2.273" />
-			<Station Name="Loader1.LSB.Lock200" Position="1.705" ModifiedDate="3/2/2020 6:21:09 PM" />
-			<Station Name="Loader1.LSB.Unlock200" Position="4.570" ModifiedDate="2/25/2020 2:54:29 PM" />
-			<Station Name="Loader1.LSB.Setup150" Position="2.273" />
-			<Station Name="Loader1.LSB.Lock150" Position="1.591" ModifiedDate="3/2/2020 6:21:09 PM" />
-			<Station Name="Loader1.LSB.Unlock150" Position="5.227" ModifiedDate="2/25/2020 2:54:29 PM" />
-			<Station Name="Loader1.LSB.Setup100" Position="2.273" />
-			<Station Name="Loader1.LSB.Lock100" Position="1.477" ModifiedDate="3/2/2020 6:21:09 PM" />
-			<Station Name="Loader1.LSB.Unlock100" Position="6.364" ModifiedDate="2/25/2020 2:54:29 PM" />
-		</Stations>
+      <ToleranceDefault>0.04</ToleranceDefault>
+      <Stations>
+        <Station Name="Loader1.LSB.Setup200" Position="2" ModifiedDate="2025-02-25 14:51:06.154" />
+        <Station Name="Loader1.LSB.Lock200" Position="1" ModifiedDate="2025-02-25 14:51:30.953" />
+        <Station Name="Loader1.LSB.Unlock200" Position="3.5" ModifiedDate="2025-02-25 14:44:33.789" />
+        <Station Name="Loader1.LSB.Setup150" Position="2.273" />
+        <Station Name="Loader1.LSB.Lock150" Position="1.591" ModifiedDate="3/2/2020 6:21:09 PM" />
+        <Station Name="Loader1.LSB.Unlock150" Position="5.227" ModifiedDate="2/25/2020 2:54:29 PM" />
+        <Station Name="Loader1.LSB.Setup100" Position="2.273" />
+        <Station Name="Loader1.LSB.Lock100" Position="1.477" ModifiedDate="3/2/2020 6:21:09 PM" />
+        <Station Name="Loader1.LSB.Unlock100" Position="6.364" ModifiedDate="2/25/2020 2:54:29 PM" />
+      </Stations>
     </Axis>
     <Axis Name="Loader1.Rotation">
-      <ToleranceDefault>0.1</ToleranceDefault>
-		<Stations>
-			<Station Name="Loader1.Rotation.TRNPA" Position="-1.35" ModifiedDate="2024-08-27 09:45:08.838" />
-			<Station Name="Loader1.Rotation.TRNPB" Position="178.16" ModifiedDate="2/26/2020 12:19:29 PM" />
-			<Station Name="Loader1.Rotation.LOADA200" Position="8.217" ModifiedDate="2024-08-13 14:00:52.955" />
-			<Station Name="Loader1.Rotation.LOADB200" Position="187.5" ModifiedDate="2024-08-13 14:22:11.332" />
-			<Station Name="Loader1.Rotation.LOADA150" Position="8.217" ModifiedDate="2024-08-13 14:00:52.955" />
-			<Station Name="Loader1.Rotation.LOADB150" Position="187.5" ModifiedDate="2024-08-13 14:22:11.332" />
-			<Station Name="Loader1.Rotation.LOADA100" Position="8.217" ModifiedDate="2024-08-13 14:00:52.955" />
-			<Station Name="Loader1.Rotation.LOADB100" Position="187.5" ModifiedDate="2024-08-13 14:22:11.332" />
-		</Stations>
+      <ToleranceDefault>0.2</ToleranceDefault>
+      <Stations>
+        <Station Name="Loader1.Rotation.TRNPA" Position="-1.04" ModifiedDate="2025-02-19 17:13:36.065" />
+        <Station Name="Loader1.Rotation.TRNPB" Position="178.16" ModifiedDate="2/26/2020 12:19:29 PM" />
+        <Station Name="Loader1.Rotation.LOADA200" Position="8.3" ModifiedDate="2025-02-19 17:13:56.677" />
+        <Station Name="Loader1.Rotation.LOADB200" Position="187.5" ModifiedDate="2024-08-13 14:22:11.332" />
+        <Station Name="Loader1.Rotation.LOADA150" Position="8.217" ModifiedDate="2024-08-13 14:00:52.955" />
+        <Station Name="Loader1.Rotation.LOADB150" Position="187.5" ModifiedDate="2024-08-13 14:22:11.332" />
+        <Station Name="Loader1.Rotation.LOADA100" Position="8.217" ModifiedDate="2024-08-13 14:00:52.955" />
+        <Station Name="Loader1.Rotation.LOADB100" Position="187.5" ModifiedDate="2024-08-13 14:22:11.332" />
+      </Stations>
     </Axis>
   </Module>
   <Module Name="Transporter">
@@ -132,12 +132,12 @@
         <Station Name="Transporter1.Elevator.Cell2" Position="570" ModifiedDate="2024-08-14 11:35:25.181" />
         <Station Name="Transporter1.Elevator.Cell3" Position="569.5" ModifiedDate="2024-08-14 11:38:10.981" />
         <Station Name="Transporter1.Elevator.Cell4" Position="569" ModifiedDate="2024-08-14 11:44:05.454" />
-        <Station Name="Transporter1.Elevator.Cell5" Position="583.9999" ModifiedDate="11/30/2020 11:31:11 AM" />        
-		<Station Name="Transporter1.Elevator.Cell6" Position="568" ModifiedDate="2024-09-01 16:31:37.580" />
+        <Station Name="Transporter1.Elevator.Cell5" Position="583.9999" ModifiedDate="11/30/2020 11:31:11 AM" />
+        <Station Name="Transporter1.Elevator.Cell6" Position="568" ModifiedDate="2024-09-01 16:31:37.580" />
         <Station Name="Transporter1.Elevator.Cell7" Position="572" ModifiedDate="2024-08-14 14:28:50.498" />
         <Station Name="Transporter1.Elevator.Cell8" Position="572" ModifiedDate="2024-08-14 14:33:04.818" />
         <Station Name="Transporter1.Elevator.Cell9" Position="567.31" ModifiedDate="2024-09-01 16:11:03.700" />
-        <Station Name="Transporter1.Elevator.Cell10" Position="570" ModifiedDate="2024-08-14 14:24:02.642" />		
+        <Station Name="Transporter1.Elevator.Cell10" Position="570" ModifiedDate="2024-08-14 14:24:02.642" />
         <Station Name="Transporter1.Elevator.Cell11" Position="569.31" ModifiedDate="2024-09-01 15:48:36.087" />
         <Station Name="Transporter1.Elevator.Cell12" Position="570" ModifiedDate="2024-08-14 14:15:55.753" />
         <Station Name="Transporter1.Elevator.Cell13" Position="584.5" ModifiedDate="12/2/2020 2:48:18 PM" />
@@ -231,22 +231,63 @@
   </Module>
   <Module Name="DualPuf">
     <Axis Name="PUF1.Flip">
-      <ToleranceDefault>100</ToleranceDefault>
+      <ToleranceDefault>0.5</ToleranceDefault>
       <Stations>
-		<Station Name="PUF1.Flip.Home" Position="500" ModifiedDate="2024-08-09 13:35:19.613" />
-        <Station Name="PUF1.Flip.SideA" Position="500" ModifiedDate="2024-08-09 13:35:19.613" />
-        <Station Name="PUF1.Flip.SideB" Position="206000" ModifiedDate="2024-08-09 13:36:34.531" />
+        <Station Name="PUF1.Flip.SideA" Position="174.95" ModifiedDate="2024-08-09 13:35:19.613" />
+        <Station Name="PUF1.Flip.SideB" Position="-5" ModifiedDate="2024-08-09 13:36:34.531" />
       </Stations>
     </Axis>
     <Axis Name="PUF1.Rotation">
-      <ToleranceDefault>100</ToleranceDefault>
+      <ToleranceDefault>0.5</ToleranceDefault>
+      <Stations>
+        <Station Name="PUF1.Rotation.Home" Position="72.9999" ModifiedDate="8/27/2018 2:53:59 PM" />
+        <Station Name="PUF1.Rotation.Park" Position="72.9999" ModifiedDate="8/27/2018 2:54:03 PM" />
+        <Station Name="PUF1.Rotation.Flip" Position="-7" ModifiedDate="4/6/2015 8:34:18 PM" />
+        <Station Name="PUF1.Rotation.Robot" Position="72.9999" ModifiedDate="7/31/2018 4:34:50 PM" />
+        <Station Name="PUF1.Rotation.LoaderPickup" Position="-6.10065" ModifiedDate="9/14/2018 2:13:39 PM" />
+        <Station Name="PUF1.Rotation.LoaderPutDown" Position="-6.30045" ModifiedDate="9/19/2018 4:32:00 PM" />
+      </Stations>
+    </Axis>
+    <Axis Name="PUF1.Vertical">
+      <ToleranceDefault>0.5</ToleranceDefault>
+      <Stations>
+        <Station Name="PUF1.Vertical.Home" Position="2.999983" ModifiedDate="9/14/2018 2:07:45 PM" />
+        <Station Name="PUF1.Vertical.Flip" Position="-148" />
+        <Station Name="PUF1.Vertical.Robot" Position="-145" ModifiedDate="2024-08-09 13:46:54.195" />
+        <Station Name="PUF1.Vertical.Park" Position="2.999992" ModifiedDate="9/14/2018 2:07:39 PM" />
+        <Station Name="PUF1.Vertical.Loader" Position="-27.19027" />
+        <Station Name="PUF1.Vertical.LoaderPickup" Position="-279" ModifiedDate="9/17/2018 2:09:42 PM" />
+        <Station Name="PUF1.Vertical.LoaderPutDown" Position="-277" ModifiedDate="9/19/2018 4:31:55 PM" />
+      </Stations>
+    </Axis>
+    <Axis Name="PUF2.Flip">
+      <ToleranceDefault>0.5</ToleranceDefault>
+      <Stations>
+        <Station Name="PUF2.Flip.SideA" Position="178" ModifiedDate="2024-08-09 13:38:11.955" />
+        <Station Name="PUF2.Flip.SideB" Position="-2.04615" ModifiedDate="9/6/2018 10:24:30 AM" />
+      </Stations>
+    </Axis>
+    <Axis Name="PUF2.Rotation">
+      <ToleranceDefault>0.5</ToleranceDefault>
+      <Stations>
+        <Station Name="PUF2.Rotation.Home" Position="-23.2889" />
+        <Station Name="PUF2.Rotation.Flip" Position="8" ModifiedDate="4/6/2015 8:52:34 PM" />
+        <Station Name="PUF2.Rotation.Robot" Position="-23.2889" />
+        <Station Name="PUF2.Rotation.Park" Position="-23.2889" />
+        <Station Name="PUF2.Rotation.LoaderPickup" Position="8.7003" ModifiedDate="9/19/2018 4:41:57 PM" />
+        <Station Name="PUF2.Rotation.LoaderPutDown" Position="8.500501" ModifiedDate="9/19/2018 4:48:41 PM" />
+      </Stations>
+    </Axis>
+    <Axis Name="PUF2.Vertical">
+      <ToleranceDefault>0.5</ToleranceDefault>
       <Stations>
-        <Station Name="PUF1.Rotation.Home" Position="25400" ModifiedDate="8/27/2018 2:53:59 PM" />
-        <Station Name="PUF1.Rotation.Park" Position="25400" ModifiedDate="8/27/2018 2:54:03 PM" />
-        <Station Name="PUF1.Rotation.Flip" Position="25400" ModifiedDate="4/6/2015 8:34:18 PM" />
-        <Station Name="PUF1.Rotation.Robot" Position="25400" ModifiedDate="7/31/2018 4:34:50 PM" />
-        <Station Name="PUF1.Rotation.LoaderPickup" Position="61600" ModifiedDate="9/14/2018 2:13:39 PM" />
-        <Station Name="PUF1.Rotation.LoaderPutDown" Position="61300" ModifiedDate="9/19/2018 4:32:00 PM" />
+        <Station Name="PUF2.Vertical.Home" Position="-15" />
+        <Station Name="PUF2.Vertical.Flip" Position="-140" ModifiedDate="9/29/2018 3:15:47 PM" />
+        <Station Name="PUF2.Vertical.Robot" Position="-148" ModifiedDate="2024-08-09 13:47:40.203" />
+        <Station Name="PUF2.Vertical.Park" Position="-15" ModifiedDate="5/7/2015 11:15:42 PM" />
+        <Station Name="PUF2.Vertical.Loader" Position="-50" />
+        <Station Name="PUF2.Vertical.LoaderPickup" Position="-276.1" ModifiedDate="9/19/2018 4:44:11 PM" />
+        <Station Name="PUF2.Vertical.LoaderPutDown" Position="-273.5" ModifiedDate="9/19/2018 5:47:50 PM" />
       </Stations>
     </Axis>
   </Module>

+ 4 - 9
CyberX8_RT/Devices/AXIS/GalilLipsel/GalilLipselProfilePositionRoutine.cs

@@ -81,7 +81,7 @@ namespace CyberX8_RT.Devices.AXIS.GalilLipsel
                 {
                     return true;
                 }
-                if(_axis.MotionData.StopCode==MOTION_STOP_CODE&&_axis.JudgeCurrentPositionIsInTargetPosition(_targetPosition))
+                if(_axis.MotionData.StopCode==MOTION_STOP_CODE&&!_axis.IsRun)
                 {
                     return true;
                 }                
@@ -104,16 +104,11 @@ namespace CyberX8_RT.Devices.AXIS.GalilLipsel
         {
             //没有运动
             bool isStop = _axis.MotionData.StopCode == MOTION_STOP_CODE&&!_axis.IsRun&&!_axis.JudgeCurrentPositionIsInTargetPosition(_targetPosition);
-            if (isStop&&_judgeTorqueLimit)
+            if(_judgeTorqueLimit)
             {
-                ErrorMsg = "position is stop";
-                return true;
-            }
-            if (_judgeTorqueLimit)
-            {
-                if (TorqueIsOverLimit())
+                if (isStop)
                 {
-                    ErrorMsg = "Torque is over limit";
+                    ErrorMsg = "position is stop";
                     return true;
                 }
             }

+ 29 - 1
CyberX8_RT/Devices/AXIS/JetAxisBase.cs

@@ -1233,7 +1233,35 @@ namespace CyberX8_RT.Devices.AXIS
         {
             foreach (Station station in _stationAxis.Stations)
             {
-                if (station.Name.ToLower().EndsWith(stationName.ToLower()))
+                string[] strAry = station.Name.Split('.');
+                if(strAry.Length == 0)
+                {
+                    continue;
+                }
+                if (strAry[strAry.Length-1].ToLower()==(stationName.ToLower()))
+                {
+                    if (double.TryParse(station.Position, out double value))
+                    {
+                        if (Math.Round(Math.Abs(position - value), 2) <= _stationAxis.ToleranceDefault)
+                        {
+                            return true;
+                        }
+                    }
+                }
+            }
+            return false;
+        }
+        /// <summary>
+        /// 检验位置(忽略WaferSize)
+        /// </summary>
+        /// <param name="position"></param>
+        /// <param name="stationName"></param>
+        /// <returns></returns>
+        public bool CheckPositionInStationIgnoreWaferSize(double position,string stationName)
+        {
+            foreach (Station station in _stationAxis.Stations)
+            {
+                if (station.Name.ToLower().Contains(stationName.ToLower()))
                 {
                     if (double.TryParse(station.Position, out double value))
                     {

+ 40 - 5
CyberX8_RT/Devices/Loader/LoaderInstallCRSRoutine.cs

@@ -54,6 +54,8 @@ namespace CyberX8_RT.Devices.Loader
             ShuttleGotoMIDWait,
             HomingLSAxis,
             HomingLSAxisWait,
+            CRSHomedGotoSetUp,
+            CRSHomedGotoSetUpCheck,
             End
         }
 
@@ -103,7 +105,7 @@ namespace CyberX8_RT.Devices.Loader
                 .WaitWithStopCondition(InstallStep.TiltGotoVerticalCheck, () => { return _tiltAxis.Status == RState.End; }, 
                     () => { return _tiltAxis.Status == RState.Failed; })
                 //2. LS Goto Unlock
-                .Run(InstallStep.LSGotoUnlock, () => { return _lsAxis.PositionStation($"Unlock{_waferSize}", false); }, NullFun, _delay_1ms)
+                .Run(InstallStep.LSGotoUnlock, () => { return _lsAxis.PositionStation($"Unlock{_waferSize}"); }, NullFun, _delay_1ms)
                 .WaitWithStopCondition(InstallStep.LSGotoUnlockWait, () => { return _lsAxis.Status == RState.End; }, 
                     () => { return _lsAxis.Status == RState.Failed; })
                 //3. Shuttle Goto IN
@@ -131,13 +133,14 @@ namespace CyberX8_RT.Devices.Loader
                 .WaitWithStopCondition(InstallStep.VacuumLevelCheckWait, () => { return CommonFunction.CheckRoutineEndState(_vacuumLevelCheckRoutine); }, 
                     () => CheckRoutineStopStatus(_vacuumLevelCheckRoutine, "LS Vacuum Level Check failed"))
                 //9. Shuttle Goto LS
-                .Run(InstallStep.ShuttleGotoLS, () => { return _shuttleAxis.PositionStation("LS", false); }, NullFun, _delay_1ms)
+                .Run(InstallStep.ShuttleGotoLS, () => { return _shuttleAxis.PositionStation("LS"); }, NullFun, _delay_1ms)
                 .WaitWithStopCondition(InstallStep.ShuttleGotoLSWait, () => { return _shuttleAxis.Status == RState.End; }, 
                     () => { return _shuttleAxis.Status == RState.Failed; })
                 //10. LS Goto Lock
-                .Run(InstallStep.LSGotoLock, () => { return _lsAxis.PositionStation($"Lock{_waferSize}", false, 0, 0, 0, false); }, NullFun, _delay_1ms)
-                .WaitWithStopCondition(InstallStep.LSGotoLockWait, () => { return _lsAxis.Status == RState.End; }, 
-                    () => { return _lsAxis.Status == RState.Failed; })
+                .Run(InstallStep.LSGotoLock, () => { 
+                    return _lsAxis.PositionStation($"Lock{_waferSize}",false,0,0,0,false); }, NullFun, _delay_1ms)
+                .WaitWithStopCondition(InstallStep.LSGotoLockWait, () => { return _lsAxis.Status!=RState.Running; }, 
+                    () => { return false; })
                 //11. Bernoulli N2 Off
                 .Run(InstallStep.BernoulliN2Off, () => { return _bernoulliN2PressureRoutine.Start(false) == RState.Running; }, _delay_1ms)
                 .WaitWithStopCondition(InstallStep.BernoulliN2OffCheck, () => { return CommonFunction.CheckRoutineEndState(_bernoulliN2PressureRoutine); }, 
@@ -162,6 +165,9 @@ namespace CyberX8_RT.Devices.Loader
                 .Run(InstallStep.HomingLSAxis, () => { return _lsAxis.Home(); }, _delay_1ms)
                 .WaitWithStopCondition(InstallStep.HomingLSAxisWait, () => { return _lsAxis.Status == RState.End; }, 
                     () => { return _lsAxis.Status == RState.Failed; })
+                 .Run(InstallStep.CRSHomedGotoSetUp, () => { return AxisPosition(_lsAxis, $"Setup{_waferSize}"); }, _delay_1ms)
+                .WaitWithStopCondition(InstallStep.CRSHomedGotoSetUpCheck, () => { return _lsAxis.Status == RState.End; },
+                    () => CheckAxisMotionStopStatus(_lsAxis))
                 .End(InstallStep.End, NullFun, 10);
             return Runner.Status;
         }
@@ -421,5 +427,34 @@ namespace CyberX8_RT.Devices.Loader
             }
             return true;
         }
+        /// <summary>
+        /// Axis goto position
+        /// </summary>
+        /// <param name="axis"></param>
+        /// <param name="station"></param>
+        /// <returns></returns>
+        private bool AxisPosition(JetAxisBase axis, string station)
+        {
+            bool result = axis.PositionStation(station);
+            if (!result)
+            {
+                NotifyError(eEvent.ERR_LOADER, $"{axis.Module} goto {station} failed", 0);
+            }
+            return result;
+        }
+        /// <summary>
+        /// 检验电机运动异常状态
+        /// </summary>
+        /// <param name="axis"></param>
+        /// <returns></returns>
+        private bool CheckAxisMotionStopStatus(JetAxisBase axis)
+        {
+            bool result = axis.Status == RState.Failed || axis.Status == RState.Timeout;
+            if (result)
+            {
+                NotifyError(eEvent.ERR_LOADER, $"{axis.Module} motion failed", 0);
+            }
+            return result;
+        }
     }
 }

+ 36 - 1
CyberX8_RT/Devices/Loader/LoaderUnloadRoutine.cs

@@ -54,7 +54,7 @@ namespace CyberX8_RT.Devices.Loader
             TiltGotoHoriCheck,
             BernoulliN2Off,
             WSBladderOff,
-            WSBladderOffCheck,
+            WSBladderOffCheck,            
             End
         }
 
@@ -156,6 +156,13 @@ namespace CyberX8_RT.Devices.Loader
                 .Run(UnloadStep.WSBladderOff, () => { return _whBladderRoutine.Start(false) == RState.Running; }, _delay_1ms)
                 .WaitWithStopCondition(UnloadStep.WSBladderOffCheck, () => { return CommonFunction.CheckRoutineEndState(_whBladderRoutine); },
                     () => CheckRoutineStopStatus(_whBladderRoutine, "WSBladder Off failed"))
+                //17 Home CRS Axis
+                //.Run(UnloadStep.HomingCRSAxis, CRSHome, _delay_1ms)
+                //.WaitWithStopCondition(UnloadStep.HomingCRSAxisWait, () => { return  _lsAxis.Status == RState.End; },
+                //    () => CheckCRSHomeStopStatus())
+                //.Run(UnloadStep.CRSHomedGotoSetUp, () => { return AxisPosition(_lsAxis, $"Setup{_waferSize}"); }, _delay_1ms)
+                //.WaitWithStopCondition(UnloadStep.CRSHomedGotoSetUpCheck, () => { return _lsAxis.Status == RState.End; },
+                //    () => CheckAxisMotionStopStatus(_lsAxis))
                 .End(UnloadStep.End, NullFun, 10);
             return Runner.Status;
         }
@@ -453,6 +460,7 @@ namespace CyberX8_RT.Devices.Loader
                      
             return true;
         }
+
         
         /// <summary>
         /// 检验状态条件
@@ -506,5 +514,32 @@ namespace CyberX8_RT.Devices.Loader
             }
             return true;
         }
+
+        /// <summary>
+        /// CRS Home
+        /// </summary>
+        /// <returns></returns>
+        private bool CRSHome()
+        {
+            bool result = _lsAxis.Home();
+            if (!result)
+            {
+                NotifyError(eEvent.ERR_LOADER, "LS Axis home failed", 0);
+            }
+            return result;
+        }
+        /// <summary>
+        /// 检验CRS home异常状态
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckCRSHomeStopStatus()
+        {
+            bool result = _lsAxis.Status == RState.Failed || _lsAxis.Status == RState.Timeout;
+            if (result)
+            {
+                NotifyError(eEvent.ERR_LOADER, "LS Axis home failed", 0);
+            }
+            return result;
+        }
     }
 }

+ 0 - 24
CyberX8_RT/Devices/PUF/PufDeviceTimer.cs

@@ -16,10 +16,6 @@ namespace CyberX8_RT.Devices.PUF
         private PeriodicJob _periodicJob;
         private JetAxisBase _puf1FlipAxis;
         private JetAxisBase _puf1RotationAxis;
-        private JetAxisBase _puf1VerticalAxis;
-        private JetAxisBase _puf2FlipAxis;
-        private JetAxisBase _puf2RotationAxis;
-        private JetAxisBase _puf2VerticalAxis;
         #endregion
         /// <summary>
         /// 构造函数
@@ -36,10 +32,6 @@ namespace CyberX8_RT.Devices.PUF
         {
             _puf1FlipAxis = DEVICE.GetDevice<JetAxisBase>($"{ModuleName.PUF1}.Flip");
             _puf1RotationAxis = DEVICE.GetDevice<JetAxisBase>($"{ModuleName.PUF1}.Rotation");
-            _puf1VerticalAxis = DEVICE.GetDevice<JetAxisBase>($"{ModuleName.PUF1}.Vertical");
-            _puf2FlipAxis = DEVICE.GetDevice<JetAxisBase>($"{ModuleName.PUF2}.Flip");
-            _puf2RotationAxis = DEVICE.GetDevice<JetAxisBase>($"{ModuleName.PUF2}.Rotation");
-            _puf2VerticalAxis = DEVICE.GetDevice<JetAxisBase>($"{ModuleName.PUF2}.Vertical");
             _periodicJob.Start();
             return true;
         }
@@ -74,22 +66,6 @@ namespace CyberX8_RT.Devices.PUF
             {
                 _puf1RotationAxis.OnTimer();
             }
-            if (_puf1VerticalAxis != null)
-            {
-                _puf1VerticalAxis.OnTimer();
-            }
-            if (_puf2FlipAxis != null)
-            {
-                _puf2FlipAxis.OnTimer();
-            }
-            if (_puf2RotationAxis != null)
-            {
-                _puf2RotationAxis.OnTimer();
-            }
-            if (_puf2VerticalAxis != null)
-            {
-                _puf2VerticalAxis.OnTimer();
-            }
             return true;
         }
     }

+ 33 - 48
CyberX8_RT/Devices/PUF/PufFlipAxisInterLock.cs

@@ -59,72 +59,57 @@ namespace CyberX8_RT.Devices.PUF
             bool chuckAWaferPresent = _pufVacuum.ChuckAWaferPresent;
             bool chuckBWaferPresent = _pufVacuum.ChuckBWaferPresent;
             JetAxisBase rotationAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Rotation");
-            if(rotationAxis.IsRun)
+            if(rotationAxis.Status==CyberX8_Core.RState.Running)
             {
-                LOG.WriteLog(eEvent.ERROR_PUF_OTHERAXIS_RUNNING, $"{Module}.{Name}", "rotation is running, Cannot execute GotoSavedPosition");
+                LOG.WriteLog(eEvent.ERROR_PUF_OTHERAXIS_RUNNING, $"{Module}.{Name}", "rotation status is running, Cannot execute GotoSavedPosition");
                 return false;
             }
-            JetAxisBase verticalAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Vertical");
-            if (verticalAxis.IsRun)
-            {
-                LOG.WriteLog(eEvent.ERROR_PUF_OTHERAXIS_RUNNING, $"{Module}.{Name}", "vertical is running, Cannot execute GotoSavedPosition");
+            double rotationPosition = rotationAxis.MotionData.MotorPosition;
+            if (!rotationAxis.CheckPositionIsInStation(rotationPosition, "Flip"))
+            {
+                LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_STATION, $"{Module}.{Name}", $"rotation station {rotationPosition} not in Flip Station,Cannot execute GotoSavedPosition");
                 return false;
             }
-            double rotationPosition = rotationAxis.MotionData.MotorPosition;
-            double verticalPosition= verticalAxis.MotionData.MotorPosition;
             //A面存在Wafer同时A面Vacuum is released
-            if(WaferManager.Instance.CheckHasWafer(Module,0)&&_pufVacuum.IsChuckAReleased)
+            if (WaferManager.Instance.CheckHasWafer(Module,0)&&_pufVacuum.IsChuckAReleased)
             {
                 LOG.WriteLog(eEvent.ERROR_PUF_HAS_WAFER, $"{Module}.{Name}", "Side A Has Wafer,Vacuum is Off");
                 return false;
-            }
-            //B面存在Wafer同时B面Vacuum is released
+            }
+            //B面存在Wafer同时B面Vacuum is released
             if (WaferManager.Instance.CheckHasWafer(Module, 1) && _pufVacuum.ISChuckBReleased)
             {
                 LOG.WriteLog(eEvent.ERROR_PUF_HAS_WAFER, $"{Module}.{Name}", "Side B Has Wafer,Vacuum is Off");
                 return false;
             }
-            if (chuckAWaferPresent || chuckBWaferPresent)//Wafer Present,
+
+            if (_pufVacuum.Chuck)
+            {
+                LOG.WriteLog(eEvent.ERROR_PUF_CHUCK_ON, $"{Module}.{Name}", "Chuck is on");
+                return false;
+            }
+
+            if (_pufVacuum.SideAChuckOut)
             {
-                if (verticalAxis.CheckPositionIsEmpty(verticalPosition))
-                {
-                    LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_EMPTY, $"{Module}.{Name}", $"vertical axis {verticalPosition} is empty, Cannot execute GotoSavedPosition");
-                    return false;
-                }
-                else if (rotationAxis.CheckPositionIsEmpty(rotationPosition))
-                {
-                    LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_EMPTY, $"{Module}.{Name}", $"rotation axis {rotationPosition} is empty, Cannot execute GotoSavedPosition");
-                    return false;
-                }
-                else if (rotationAxis.CheckPositionIsInStation(rotationPosition, "Flip") && 
-                    verticalAxis.CheckPositionIsInStation(verticalPosition, "Flip"))//rotation轴和vertical轴同时在Flip,可以使用GotoSavedPosition
-                {
-                    return true;
-                }
-                else
-                {
-                    LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_STATION, $"{Module}.{Name}", $"rotation station {rotationPosition} and vertical station {verticalPosition} not both in Flip Station,Cannot execute GotoSavedPosition");
-                    return false;
-                }
+                LOG.WriteLog(eEvent.ERROR_PUF_SIDEA_CHUCK_OUT_ON, $"{Module}.{Name}", "SideA Chuck out is on");
+                return false;
+            }
+            if (_pufVacuum.SideBChuckOut)
+            {
+                LOG.WriteLog(eEvent.ERROR_PUF_SIDEA_CHUCK_OUT_ON, $"{Module}.{Name}", "SideB Chuck out is on");
+                return false;
             }
-            else//Wafer Absent
+            if (!_pufVacuum.SideAChuckIn)
             {
-                if (verticalAxis.CheckPositionIsEmpty(verticalPosition))
-                {
-                    LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_EMPTY, $"{Module}.{Name}", $"vertical {verticalPosition} is empty, Cannot execute GotoSavedPosition");
-                    return false;
-                }
-                else if (verticalAxis.CheckPositionIsInStation(verticalPosition, "Park") ||
-                    verticalAxis.CheckPositionIsInStation(verticalPosition, "Flip")) //vertical轴在Flip或Park,可以使用GotoSavedPosition
-                {
-                    return true;
-                }
-                else
-                {
-                    LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_STATION, $"{Module}.{Name}", $"wafer absent,vertical station {verticalPosition} not in Park or Flip, Cannot execute GotoSavedPosition");
-                    return false;
-                }
+                LOG.WriteLog(eEvent.ERROR_PUF_SIDEA_CHUCK_IN_OFF, $"{Module}.{Name}", "SideA Chuck in is off");
+                return false;
+            }
+            if (!_pufVacuum.SideBChuckIn)
+            {
+                LOG.WriteLog(eEvent.ERROR_PUF_SIDEA_CHUCK_IN_OFF, $"{Module}.{Name}", "SideB Chuck in is off");
+                return false;
             }
+            return true;
         }
     }
 }

+ 63 - 90
CyberX8_RT/Devices/PUF/PufRotationAxisInterLock.cs

@@ -72,18 +72,17 @@ namespace CyberX8_RT.Devices.PUF
                 return false;
             }
             JetAxisBase flipAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Flip");
-            if (flipAxis.IsRun)
+            if (flipAxis.Status==CyberX8_Core.RState.Running)
             {
-                LOG.WriteLog(eEvent.ERROR_PUF_OTHERAXIS_RUNNING, $"{Module}.{Name}", "flip is running, Cannot execute GotoSavedPosition");
+                LOG.WriteLog(eEvent.ERROR_PUF_OTHERAXIS_RUNNING, $"{Module}.{Name}", "flip status is running, Cannot execute GotoSavedPosition");
                 return false;
             }
-            JetAxisBase verticalAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Vertical");
-            if (verticalAxis.IsRun)
+            double flipPosition = flipAxis.MotionData.MotorPosition;
+            if (flipAxis.CheckPositionIsEmpty(flipPosition))
             {
-                LOG.WriteLog(eEvent.ERROR_PUF_OTHERAXIS_RUNNING, $"{Module}.{Name}", "vertical is running, Cannot execute GotoSavedPosition");
+                LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_EMPTY, $"{Module}.{Name}", "flip station is empty, Cannot execute GotoSavedPosition");
                 return false;
             }
-            double verticalPosition = verticalAxis.MotionData.MotorPosition;
             bool loaderInstalled = ModuleHelper.IsInstalled(ModuleName.Loader1);
             JetAxisBase loaderRotationAxis = DEVICE.GetDevice<JetAxisBase>($"{ModuleName.Loader1}.Rotation");
 
@@ -93,97 +92,71 @@ namespace CyberX8_RT.Devices.PUF
             {
                 GetLoaderTransporterGantryAxis();
             }
-            if (verticalAxis.CheckPositionIsInStation(verticalPosition, "Park"))//vertical轴在Park位置,Loader transporter在Loader右侧,Rotation轴可以GotoSavedPosition
-            {
-                if (loaderTransporterInstalled&&_loaderTransporterGantryAxis.JudgeCompareTargetStation("Loader","Right"))//LoaderTransPorter在Loader的右侧(位置不在Loader),Rotation轴可以GotoSavedPosition
-                {
-                    return true;
-                }
-                else if (!loaderTransporterInstalled)
-                {
-                    return true;
-                }
-                else
-                {
-                    LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_STATION, $"{Module}.{Name}", "loader transporter axis is in loader station, Cannot execute GotoSavedPosition");
-                    return false;
-                }
-            }
-            else if (verticalAxis.CheckPositionIsEmpty(verticalPosition))
-            {
-                LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_EMPTY, $"{Module}.{Name}", $"vertical axis {verticalPosition} is empty, Cannot execute GotoSavedPosition");
+            if(station.EndsWith("HOME")||station.EndsWith("Flip")||station.EndsWith("ROBOT"))
+            {
+                return true;
+            }
+            if (!loaderInstalled)
+            {
+                return true;
+            }
+            if (loaderRotationAxis == null || loaderRotationAxis.CheckPositionIsEmpty(loaderRotationPosition))
+            {
+                LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_EMPTY, $"{Module}.{Name}", $"loader rotation axis {loaderRotationPosition} is empty, Cannot execute GotoSavedPosition");
                 return false;
             }
-            else//Vertical轴在Park以外的位置
-            {
-                if (!loaderInstalled)
-                {
-                    return true;
-                }
-                else if (loaderRotationAxis == null || loaderRotationAxis.CheckPositionIsEmpty(loaderRotationPosition))
-                {
-                    LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_EMPTY, $"{Module}.{Name}", $"loader rotation axis {loaderRotationPosition} is empty, Cannot execute GotoSavedPosition");
-                    return false;
-                }
-                else if (loaderRotationAxis.CheckPositionIsInStation(loaderRotationPosition, "TRNPA"))//loader1 rotation轴在TRNPA,Rotation轴只可以在Robot和Park位置
-                {
-                    string selectedItem = station;
-                    if (selectedItem.EndsWith("Park") || selectedItem.EndsWith("Robot"))
-                    {
-                        return true;
-                    }
-                    else
-                    {
-                        LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_STATION, $"{Module}.{Name}", "vertical can only goto Park or Robot station");
-                        return false;
-                    }
-                }
-                else if (loaderRotationAxis.CheckPositionIsInStation(loaderRotationPosition,"LOADA"))//loader1 rotation轴在LOADA,同时Loader1 门已经打开,Rotation轴不可以去Park和Robot位置
-                {
-                    string selectedItem = station;
-                    LoaderSideDevice loaderSideDevice = LoadLoaderSideDevice();
-                    if(loaderSideDevice==null)
-                    {
-                        return true;
-                    }
-                    
-                    if (loaderSideDevice.SideData.DoorLowerUnlocked||loaderSideDevice.SideData.DoorUpperUnlocked)
-                    {
-                        if (selectedItem.EndsWith("Park") || selectedItem.EndsWith("Robot"))
-                        {
-                            LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_STATION, $"{Module}.{Name}", "loader door open,rotation cannot goto Park or Robot station");
-                            return false;
-                        }
-                        else
-                        {
-                            return true;
-                        }
-                    }
-                    else
-                    {
-                        return true;
-                    }
-                }
-                else
-                {
-                    return true;
-                }
+            bool isInLOADA = loaderRotationAxis.CheckPositionInStationIgnoreWaferSize(loaderRotationPosition, "LOADA");
+            bool isInLOADB = loaderRotationAxis.CheckPositionInStationIgnoreWaferSize(loaderRotationPosition, "LOADB");
+            if (!isInLOADA&&!isInLOADB)//loader1 rotation轴不在LOADA或LOADB
+            {                
+                LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_STATION, $"{Module}.{Name}", $"load rotation {loaderRotationPosition} is not in LOADA and LOADB");
+                return false;
             }
-        }
-        /// <summary>
-        /// 获取Loader Side设备
-        /// </summary>
-        /// <returns></returns>
-        private LoaderSideDevice LoadLoaderSideDevice()
-        {
-            if(Module==ModuleName.PUF1.ToString())
+            string side = isInLOADA ? "A" : "B";
+            JetAxisBase shuttleAxis = DEVICE.GetDevice<JetAxisBase>($"{ModuleName.Loader1}.Shuttle{side}");
+            double shuttlePosition = shuttleAxis.MotionData.MotorPosition;
+            if(!shuttleAxis.CheckPositionInStationIgnoreWaferSize(shuttlePosition, "OUT"))
             {
-                return DEVICE.GetDevice<LoaderSideDevice>($"{ModuleName.Loader1}.SideA");
+                LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_STATION, $"{Module}.{Name}", $"load shuttle{side} {shuttlePosition} is not in OUT");
+                return false;
             }
-            else
+
+            JetAxisBase tiltAxis = DEVICE.GetDevice<JetAxisBase>($"{ModuleName.Loader1}.Tilt{side}");
+            double tiltPosition = tiltAxis.MotionData.MotorPosition;
+            if (!tiltAxis.CheckPositionInStationIgnoreWaferSize(shuttlePosition, "HORI"))
             {
-                return DEVICE.GetDevice<LoaderSideDevice>($"{ModuleName.Loader1}.SideB");
+                LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_STATION, $"{Module}.{Name}", $"load tilt{side} {tiltPosition} is not in HORI");
+                return false;
+            }
+
+            PufVacuum _pufVacuum = DEVICE.GetDevice<PufVacuum>($"{Module}.Vacuum");
+            if (_pufVacuum.Chuck)
+            {
+                LOG.WriteLog(eEvent.ERROR_PUF_CHUCK_ON, $"{Module}.{Name}", "Chuck is on");
+                return false;
+            }
+
+            if (_pufVacuum.SideAChuckOut)
+            {
+                LOG.WriteLog(eEvent.ERROR_PUF_SIDEA_CHUCK_OUT_ON, $"{Module}.{Name}", "SideA Chuck out is on");
+                return false;
+            }
+            if (_pufVacuum.SideBChuckOut)
+            {
+                LOG.WriteLog(eEvent.ERROR_PUF_SIDEA_CHUCK_OUT_ON, $"{Module}.{Name}", "SideB Chuck out is on");
+                return false;
+            }
+            if (!_pufVacuum.SideAChuckIn)
+            {
+                LOG.WriteLog(eEvent.ERROR_PUF_SIDEA_CHUCK_IN_OFF, $"{Module}.{Name}", "SideA Chuck in is off");
+                return false;
+            }
+            if (!_pufVacuum.SideBChuckIn)
+            {
+                LOG.WriteLog(eEvent.ERROR_PUF_SIDEA_CHUCK_IN_OFF, $"{Module}.{Name}", "SideB Chuck in is off");
+                return false;
             }
+            return true;
         }
     }
 }

+ 5 - 0
CyberX8_RT/Devices/PUF/PufVacuum.cs

@@ -392,18 +392,23 @@ namespace CyberX8_RT.Devices.PUF
             {
                 case CHUCK:
                     _chuck = value;
+                    LOG.WriteLog(eEvent.INFO_PUF, Module, $"Chuck value is {value}");
                     break;
                 case SIDEA_CHUCK_IN:
                     _sideAChuckIn = value;
+                    LOG.WriteLog(eEvent.INFO_PUF, Module, $"SideA Chuck In value is {value}");
                     break;
                 case SIDEA_CHUCK_OUT:
                     _sideAChuckOut = value;
+                    LOG.WriteLog(eEvent.INFO_PUF, Module, $"SideA Chuck Out value is {value}");
                     break;
                 case SIDEB_CHUCK_IN:
                     _sideBChuckIn = value;
+                    LOG.WriteLog(eEvent.INFO_PUF, Module, $"SideB Chuck In value is {value}");
                     break;
                 case SIDEB_CHUCK_OUT:
                     _sideBChuckOut = value;
+                    LOG.WriteLog(eEvent.INFO_PUF, Module, $"SideB Chuck Out value is {value}");
                     break;
             }
         }

+ 3 - 0
CyberX8_Themes/UserControls/PowerSupplyChannelControl.xaml.cs

@@ -301,6 +301,7 @@ namespace CyberX8_Themes.UserControls
             List<PowerSupplierStepPeriodData> stepPeriodDatas = new List<PowerSupplierStepPeriodData>();
             if(Step1Data.Hour+Step1Data.Minute+Step1Data.Second+Step1Data.Microsecond!=0&&Step1Data.Current!=0) 
             {
+                Step1Data.Voltage = 6;
                 stepPeriodDatas.Add(Step1Data);
             }
             else
@@ -309,10 +310,12 @@ namespace CyberX8_Themes.UserControls
             }
             if (Step2Data.Hour + Step2Data.Minute + Step2Data.Second + Step2Data.Microsecond != 0 && Step2Data.Current != 0)
             {
+                Step2Data.Voltage = 6;
                 stepPeriodDatas.Add(Step2Data);
             }
             if (Step3Data.Hour + Step3Data.Minute + Step3Data.Second + Step3Data.Microsecond != 0 && Step3Data.Current != 0)
             {
+                Step3Data.Voltage = 6;
                 stepPeriodDatas.Add(Step3Data);
             }
             InvokeClient.Instance.Service.DoOperation($"{ModuleName}.StartStepPeriod", "StepPeriodDatas", stepPeriodDatas);

+ 76 - 56
Framework/Common/Device/Wago/WagoControllerCfgManager.cs

@@ -129,7 +129,7 @@ namespace MECF.Framework.Common.Device.Wago
             }
             catch
             {
-                LOG.WriteLog(eEvent.ERR_GALIL, "Galil", "Load galil xml failed");
+                LOG.WriteLog(eEvent.ERR_WAGO, "wago", "Load galil xml failed");
             }
         }
         /// <summary>
@@ -139,84 +139,104 @@ namespace MECF.Framework.Common.Device.Wago
         private void InitializeWagoDeviceConfig(WagoDeviceConfig deviceConfig,WagoModbusDevice modbusDevice,List<string> lst)
         {
             //DI
-            ushort diStartAddress = (ushort)deviceConfig.WagoDigIn.WagoDIGroups[0].WagoDIs[0].Address;
-            List<string> diLst = new List<string>();
-            int index = 0;
-            foreach (var group in deviceConfig.WagoDigIn.WagoDIGroups)
+            ushort diStartAddress = 0;
+            ushort diCount = 0;
+            if (deviceConfig.WagoDigIn.WagoDIGroups?.Count != 0)
             {
-                foreach (var item in group.WagoDIs)
+                diStartAddress = (ushort)deviceConfig.WagoDigIn.WagoDIGroups[0].WagoDIs[0].Address;
+                List<string> diLst = new List<string>();
+                int index = 0;
+                foreach (var group in deviceConfig.WagoDigIn.WagoDIGroups)
                 {
-                    _indexDIDictionary[index] = item.Name;
-                    _moduleNameDIDictionary[item.Name] = item;
-                    diLst.Add(item.Name);
-                    lst.Add(item.Name);
-                    index++;
+                    foreach (var item in group.WagoDIs)
+                    {
+                        _indexDIDictionary[index] = item.Name;
+                        _moduleNameDIDictionary[item.Name] = item;
+                        diLst.Add(item.Name);
+                        lst.Add(item.Name);
+                        index++;
+                    }
                 }
+                diCount = (ushort)index;
+                _moduleDINameListDictionary[deviceConfig.Module] = diLst;
             }
-            ushort diCount = (ushort)index;
-            _moduleDINameListDictionary[deviceConfig.Module] = diLst;
             //DO
-            ushort doStartAddress = (ushort)deviceConfig.WagoDigOut.WagoDOGroups[0].WagoDOs[0].Address;
-            List<string> doList = new List<string>();
-            index = 0;
-            foreach(var group in deviceConfig.WagoDigOut.WagoDOGroups)
+            ushort doStartAddress = 0;
+            ushort doCount = 0;
+            if (deviceConfig.WagoDigOut.WagoDOGroups?.Count != 0)
             {
-                foreach (WagoDO item in group.WagoDOs)
+                doStartAddress = (ushort)deviceConfig.WagoDigOut.WagoDOGroups[0].WagoDOs[0].Address;
+                List<string> doList = new List<string>();
+                int index = 0;
+                foreach (var group in deviceConfig.WagoDigOut.WagoDOGroups)
                 {
-                    _ioModbusDictionary[item.Name] = modbusDevice;
-                    _indexDODictionary[index] = item.Name;
-                    doList.Add(item.Name);
-                    _moduleNameDODictionary[item.Name] = item;
-                    _doModuleDictionary[item.Name] = deviceConfig.Module;
-                    lst.Add(item.Name);
-                    index++;
+                    foreach (WagoDO item in group.WagoDOs)
+                    {
+                        _ioModbusDictionary[item.Name] = modbusDevice;
+                        _indexDODictionary[index] = item.Name;
+                        doList.Add(item.Name);
+                        _moduleNameDODictionary[item.Name] = item;
+                        _doModuleDictionary[item.Name] = deviceConfig.Module;
+                        lst.Add(item.Name);
+                        index++;
+                    }
                 }
+                _moduleDONameListDictionary[deviceConfig.Module] = doList;
+                doCount = (ushort)index;
             }
-            _moduleDONameListDictionary[deviceConfig.Module] = doList;
-            ushort doCount = (ushort)index;
             //AI
-            ushort aiStartAddress = (ushort)deviceConfig.WagoAnoIn.WagoAIGroups[0].WagoAIs[0].Address;
-            index = 0;
-            List<WagoAI> aiLst = new List<WagoAI>();
-            foreach(var group in deviceConfig.WagoAnoIn.WagoAIGroups)
+            ushort aiCount = 0;
+            ushort aiStartAddress = 0;
+            if (deviceConfig.WagoAnoIn.WagoAIGroups?.Count != 0)
             {
-                foreach (var item in group.WagoAIs)
+                aiStartAddress = (ushort)deviceConfig.WagoAnoIn.WagoAIGroups[0].WagoAIs[0].Address;
+                int index = 0;
+                List<WagoAI> aiLst = new List<WagoAI>();
+                foreach (var group in deviceConfig.WagoAnoIn.WagoAIGroups)
                 {
-                    _indexAIDictionary[index] = item.Name;
-                    if (!string.IsNullOrEmpty(item.Scaling))
+                    foreach (var item in group.WagoAIs)
                     {
-                        ScalingManager.Instance.Initialize(item.Name, item.Scaling);
+                        _indexAIDictionary[index] = item.Name;
+                        if (!string.IsNullOrEmpty(item.Scaling))
+                        {
+                            ScalingManager.Instance.Initialize(item.Name, item.Scaling);
+                        }
+                        lst.Add(item.Name);
+                        _moduleNameAIDictionary[item.Name] = item;
+                        aiLst.Add(item);
+                        index++;
                     }
-                    lst.Add(item.Name);
-                    _moduleNameAIDictionary[item.Name] = item;
-                    aiLst.Add(item);
-                    index++;
                 }
+                _moduleAIListDictionary[deviceConfig.Module] = aiLst;
+                aiCount = (ushort)index;
             }
-            _moduleAIListDictionary[deviceConfig.Module] = aiLst;
-            ushort aiCount = (ushort)index;
             //AO
-            ushort aoStartAddress = (ushort)deviceConfig.WagoAnoOut.WagoAOGroups[0].WagoAOs[0].Address;
-            index = 0;
-            List<WagoAO> aoList = new List<WagoAO>();
-            foreach (var group in deviceConfig.WagoAnoOut.WagoAOGroups)
+            ushort aoStartAddress = 0;
+            ushort aoCount = 0;
+            if (deviceConfig.WagoAnoOut.WagoAOGroups?.Count != 0)
             {
-                foreach (var item in group.WagoAOs)
+                aoStartAddress = (ushort)deviceConfig.WagoAnoOut.WagoAOGroups[0].WagoAOs[0].Address;
+                int index = 0;
+                List<WagoAO> aoList = new List<WagoAO>();
+                foreach (var group in deviceConfig.WagoAnoOut.WagoAOGroups)
                 {
-                    _ioModbusDictionary[item.Name] = modbusDevice;
-                    _indexAODictionary[index] = item.Name;
-                    if (!string.IsNullOrEmpty(item.Scaling))
+                    foreach (var item in group.WagoAOs)
                     {
-                        ScalingManager.Instance.Initialize(item.Name, item.Scaling);
+                        _ioModbusDictionary[item.Name] = modbusDevice;
+                        _indexAODictionary[index] = item.Name;
+                        if (!string.IsNullOrEmpty(item.Scaling))
+                        {
+                            ScalingManager.Instance.Initialize(item.Name, item.Scaling);
+                        }
+                        _moduleNameAODictionary[item.Name] = item;
+                        lst.Add(item.Name);
+                        index++;
+                        aoList.Add(item);
                     }
-                    _moduleNameAODictionary[item.Name] = item;
-                    lst.Add(item.Name);
-                    index++;
-                    aoList.Add(item);
                 }
+                aoCount = (ushort)index;
+                _moduleAOListDictionary[deviceConfig.Module] = aoList;
             }
-            ushort aoCount = (ushort)index;
-            _moduleAOListDictionary[deviceConfig.Module] = aoList;
             modbusDevice.Initialize(diCount, diStartAddress, doCount, doStartAddress, aiCount, aiStartAddress, aoCount, aoStartAddress);
         }
         /// <summary>

+ 16 - 4
Framework/Common/Device/Wago/WagoModbusDevice.cs

@@ -264,28 +264,40 @@ namespace MECF.Framework.Common.Device.Wago
         /// </summary>
         public void ApplyAllDIDatas()
         {
-            ApplyAllDataTypeDatas(DI_READ_CMD, _diCount, _diStartAddress);
+            if (_diCount != 0)
+            {
+                ApplyAllDataTypeDatas(DI_READ_CMD, _diCount, _diStartAddress);
+            }
         }
         /// <summary>
         /// 申请所有DO数据
         /// </summary>
         public void ApplyAllDODatas()
         {
-            ApplyAllDataTypeDatas(DO_READ_CMD, _doCount, _doStartAddress);
+            if (_doCount != 0)
+            {
+                ApplyAllDataTypeDatas(DO_READ_CMD, _doCount, _doStartAddress);
+            }
         }
         /// <summary>
         /// 申请所有AI数据
         /// </summary>
         public void ApplyAllAIDatas()
         {
-            ApplyAllDataTypeDatas(AI_READ_CMD, _aiCount, _aiStartAddress);
+            if (_aiCount != 0)
+            {
+                ApplyAllDataTypeDatas(AI_READ_CMD, _aiCount, _aiStartAddress);
+            }
         }
         /// <summary>
         /// 申请所有AO数据
         /// </summary>
         public void ApplyAllAODatas()
         {
-            ApplyAllDataTypeDatas(AO_READ_CMD, _aoCount, _aoStartAddress);
+            if (_aoCount != 0)
+            {
+                ApplyAllDataTypeDatas(AO_READ_CMD, _aoCount, _aoStartAddress);
+            }
         }
         /// <summary>
         /// 申请所有数据类型数据