Explorar o código

update transporter

chenkui hai 4 meses
pai
achega
00c6fabca5

+ 158 - 28
CyberX8_RT/Config/Devices/GalilControllerCfg.xml

@@ -1,33 +1,163 @@
 <?xml version="1.0" encoding="utf-8"?>
 <GalilControllerConfig>
   <GalilDeviceConfig Module="PUF1" IpAddress="10.0.0.22" Port="58678" SendTimeout="2000" RecvTimeout="2000" GalilType="Galil40">
-	  <GalilAxisConfig Name="Flip" Index="0" Type="Galil">
-		  <Speed>1000000</Speed>
-		  <Acceleration>2000000</Acceleration>
-		  <Deceleration>2000000</Deceleration>
-		  <HomingSpeed>16000</HomingSpeed>
-		  <HomingOffset>13000</HomingOffset>
-		  <HomingTimeOut>20000</HomingTimeOut>
-		  <HomingAcceleration>2000000</HomingAcceleration>
-		  <HomingDeceleration>2000000</HomingDeceleration>
-		  <ReverseSoftwareLimit>0</ReverseSoftwareLimit>
-		  <ForwardSoftwareLimit>0</ForwardSoftwareLimit>
-		  <NegativeTorqueLimit>130</NegativeTorqueLimit>
-		  <PositiveTorqueLimit>20</PositiveTorqueLimit>
-	  </GalilAxisConfig>
-	  <GalilAxisConfig Name="Rotation" Index="1" Type="Galil">
-		  <Speed>500000</Speed>
-		  <Acceleration>500000</Acceleration>
-		  <Deceleration>250000</Deceleration>
-		  <HomingSpeed>8000</HomingSpeed>
-		  <HomingOffset>0</HomingOffset>
-		  <HomingTimeOut>20000</HomingTimeOut>
-		  <HomingAcceleration>500000</HomingAcceleration>
-		  <HomingDeceleration>250000</HomingDeceleration>
-		  <ReverseSoftwareLimit>0</ReverseSoftwareLimit>
-		  <ForwardSoftwareLimit>0</ForwardSoftwareLimit>
-		  <NegativeTorqueLimit>130</NegativeTorqueLimit>
-		  <PositiveTorqueLimit>20</PositiveTorqueLimit>
-	  </GalilAxisConfig>
+	<GalilAxisConfig Name="Flip" Index="0" Type="Galil" CNType="-1">
+		<Speed>1000000</Speed>
+		<Acceleration>2000000</Acceleration>
+		<Deceleration>2000000</Deceleration>
+		<HomingSpeed>16000</HomingSpeed>
+		<HomingOffset>13000</HomingOffset>
+		<HomingTimeOut>60000</HomingTimeOut>
+		<HomingAcceleration>2000000</HomingAcceleration>
+		<HomingDeceleration>2000000</HomingDeceleration>
+		<ReverseSoftwareLimit>0</ReverseSoftwareLimit>
+		<ForwardSoftwareLimit>0</ForwardSoftwareLimit>
+		<NegativeTorqueLimit>130</NegativeTorqueLimit>
+		<PositiveTorqueLimit>20</PositiveTorqueLimit>
+	</GalilAxisConfig>
+	<GalilAxisConfig Name="Rotation" Index="1" Type="Galil" CNType="-1">
+		<Speed>500000</Speed>
+		<Acceleration>500000</Acceleration>
+		<Deceleration>250000</Deceleration>
+		<HomingSpeed>8000</HomingSpeed>
+		<HomingOffset>0</HomingOffset>
+		<HomingTimeOut>60000</HomingTimeOut>
+		<HomingAcceleration>500000</HomingAcceleration>
+		<HomingDeceleration>250000</HomingDeceleration>
+		<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" GalilType="Galil21">
+		<GalilAxisConfig Name="LSA" Index="4" Type="GalilLipsel" CNType="-1">
+			<Speed>150000</Speed>
+			<Acceleration>200000</Acceleration>
+			<Deceleration>200000</Deceleration>
+			<HomingSpeed>30000</HomingSpeed>
+			<HomingOffset>0</HomingOffset>
+			<HomingTimeOut>60000</HomingTimeOut>
+			<HomingAcceleration>200000</HomingAcceleration>
+			<HomingDeceleration>60000000</HomingDeceleration>
+			<ReverseSoftwareLimit>-48400</ReverseSoftwareLimit>
+			<ForwardSoftwareLimit>352000</ForwardSoftwareLimit>
+			<NegativeTorqueLimit>130</NegativeTorqueLimit>
+			<PositiveTorqueLimit>20</PositiveTorqueLimit>
+		</GalilAxisConfig>
+		<GalilAxisConfig Name="TiltA" Index="5" Type="Galil" CNType="-1">
+			<Speed>150000</Speed>
+			<Acceleration>200000</Acceleration>
+			<Deceleration>200000</Deceleration>
+			<HomingSpeed>30000</HomingSpeed>
+			<HomingOffset>0</HomingOffset>
+			<HomingTimeOut>60000</HomingTimeOut>
+			<HomingAcceleration>200000</HomingAcceleration>
+			<HomingDeceleration>10000000</HomingDeceleration>
+			<ReverseSoftwareLimit>-20000</ReverseSoftwareLimit>
+			<ForwardSoftwareLimit>236130</ForwardSoftwareLimit>
+			<NegativeTorqueLimit>130</NegativeTorqueLimit>
+			<PositiveTorqueLimit>20</PositiveTorqueLimit>
+		</GalilAxisConfig>
+		<GalilAxisConfig Name="ShuttleA" Index="6" Type="Galil" CNType="-1">
+			<Speed>200000</Speed>
+			<Acceleration>200000</Acceleration>
+			<Deceleration>200000</Deceleration>
+			<HomingSpeed>100000</HomingSpeed>
+			<HomingOffset>0</HomingOffset>
+			<HomingTimeOut>60000</HomingTimeOut>
+			<HomingAcceleration>200000</HomingAcceleration>
+			<HomingDeceleration>10000000</HomingDeceleration>
+			<ReverseSoftwareLimit>-25000</ReverseSoftwareLimit>
+			<ForwardSoftwareLimit>270000</ForwardSoftwareLimit>
+			<NegativeTorqueLimit>130</NegativeTorqueLimit>
+			<PositiveTorqueLimit>20</PositiveTorqueLimit>
+		</GalilAxisConfig>
+		<GalilAxisConfig Name="Rotation" Index="3" Type="Galil" CNType="-1">
+			<Speed>100000</Speed>
+			<Acceleration>50000</Acceleration>
+			<Deceleration>50000</Deceleration>
+			<HomingSpeed>20000</HomingSpeed>
+			<HomingOffset>0</HomingOffset>
+			<HomingTimeOut>60000</HomingTimeOut>
+			<HomingAcceleration>10000</HomingAcceleration>
+			<HomingDeceleration>1000000</HomingDeceleration>
+			<ReverseSoftwareLimit>-1600</ReverseSoftwareLimit>
+			<ForwardSoftwareLimit>162000</ForwardSoftwareLimit>
+			<NegativeTorqueLimit>130</NegativeTorqueLimit>
+			<PositiveTorqueLimit>20</PositiveTorqueLimit>
+		</GalilAxisConfig>
+		<GalilAxisConfig Name="LSB" Index="0" Type="GalilLipsel" CNType="-1">
+			<Speed>150000</Speed>
+			<Acceleration>200000</Acceleration>
+			<Deceleration>200000</Deceleration>
+			<HomingSpeed>30000</HomingSpeed>
+			<HomingOffset>0</HomingOffset>
+			<HomingTimeOut>60000</HomingTimeOut>
+			<HomingAcceleration>200000</HomingAcceleration>
+			<HomingDeceleration>60000000</HomingDeceleration>
+			<ReverseSoftwareLimit>-48400</ReverseSoftwareLimit>
+			<ForwardSoftwareLimit>352000</ForwardSoftwareLimit>
+			<NegativeTorqueLimit>130</NegativeTorqueLimit>
+			<PositiveTorqueLimit>20</PositiveTorqueLimit>
+		</GalilAxisConfig>
+		<GalilAxisConfig Name="TiltB" Index="1" Type="Galil" CNType="-1">
+			<Speed>150000</Speed>
+			<Acceleration>200000</Acceleration>
+			<Deceleration>200000</Deceleration>
+			<HomingSpeed>30000</HomingSpeed>
+			<HomingOffset>0</HomingOffset>
+			<HomingTimeOut>60000</HomingTimeOut>
+			<HomingAcceleration>200000</HomingAcceleration>
+			<HomingDeceleration>10000000</HomingDeceleration>
+			<ReverseSoftwareLimit>-20000</ReverseSoftwareLimit>
+			<ForwardSoftwareLimit>236130</ForwardSoftwareLimit>
+			<NegativeTorqueLimit>130</NegativeTorqueLimit>
+			<PositiveTorqueLimit>20</PositiveTorqueLimit>
+		</GalilAxisConfig>
+		<GalilAxisConfig Name="ShuttleB" Index="2" Type="Galil" CNType="-1">
+			<Speed>200000</Speed>
+			<Acceleration>200000</Acceleration>
+			<Deceleration>200000</Deceleration>
+			<HomingSpeed>100000</HomingSpeed>
+			<HomingOffset>0</HomingOffset>
+			<HomingTimeOut>60000</HomingTimeOut>
+			<HomingAcceleration>200000</HomingAcceleration>
+			<HomingDeceleration>10000000</HomingDeceleration>
+			<ReverseSoftwareLimit>-25000</ReverseSoftwareLimit>
+			<ForwardSoftwareLimit>270000</ForwardSoftwareLimit>
+			<NegativeTorqueLimit>130</NegativeTorqueLimit>
+			<PositiveTorqueLimit>20</PositiveTorqueLimit>
+		</GalilAxisConfig>
+	</GalilDeviceConfig>
+	<GalilDeviceConfig Module="Transporter1" IpAddress="10.0.0.21" Port="58678" SendTimeout="2000" RecvTimeout="2000" GalilType="Galil21">
+		<GalilAxisConfig Name="Elevator" Index="0" Type="Galil" CNType="-1">
+			<Speed>200000</Speed>
+			<Acceleration>200000</Acceleration>
+			<Deceleration>200000</Deceleration>
+			<HomingSpeed>50000</HomingSpeed>
+			<HomingOffset>0</HomingOffset>
+			<HomingTimeOut>60000</HomingTimeOut>
+			<HomingAcceleration>200000</HomingAcceleration>
+			<HomingDeceleration>400000</HomingDeceleration>
+			<ReverseSoftwareLimit>0</ReverseSoftwareLimit>
+			<ForwardSoftwareLimit>0</ForwardSoftwareLimit>
+			<NegativeTorqueLimit>130</NegativeTorqueLimit>
+			<PositiveTorqueLimit>20</PositiveTorqueLimit>
+		</GalilAxisConfig>
+		<GalilAxisConfig Name="Gantry" Index="1" Type="Galil" CNType="1">
+			<Speed>400000</Speed>
+			<Acceleration>4000000</Acceleration>
+			<Deceleration>4000000</Deceleration>
+			<HomingSpeed>100000</HomingSpeed>
+			<HomingOffset>0</HomingOffset>
+			<HomingTimeOut>60000</HomingTimeOut>
+			<HomingAcceleration>4000000</HomingAcceleration>
+			<HomingDeceleration>8000000</HomingDeceleration>
+			<ReverseSoftwareLimit>0</ReverseSoftwareLimit>
+			<ForwardSoftwareLimit>0</ForwardSoftwareLimit>
+			<NegativeTorqueLimit>130</NegativeTorqueLimit>
+			<PositiveTorqueLimit>20</PositiveTorqueLimit>
+		</GalilAxisConfig>
   </GalilDeviceConfig>
 </GalilControllerConfig>

