Browse Source

Add SRD UnloaderRoutine、ChuckATMRoutine; Modify EfemView;

niuyx 2 weeks ago
parent
commit
69d4e6919b

+ 33 - 33
CyberX8_MainPages/Views/EfemView.xaml

@@ -325,7 +325,7 @@
                     </StackPanel>
                 </Border>
 
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="3" Padding="5,1,0,1">
+                <!--<Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="3" Padding="5,1,0,1">
                     <TextBlock Text="Carrier ID" TextWrapping="Wrap" Foreground="{DynamicResource FG_Black}" FontSize="12" FontFamily="Arial" VerticalAlignment="Center"/>
                 </Border>
                 <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,0,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="3" Grid.Column="1" Padding="5,1">
@@ -337,20 +337,20 @@
                         <Button IsEnabled="{Binding RtDataValues[LP1.CassettePlaced]}" Content="WriteID " Width="80" Height="25" Margin="10,0" Command="{Binding LP1WriteIDCommand}" CommandParameter="LP1"/>
                         <TextBox IsEnabled="{Binding RtDataValues[LP1.CassettePlaced]}" Text="{Binding SetLP1IDValue, Mode=TwoWay}" Width="80" Height="25" VerticalContentAlignment="Center" HorizontalContentAlignment="Center"  FontSize="15"/>
                     </StackPanel>
-                </Border>
+                </Border>-->
 
 
 
 
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="4" Padding="5,1,0,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="3" Padding="5,1,0,1">
                     <TextBlock Text="Is Clamped" TextWrapping="Wrap" Foreground="{DynamicResource FG_Black}" FontSize="12" FontFamily="Arial" VerticalAlignment="Center" />
                 </Border>
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,0,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="4" Grid.Column="1" Padding="5,1,0,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,0,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="3" Grid.Column="1" Padding="5,1,0,1">
                     <!--<deviceControl:AITSensor Margin="5,0" GreenColor="True" LightOnValue="{Binding IsLP1Clamped}"></deviceControl:AITSensor>-->
                     <TextBlock Text="{Binding RtDataValues[LP1.IsClamped]}" TextAlignment="Center"/>
 
                 </Border>
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="4" Grid.Column="2" Padding="5,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="3" Grid.Column="2" Padding="5,1">
                     <StackPanel   Orientation="Horizontal">
                         <!--<Button IsEnabled="{Binding IsLP1ClampEnable}" Margin="10,0"  Content="Clamp" Width="80" Height="25" Command="{Binding LPClampCommand}" CommandParameter="LP1"/>-->
                         <!--<Button IsEnabled="{Binding IsLP1UnclampEnable}" Margin="10,0" Content="Unclamp" Width="80" Height="25" Command="{Binding LPUnClampCommand}" CommandParameter="LP1"/>-->
@@ -358,27 +358,27 @@
                 </Border>
 
 
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="5" Padding="5,1,0,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="4" Padding="5,1,0,1">
                     <TextBlock Text="Is Docked" TextWrapping="Wrap" Foreground="{DynamicResource FG_Black}" FontSize="12" FontFamily="Arial" VerticalAlignment="Center" />
                 </Border>
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,0,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="5" Grid.Column="1" Padding="5,1,0,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,0,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="4" Grid.Column="1" Padding="5,1,0,1">
                     <!--<deviceControl:AITSensor Margin="5,0" GreenColor="True" LightOnValue="{Binding IsLP1Docked}"></deviceControl:AITSensor>-->
                     <TextBlock Text="{Binding RtDataValues[LP1.IsDocked]}" TextAlignment="Center"/>
                 </Border>
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="5" Grid.Column="2" Padding="5,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="4" Grid.Column="2" Padding="5,1">
                     <StackPanel Orientation="Horizontal">                        
                     </StackPanel>
                 </Border>
 
 
 
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="6" Padding="5,1,0,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="5" Padding="5,1,0,1">
                     <TextBlock Text="Is Door Open" TextWrapping="Wrap" Foreground="{DynamicResource FG_Black}" FontSize="12" FontFamily="Arial" VerticalAlignment="Center" />
                 </Border>
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,0,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="6" Grid.Column="1" Padding="5,1,0,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,0,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="5" Grid.Column="1" Padding="5,1,0,1">
                     <TextBlock Text="{Binding RtDataValues[LP1.IsDoorOpened]}" TextAlignment="Center"/>
                 </Border>
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="6" Grid.Column="2" Padding="5,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="5" Grid.Column="2" Padding="5,1">
                     <StackPanel Orientation="Horizontal">
                         
                     </StackPanel>
@@ -442,7 +442,7 @@
                     </StackPanel>
                 </Border>
 
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="3" Padding="5,1,0,1">
+                <!--<Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="3" Padding="5,1,0,1">
                     <TextBlock Text="Carrier ID" TextWrapping="Wrap" Foreground="{DynamicResource FG_Black}" FontSize="12" FontFamily="Arial" VerticalAlignment="Center"/>
                 </Border>
                 <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,0,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="3" Grid.Column="1" Padding="5,1">
@@ -454,20 +454,20 @@
                         <Button IsEnabled="{Binding RtDataValues[LP2.CassettePlaced]}" Content="WriteID " Width="80" Height="25" Margin="10,0" Command="{Binding LP2WriteIDCommand}" CommandParameter="LP2"/>
                         <TextBox IsEnabled="{Binding RtDataValues[LP2.CassettePlaced]}" Text="{Binding SetLP2IDValue, Mode=TwoWay}" Width="80" Height="25" VerticalContentAlignment="Center" HorizontalContentAlignment="Center"  FontSize="15"/>
                     </StackPanel>
-                </Border>
+                </Border>-->
 
 
 
 
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="4" Padding="5,1,0,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="3" Padding="5,1,0,1">
                     <TextBlock Text="Is Clamped" TextWrapping="Wrap" Foreground="{DynamicResource FG_Black}" FontSize="12" FontFamily="Arial" VerticalAlignment="Center" />
                 </Border>
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,0,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="4" Grid.Column="1" Padding="5,1,0,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,0,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="3" Grid.Column="1" Padding="5,1,0,1">
                     <!--<deviceControl:AITSensor Margin="5,0" GreenColor="True" LightOnValue="{Binding IsLP1Clamped}"></deviceControl:AITSensor>-->
                     <TextBlock Text="{Binding RtDataValues[LP2.IsClamped]}" TextAlignment="Center"/>
 
                 </Border>
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="4" Grid.Column="2" Padding="5,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="3" Grid.Column="2" Padding="5,1">
                     <StackPanel   Orientation="Horizontal"  >
                         <!--<Button IsEnabled="{Binding IsLP1ClampEnable}" Margin="10,0"  Content="Clamp" Width="80" Height="25" Command="{Binding LPClampCommand}" CommandParameter="LP2"/>
                         <Button IsEnabled="{Binding IsLP1UnclampEnable}" Margin="10,0" Content="Unclamp" Width="80" Height="25" Command="{Binding LPUnClampCommand}" CommandParameter="LP2"/>-->