+ 0 - 11
CyberX8_RT/Config/System.sccfg

@@ -120,17 +120,6 @@
 	</configs>
 	<!--PUF1-->
 	<configs name="PUF1" nameView="PUF1">
-		<config default="5" name="CheckStuckWafer300_Offset_mm" nameView="CheckStuckWafer300_Offset_mm" description="300 wafer stick offset distance " max="20" min="0" paramter="" tag="" unit="mm" type="Double" />
-		<config default="2.0" name="CheckStuckWafer300_Acceleration_mm_sec_sec" nameView="CheckStuckWafer300_Acceleration_mm_sec_sec" description="300 wafer stick distance acceleration" max="2500" min="1" paramter="" tag="" unit="deg" type="Double" />
-		<config default="2.0" name="CheckStuckWafer300_Deceleration_mm_sec_sec" nameView="CheckStuckWafer300_Deceleration_mm_sec_sec" description="300 wafer stick distance deceleration" max="2500" min="1" paramter="" tag="" unit="deg" type="Double" />
-		<config default="2.0" name="CheckStuckWafer300_Speed_mm_sec" nameView="CheckStuckWafer300_Speed_mm_sec" description="300 wafer stick distance speed" max="1500" min="1" paramter="" tag="" unit="deg" type="Double" />
-		<config default="30" name="CheckStuckWafer300_TorqueLimit_Percent" nameView="CheckStuckWafer300_TorqueLimit_Percent" description="torque value of 300 wafer is less than this value,it is normal,otherwise innormal" max="100" min="1" paramter="" tag="" unit="deg" type="Double" />
-		<config default="2" name="CheckStuckWafer300_DistanceOffset1" nameView="Distance Sensor Offset1 mm" description="300 wafer Check Stuck Wafer Distance Sensor Offset1 MM" max="100" min="0" paramter="" tag="" unit="mm" type="Double" />
-		<config default="2" name="CheckStuckWafer300_DistanceOffset2" nameView="Distance Sensor Offset2 mm" description="300 wafer Check Stuck Wafer Distance Sensor Offset2 MM" max="100" min="0" paramter="" tag="" unit="mm" type="Double" />
-		<config default="5" name="CheckStuckWafer200_Offset_mm" nameView="CheckStuckWafer200_Offset_mm" description="200 wafer stick offset distance" max="20" min="0" paramter="" tag="" unit="mm" type="Double" />
-		<config default="2" name="CheckStuckWafer200_Acceleration_mm_sec_sec" nameView="CheckStuckWafer200_Acceleration_mm_sec_sec" description="200 wafer stick distance acceleration" max="2500" min="1" paramter="" tag="" unit="deg" type="Double" />
-		<config default="2" name="CheckStuckWafer200_Deceleration_mm_sec_sec" nameView="CheckStuckWafer200_Deceleration_mm_sec_sec" description="200 wafer stick distance deceleration" max="2500" min="1" paramter="" tag="" unit="deg" type="Double" />
-		<config default="2" name="CheckStuckWafer200_Speed_mm_sec" nameView="CheckStuckWafer200_Speed_mm_sec" description="200 wafer stick distance speed" max="1500" min="1" paramter="" tag="" unit="deg" type="Double" />
 		<config default="30" name="CheckStuckWafer200_TorqueLimit_Percent" nameView="CheckStuckWafer200_TorqueLimit_Percent" description="torque value of 200 wafer is less than this value,it is normal,otherwise innormal" max="100" min="1" paramter="" tag="" unit="deg" type="Double" />
 		<config default="2" name="CheckStuckWafer200_DistanceOffset1" nameView="Distance Sensor Offset1 mm" description="200 wafer Check Stuck Wafer Distance Sensor Offset1 MM" max="100" min="0" paramter="" tag="" unit="mm" type="Double" />
 		<config default="2" name="CheckStuckWafer200_DistanceOffset2" nameView="Distance Sensor Offset2 mm" description="200 wafer Check Stuck Wafer Distance Sensor Offset2 MM" max="100" min="0" paramter="" tag="" unit="mm" type="Double" />

+ 2 - 1
CyberX8_RT/Devices/AXIS/Galil/GalilAxis.cs

@@ -112,7 +112,8 @@ namespace CyberX8_RT.Devices.AXIS.Galil
                 return false;
             }
             MotionData.IsHomed = false;
-            _homeRoutine.Start(_homeTimeout,_galilAxisConfig.HomingAcceleration,_galilAxisConfig.HomingDeceleration,_galilAxisConfig.HomingSpeed,_galilAxisConfig.HomingOffset);
+            _homeRoutine.Start(_homeTimeout,_galilAxisConfig.HomingAcceleration,_galilAxisConfig.HomingDeceleration,
+                _galilAxisConfig.HomingSpeed,_galilAxisConfig.HomingOffset,_galilAxisConfig.CNType);
             IsHomeSwitchedTriggered = false;
             return true;
         }

+ 5 - 0
CyberX8_RT/Devices/AXIS/Galil/GalilHomeRoutine.cs

@@ -19,6 +19,7 @@ namespace CyberX8_RT.Devices.AXIS.Galil
             HomingAcceleration,
             HomingDeceleration,
             HomingSpeed,
+            WriteCNType,
             SetHomeModel,
             StartMotion,
             Delay,
@@ -39,6 +40,7 @@ namespace CyberX8_RT.Devices.AXIS.Galil
         private int _homingDeceleration = 0;
         private int _homingSpeed = 0;
         private int _homingOffset = 0;