@@ -475,15 +475,15 @@
                 </Border>
 
 
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="5" Padding="5,1,0,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="4" Padding="5,1,0,1">
                     <TextBlock Text="Is Docked" TextWrapping="Wrap" Foreground="{DynamicResource FG_Black}" FontSize="12" FontFamily="Arial" VerticalAlignment="Center" />
                 </Border>
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,0,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="5" Grid.Column="1" Padding="5,1,0,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,0,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="4" Grid.Column="1" Padding="5,1,0,1">
                     <!--<deviceControl:AITSensor Margin="5,0" GreenColor="True" LightOnValue="{Binding IsLP1Docked}"></deviceControl:AITSensor>-->
                     <TextBlock Text="{Binding RtDataValues[LP2.IsDocked]}" TextAlignment="Center"/>
 
                 </Border>
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="5" Grid.Column="2" Padding="5,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="4" Grid.Column="2" Padding="5,1">
                     <StackPanel Orientation="Horizontal">
                         <!--<Button IsEnabled="{Binding IsLP1DockEnable}" Margin="10,0"  Content="Dock" Width="80" Height="25" Command="{Binding LPDockCommand}" CommandParameter="LP2">
 
@@ -496,13 +496,13 @@
 
 
 
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="6" Padding="5,1,0,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="5" Padding="5,1,0,1">
                     <TextBlock Text="Is Door Open" TextWrapping="Wrap" Foreground="{DynamicResource FG_Black}" FontSize="12" FontFamily="Arial" VerticalAlignment="Center" />
                 </Border>
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,0,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="6" Grid.Column="1" Padding="5,1,0,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,0,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="5" Grid.Column="1" Padding="5,1,0,1">
                     <TextBlock Text="{Binding RtDataValues[LP2.IsDoorOpened]}" TextAlignment="Center"/>
                 </Border>
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="6" Grid.Column="2" Padding="5,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="5" Grid.Column="2" Padding="5,1">
                     <StackPanel Orientation="Horizontal">
                         <!--<TextBox IsEnabled="{Binding RtDataValues[LP2.CassettePlaced]}" Margin="10,0" Text="{Binding SetLP2CycleValue, Mode=TwoWay}" Width="80" Height="25" VerticalContentAlignment="Center" HorizontalContentAlignment="Center"  FontSize="15"/>
                         <Button IsEnabled="{Binding RtDataValues[LP2.CassettePlaced]}" Content="Cycle Load/Unload " Width="150" Height="25" Margin="10,0" Command="{Binding LP2CycleCommand}" CommandParameter="LP2"/>-->
@@ -567,7 +567,7 @@
                     </StackPanel>
                 </Border>
 
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="3" Padding="5,1,0,1">
+                <!--<Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="3" Padding="5,1,0,1">
                     <TextBlock Text="Carrier ID" TextWrapping="Wrap" Foreground="{DynamicResource FG_Black}" FontSize="12" FontFamily="Arial" VerticalAlignment="Center"/>
                 </Border>
                 <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,0,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="3" Grid.Column="1" Padding="5,1">
@@ -579,20 +579,20 @@
                         <Button IsEnabled="{Binding RtDataValues[LP3.CassettePlaced]}" Content="WriteID " Width="80" Height="25" Margin="10,0" Command="{Binding LP3WriteIDCommand}" CommandParameter="LP3"/>
                         <TextBox IsEnabled="{Binding RtDataValues[LP3.CassettePlaced]}" Text="{Binding SetLP3IDValue, Mode=TwoWay}" Width="80" Height="25" VerticalContentAlignment="Center" HorizontalContentAlignment="Center"  FontSize="15"/>
                     </StackPanel>
-                </Border>
+                </Border>-->
 
 
 
 
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="4" Padding="5,1,0,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="3" Padding="5,1,0,1">
                     <TextBlock Text="Is Clamped" TextWrapping="Wrap" Foreground="{DynamicResource FG_Black}" FontSize="12" FontFamily="Arial" VerticalAlignment="Center" />
                 </Border>
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,0,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="4" Grid.Column="1" Padding="5,1,0,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,0,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="3" Grid.Column="1" Padding="5,1,0,1">
                     <!--<deviceControl:AITSensor Margin="5,0" GreenColor="True" LightOnValue="{Binding IsLP1Clamped}"></deviceControl:AITSensor>-->
                     <TextBlock Text="{Binding RtDataValues[LP3.IsClamped]}" TextAlignment="Center"/>
 
                 </Border>
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="4" Grid.Column="2" Padding="5,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="3" Grid.Column="2" Padding="5,1">
                     <StackPanel   Orientation="Horizontal"  >
                         <!--<Button IsEnabled="{Binding IsLP1ClampEnable}" Margin="10,0"  Content="Clamp" Width="80" Height="25" Command="{Binding LPClampCommand}" CommandParameter="LP3"/>
                         <Button IsEnabled="{Binding IsLP1UnclampEnable}" Margin="10,0" Content="Unclamp" Width="80" Height="25" Command="{Binding LPUnClampCommand}" CommandParameter="LP3"/>-->
@@ -600,15 +600,15 @@
                 </Border>
 
 
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="5" Padding="5,1,0,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="4" Padding="5,1,0,1">
                     <TextBlock Text="Is Docked" TextWrapping="Wrap" Foreground="{DynamicResource FG_Black}" FontSize="12" FontFamily="Arial" VerticalAlignment="Center" />
                 </Border>
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,0,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="5" Grid.Column="1" Padding="5,1,0,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,0,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="4" Grid.Column="1" Padding="5,1,0,1">
                     <!--<deviceControl:AITSensor Margin="5,0" GreenColor="True" LightOnValue="{Binding IsLP1Docked}"></deviceControl:AITSensor>-->
                     <TextBlock Text="{Binding RtDataValues[LP3.IsDocked]}" TextAlignment="Center"/>
 
                 </Border>
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="5" Grid.Column="2" Padding="5,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="4" Grid.Column="2" Padding="5,1">
                     <StackPanel Orientation="Horizontal">
                         <!--<Button IsEnabled="{Binding IsLP1DockEnable}" Margin="10,0"  Content="Dock" Width="80" Height="25" Command="{Binding LPDockCommand}" CommandParameter="LP3"/>
                         <Button IsEnabled="{Binding IsLP1UndockEnable}" Margin="10,0" Content="Undock" Width="80" Height="25" Command="{Binding LPUnDockCommand}" CommandParameter="LP3"/>-->