+        private int _cnType = 0;
         #endregion
         public GalilHomeRoutine(string module,JetAxisBase axis) : base(module)
         {
@@ -55,6 +57,8 @@ namespace CyberX8_RT.Devices.AXIS.Galil
             Runner.Run(HomeStep.HomingAcceleration, () => { return _axis.WriteAcceleration(_homingAcceleration); }, _delay_1ms)
                 .Run(HomeStep.HomingDeceleration, () => { return _axis.WriteDeceleration(_homingDeceleration); }, _delay_1ms)
                 .Run(HomeStep.HomingSpeed, () => { return _axis.WriteSpeed(_homingSpeed); }, _delay_1ms)
+                //增加CN类型用于区分process transporter gantry与elevator home方向相反
+                .RunIf(HomeStep.WriteCNType, _cnType!=0, () => { return _axis.WriteCNCommand($",{_cnType}"); },_delay_1ms)
                 .Run(HomeStep.SetHomeModel, () => { return _axis.WriteHomeAxisCommand(); }, _delay_1ms)
                 .Run(HomeStep.StartMotion, () => { return _axis.WriteStartMotion(); }, _delay_1ms)
                 .Delay(HomeStep.Delay,500)
@@ -86,6 +90,7 @@ namespace CyberX8_RT.Devices.AXIS.Galil
             _homingDeceleration = (int)objs[2];
             _homingSpeed = (int)objs[3];
             _homingOffset = (int)objs[4];
+            _cnType = objs.Length >= 6 ? (int)objs[5] : 0;
             return Runner.Start(Module, "Home");
         }
     }

+ 9 - 0
CyberX8_RT/Devices/AXIS/JetAxisBase.cs

@@ -1176,6 +1176,15 @@ namespace CyberX8_RT.Devices.AXIS
         {
             return GalilControllerCfgManager.Instance.SetAxisCommand(Module, Name, "HM", null);
         }
+
+        /// <summary>
+        /// Home 电机
+        /// </summary>
+        /// <returns></returns>
+        public bool WriteCNCommand(string cn)
+        {
+            return GalilControllerCfgManager.Instance.SetSystemCommand(Module, Name, "CN", cn);
+        }
         /// <summary>
         /// 手动置零
         /// </summary>

+ 12 - 14
CyberX8_RT/Devices/DeviceManager.cs

@@ -232,19 +232,18 @@ namespace CyberX8_RT.Instances
         /// <param name="moduleName"></param>
         private void InitLoaderTransporter(ModuleName moduleName)
         {
-            BeckhoffAxis gantryBeckhoffAxis = BeckhoffAxisManager.Instance.GetAxis($"{moduleName}.Gantry");
-            if (gantryBeckhoffAxis != null)
+            GalilAxisConfig gantryGalilAxis = GalilControllerCfgManager.Instance.GetGalilAxisConfig(moduleName.ToString(), "Gantry");
+            if (gantryGalilAxis != null)
             {
-                JetAxisBase gantryAxis = AxisManager.Instance.GetAxisInstance(gantryBeckhoffAxis.MotorType, moduleName.ToString(), "Gantry");
-                gantryAxis.IsForwardSensorLimit = true;
+                JetAxisBase gantryAxis = AxisManager.Instance.GetAxisInstance(gantryGalilAxis.Type, moduleName.ToString(), "Gantry");
                 AddCustomModuleDevice(gantryAxis);
                 gantryAxis.InterLock = new LoaderTransPorterGantryAxisInterLock(gantryAxis);
                 AxisManager.Instance.AddModuleAxis(moduleName.ToString(), gantryAxis);
             }
-            BeckhoffAxis elevatorBeckhoffAxis = BeckhoffAxisManager.Instance.GetAxis($"{moduleName}.Elevator");
-            if (elevatorBeckhoffAxis != null)
+            GalilAxisConfig elevatorGalilAxis = GalilControllerCfgManager.Instance.GetGalilAxisConfig(moduleName.ToString(), "Elevator");
+            if (elevatorGalilAxis != null)
             {
-                JetAxisBase elevatorAxis = AxisManager.Instance.GetAxisInstance(elevatorBeckhoffAxis.MotorType, moduleName.ToString(), "Elevator");
+                JetAxisBase elevatorAxis = AxisManager.Instance.GetAxisInstance(elevatorGalilAxis.Type, moduleName.ToString(), "Elevator");
                 elevatorAxis.IsForwardSensorLimit = true;
                 AddCustomModuleDevice(elevatorAxis);
                 elevatorAxis.InterLock = new LoaderTransPorterElevatorAxisInterLock(elevatorAxis);
@@ -259,19 +258,18 @@ namespace CyberX8_RT.Instances
         /// <param name="moduleName"></param>
         private void InitProcessTransporter(ModuleName moduleName)
         {
-            BeckhoffAxis gantryBeckhoffAxis = BeckhoffAxisManager.Instance.GetAxis($"{moduleName}.Gantry");
-            if (gantryBeckhoffAxis != null)
+            GalilAxisConfig gantryGalilAxis = GalilControllerCfgManager.Instance.GetGalilAxisConfig(moduleName.ToString(), "Gantry");
+            if (gantryGalilAxis != null)
             {
-                JetAxisBase gantryAxis = AxisManager.Instance.GetAxisInstance(gantryBeckhoffAxis.MotorType, moduleName.ToString(), "Gantry");
-                gantryAxis.IsRevSensorLimit = true;
+                JetAxisBase gantryAxis = AxisManager.Instance.GetAxisInstance(gantryGalilAxis.Type, moduleName.ToString(), "Gantry");
                 AddCustomModuleDevice(gantryAxis);
                 gantryAxis.InterLock = new ProcessTransporterGantryAxisInterLock(gantryAxis);
                 AxisManager.Instance.AddModuleAxis(moduleName.ToString(), gantryAxis);
             }
-            BeckhoffAxis elevatorBeckhoffAxis = BeckhoffAxisManager.Instance.GetAxis($"{moduleName}.Elevator");
-            if (elevatorBeckhoffAxis != null)
+            GalilAxisConfig elevatorGalilAxis = GalilControllerCfgManager.Instance.GetGalilAxisConfig(moduleName.ToString(), "Elevator");
+            if (elevatorGalilAxis != null)
             {
-                JetAxisBase elevatorAxis = AxisManager.Instance.GetAxisInstance(elevatorBeckhoffAxis.MotorType, moduleName.ToString(), "Elevator");
+                JetAxisBase elevatorAxis = AxisManager.Instance.GetAxisInstance(elevatorGalilAxis.Type, moduleName.ToString(), "Elevator");
                 elevatorAxis.IsForwardSensorLimit = true;
                 AddCustomModuleDevice(elevatorAxis);
                 elevatorAxis.InterLock = new ProcessTransporterElevatorAxisInterLock(elevatorAxis);

+ 5 - 60
CyberX8_RT/Devices/PUF/PufDistanceSensor.cs

@@ -51,26 +51,6 @@ namespace CyberX8_RT.Devices.PUF
         private double _offset1 = 0;
         private double _offset2 = 0;
         /// <summary>
-        /// 尺寸
-        /// </summary>
-        private int _waferSize = 200;
-        /// <summary>
-        /// 加速度
-        /// </summary>
-        private double _acceleration = 0;
-        /// <summary>
-        /// 减速度
-        /// </summary>
-        private double _deceleration = 0;
-        /// <summary>
-        /// 速度
-        /// </summary>
-        private double _speed = 0;
-        /// <summary>
-        /// 距离
-        /// </summary>
-        private double _distance = 0;
-        /// <summary>
         /// 比例因子
         /// </summary>
         private double _verticalScaleFactor = 0;
@@ -101,7 +81,6 @@ namespace CyberX8_RT.Devices.PUF
         /// <param name="moduleName"></param>
         public PufDistanceSensor(string moduleName): base(moduleName,"DistanceSensor", "DistanceSensor", "DistanceSensor")
         {
-            _waferSize = SC.GetValue<int>("System.WaferSize");
             BeckhoffProviderAxis verticalBeckhoffProviderAxis = BeckhoffAxisProviderManager.Instance.GetAxisProvider($"{Module}.Vertical");
             if (verticalBeckhoffProviderAxis != null)
             {
@@ -164,25 +143,8 @@ namespace CyberX8_RT.Devices.PUF
         {
             _dynamicOffset1=offset1;
             _dynamicOffset2=offset2;
-            if(_waferSize==200)
-            {
-                SC.SetItemValue($"{Module}.{STUCK_WAFER_200_DISTANCE_OFFSET1}", offset1);
-                SC.SetItemValue($"{Module}.{STUCK_WAFER_200_DISTANCE_OFFSET2}", offset2);
-            }
-            else
-            {
-                SC.SetItemValue($"{Module}.{STUCK_WAFER_300_DISTANCE_OFFSET1}", offset1);
-                SC.SetItemValue($"{Module}.{STUCK_WAFER_300_DISTANCE_OFFSET2}", offset2);
-            }
-        }
-        /// <summary>
-        /// Stick Distance
-        /// </summary>
-        public bool GotoStickDistance()
-        {
-            LoadConfigParameter();
-            return _verticalAxis.ProfilePosition(GetAfterScaleData(_verticalAxis.MotionData.MotorPosition + _distance),GetAfterScaleData(_speed),
-                GetAfterScaleData(_acceleration),GetAfterScaleData(_deceleration),true);
+            SC.SetItemValue($"{Module}.{STUCK_WAFER_200_DISTANCE_OFFSET1}", offset1);
+            SC.SetItemValue($"{Module}.{STUCK_WAFER_200_DISTANCE_OFFSET2}", offset2);
         }
         /// <summary>
         /// 获取尺寸放大后的数据
@@ -224,26 +186,9 @@ namespace CyberX8_RT.Devices.PUF
 
         private void LoadConfigParameter()
         {
-            if (_waferSize == 200)
-            {
-                _distance = SC.GetValue<double>($"{Module}.{STUCK_WAFER_200_OFFSET}");
-                _offset1 = SC.GetValue<double>($"{Module}.{STUCK_WAFER_200_DISTANCE_OFFSET1}");
-                _offset2 = SC.GetValue<double>($"{Module}.{STUCK_WAFER_200_DISTANCE_OFFSET2}");
-                _acceleration = SC.GetValue<double>($"{Module}.{STUCK_WAFER_200_ACCELERATION}");
-                _deceleration = SC.GetValue<double>($"{Module}.{STUCK_WAFER_200_DECELERATION}");
-                _speed = SC.GetValue<double>($"{Module}.{STUCK_WAFER_200_SPEED}");
-                _torquelimit = SC.GetValue<double>($"{Module}.{STUCK_WAFER_200_TORQUE_LIMIT}");
-            }
-            else
-            {
-                _distance = SC.GetValue<double>($"{Module}.{STUCK_WAFER_300_OFFSET}");
-                _offset1 = SC.GetValue<double>($"{Module}.{STUCK_WAFER_300_DISTANCE_OFFSET1}");
-                _offset2 = SC.GetValue<double>($"{Module}.{STUCK_WAFER_300_DISTANCE_OFFSET2}");
-                _acceleration = SC.GetValue<double>($"{Module}.{STUCK_WAFER_300_ACCELERATION}");
-                _deceleration = SC.GetValue<double>($"{Module}.{STUCK_WAFER_300_DECELERATION}");
-                _speed = SC.GetValue<double>($"{Module}.{STUCK_WAFER_300_SPEED}");
-                _torquelimit = SC.GetValue<double>($"{Module}.{STUCK_WAFER_300_TORQUE_LIMIT}");
-            }
+            _offset1 = SC.GetValue<double>($"{Module}.{STUCK_WAFER_200_DISTANCE_OFFSET1}");
+            _offset2 = SC.GetValue<double>($"{Module}.{STUCK_WAFER_200_DISTANCE_OFFSET2}");
+            _torquelimit = SC.GetValue<double>($"{Module}.{STUCK_WAFER_200_TORQUE_LIMIT}");
 
             if (SC.ContainsItem($"{Module}.CheckStuckWafer_DistanceSensorThreshold_mm"))
             {

+ 1 - 1
CyberX8_RT/Devices/PUF/PufRotationAxisInterLock.cs

@@ -123,7 +123,7 @@ namespace CyberX8_RT.Devices.PUF
 
             JetAxisBase tiltAxis = DEVICE.GetDevice<JetAxisBase>($"{ModuleName.Loader1}.Tilt{side}");
             double tiltPosition = tiltAxis.MotionData.MotorPosition;
-            if (!tiltAxis.CheckPositionIsInStation(shuttlePosition, "HORI"))
+            if (!tiltAxis.CheckPositionIsInStation(tiltPosition, "HORI"))
             {
                 LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_STATION, $"{Module}.{Name}", $"load tilt{side} {tiltPosition} is not in HORI");
                 return false;

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

@@ -20,6 +20,7 @@ namespace CyberX8_RT.Modules.EFEM
     {
         private enum HomeStep
         {
+            PowerOn,
             SetHomeSpeed,
             HomeAll,
             InitAligner,
@@ -82,7 +83,8 @@ namespace CyberX8_RT.Modules.EFEM
 
             if(_targetModule == ModuleName.EFEM)
             {
-                Runner.Run(HomeStep.SetHomeSpeed,            SetHomeSpeed,           IsStepComplete,         _delay_5s)
+                Runner.Run(HomeStep.PowerOn, PowerOn, IsStepComplete, _delay_5s)
+                    .Run(HomeStep.SetHomeSpeed,            SetHomeSpeed,           IsStepComplete,         _delay_5s)
                     .Run(HomeStep.HomeAll,          HomeAll,   IsStepComplete, _homeTimeout)
                     //.Run(HomeStep.InitAligner,                     () => { return HomeModule(ModuleName.Aligner1); },IsStepComplete, _homeTimeout)
                     .Run(HomeStep.CheckWaferPresence,      CheckWaferPresence,     VerifyWaferPresence,    _delay_5s)
@@ -94,7 +96,8 @@ namespace CyberX8_RT.Modules.EFEM
             }
             else
             {
-                Runner.Run(HomeModuleStep.SetHomeSpeed, SetHomeSpeed,        IsStepComplete, _delay_5s)
+                Runner.Run(HomeStep.PowerOn, PowerOn, IsStepComplete, _delay_5s)
+                    .Run(HomeModuleStep.SetHomeSpeed, SetHomeSpeed,        IsStepComplete, _delay_5s)
                     .Run(HomeModuleStep.Home,           HomeModule,         IsStepComplete,     _homeTimeout)
                     .Run(HomeModuleStep.SetRobotSpeed,  SetRobotSpeed,      IsStepComplete, _delay_5s)
                     .End(HomeModuleStep.End,        NullFun,            _delay_50ms);
@@ -142,6 +145,11 @@ namespace CyberX8_RT.Modules.EFEM
             return _efem.CheckWaferPresence();
         }
 
+        private bool PowerOn()
+        {
+            return _efem.RobotPowerOn(ModuleName.EfemRobot, true);
+        }
+
         private bool SetHomeSpeed()
         {
             return _efem.SetRobotSpeed(ModuleName.EfemRobot, _homeSpeed);

+ 74 - 11
CyberX8_RT/Modules/PUF/PufOnlyPlaceToLoaderRoutine.cs

@@ -27,11 +27,11 @@ namespace CyberX8_RT.Modules.PUF
             SideConditionRoutineWait,
             RotationGotoLoaderPlaceDown,
             RotationGotoLoaderPlaceDownWait,
-            ChuckOut,
-            CheckChuckOut,
+            FirstPlaceVacuumCheck,
+            FirstPlaceVacuumCheckWait,
+            SecondPlaceVacuumCheck,
+            SecondPlaceVacuumCheckWait,
             VacuumOff,
-            ChuckIn,
-            CheckChuckIn,
             End
         }
         #region 常量 
@@ -48,7 +48,7 @@ namespace CyberX8_RT.Modules.PUF
         private PufVacuum _vacuum;
         private JetAxisBase _loaderCrsAxis;
         private PufWaferPickSubRoutine _pufWaferPickSubRoutine;
-        private PufChuckRoutine _chuckRoutine;
+        private PufPlaceVacuumCheckRoutine _pufPlaceVacuumCheckRoutine;
         #endregion
         /// <summary>
         /// 构造函数
@@ -57,7 +57,6 @@ namespace CyberX8_RT.Modules.PUF
         public PufOnlyPlaceToLoaderRoutine(string module) : base(module)
         {
             _pufWaferPickSubRoutine = new PufWaferPickSubRoutine(module);
-            _chuckRoutine = new PufChuckRoutine(module);
         }
 
         /// <summary>
@@ -86,11 +85,11 @@ namespace CyberX8_RT.Modules.PUF
                .WaitConditionSubRoutine(PlaceStep.SideConditionRoutineWait)
                .Run(PlaceStep.RotationGotoLoaderPlaceDown, () => _rotationAxis.PositionStation("LoaderPutDown"), _delay_1ms)
                .WaitWithStopCondition(PlaceStep.RotationGotoLoaderPlaceDownWait, CheckRotationPositionStatus, CheckRotationPositionRunStop)
-               .Run(PlaceStep.ChuckOut, () => { return _chuckRoutine.Start(true) == RState.Running; }, NullFun, 100)
-               .WaitWithStopCondition(PlaceStep.CheckChuckOut, () => CommonFunction.CheckRoutineEndState(_chuckRoutine), () => CommonFunction.CheckRoutineStopState(_chuckRoutine))
-               .Run(PlaceStep.VacuumOff, VacuumOff, CheckWaferAbsent,_delay_5s)
-               .Run(PlaceStep.ChuckIn, () => { return _chuckRoutine.Start(false) == RState.Running; }, NullFun, 100)
-               .WaitWithStopCondition(PlaceStep.CheckChuckIn, () => CommonFunction.CheckRoutineEndState(_chuckRoutine), () => CommonFunction.CheckRoutineStopState(_chuckRoutine))
+               .Run(PlaceStep.FirstPlaceVacuumCheck, () => StartPlaceVacuumCheckRoutine(false, 1), _delay_1ms)
+               .WaitWithStopCondition(PlaceStep.FirstPlaceVacuumCheckWait, CheckFirstPlaceVacuumCheckRoutineStatus, () => { return false; })
+               .Run(PlaceStep.SecondPlaceVacuumCheck, StartSecondPlaceVacuumCheckRoutine, _delay_1ms)
+               .WaitWithStopCondition(PlaceStep.SecondPlaceVacuumCheckWait, CheckPlaceVacuumCheckRoutineEndStatus, CheckSecondPlaceVacuumCheckRoutineStopStatus)
+               .Run(PlaceStep.VacuumOff, VacuumOff, _delay_1ms)
                .End(PlaceStep.End, NullFun, _delay_1ms);
             return Runner.Status;
         }
@@ -196,6 +195,69 @@ namespace CyberX8_RT.Modules.PUF
             return _rotationAxis.Status == RState.Failed;
         }
         /// <summary>
+        /// 启动Place Vacuum Check routine
+        /// </summary>
+        /// <returns></returns>
+        private bool StartPlaceVacuumCheckRoutine(bool showError, int times)
+        {
+            return _pufPlaceVacuumCheckRoutine.Start(_side, showError, times) == RState.Running;
+        }
+        /// <summary>
+        ///  检验第一次Place Vacuum Check routine运行情况
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckFirstPlaceVacuumCheckRoutineStatus()
+        {
+            RState rsState = _pufPlaceVacuumCheckRoutine.Monitor();
+            if (rsState == RState.End)
+            {
+                return true;
+            }
+            if (rsState == RState.Failed || rsState == RState.Timeout)
+            {
+                _isSecondPlaceVacuumCheck = true;
+                return true;
+            }
+            return false;
+        }
+        /// <summary>
+        /// 启动Place Vacuum Check routine完成状态
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckPlaceVacuumCheckRoutineEndStatus()
+        {
+            RState rsState = _pufPlaceVacuumCheckRoutine.Monitor();
+            return rsState == RState.End;
+        }
+        /// <summary>
+        /// 启动第二次Place Vacuum Check routine
+        /// </summary>
+        /// <returns></returns>
+        private bool StartSecondPlaceVacuumCheckRoutine()
+        {
+            if (_isSecondPlaceVacuumCheck)
+            {
+                return StartPlaceVacuumCheckRoutine(true, 2);
+            }
+            else
+            {
+                return true;
+            }
+        }
+        /// <summary>
+        /// 检验第二次Place Vacuum Check routine错误状态
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckSecondPlaceVacuumCheckRoutineStopStatus()
+        {
+            RState rState = _pufPlaceVacuumCheckRoutine.Monitor();
+            if (rState == RState.Failed || rState == RState.Timeout)
+            {
+                return true;
+            }
+            return false;
+        }
+        /// <summary>
         /// 关闭Vacuum
         /// </summary>
         /// <returns></returns>
@@ -243,6 +305,7 @@ namespace CyberX8_RT.Modules.PUF
             _vacuum = DEVICE.GetDevice<PufVacuum>($"{Module}.Vacuum");
             GetCrsAxis();
             _isSecondPlaceVacuumCheck = false;
+            _pufPlaceVacuumCheckRoutine = new PufPlaceVacuumCheckRoutine(Module);
             return Runner.Start(Module, "Start Place To Loader");
         }
         /// <summary>

+ 8 - 37
CyberX8_RT/Modules/PUF/PufPlaceVacuumCheckRoutine.cs

@@ -10,6 +10,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using MECF.Framework.Common.Utilities;
 
 namespace CyberX8_RT.Modules.PUF
 {
@@ -20,8 +21,8 @@ namespace CyberX8_RT.Modules.PUF
             VerticalGotoLoaderPlaceDown,
             VerticalGotoLoaderPlaceDownWait,
             VacuumOff,
-            StickDistance,
-            StickDistanceWait,
+            ChuckIn,
+            CheckChuckIn,
             VacuumOn,
             Delay,
             VacuumCheck,
@@ -35,9 +36,8 @@ namespace CyberX8_RT.Modules.PUF
         #endregion
 
         #region 内部变量
-        private JetAxisBase _verticalAxis;
-        private PufDistanceSensor _distanceSensor;
         private PufVacuum _vacuum;
+        private PufChuckRoutine _chuckRoutine;
         private string _side = "SideA";
         /// <summary>
         /// 是否显示Routine错误
@@ -64,6 +64,7 @@ namespace CyberX8_RT.Modules.PUF
         public PufPlaceVacuumCheckRoutine(string module) : base(module)
         {
             _isSimulator = SC.GetValue<bool>("System.IsSimulatorMode");
+            _chuckRoutine = new PufChuckRoutine(module);
         }
 
         /// <summary>
@@ -79,43 +80,15 @@ namespace CyberX8_RT.Modules.PUF
         /// <returns></returns>
         public RState Monitor()
         {
-            Runner.Run(PlaceVacuumStep.VerticalGotoLoaderPlaceDown, () => _verticalAxis.PositionStation("LoaderPutDown"), _delay_1ms)
-                .WaitWithStopCondition(PlaceVacuumStep.VerticalGotoLoaderPlaceDownWait, CheckVerticalPositionStatus, CheckVerticalPositionRunStop)
-                .Run(PlaceVacuumStep.VacuumOff, VacuumOff, _delay_1ms)
-                .Run(PlaceVacuumStep.StickDistance, StickDistance, 100)
-                .WaitWithStopCondition(PlaceVacuumStep.StickDistanceWait, CheckVerticalPositionStatus, CheckVerticalPositionRunStop)
+            Runner.Run(PlaceVacuumStep.VacuumOff, VacuumOff, _delay_1ms)
+                 .Run(PlaceVacuumStep.ChuckIn, () => { return _chuckRoutine.Start(false) == RState.Running; }, NullFun, 100)
+                .WaitWithStopCondition(PlaceVacuumStep.CheckChuckIn, () => CommonFunction.CheckRoutineEndState(_chuckRoutine), () => CommonFunction.CheckRoutineStopState(_chuckRoutine))
                 .Run(PlaceVacuumStep.VacuumOn, VacuumOn, _delay_1ms)
                 .Delay(PlaceVacuumStep.Delay, _chuckValveSwitchingTimeDelayInMilliSeconds)
                 .Run(PlaceVacuumStep.VacuumCheck, CheckWaferPresent,NullFun, _delay_1ms,_showError)
                 .End(PlaceVacuumStep.End, NullFun, _delay_1ms);
             return Runner.Status;                 
         }
-
-        /// <summary>
-        /// Stick Distance
-        /// </summary>
-        /// <returns></returns>
-        private bool StickDistance()
-        {
-            return _distanceSensor.GotoStickDistance();
-        }
-
-        /// <summary>
-        /// 检验Vertical移动状态
-        /// </summary>
-        /// <returns></returns>
-        private bool CheckVerticalPositionStatus()
-        {
-            return _verticalAxis.Status == RState.End;
-        }
-        /// <summary>
-        /// 检验Vertical是否还在运动
-        /// </summary>
-        /// <returns></returns>
-        private bool CheckVerticalPositionRunStop()
-        {
-            return _verticalAxis.Status == RState.Failed;
-        }
         /// <summary>
         /// 关闭Vacuum
         /// </summary>
@@ -182,9 +155,7 @@ namespace CyberX8_RT.Modules.PUF
             _side = objs[0].ToString();
             _showError = objs.Length > 1 ? (bool)objs[1] : true;
             _times = objs.Length > 2 ? (int)objs[2] : 1;
-            _verticalAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Vertical");
             _vacuum = DEVICE.GetDevice<PufVacuum>($"{Module}.Vacuum");
-            _distanceSensor = DEVICE.GetDevice<PufDistanceSensor>($"{Module}.DistanceSensor");
             _chuckValveSwitchingTimeDelayInMilliSeconds = SC.GetValue<int>($"{Module}.ChuckValveSwitchingTimeDelayInMilliSeconds");
             return Runner.Start(Module, $"Start {_times} Place Vacuum Check");
         }

+ 0 - 13
CyberX8_RT/Modules/PUF/PufSwapRoutine.cs

@@ -165,19 +165,6 @@ namespace CyberX8_RT.Modules.PUF
             return result;
         }
         /// <summary>
-        /// Stick Distance
-        /// </summary>
-        /// <returns></returns>
-        private bool StickDistance()
-        {
-            bool result= _distanceSensor.GotoStickDistance();
-            if(!result)
-            {
-                NotifyError(eEvent.ERR_PUF, "goto stick distance failed", 0);
-            }
-            return result;
-        }
-        /// <summary>
         /// Stick Distance检验结果
         /// </summary>
         /// <returns></returns>

+ 2 - 0
Framework/Common/Device/Galil/GalilAxisConfig.cs

@@ -16,6 +16,8 @@ namespace MECF.Framework.Common.Device.Galil
         public int Index { get; set; }
         [XmlAttribute(AttributeName = "Type", Form = XmlSchemaForm.Unqualified, DataType = "string")]
         public string Type { get; set; }
+        [XmlAttribute(AttributeName = "CNType", Form = XmlSchemaForm.Unqualified, DataType = "int")]
+        public int CNType { get; set; }
 
         public int Speed { get; set; }
 

+ 48 - 7
Framework/Common/Device/Galil/GalilControllerCfgManager.cs

@@ -130,13 +130,13 @@ namespace MECF.Framework.Common.Device.Galil
             }
             if (lst.Count > 0)
             {
-                _moduleNameLstDictionary[deviceConfig.Module] = lst;
-                _axisArray = new char[maxIndex+1];
-                int a = 'A';
-                for(int i = 0; i < _axisArray.Length; i++)
-                {
-                    _axisArray[i] = (char)(a + i);
-                }
+                _moduleNameLstDictionary[deviceConfig.Module] = lst;                
+            }
+            _axisArray = new char[10];
+            int a = 'A';
+            for (int i = 0; i < _axisArray.Length; i++)
+            {
+                _axisArray[i] = (char)(a + i);
             }
         }
         /// <summary>
@@ -227,6 +227,47 @@ namespace MECF.Framework.Common.Device.Galil
         /// <param name="variable"></param>
         /// <param name="value"></param>
         /// <returns></returns>
+        public bool SetSystemCommand(string module, string name, string commad, object value)
+        {
+            if (!_moduleGalilTcpDeviceDictionary.ContainsKey(module))
+            {
+                LOG.WriteLog(eEvent.ERR_GALIL, module, $"{module} does not have tcp device");
+                return false;
+            }
+            string str = $"{module}.{name}";
+            if (_moduleNameIndexDictionary.ContainsKey(str))
+            {
+                int index = _moduleNameIndexDictionary[str];
+                if (index >= _axisArray.Length)
+                {
+                    LOG.WriteLog(eEvent.ERR_GALIL, module, $"{str} is not matched with index");
+                    return false;
+                }
+                string strCommand = "";
+                if (value != null)
+                {
+                    strCommand = $"{commad}{value};";
+                }
+                else
+                {
+                    strCommand = $"{commad};";
+                }
+                return _moduleGalilTcpDeviceDictionary[module].SetGalilCommand(strCommand);
+            }
+            else
+            {
+                LOG.WriteLog(eEvent.ERR_GALIL, module, $"{str} is not matched with index");
+                return false;
+            }
+        }
+        /// <summary>
+        /// 设置
+        /// </summary>
+        /// <param name="module"></param>
+        /// <param name="name"></param>
+        /// <param name="variable"></param>
+        /// <param name="value"></param>
+        /// <returns></returns>
         public bool SetAxisCommand(string module, string name,string commad, object value) 
         {
             if (!_moduleGalilTcpDeviceDictionary.ContainsKey(module))