@@ -617,13 +617,13 @@
 
 
 
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="6" Padding="5,1,0,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="5" Padding="5,1,0,1">
                     <TextBlock Text="Is Door Open" TextWrapping="Wrap" Foreground="{DynamicResource FG_Black}" FontSize="12" FontFamily="Arial" VerticalAlignment="Center" />
                 </Border>
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,0,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="6" Grid.Column="1" Padding="5,1,0,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,0,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="5" Grid.Column="1" Padding="5,1,0,1">
                     <TextBlock Text="{Binding RtDataValues[LP3.IsDoorOpened]}" TextAlignment="Center"/>
                 </Border>
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="6" Grid.Column="2" Padding="5,1">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="5" Grid.Column="2" Padding="5,1">
                     <StackPanel Orientation="Horizontal">
                         <!--<TextBox IsEnabled="{Binding RtDataValues[LP3.CassettePlaced]}" Margin="10,0" Text="{Binding SetLP3CycleValue, Mode=TwoWay}" Width="80" Height="25" VerticalContentAlignment="Center" HorizontalContentAlignment="Center"  FontSize="15"/>
                         <Button IsEnabled="{Binding RtDataValues[LP3.CassettePlaced]}" Content="Cycle Load/Unload " Width="150" Height="25" Margin="10,0" Command="{Binding LP3CycleCommand}" CommandParameter="LP3"/>-->

+ 9 - 1
CyberX8_RT/Config/Devices/ModuleIOCfg.xml

@@ -191,13 +191,17 @@
 	<IO Name="SRD1.ChuckVacuumOK" IOName="r_SRD1_CHUCK_VAC_OK"/>	
 	<IO Name="SRD1.WaferPresent" IOName="r_SRD1_WAFER_PRESENT"/>	
 	<IO Name="SRD1.LiftUp" IOName="c_SRD1_LIFT_UP"/>
-	<IO Name="SRD1.LiftUpStatus" IOName="r_SRD1_LIFT_UP"/>			
+	<IO Name="SRD1.LiftUpStatus" IOName="r_SRD1_LIFT_UP"/>
+	<IO Name="SRD1.Flipper1Out100Status" IOName="r_SRD1_100_FLIPPER1_OUT"/>
+	<IO Name="SRD1.Flipper2Out100Status" IOName="r_SRD1_100_FLIPPER2_OUT"/>
+	<IO Name="SRD1.Flipper3Out100Status" IOName="r_SRD1_100_FLIPPER3_OUT"/>
 	<IO Name="SRD1.Flipper1Out150Status" IOName="r_SRD1_150_FLIPPER1_OUT"/>
 	<IO Name="SRD1.Flipper2Out150Status" IOName="r_SRD1_150_FLIPPER2_OUT"/>
 	<IO Name="SRD1.Flipper3Out150Status" IOName="r_SRD1_150_FLIPPER3_OUT"/>
 	<IO Name="SRD1.Flipper1Out200Status" IOName="r_SRD1_200_FLIPPER1_OUT"/>
 	<IO Name="SRD1.Flipper2Out200Status" IOName="r_SRD1_200_FLIPPER2_OUT"/>
 	<IO Name="SRD1.Flipper3Out200Status" IOName="r_SRD1_200_FLIPPER3_OUT"/>
+	<IO Name="SRD1.FlippersIn100" IOName="c_SRD1_100_FLIPPERS_IN"/>
 	<IO Name="SRD1.FlippersIn150" IOName="c_SRD1_150_FLIPPERS_IN"/>
 	<IO Name="SRD1.FlippersIn200" IOName="c_SRD1_200_FLIPPERS_IN"/>
 	<IO Name="SRD1.WaterOn" IOName="c_SRD1_WATER_ON"/>
@@ -222,12 +226,16 @@
 	<IO Name="SRD2.WaferPresent" IOName="r_SRD2_WAFER_PRESENT"/>
 	<IO Name="SRD2.LiftUp" IOName="c_SRD2_LIFT_UP"/>
 	<IO Name="SRD2.LiftUpStatus" IOName="r_SRD2_LIFT_UP"/>
+	<IO Name="SRD2.Flipper1Out100Status" IOName="r_SRD2_100_FLIPPER1_OUT"/>
+	<IO Name="SRD2.Flipper2Out100Status" IOName="r_SRD2_100_FLIPPER2_OUT"/>
+	<IO Name="SRD2.Flipper3Out100Status" IOName="r_SRD2_100_FLIPPER3_OUT"/>
 	<IO Name="SRD2.Flipper1Out150Status" IOName="r_SRD2_150_FLIPPER1_OUT"/>
 	<IO Name="SRD2.Flipper2Out150Status" IOName="r_SRD2_150_FLIPPER2_OUT"/>
 	<IO Name="SRD2.Flipper3Out150Status" IOName="r_SRD2_150_FLIPPER3_OUT"/>
 	<IO Name="SRD2.Flipper1Out200Status" IOName="r_SRD2_200_FLIPPER1_OUT"/>
 	<IO Name="SRD2.Flipper2Out200Status" IOName="r_SRD2_200_FLIPPER2_OUT"/>
 	<IO Name="SRD2.Flipper3Out200Status" IOName="r_SRD2_200_FLIPPER3_OUT"/>
+	<IO Name="SRD2.FlippersIn100" IOName="c_SRD2_100_FLIPPERS_IN"/>
 	<IO Name="SRD2.FlippersIn150" IOName="c_SRD2_150_FLIPPERS_IN"/>
 	<IO Name="SRD2.FlippersIn200" IOName="c_SRD2_200_FLIPPERS_IN"/>
 	<IO Name="SRD2.WaterOn" IOName="c_SRD2_WATER_ON"/>

+ 2 - 2
CyberX8_RT/Config/Devices/WagoControllerCfg-Simulator.xml

@@ -444,7 +444,7 @@
 				<DO Name="c_SRD1_200_FLIPPERS_IN"  Address="514" Invert="true"/>
 				<DO Name="c_SRD1_Shutter_Close"  Address="515" Invert="false"/>
 				<DO Name="c_SRD1_WATER_ON"  Address="516" Invert="false"/>
-				<DO Name="c_SRD1_CHUCK_VACUUM"  Address="517" Invert="false"/>
+				<DO Name="c_SRD1_CHUCK_VACUUM"  Address="517" Invert="true"/>
 				<DO Name="c_SRD1_N2_FLOW_ON" Address="518" Invert="false"/>
 				<DO Name="c_SRD1_CHUCK_ATM_ON"  Address="519" Invert="false"/>
 			</DOGroup>
@@ -454,7 +454,7 @@
 				<DO Name="c_SRD2_200_FLIPPERS_IN"  Address="522" Invert="true"/>
 				<DO Name="c_SRD2_Shutter_Close"  Address="523" Invert="false"/>
 				<DO Name="c_SRD2_WATER_ON"  Address="524" Invert="false"/>
-				<DO Name="c_SRD2_CHUCK_VACUUM"  Address="525" Invert="false"/>
+				<DO Name="c_SRD2_CHUCK_VACUUM"  Address="525" Invert="true"/>
 				<DO Name="c_SRD2_N2_FLOW_ON"  Address="526" Invert="false"/>
 				<DO Name="c_SRD2_CHUCK_ATM_ON"  Address="527" Invert="false"/>
 			</DOGroup>

+ 2 - 2
CyberX8_RT/Config/Devices/WagoControllerCfg.xml

@@ -444,7 +444,7 @@
 				<DO Name="c_SRD1_200_FLIPPERS_IN"  Address="514" Invert="true"/>
 				<DO Name="c_SRD1_Shutter_Close"  Address="515" Invert="false"/>
 				<DO Name="c_SRD1_WATER_ON"  Address="516" Invert="false"/>
-				<DO Name="c_SRD1_CHUCK_VACUUM"  Address="517" Invert="false"/>
+				<DO Name="c_SRD1_CHUCK_VACUUM"  Address="517" Invert="true"/>
 				<DO Name="c_SRD1_N2_FLOW_ON" Address="518" Invert="false"/>
 				<DO Name="c_SRD1_CHUCK_ATM_ON"  Address="519" Invert="false"/>
 			</DOGroup>
@@ -454,7 +454,7 @@
 				<DO Name="c_SRD2_200_FLIPPERS_IN"  Address="522" Invert="true"/>
 				<DO Name="c_SRD2_Shutter_Close"  Address="523" Invert="false"/>
 				<DO Name="c_SRD2_WATER_ON"  Address="524" Invert="false"/>
-				<DO Name="c_SRD2_CHUCK_VACUUM"  Address="525" Invert="false"/>
+				<DO Name="c_SRD2_CHUCK_VACUUM"  Address="525" Invert="true"/>
 				<DO Name="c_SRD2_N2_FLOW_ON"  Address="526" Invert="false"/>
 				<DO Name="c_SRD2_CHUCK_ATM_ON"  Address="527" Invert="false"/>
 			</DOGroup>

+ 2 - 0
CyberX8_RT/CyberX8_RT.csproj

@@ -254,6 +254,7 @@
     <Compile Include="Devices\Safety\SafetyNewAllOnRoutine.cs" />
     <Compile Include="Devices\Safety\SafetyAllOnRoutine.cs" />
     <Compile Include="Devices\Safety\SafetyArmResetRoutine.cs" />
+    <Compile Include="Devices\SRD\SrdCommonChuckATMRoutine.cs" />
     <Compile Include="Devices\SRD\SrdCommonFlipperRoutine.cs" />
     <Compile Include="Devices\SRD\SrdCommonLiftUpRoutine.cs" />
     <Compile Include="Devices\SRD\SRDDeviceTimer.cs" />
@@ -375,6 +376,7 @@
     <Compile Include="Modules\SRD\SRDRunWaferRecipeRoutine.cs" />
     <Compile Include="Modules\SRD\SRDSwitchOffRoutine.cs" />
     <Compile Include="Modules\SRD\SRDSwitchOnRoutine.cs" />
+    <Compile Include="Modules\SRD\SRDUnloaderRoutine.cs" />
     <Compile Include="Modules\SRD\SRDUnloadRoutine.cs" />
     <Compile Include="Modules\SRD\UnloadingStateMachine.cs" />
     <Compile Include="Modules\Transporter\TransporterConflictRoutine.cs" />

+ 78 - 0
CyberX8_RT/Devices/SRD/SrdCommonChuckATMRoutine.cs

@@ -0,0 +1,78 @@
+using Aitex.Core.RT.Device;
+using Aitex.Core.RT.Log;
+using Aitex.Core.RT.Routine;
+using Aitex.Core.RT.SCCore;
+using CyberX8_Core;
+using MECF.Framework.Common.Beckhoff.ModuleIO;
+using MECF.Framework.Common.IOCore;
+using MECF.Framework.Common.Routine;
+
+namespace CyberX8_RT.Devices.SRD
+{
+    public class SrdCommonChuckATMRoutine : RoutineBase, IRoutine
+    {
+        #region 常量 
+        private const string CHUCK_ATM_ON = "ChuckATMOn";
+        #endregion
+        private enum ChuckATMStep
+        {
+            ChuckATMOn,
+            Delay,
+            ChuckATMOff,
+            End
+        }
+        #region 内部变量
+        /// <summary>
+        /// Srd Device
+        /// </summary>
+        private SrdCommonDevice _srdCommon;
+        /// <summary>
+        /// 破真空持续时间
+        /// </summary>
+        private int _duration= 100;
+        #endregion
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        /// <param name="module"></param>
+        public SrdCommonChuckATMRoutine(string module) : base(module)
+        {
+
+        }
+        public void Abort()
+        {
+            Runner.Stop("Manual Abort");
+        }
+
+        public RState Monitor()
+        {
+            Runner.Run(ChuckATMStep.ChuckATMOn, ChuckATMOn, _delay_1ms)
+                .Delay(ChuckATMStep.Delay, _duration)
+                .Run(ChuckATMStep.ChuckATMOff, ChuckATMOff, _delay_1ms)
+                .End(ChuckATMStep.End, NullFun, 100);
+            return Runner.Status;
+        }
+        public RState Start(params object[] objs)
+        {
+            _srdCommon = DEVICE.GetDevice<SrdCommonDevice>($"{Module}.Common");
+            return Runner.Start(Module, "Chuck ATM Click");
+        }
+        /// <summary>
+        /// Chuck ATM On
+        /// </summary>
+        /// <returns></returns>
+        private bool ChuckATMOn()
+        {
+            return _srdCommon.ChuckATMOnAction("", null);
+        }
+        /// <summary>
+        /// Chuck ATM Off
+        /// </summary>
+        /// <returns></returns>
+        private bool ChuckATMOff()
+        {
+            return _srdCommon.ChuckATMOffAction("", null);
+        }
+        
+    }
+}

+ 35 - 0
CyberX8_RT/Devices/SRD/SrdCommonDevice.cs

@@ -40,6 +40,7 @@ namespace CyberX8_RT.Devices.SRD
             LiftUpOff,
             FlippersIn,
             FlippersOut,
+            ChuckATMClick
         }
 
         #region 常量
@@ -63,12 +64,16 @@ namespace CyberX8_RT.Devices.SRD
         private const string WAFER_PRESENT = "WaferPresent";
         private const string LIFT_UP = "LiftUp";
         private const string LIFT_UP_STATUS = "LiftUpStatus";
+        private const string FLIPPER1_OUT_100_STATUS = "Flipper1Out100Status";
+        private const string FLIPPER2_OUT_100_STATUS = "Flipper2Out100Status";
+        private const string FLIPPER3_OUT_100_STATUS = "Flipper3Out100Status";
         private const string FLIPPER1_OUT_150_STATUS = "Flipper1Out150Status";
         private const string FLIPPER2_OUT_150_STATUS = "Flipper2Out150Status";
         private const string FLIPPER3_OUT_150_STATUS = "Flipper3Out150Status";
         private const string FLIPPER1_OUT_200_STATUS = "Flipper1Out200Status";
         private const string FLIPPER2_OUT_200_STATUS = "Flipper2Out200Status";
         private const string FLIPPER3_OUT_200_STATUS = "Flipper3Out200Status";
+        private const string FLIPPERS_IN_100 = "FlippersIn100";
         private const string FLIPPERS_IN_150 = "FlippersIn150";
         private const string FLIPPERS_IN_200 = "FlippersIn200";
         private const string WATER_FLOW = "WaterFlow";
@@ -122,6 +127,10 @@ namespace CyberX8_RT.Devices.SRD
         /// Flippers Routine
         /// </summary>
         private SrdCommonFlipperRoutine _flipperRoutine;
+        /// <summary>
+        /// Chuck ATM Click Routine
+        /// </summary>
+        private SrdCommonChuckATMRoutine _chuckATMRoutine;
         #endregion
 
         #endregion
@@ -183,6 +192,7 @@ namespace CyberX8_RT.Devices.SRD
             _chuckVacuumRoutine = new SrdCommonChuckVacuumRoutine(Module);
             _liftUpRoutine = new SrdCommonLiftUpRoutine(Module);
             _flipperRoutine = new SrdCommonFlipperRoutine(Module);
+            _chuckATMRoutine = new SrdCommonChuckATMRoutine(Module);    
         }
         /// <summary>
         /// 订阅数据
@@ -218,12 +228,16 @@ namespace CyberX8_RT.Devices.SRD
             IOModuleManager.Instance.SubscribeModuleVariable(Module, WAFER_PRESENT, UpdateVariableValue);
             IOModuleManager.Instance.SubscribeModuleVariable(Module, LIFT_UP, UpdateVariableValue);
             IOModuleManager.Instance.SubscribeModuleVariable(Module, LIFT_UP_STATUS, UpdateVariableValue);
+            IOModuleManager.Instance.SubscribeModuleVariable(Module, FLIPPER1_OUT_100_STATUS, UpdateVariableValue);
+            IOModuleManager.Instance.SubscribeModuleVariable(Module, FLIPPER2_OUT_100_STATUS, UpdateVariableValue);
+            IOModuleManager.Instance.SubscribeModuleVariable(Module, FLIPPER3_OUT_100_STATUS, UpdateVariableValue);
             IOModuleManager.Instance.SubscribeModuleVariable(Module, FLIPPER1_OUT_150_STATUS, UpdateVariableValue);
             IOModuleManager.Instance.SubscribeModuleVariable(Module, FLIPPER2_OUT_150_STATUS, UpdateVariableValue);
             IOModuleManager.Instance.SubscribeModuleVariable(Module, FLIPPER3_OUT_150_STATUS, UpdateVariableValue);
             IOModuleManager.Instance.SubscribeModuleVariable(Module, FLIPPER1_OUT_200_STATUS, UpdateVariableValue);
             IOModuleManager.Instance.SubscribeModuleVariable(Module, FLIPPER2_OUT_200_STATUS, UpdateVariableValue);
             IOModuleManager.Instance.SubscribeModuleVariable(Module, FLIPPER3_OUT_200_STATUS, UpdateVariableValue);
+            IOModuleManager.Instance.SubscribeModuleVariable(Module, FLIPPERS_IN_100, UpdateVariableValue);
             IOModuleManager.Instance.SubscribeModuleVariable(Module, FLIPPERS_IN_150, UpdateVariableValue);
             IOModuleManager.Instance.SubscribeModuleVariable(Module, FLIPPERS_IN_200, UpdateVariableValue);
             IOModuleManager.Instance.SubscribeModuleVariable(Module, WATER_FLOW, UpdateVariableValue);
@@ -667,6 +681,25 @@ namespace CyberX8_RT.Devices.SRD
             string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{CHUCK_ATM_ON}");
             return IOModuleManager.Instance.WriteIoValue(ioName, value);
         }
+        /// <summary>
+        /// Chuck ATM Routine
+        /// </summary>
+        /// <param name="cmd"></param>
+        /// <param name="args"></param>
+        /// <returns></returns>
+        public bool ChuckATMAction(string cmd, object[] args)
+        {
+            if (!JudgeRunningState(SrdCommonOperation.ChuckATMClick))
+            {
+                _currentOperation = SrdCommonOperation.ChuckATMClick;
+                _status = _chuckATMRoutine.Start();
+                return _status == RState.Running;
+            }
+            else
+            {
+                return false;
+            }
+        }
         #endregion
 
         #region Water Above 
@@ -859,6 +892,8 @@ namespace CyberX8_RT.Devices.SRD
                 case SrdCommonOperation.FlippersIn:
                 case SrdCommonOperation.FlippersOut:
                     return _flipperRoutine;
+                case SrdCommonOperation.ChuckATMClick:
+                    return _chuckATMRoutine;
                 default:
                     return null;
             }

+ 8 - 0
CyberX8_RT/Devices/SRD/SrdCommonFlipperRoutine.cs

@@ -19,6 +19,7 @@ namespace CyberX8_RT.Devices.SRD
     public class SrdCommonFlipperRoutine : RoutineBase, IRoutine
     {
         #region 常量 
+        private const string FLIPPERS_IN_100 = "FlippersIn100";
         private const string FLIPPERS_IN_150 = "FlippersIn150";
         private const string FLIPPERS_IN_200 = "FlippersIn200";
         #endregion
@@ -80,6 +81,9 @@ namespace CyberX8_RT.Devices.SRD
             string variableName;
             switch (_waferSize)
             {
+                case 100:
+                    variableName = FLIPPERS_IN_100;
+                    break;
                 case 150:
                     variableName = FLIPPERS_IN_150;
                     break;
@@ -102,6 +106,10 @@ namespace CyberX8_RT.Devices.SRD
             bool result = false;
             switch (_waferSize)
             {
+                case 100:
+                    result = _flipperIn ? (!_srdCommon.CommonData.Flipper1Out100Status && !_srdCommon.CommonData.Flipper2Out100Status && !_srdCommon.CommonData.Flipper3Out100Status)
+                        : (_srdCommon.CommonData.Flipper1Out100Status && _srdCommon.CommonData.Flipper2Out100Status && _srdCommon.CommonData.Flipper3Out100Status);
+                    break;
                 case 150:
                     result = _flipperIn ? (!_srdCommon.CommonData.Flipper1Out150Status && !_srdCommon.CommonData.Flipper2Out150Status && !_srdCommon.CommonData.Flipper3Out150Status)
                         : (_srdCommon.CommonData.Flipper1Out150Status && _srdCommon.CommonData.Flipper2Out150Status && _srdCommon.CommonData.Flipper3Out150Status);

+ 12 - 3
CyberX8_RT/Modules/SRD/SRDEntity.cs

@@ -127,6 +127,10 @@ namespace CyberX8_RT.Modules.SRD
         /// </summary>
         private SRDLoaderRoutine _loaderRoutine;
         /// <summary>
+        /// SRD Unloader Routine
+        /// </summary>
+        private SRDUnloaderRoutine _unloaderRoutine;
+        /// <summary>
         /// RecipeCycle
         /// </summary>
         private int _cycle = 0;
@@ -430,6 +434,7 @@ namespace CyberX8_RT.Modules.SRD
             _awcCycleRoutine = new SRDAWCCycleRoutine(Module);
             _processErrorRoutine=new SRDProcessErrorRoutine(Module.ToString());
             _loaderRoutine = new SRDLoaderRoutine(Module.ToString());
+            _unloaderRoutine = new SRDUnloaderRoutine(Module.ToString());
         }
         /// <summary>
         /// 初始化操作
@@ -977,7 +982,7 @@ namespace CyberX8_RT.Modules.SRD
         /// <returns></returns>
         private bool UnloaderWafer(object[] param)
         {
-            return true;
+            return _unloaderRoutine.Start(param) == RState.Running;
         }
         /// <summary>
         /// SRD Unloader Wafer Monitor
@@ -986,8 +991,12 @@ namespace CyberX8_RT.Modules.SRD
         /// <returns></returns>
         private bool UnloaderWaferMonitor(object[] param)
         {
-            
-            return true;
+            RState state = _unloaderRoutine.Monitor();
+            if (state == RState.End || state == RState.Failed || state == RState.Timeout)
+            {
+                return true;
+            }
+            return false;
         }
         #endregion
         public bool Check(int msg, out string reason, params object[] args)

+ 2 - 3
CyberX8_RT/Modules/SRD/SRDLoaderRoutine.cs

@@ -176,9 +176,7 @@ namespace CyberX8_RT.Modules.SRD
             }
             switch (waferInfo.Size)
             {
-                case WaferSize.WS0:
-                    _waferSize = 200;
-                    break;
+               
                 case WaferSize.WS4:
                     _waferSize = 100;
                     break;
@@ -187,6 +185,7 @@ namespace CyberX8_RT.Modules.SRD
                 case WaferSize.WS159:
                     _waferSize = 150;
                     break;
+                case WaferSize.WS0:
                 case WaferSize.WS8:
                     _waferSize = 200;
                     break;

+ 399 - 0
CyberX8_RT/Modules/SRD/SRDUnloaderRoutine.cs

@@ -0,0 +1,399 @@
+using Aitex.Core.RT.Device;
+using Aitex.Core.RT.Log;
+using Aitex.Core.RT.Routine;
+using Aitex.Core.RT.SCCore;
+using CyberX8_Core;
+using CyberX8_RT.Devices.AXIS;
+using CyberX8_RT.Devices.Facilities;
+using CyberX8_RT.Devices.SRD;
+using MECF.Framework.Common.Routine;
+
+namespace CyberX8_RT.Modules.SRD
+{
+    public class SRDUnloaderRoutine : RoutineBase, IRoutine
+    {         
+        private enum SRDUnloaderStep
+        {
+            ChuckVacuumOff,
+            ChuckATMOn,
+            CheckVacuum,
+            LiftUpOn,
+            CheckWaferPresent,
+            OpenDoor,
+            End
+        }
+        #region 常量 
+        private const int RETRY_TIMES = 3;
+        #endregion
+
+        #region 内部变量
+        /// <summary>
+        /// Rotation Axis
+        /// </summary>
+        private JetAxisBase _rotationAxis;
+        /// <summary>
+        /// SRD Common
+        /// </summary>
+        private SrdCommonDevice _srdCommon;
+        /// <summary>
+        /// Total SRD
+        /// </summary>
+        private TotalSRDDevice _totalSRDDevice;
+        /// <summary>
+        /// System Facility
+        /// </summary>
+        private SystemFacilities _systemFacilities;
+        /// <summary>
+        /// 当前WaferSize
+        /// </summary>
+        private int _waferSize = 200;
+        /// <summary>
+        /// 当前Retry次数
+        /// </summary>
+        private int _currentRetryTimes = 0;
+        /// <summary>
+        /// 真空值
+        /// </summary>
+        private int _vacuumOffLimit = 0;
+        #endregion
+
+        #region 属性
+        #endregion
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        /// <param name="module"></param>
+        public SRDUnloaderRoutine(string module) : base(module)
+        {
+
+        }
+        /// <summary>
+        /// 中止
+        /// </summary>
+        public void Abort()
+        {
+            Runner.Stop("SRD Loader Abort");
+        }
+        /// <summary>
+        /// 监控
+        /// </summary>
+        /// <returns></returns>
+        public RState Monitor()
+        {
+            Runner.Run(SRDUnloaderStep.ChuckVacuumOff, ChuckVacuumOff, CheckChuckVacuumOffEndStatus, CheckChuckVacuumOffStopStatus)
+                .Run(SRDUnloaderStep.ChuckATMOn, ChuckATMOn, CheckChuckATMEndStatus, CheckChuckATMStopStatus)
+                .WaitWithStopCondition(SRDUnloaderStep.CheckVacuum, CheckVacuumEndStatus, CheckVacuumStopStatus)
+                .Run(SRDUnloaderStep.LiftUpOn, LiftUpOn, CheckLiftUpOnEndStatus, CheckLiftUpOnStopStatus)
+                .Run(SRDUnloaderStep.CheckWaferPresent, CheckWaferPresent, _delay_1ms)
+                .Run(SRDUnloaderStep.OpenDoor, OpenDoor, CheckDoorOpenedEndStatus, CheckDoorOpenedStopStatus)
+                .End(SRDUnloaderStep.End, NullFun, _delay_1ms);
+            return Runner.Status;
+        }
+        /// <summary>
+        /// 启动
+        /// </summary>
+        /// <param name="objs"></param>
+        /// <returns></returns>
+        public RState Start(params object[] objs)
+        {
+            _srdCommon = DEVICE.GetDevice<SrdCommonDevice>($"{Module}.Common");
+            _totalSRDDevice = DEVICE.GetDevice<TotalSRDDevice>("SRD");
+            _rotationAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Rotation");
+            _systemFacilities = DEVICE.GetDevice<SystemFacilities>("System.Facilities");
+            _vacuumOffLimit = SC.GetValue<int>("SRD.ChuckVacuumOffLimit");
+            if (!CheckPreCondition())
+            {
+                return RState.Failed;
+            }
+            return Runner.Start(Module, "SRD Unloader Start");
+        }
+        /// <summary>
+        /// Check Pre Condition
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckPreCondition()
+        {
+            //Check Rotation Home
+            //if (!_rotationAxis.IsHomed)
+            //{
+            //    NotifyError(eEvent.ERR_SRD, "Rotation is not homed", 0);
+            //    return false;
+            //}
+            //Check LiftUp
+            if (_srdCommon.CommonData.LiftUp)
+            {
+                NotifyError(eEvent.ERR_SRD, "LiftUp is on", 0);
+                return false;
+            }
+            //Check LiftUp Status
+            if (_srdCommon.CommonData.LiftUpStatus)
+            {
+                NotifyError(eEvent.ERR_SRD, "LiftUp sensor is on", 0);
+                return false;
+            }
+            //Check Wafer Present
+            if (!_srdCommon.CommonData.WaferPresent)
+            {
+                NotifyError(eEvent.ERR_SRD, "WaferPresent sensor is off", 0);
+                return false;
+            }
+            //Check LoaderDI
+            if (!_systemFacilities.LoaderDiEnable)
+            {
+                NotifyError(eEvent.ERR_SRD, "Load DI Is Disable", 0);
+                return false;
+            }
+            //Check Vacuum
+            int vacuumOnLimit = SC.GetValue<int>("SRD.ChuckVacuumOnLimit");
+            if (!_srdCommon.CommonData.ChuckVacuum)
+            {
+                if(_srdCommon.CommonData.VacuumValue >= vacuumOnLimit)
+                {
+                    LOG.WriteLog(eEvent.ERR_SRD, Module, $"VacuumValue:{_srdCommon.CommonData.VacuumValue}, VacuumOn Limit:{vacuumOnLimit}");
+                    return false;
+                }              
+            }
+            else
+            {
+                LOG.WriteLog(eEvent.ERR_SRD, Module, $"Chuck Vacuum is off");
+                return false;
+            }
+
+            //Check Flippers
+            if (_srdCommon.CommonData.FlippersIn150 || _srdCommon.CommonData.FlippersIn200) //|| _srdCommon.CommonData.FlippersIn100
+            {
+                NotifyError(eEvent.ERR_SRD, "FlippersIn is on", 0);
+                return false;
+            }
+            if (!_srdCommon.CommonData.Flipper1Out150Status || !_srdCommon.CommonData.Flipper2Out150Status || !_srdCommon.CommonData.Flipper3Out150Status
+                || !_srdCommon.CommonData.Flipper1Out200Status || !_srdCommon.CommonData.Flipper2Out200Status || !_srdCommon.CommonData.Flipper3Out200Status)
+            //|| !_srdCommon.CommonData.Flipper1Out100Status || !_srdCommon.CommonData.Flipper2Out100Status || !_srdCommon.CommonData.Flipper3Out100Status
+            {
+                NotifyError(eEvent.ERR_SRD, "Flippers are at In position", 0);
+                return false;
+            }
+
+            return true;
+        }
+        /// <summary>
+        /// ChuckATMOn
+        /// </summary>
+        /// <returns></returns>
+        private bool ChuckATMOn()
+        {
+            bool result = _srdCommon.ChuckATMAction("", null);
+            if (!result)
+            {
+                NotifyError(eEvent.ERR_SRD, "Chuck ATM Action is failed", 0);
+                return result;
+            }
+            return true;
+        }
+        /// <summary>
+        /// Chuck ATM On End
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckChuckATMEndStatus()
+        {
+            return _srdCommon.Status == RState.End && !_srdCommon.CommonData.ChuckATMOn;
+        }
+        /// <summary>
+        /// Chuck ATM On Stop
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckChuckATMStopStatus()
+        {
+            if (_srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout)
+            {
+                NotifyError(eEvent.ERR_SRD, "Check ChuckATM is failed", 0);
+                return true;
+            }
+            return false;
+        }
+        /// <summary>
+        /// Check Vacuum End
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckVacuumEndStatus()
+        {
+            if(_srdCommon.Status == RState.End && CheckVacuumValue())
+            {
+                return true;
+            }          
+            return false;
+        }
+        /// <summary>
+        /// Check Vacuum Stop
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckVacuumStopStatus()
+        {
+            if (_srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout)
+            {
+                NotifyError(eEvent.ERR_SRD, "Check ChuckATM is failed", 0);
+                return true;
+            }
+            else if (_srdCommon.Status == RState.End)
+            {
+                if (_currentRetryTimes < RETRY_TIMES)
+                {
+                    _currentRetryTimes++;
+                    NotifyError(eEvent.WARN_SRD, $"Current Chuck ATM Retry Times is {_currentRetryTimes}", 0);
+                    _srdCommon.ChuckATMAction("", null);
+                }
+                else
+                {
+                    NotifyError(eEvent.ERR_SRD, $"Chuck ATM Retry Times is over {RETRY_TIMES}. ChuckATM is failed!", 0);
+                    return true;
+                }
+            }
+                    
+            return false;
+        }
+        /// <summary>
+        /// Check Vacuum Value
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckVacuumValue()
+        {
+            if (_srdCommon.CommonData.VacuumValue >= _vacuumOffLimit)
+            {
+                //LOG.WriteLog(eEvent.INFO_SRD, Module, $"VacuumValue:{_srdCommon.CommonData.VacuumValue}, VacuumOn Limit:{_vacuumOffLimit}");
+                return true;
+            }
+            else
+            {
+                LOG.WriteLog(eEvent.WARN_SRD, Module, $"VacuumValue:{_srdCommon.CommonData.VacuumValue}, VacuumOn Limit:{_vacuumOffLimit}");
+                return false;
+            }
+        }
+        /// <summary>
+        /// LiftUpOff
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool LiftUpOn()
+        {
+            bool result = _srdCommon.LiftUpOnAction("", null);
+            if (!result)
+            {
+                NotifyError(eEvent.ERR_SRD, "Lift Up On Action is failed", 0);
+                return result;
+            }
+            return true;
+        }
+        /// <summary>
+        /// 检验LiftUpOff结束状态
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool CheckLiftUpOnEndStatus()
+        {
+            return _srdCommon.Status == RState.End && _srdCommon.CommonData.LiftUpStatus;
+        }
+        /// <summary>
+        /// 检验LiftUpOff结束状态
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool CheckLiftUpOnStopStatus()
+        {
+            if (_srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout)
+            {
+                NotifyError(eEvent.ERR_SRD, "Check LiftUpOn is failed", 0);
+                return true;
+            }
+            return false;
+        }        
+        /// <summary>
+        /// ChuckVacuumOn
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool ChuckVacuumOff()
+        {
+            bool result = _srdCommon.ChuckVacuumOffAction("", null);
+            if (!result)
+            {
+                NotifyError(eEvent.ERR_SRD, "ChuckVacuumOff Action is failed", 0);
+                return result;
+            }
+            return true;
+        }
+        /// <summary>
+        /// 检验ChuckVacuumOn结束状态
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool CheckChuckVacuumOffEndStatus()
+        {
+            return _srdCommon.Status == RState.End && _srdCommon.CommonData.ChuckVacuum;
+        }
+        /// <summary>
+        /// 检验ChuckVacuumOn结束状态
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool CheckChuckVacuumOffStopStatus()
+        {
+            if (_srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout)
+            {
+                NotifyError(eEvent.ERR_SRD, "Check ChuckVacuumOff is failed", 0);
+                return true;
+            }
+            return false;
+        }
+        /// <summary>
+        /// Check WaferPresent
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckWaferPresent()
+        {
+            if (!_srdCommon.CommonData.WaferPresent)
+            {
+                NotifyError(eEvent.ERR_SRD, "WaferPresent sensor is off", 0);
+                return false;
+            }
+            return true;
+        }
+        /// <summary>
+        /// Open Door
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool OpenDoor()
+        {
+            return _srdCommon.DoorOpenAction("", null);
+        }
+        /// <summary>
+        /// 检验DoorOpened
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool CheckDoorOpenedEndStatus()
+        {
+            bool result = _srdCommon.Status == RState.End;
+            if (result)
+            {
+                if (_srdCommon.CommonData.DoorOpened && !_srdCommon.CommonData.DoorClosed)
+                {
+                    return true;
+                }
+                else
+                {
+                    NotifyError(eEvent.ERR_SRD, $"Opened {_srdCommon.CommonData.DoorOpened}&&Closed {_srdCommon.CommonData.DoorClosed}", 0);
+                    return false;
+                }
+            }
+            return false;
+        }
+        /// <summary>
+        /// 检验Door
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckDoorOpenedStopStatus()
+        {
+            return _srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout;
+        }
+    }
+}

+ 2 - 2
CyberX8_Simulator/Devices/WagoSocketSimulator.cs

@@ -264,14 +264,14 @@ namespace CyberX8_Simulator.Devices
             if (DONameIndexDic.ContainsKey("c_SRD1_CHUCK_ATM_ON") && position == DONameIndexDic["c_SRD1_CHUCK_ATM_ON"])
             {
                 value = _doNameWagoDODic["c_SRD1_CHUCK_ATM_ON"].Invert ? !value : value;
-                _srd1currentVacuumValue = value ? 5000 : 15000;
+                _srd1currentVacuumValue = value ? _srd1currentVacuumValue - 8000 : _srd1currentVacuumValue;
                 UpdataAIShorts("r_SRD1_CHUCK_VACUUM_anlg", _srd1currentVacuumValue);
                 
             }
             if (DONameIndexDic.ContainsKey("c_SRD2_CHUCK_ATM_ON") && position == DONameIndexDic["c_SRD2_CHUCK_ATM_ON"])
             {
                 value = _doNameWagoDODic["c_SRD2_CHUCK_ATM_ON"].Invert ? !value : value;
-                _srd2currentVacuumValue = value ? 5000 : 15000;
+                _srd2currentVacuumValue = value ? _srd2currentVacuumValue - 8000 : _srd2currentVacuumValue;
                 UpdataAIShorts("r_SRD2_CHUCK_VACUUM_anlg", _srd2currentVacuumValue);
             }
             //Water

+ 8 - 0
CyberX8_Themes/UserControls/SRDFlipperControl.xaml.cs

@@ -76,6 +76,14 @@ namespace CyberX8_Themes.UserControls
         {
             InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Common.FlipperOut", 200);
         }
+        //private void FlipperIn100_Click(object sender, RoutedEventArgs e)
+        //{
+        //    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Common.FlipperIn", 100);
+        //}
+        //private void FlipperOut100_Click(object sender, RoutedEventArgs e)
+        //{
+        //    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Common.FlipperOut", 100);
+        //}
         #endregion
 
     }

+ 14 - 1
Framework/Common/CommonData/SRD/SrdCommonData.cs

@@ -42,17 +42,26 @@ namespace MECF.Framework.Common.CommonData.SRD
 
         public bool LiftUpStatus { get { return _liftUpStatus; } set { _liftUpStatus = value; InvokePropertyChanged(nameof(LiftUpStatus)); } }
 
+        public bool Flipper1Out100Status { get { return _flipper1Out100Status; } set { _flipper1Out100Status = value; InvokePropertyChanged(nameof(Flipper1Out100Status)); } }
+
+        public bool Flipper2Out100Status { get { return _flipper2Out100Status; } set { _flipper2Out100Status = value; InvokePropertyChanged(nameof(Flipper2Out100Status)); } }
+
+        public bool Flipper3Out100Status { get { return _flipper3Out100Status; } set { _flipper3Out100Status = value; InvokePropertyChanged(nameof(Flipper3Out100Status)); } }
+
         public bool Flipper1Out150Status { get { return _flipper1Out150Status; } set { _flipper1Out150Status = value; InvokePropertyChanged(nameof(Flipper1Out150Status)); } }
 
         public bool Flipper2Out150Status { get { return _flipper2Out150Status; } set { _flipper2Out150Status = value; InvokePropertyChanged(nameof(Flipper2Out150Status)); } }
-
+        
         public bool Flipper3Out150Status { get { return _flipper3Out150Status; } set { _flipper3Out150Status = value; InvokePropertyChanged(nameof(Flipper3Out150Status)); } }
+        
         public bool Flipper1Out200Status { get { return _flipper1Out200Status; } set { _flipper1Out200Status = value; InvokePropertyChanged(nameof(Flipper1Out200Status)); } }
 
         public bool Flipper2Out200Status { get { return _flipper2Out200Status; } set { _flipper2Out200Status = value; InvokePropertyChanged(nameof(Flipper2Out200Status)); } }
 
         public bool Flipper3Out200Status { get { return _flipper3Out200Status; } set { _flipper3Out200Status = value; InvokePropertyChanged(nameof(Flipper3Out200Status)); } }
 
+        public bool FlippersIn100 { get { return _flippersIn100; } set { _flippersIn100 = value; InvokePropertyChanged(nameof(FlippersIn100)); } }
+
         public bool FlippersIn150 { get { return _flippersIn150; } set { _flippersIn150 = value; InvokePropertyChanged(nameof(FlippersIn150)); } }
 
         public bool FlippersIn200 { get { return _flippersIn200; } set { _flippersIn200 = value; InvokePropertyChanged(nameof(FlippersIn200)); } }
@@ -82,12 +91,16 @@ namespace MECF.Framework.Common.CommonData.SRD
         private bool _waferPresent;
         private bool _liftUp;
         private bool _liftUpStatus;
+        private bool _flipper1Out100Status;
+        private bool _flipper2Out100Status;
+        private bool _flipper3Out100Status;
         private bool _flipper1Out150Status;
         private bool _flipper2Out150Status;
         private bool _flipper3Out150Status;
         private bool _flipper1Out200Status;
         private bool _flipper2Out200Status;
         private bool _flipper3Out200Status;
+        private bool _flippersIn100;
         private bool _flippersIn150;
         private bool _flippersIn200;
         private bool _waterOn;