Bläddra i källkod

Modify SRD related Routines; Modify SRD recipes;

niuyx 3 månader sedan
förälder
incheckning
58c7513e6c

+ 3 - 1
CyberX8_Core/RtState.cs

@@ -178,7 +178,9 @@ namespace CyberX8_Core
         AWCCycling,
         AWCHoming,
         Retrying,
-        ConfirmCompleting
+        ConfirmCompleting,
+        Loading,
+        Unloading
     }
 
     public enum PrewetState

+ 26 - 11
CyberX8_MainPages/ViewModels/SRDHomePageViewModel.cs

@@ -11,25 +11,15 @@ using Prism.Mvvm;
 using Prism.Commands;
 using MECF.Framework.Common.CommonData.SRD;
 using MECF.Framework.Common.Persistent.SRD;
-using Aitex.Core.RT.DataCenter;
 using MECF.Framework.Common.CommonData.PUF;
 using MECF.Framework.Common.DataCenter;
 using MECF.Framework.Common.Utilities;
 using MECF.Framework.Common.RecipeCenter;
 using System.Collections.ObjectModel;
 using CyberX8_MainPages.PMs;
-using Aitex.Core.Utilities;
-using CyberX8_Core;
-using System.Windows.Documents;
-using System.Windows;
-using Aitex.Core.Common;
-using Aitex.Core.Util;
-using MECF.Framework.Common.WaferHolder;
-using OpenSEMI.ClientBase;
 using MECF.Framework.Common.Beckhoff.Station;
 using CyberX8_MainPages.Unity;
 using WaferInfo = OpenSEMI.ClientBase.WaferInfo;
-using MECF.Framework.Common.Equipment;
 
 namespace CyberX8_MainPages.ViewModels
 {
@@ -479,7 +469,14 @@ namespace CyberX8_MainPages.ViewModels
         /// SwitchOff Command
         /// </summary>
         public ICommand SwitchOffCommand { get; set; }
-
+        /// <summary>
+        /// Loader Command
+        /// </summary>
+        public ICommand LoaderCommand { get; set; }
+        /// <summary>
+        /// Unloader Command
+        /// </summary>
+        public ICommand UnloaderCommand { get; set; }
         #endregion
 
         /// <summary>
@@ -490,6 +487,8 @@ namespace CyberX8_MainPages.ViewModels
             InitializeCommand = new DelegateCommand<object>(InitializeAction);
             SwitchOnCommand = new DelegateCommand<object>(SwitchOnAction);
             SwitchOffCommand = new DelegateCommand<object>(SwitchOffAction);
+            LoaderCommand = new DelegateCommand<object>(LoaderAction);
+            UnloaderCommand = new DelegateCommand<object>(UnloaderAction);
         }
 
         /// <summary>
@@ -662,6 +661,22 @@ namespace CyberX8_MainPages.ViewModels
         {
             InvokeClient.Instance.Service.DoOperation($"{Module}.SwitchOffAll");
         }
+        /// <summary>
+        /// Loader Action
+        /// </summary>
+        /// <param name="param"></param>
+        private void LoaderAction(object param)
+        {
+            InvokeClient.Instance.Service.DoOperation($"{Module}.Loader");
+        }
+        /// <summary>
+        /// Unloader Action
+        /// </summary>
+        /// <param name="param"></param>
+        private void UnloaderAction(object param)
+        {
+            InvokeClient.Instance.Service.DoOperation($"{Module}.Unloader");
+        }
         #endregion
     }
 }

+ 17 - 11
CyberX8_MainPages/ViewModels/SrdRecipeViewModel.cs

@@ -163,24 +163,30 @@ namespace CyberX8_MainPages.ViewModels
         /// </summary>
         private void InitializeProprtyValidResultDictionary()
         {
-            PropertyValidResultDic["FrontDivertTime"] = false;
-            PropertyValidResultDic["FrontPoolTime"] = false;
-            PropertyValidResultDic["MaxDivertPlusPoolPressure"] = false;
-            PropertyValidResultDic["DivertPlusPoolDelay"] = false;
+            //PropertyValidResultDic["FrontDivertTime"] = false;
+            //PropertyValidResultDic["FrontPoolTime"] = false;
+            //PropertyValidResultDic["MaxDivertPlusPoolPressure"] = false;
+            //PropertyValidResultDic["DivertPlusPoolDelay"] = false;
 
             PropertyValidResultDic["RinseSpeed"] = false;
-            PropertyValidResultDic["FrontRinseTime"] = false;
-            PropertyValidResultDic["BackRinseTime"] = false;
-            PropertyValidResultDic["MaxWashPressure"] = false;
+            PropertyValidResultDic["RinseTime"] = false;
+            //PropertyValidResultDic["FrontRinseTime"] = false;
+            //PropertyValidResultDic["BackRinseTime"] = false;
+            //PropertyValidResultDic["MaxWashPressure"] = false;
             PropertyValidResultDic["FlowCheckDelay"] = false;
 
             PropertyValidResultDic["DrySpeed"] = false;
-            PropertyValidResultDic["PreN2DryTime"] = false;
-            PropertyValidResultDic["BackN2DryTime"] = false;
-            PropertyValidResultDic["PostN2DryTime"] = false;
-            PropertyValidResultDic["ExhaustFanDelay"] = false;
+            PropertyValidResultDic["DryTime"] = false;
+            //PropertyValidResultDic["PreN2DryTime"] = false;
+            //PropertyValidResultDic["BackN2DryTime"] = false;
+            //PropertyValidResultDic["PostN2DryTime"] = false;
+            //PropertyValidResultDic["ExhaustFanDelay"] = false;
 
             PropertyValidResultDic["MinWaterPressure"] = false;
+            PropertyValidResultDic["MaxWaterPressure"] = false;
+            PropertyValidResultDic["MinSRDWaterFlow"] = false;
+            PropertyValidResultDic["MaxSRDWaterFlow"] = false;
+
         }
         /// <summary>
         /// 加载数据

+ 13 - 27
CyberX8_MainPages/Views/SRDHomePageView.xaml

@@ -57,34 +57,20 @@
         </Grid>
         <Grid Grid.Row="3" Grid.Column="3" Margin="0,-50,0,00">
             <Grid.RowDefinitions>
-                <RowDefinition Height="30"></RowDefinition>
-                <RowDefinition Height="100"></RowDefinition>
-                <RowDefinition Height="1*"></RowDefinition>
-                <RowDefinition Height="1*"></RowDefinition>
+                <RowDefinition Height="1*"/>
+                <RowDefinition Height="1*"/>
+                <RowDefinition Height="1*"/>
+                <RowDefinition Height="30"/>
             </Grid.RowDefinitions>
-            <Grid Grid.Row="0">
-               
-            </Grid>
-            <Grid Grid.Row="1">
-                <Grid.ColumnDefinitions>
-                    <ColumnDefinition Width="21*"/>
-                    <ColumnDefinition Width="29*"/>
-                </Grid.ColumnDefinitions>
-              
-            </Grid>
-            <Grid Grid.Row="2"/>
-            <Grid Grid.Row="0">
-                <Grid>
-                    <Grid.ColumnDefinitions>
-                        <ColumnDefinition Width="15"/>
-                        <ColumnDefinition Width="100"/>
-                        <ColumnDefinition Width="100"/>
-                    </Grid.ColumnDefinitions>
-                    <Button Grid.Column="1" Style="{StaticResource SysBtnStyle}" IsEnabled="{Binding IsEnabled}" Height="30" Width="80" HorizontalAlignment="Center" VerticalAlignment="Center"  Content="Switch On" Command="{Binding SwitchOnCommand}"/>
-                    <Button Grid.Column="2" Style="{StaticResource SysBtnStyle}" IsEnabled="{Binding IsEnabled}" Height="30" Width="80" HorizontalAlignment="Center" VerticalAlignment="Center"  Content="Switch Off" Command="{Binding SwitchOffCommand}"/>
-                </Grid>
-                
-            </Grid>
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="15"/>
+                <ColumnDefinition Width="100"/>
+                <ColumnDefinition Width="100"/>
+            </Grid.ColumnDefinitions>
+            <Button Grid.Column="1" Style="{StaticResource SysBtnStyle}" IsEnabled="{Binding IsEnabled}" Height="30" Width="80" HorizontalAlignment="Center" VerticalAlignment="Center"  Content="Switch On" Command="{Binding SwitchOnCommand}"/>
+            <Button Grid.Column="2" Style="{StaticResource SysBtnStyle}" IsEnabled="{Binding IsEnabled}" Height="30" Width="80" HorizontalAlignment="Center" VerticalAlignment="Center"  Content="Switch Off" Command="{Binding SwitchOffCommand}"/>
+            <Button Grid.Row="1" Grid.Column="1" Style="{StaticResource SysBtnStyle}" IsEnabled="{Binding IsEnabled}" Height="30" Width="80" HorizontalAlignment="Center" VerticalAlignment="Center"  Content="Loader" Command="{Binding LoaderCommand}"/>
+            <Button Grid.Row="1" Grid.Column="2" Style="{StaticResource SysBtnStyle}" IsEnabled="{Binding IsEnabled}" Height="30" Width="80" HorizontalAlignment="Center" VerticalAlignment="Center"  Content="Unloader" Command="{Binding UnloaderCommand}"/>
         </Grid>
         <Grid Grid.Row="2" Grid.Column="3" Height="155" VerticalAlignment="Top">
             <UserControls:OperatingModeControl HorizontalAlignment="Left" Margin="10,0,0,0" VerticalAlignment="Top" 

+ 20 - 20
CyberX8_MainPages/Views/SrdRecipeView.xaml

@@ -52,12 +52,7 @@
                             <RowDefinition Height="10"></RowDefinition>
                         </Grid.RowDefinitions>
                         <Grid Grid.Row="0">
-                            <Grid.ColumnDefinitions>
-                                <ColumnDefinition Width="300"></ColumnDefinition>
-                                <ColumnDefinition Width="100"></ColumnDefinition>
-                                <ColumnDefinition/>
-                            </Grid.ColumnDefinitions>
-                            <GroupBox Header="Pre-Rinse" Grid.Column="0" Height="370">
+                            <!--<GroupBox Header="Pre-Rinse" Grid.Column="0" Height="370">
                                 <Grid>
                                     <Grid.RowDefinitions>
                                         <RowDefinition Height="88"/>
@@ -67,10 +62,10 @@
                                     </Grid.RowDefinitions>
                                     <UserControls:GroupTextBoxControl Grid.Row="0" Title="Front Divert Time" Unit="sec" MinValue="0" MaxValue="30" IntValue="{Binding Recipe.FrontDivertTime,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[FrontDivertTime],Mode=TwoWay}" Width="290"/>
                                     <UserControls:GroupTextBoxControl Grid.Row="1" Title="Front Pool Time" Unit="sec" MinValue="0" MaxValue="60" IntValue="{Binding Recipe.FrontPoolTime,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[FrontPoolTime],Mode=TwoWay}" Width="290"/>
-                                    <UserControls:GroupTextBoxControl Grid.Row="2" Title="Max Divert Plus Pool Pressure" Unit="psi" MinValue="0" MaxValue="100" IntValue="{Binding Recipe.MaxDivertPlusPoolPressure,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[MaxDivertPlusPoolPressure],Mode=TwoWay}" Width="290"/>
-                                    <UserControls:GroupTextBoxControl Grid.Row="3" Title="Divert Plus Pool Delay" Unit="sec" MinValue="0" MaxValue="60" IntValue="{Binding Recipe.DivertPlusPoolDelay,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[DivertPlusPoolDelay],Mode=TwoWay}" Width="290"/>
+                                    --><!--<UserControls:GroupTextBoxControl Grid.Row="2" Title="Max Divert Plus Pool Pressure" Unit="psi" MinValue="0" MaxValue="100" IntValue="{Binding Recipe.MaxDivertPlusPoolPressure,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[MaxDivertPlusPoolPressure],Mode=TwoWay}" Width="290"/>-->
+                                    <!--<UserControls:GroupTextBoxControl Grid.Row="3" Title="Divert Plus Pool Delay" Unit="sec" MinValue="0" MaxValue="60" IntValue="{Binding Recipe.DivertPlusPoolDelay,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[DivertPlusPoolDelay],Mode=TwoWay}" Width="290"/>--><!--
                                 </Grid>
-                            </GroupBox>
+                            </GroupBox>-->
                             <GroupBox Header="Rinse" Grid.Column="2">
                                 <Grid>
                                     <Grid.RowDefinitions>
@@ -81,12 +76,17 @@
                                         <RowDefinition Height="85"/>
                                         <RowDefinition/>
                                     </Grid.RowDefinitions>
+                                    <Grid.ColumnDefinitions>
+                                        <ColumnDefinition/>
+                                        <ColumnDefinition/>
+                                    </Grid.ColumnDefinitions>
                                     <UserControls:GroupTextBoxControl Grid.Row="0" Title="Rinse Speed" Unit="rpm" MinValue="0" MaxValue="300" IntValue="{Binding Recipe.RinseSpeed,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[RinseSpeed],Mode=TwoWay}" Width="290"/>
-                                    <UserControls:GroupTextBoxControl Grid.Row="1" Title="Front Rinse Time" Unit="sec" MinValue="0" MaxValue="60" IntValue="{Binding Recipe.FrontRinseTime,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[FrontRinseTime],Mode=TwoWay}" Width="290"/>
-                                    <UserControls:GroupTextBoxControl Grid.Row="2" Title="Back Rinse Time" Unit="sec" MinValue="0" MaxValue="100" IntValue="{Binding Recipe.BackRinseTime,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[BackRinseTime],Mode=TwoWay}" Width="290"/>
-                                    <UserControls:GroupTextBoxControl Grid.Row="3" Title="Max Wash Pressure" Unit="psi" MinValue="0" MaxValue="100" IntValue="{Binding Recipe.MaxWashPressure,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[MaxWashPressure],Mode=TwoWay}" Width="290"/>
-                                    <UserControls:GroupTextBoxControl Grid.Row="4" Title="Flow Check Delay" Unit="sec" MinValue="0" MaxValue="60" IntValue="{Binding Recipe.FlowCheckDelay,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[FlowCheckDelay],Mode=TwoWay}" Width="290"/>
-                                    <UserControls:GroupTextBoxControl Grid.Row="5" Title="Min Pressure" Unit="psi" MinValue="0" MaxValue="100" IntValue="{Binding Recipe.MinWaterPressure,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[MinWaterPressure],Mode=TwoWay}" Width="290" />
+                                    <UserControls:GroupTextBoxControl Grid.Row="1" Title="Rinse Time" Unit="sec" MinValue="0" MaxValue="60" IntValue="{Binding Recipe.RinseTime,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[RinseTime],Mode=TwoWay}" Width="290"/>
+                                    <UserControls:GroupTextBoxControl Grid.Row="0" Grid.Column="1" Title="Max Water Pressure" Unit="psi" MinValue="0" MaxValue="100" IntValue="{Binding Recipe.MaxWaterPressure,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[MaxWaterPressure],Mode=TwoWay}" Width="290"/>
+                                    <UserControls:GroupTextBoxControl Grid.Row="2" Title="Flow Check Delay" Unit="sec" MinValue="0" MaxValue="60" IntValue="{Binding Recipe.FlowCheckDelay,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[FlowCheckDelay],Mode=TwoWay}" Width="290"/>
+                                    <UserControls:GroupTextBoxControl Grid.Row="1" Grid.Column="1" Title="Min Water Pressure" Unit="psi" MinValue="0" MaxValue="100" IntValue="{Binding Recipe.MinWaterPressure,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[MinWaterPressure],Mode=TwoWay}" Width="290" />
+                                    <UserControls:GroupTextBoxControl Grid.Row="2" Grid.Column="1" Title="Max SRD Water Flow" Unit="L/min" MinValue="0" MaxValue="100" IntValue="{Binding Recipe.MaxSRDWaterFlow,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[MaxSRDWaterFlow],Mode=TwoWay}" Width="290" />
+                                    <UserControls:GroupTextBoxControl Grid.Row="3" Grid.Column="1" Title="Min SRD Water Flow" Unit="L/min" MinValue="0" MaxValue="100" IntValue="{Binding Recipe.MinSRDWaterFlow,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[MinSRDWaterFlow],Mode=TwoWay}" Width="290" />
                                 </Grid>
                             </GroupBox>
                         </Grid>
@@ -118,7 +118,7 @@
                     <ColumnDefinition/>
                     <ColumnDefinition Width="90"></ColumnDefinition>
                 </Grid.ColumnDefinitions>
-                <GroupBox Header="Notrogen Dry" Grid.Column="1">
+                <GroupBox Header="Nitrogen Dry" Grid.Column="1">
                     <Grid>
                         <Grid.RowDefinitions>
                             <RowDefinition Height="88"/>
@@ -127,11 +127,11 @@
                             <RowDefinition Height="88"/>
                             <RowDefinition/>
                         </Grid.RowDefinitions>
-                        <UserControls:GroupTextBoxControl Grid.Row="0" Title="Speed" Unit="rpm" MinValue="1" MaxValue="1500" IntValue="{Binding Recipe.DrySpeed,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[DrySpeed],Mode=TwoWay}" Width="290"/>
-                        <UserControls:GroupTextBoxControl Grid.Row="1" Title="Pre-N2 Time" Unit="sec" MinValue="0" MaxValue="60" IntValue="{Binding Recipe.PreN2DryTime,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[PreN2DryTime],Mode=TwoWay}" Width="290"/>
-                        <UserControls:GroupTextBoxControl Grid.Row="2" Title="Dry Time" Unit="sec" MinValue="0" MaxValue="100" IntValue="{Binding Recipe.BackN2DryTime,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[BackN2DryTime],Mode=TwoWay}" Width="290" Loaded="GroupTextBoxControl_Loaded"/>
-                        <UserControls:GroupTextBoxControl Grid.Row="3" Title="Post-N2 Time" Unit="sec" MinValue="0" MaxValue="60" IntValue="{Binding Recipe.PostN2DryTime,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[PostN2DryTime],Mode=TwoWay}" Width="290"/>
-                        <UserControls:GroupTextBoxControl Grid.Row="4" Title="Exhaust Fan Delay" Unit="sec" MinValue="0" MaxValue="60" IntValue="{Binding Recipe.ExhaustFanDelay,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[ExhaustFanDelay],Mode=TwoWay}" Width="290"/>
+                        <UserControls:GroupTextBoxControl Grid.Row="0" Title="Dry Speed" Unit="rpm" MinValue="1" MaxValue="1500" IntValue="{Binding Recipe.DrySpeed,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[DrySpeed],Mode=TwoWay}" Width="290"/>
+                        <!--<UserControls:GroupTextBoxControl Grid.Row="1" Title="Pre-N2 Time" Unit="sec" MinValue="0" MaxValue="60" IntValue="{Binding Recipe.PreN2DryTime,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[PreN2DryTime],Mode=TwoWay}" Width="290"/>-->
+                        <UserControls:GroupTextBoxControl Grid.Row="1" Title="Dry Time" Unit="sec" MinValue="0" MaxValue="100" IntValue="{Binding Recipe.DryTime,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[DryTime],Mode=TwoWay}" Width="290" />
+                        <!--<UserControls:GroupTextBoxControl Grid.Row="3" Title="Post-N2 Time" Unit="sec" MinValue="0" MaxValue="60" IntValue="{Binding Recipe.PostN2DryTime,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[PostN2DryTime],Mode=TwoWay}" Width="290"/>-->
+                        <!--<UserControls:GroupTextBoxControl Grid.Row="4" Title="Exhaust Fan Delay" Unit="sec" MinValue="0" MaxValue="60" IntValue="{Binding Recipe.ExhaustFanDelay,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[ExhaustFanDelay],Mode=TwoWay}" Width="290"/>-->
                     </Grid>
                 </GroupBox>
             </Grid>

+ 0 - 4
CyberX8_MainPages/Views/SrdRecipeView.xaml.cs

@@ -31,9 +31,5 @@ namespace CyberX8_MainPages.Views
             (this.DataContext as SrdRecipeViewModel).LoadRecipeData();
         }
 
-        private void GroupTextBoxControl_Loaded(object sender, RoutedEventArgs e)
-        {
-
-        }
     }
 }

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

@@ -421,10 +421,10 @@
 				<DI Name="r_SRD2_WAFER_PRESENT"  Address="17" Invert="false"/>
 				<DI Name="r_SRD2_LIFT_UP"  Address="18" Invert="true"/>
 				<DI Name="DI19"  Address="19" Invert="true"/>
-				<DI Name="r_SRD2_SHUTTER_OPEN "  Address="20" Invert="false"/>
-				<DI Name="r_SRD2_SHUTTER_CLOSED"  Address="21" Invert="true"/>
+				<DI Name="r_SRD2_SHUTTER_OPEN"  Address="20" Invert="false"/>
+				<DI Name="r_SRD2_SHUTTER_CLOSED"  Address="21" Invert="false"/>
 				<DI Name="r_SRD2_150_FLIPPER1_OUT"  Address="22" Invert="false"/>
-				<DI Name="r_SRD2_150_FLIPPER2_OUT"  Address="23" Invert="true"/>
+				<DI Name="r_SRD2_150_FLIPPER2_OUT"  Address="23" Invert="false"/>
 			</DIGroup>
 			<DIGroup Name="6">
 				<DI Name="r_SRD2_150_FLIPPER3_OUT"  Address="24" Invert="false"/>

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

@@ -421,10 +421,10 @@
 				<DI Name="r_SRD2_WAFER_PRESENT"  Address="17" Invert="false"/>
 				<DI Name="r_SRD2_LIFT_UP"  Address="18" Invert="true"/>
 				<DI Name="DI19"  Address="19" Invert="true"/>
-				<DI Name="r_SRD2_SHUTTER_OPEN "  Address="20" Invert="false"/>
-				<DI Name="r_SRD2_SHUTTER_CLOSED"  Address="21" Invert="true"/>
+				<DI Name="r_SRD2_SHUTTER_OPEN"  Address="20" Invert="false"/>
+				<DI Name="r_SRD2_SHUTTER_CLOSED"  Address="21" Invert="false"/>
 				<DI Name="r_SRD2_150_FLIPPER1_OUT"  Address="22" Invert="false"/>
-				<DI Name="r_SRD2_150_FLIPPER2_OUT"  Address="23" Invert="true"/>
+				<DI Name="r_SRD2_150_FLIPPER2_OUT"  Address="23" Invert="false"/>
 			</DIGroup>
 			<DIGroup Name="6">
 				<DI Name="r_SRD2_150_FLIPPER3_OUT"  Address="24" Invert="false"/>

+ 3 - 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\SrdCommonFlipperRoutine.cs" />
     <Compile Include="Devices\SRD\SrdCommonLiftUpRoutine.cs" />
     <Compile Include="Devices\SRD\SRDDeviceTimer.cs" />
     <Compile Include="Devices\SRD\TotalSRDDevice.cs" />
@@ -360,6 +361,7 @@
     <Compile Include="Modules\Rinse\RinseThirdStepRoutine.cs" />
     <Compile Include="Modules\SRD\SRDAWCCycleRoutine.cs" />
     <Compile Include="Modules\SRD\SRDInitializeHomeRoutine.cs" />
+    <Compile Include="Modules\SRD\SRDLoaderRoutine.cs" />
     <Compile Include="Modules\SRD\SRDLotTrackUtil.cs" />
     <Compile Include="Modules\SRD\SRDPositionRoutine.cs" />
     <Compile Include="Modules\SRD\SRDPresenceTestRoutine.cs" />
@@ -369,6 +371,7 @@
     <Compile Include="Modules\SRD\RunWaferRecipeStateMachine.cs" />
     <Compile Include="Modules\SRD\SRDInitializeRoutine.cs" />
     <Compile Include="Modules\SRD\SRDHomeRoutine.cs" />
+    <Compile Include="Modules\SRD\SRDRunRecipeRoutine.cs" />
     <Compile Include="Modules\SRD\SRDRunWaferRecipeRoutine.cs" />
     <Compile Include="Modules\SRD\SRDSwitchOffRoutine.cs" />
     <Compile Include="Modules\SRD\SRDSwitchOnRoutine.cs" />

+ 41 - 44
CyberX8_RT/Devices/SRD/SrdCommonDevice.cs

@@ -20,6 +20,7 @@ using CyberX8_RT.Devices.AXIS;
 using MECF.Framework.Common.Persistent.Rinse;
 using System.Security.Principal;
 using MECF.Framework.Common.IOCore;
+using Aitex.Core.Common;
 
 namespace CyberX8_RT.Devices.SRD
 {
@@ -36,7 +37,9 @@ namespace CyberX8_RT.Devices.SRD
             ChuckVacuumOn,
             ChuckVacuumOff,
             LiftUpOn,
-            LiftUpOff  
+            LiftUpOff,
+            FlippersIn,
+            FlippersOut,
         }
 
         #region 常量
@@ -115,6 +118,10 @@ namespace CyberX8_RT.Devices.SRD
         /// Lift Up routine
         /// </summary>
         private SrdCommonLiftUpRoutine _liftUpRoutine;
+        /// <summary>
+        /// Flippers Routine
+        /// </summary>
+        private SrdCommonFlipperRoutine _flipperRoutine;
         #endregion
 
         #endregion
@@ -175,6 +182,7 @@ namespace CyberX8_RT.Devices.SRD
             _doorCloseRoutine = new SrdCommonDoorCloseRoutine(Module);
             _chuckVacuumRoutine = new SrdCommonChuckVacuumRoutine(Module);
             _liftUpRoutine = new SrdCommonLiftUpRoutine(Module);
+            _flipperRoutine = new SrdCommonFlipperRoutine(Module);
         }
         /// <summary>
         /// 订阅数据
@@ -240,10 +248,8 @@ namespace CyberX8_RT.Devices.SRD
             OP.Subscribe($"{Module}.{Name}.LiftUpOff", LiftUpOffAction);
             OP.Subscribe($"{Module}.{Name}.ChuckATMOn", ChuckATMOnAction);
             OP.Subscribe($"{Module}.{Name}.ChuckATMOff", ChuckATMOffAction);
-            OP.Subscribe($"{Module}.{Name}.FlipperIn150", FlipperIn150Action);
-            OP.Subscribe($"{Module}.{Name}.FlipperOut150", FlipperOut150Action);
-            OP.Subscribe($"{Module}.{Name}.FlipperIn200", FlipperIn200Action);
-            OP.Subscribe($"{Module}.{Name}.FlipperOut200", FlipperOut200Action);
+            OP.Subscribe($"{Module}.{Name}.FlipperIn", FlipperInAction);
+            OP.Subscribe($"{Module}.{Name}.FlipperOut", FlipperOutAction);
 
             OP.Subscribe($"{Module}.KeyDown", KeyDownAction);            
             OP.Subscribe($"{Module}.DisabledAction", DisabledOperation);
@@ -255,8 +261,6 @@ namespace CyberX8_RT.Devices.SRD
             OP.Subscribe($"{Module}.UpdateIsWaferPresenceAction", UpdateIsWaferPresenceAction);
         }
 
-    
-
         /// 更新变量数值
         /// </summary>
         /// <param name="variable"></param>
@@ -484,56 +488,46 @@ namespace CyberX8_RT.Devices.SRD
         }
         #endregion
 
-        #region Flipper
-        /// <summary>
-        /// FlipperIn150
-        /// </summary>
-        /// <param name="cmd"></param>
-        /// <param name="args"></param>
-        /// <returns></returns>
-        public bool FlipperIn150Action(string cmd, object[] args)
-        {
-            return FlipperIn150(true);
-        }
+        #region Flipper      
         /// <summary>
-        /// FlipperOut150
+        /// FlipperIn
         /// </summary>
         /// <param name="cmd"></param>
         /// <param name="args"></param>
         /// <returns></returns>
-        public bool FlipperOut150Action(string cmd, object[] args)
+        public bool FlipperInAction(string cmd, object[] args)
         {
-            return FlipperIn150(false);
-        }
-        public bool FlipperIn150(bool value)
-        {
-            string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{FLIPPERS_IN_150}");
-            return IOModuleManager.Instance.WriteIoValue(ioName, value);
-        }
-        /// <summary>
-        /// FlipperIn200
-        /// </summary>
-        /// <param name="cmd"></param>
-        /// <param name="args"></param>
-        /// <returns></returns>
-        public bool FlipperIn200Action(string cmd, object[] args)
-        {
-            return FlipperIn200(true);
+            int waferSize = (int)args[0];
+            if (!JudgeRunningState(SrdCommonOperation.FlippersIn))
+            {
+                _currentOperation = SrdCommonOperation.FlippersIn;
+                _status = _flipperRoutine.Start(true, waferSize);
+                return _status == RState.Running;
+            }
+            else
+            {
+                return false;
+            }
         }
         /// <summary>
-        /// FlipperOut200
+        /// FlipperOut
         /// </summary>
         /// <param name="cmd"></param>
         /// <param name="args"></param>
         /// <returns></returns>
-        public bool FlipperOut200Action(string cmd, object[] args)
-        {
-            return FlipperIn200(false);
-        }
-        public bool FlipperIn200(bool value)
+        public bool FlipperOutAction(string cmd, object[] args)
         {
-            string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{FLIPPERS_IN_200}");
-            return IOModuleManager.Instance.WriteIoValue(ioName, value);
+            int waferSize = (int)args[0];
+            if (!JudgeRunningState(SrdCommonOperation.FlippersOut))
+            {
+                _currentOperation = SrdCommonOperation.FlippersOut;
+                _status = _flipperRoutine.Start(false, waferSize);
+                return _status == RState.Running;
+            }
+            else
+            {
+                return false;
+            }
         }
         #endregion
         #region Water
@@ -862,6 +856,9 @@ namespace CyberX8_RT.Devices.SRD
                 case SrdCommonOperation.LiftUpOn:
                 case SrdCommonOperation.LiftUpOff:
                     return _liftUpRoutine;
+                case SrdCommonOperation.FlippersIn:
+                case SrdCommonOperation.FlippersOut:
+                    return _flipperRoutine;
                 default:
                     return null;
             }

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

@@ -0,0 +1,122 @@
+using Aitex.Core.Common;
+using Aitex.Core.RT.Device;
+using Aitex.Core.RT.Log;
+using Aitex.Core.RT.Routine;
+using Aitex.Core.UI.Control;
+using CyberX8_Core;
+using MECF.Framework.Common.Beckhoff.ModuleIO;
+using MECF.Framework.Common.IOCore;
+using MECF.Framework.Common.Routine;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace CyberX8_RT.Devices.SRD
+{
+    public class SrdCommonFlipperRoutine : RoutineBase, IRoutine
+    {
+        #region 常量 
+        private const string FLIPPERS_IN_150 = "FlippersIn150";
+        private const string FLIPPERS_IN_200 = "FlippersIn200";
+        #endregion
+        private enum FlipperStep
+        {
+            Flipper,
+            Delay,
+            CheckFlipperStatus,
+            End
+        }
+        #region 内部变量
+        private bool _flipperIn;
+        private int _waferSize = 200;
+        private SrdCommonDevice _srdCommon;
+        private int _timeout = 3000;
+        #endregion
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        /// <param name="module"></param>
+        public SrdCommonFlipperRoutine(string module) : base(module)
+        {
+
+        }
+        public void Abort()
+        {
+            Runner.Stop("Manual Abort");
+        }
+
+        public RState Monitor()
+        {
+            Runner.Run(FlipperStep.Flipper, FlipperPosition, _delay_1ms)
+                .DelayIf(FlipperStep.Delay, !_flipperIn, 500)
+                .Run(FlipperStep.CheckFlipperStatus, NullFun, CheckFlipperOutEndStatus, _timeout)
+                .End(FlipperStep.End, NullFun, 100);
+            return Runner.Status;
+        }
+        public RState Start(params object[] objs)
+        {
+            if (objs.Length < 2) return RState.Failed;
+            _flipperIn = (bool)objs[0];
+            _waferSize = (int)objs[1];
+            _srdCommon = DEVICE.GetDevice<SrdCommonDevice>($"{Module}.Common");
+            if (_flipperIn)
+            {
+                return Runner.Start(Module, "Flippers In");
+            }
+            else
+            {
+                return Runner.Start(Module, "Flippers Out");
+            }
+        }
+        /// <summary>
+        /// Flipper Position
+        /// </summary>
+        /// <returns></returns>
+        private bool FlipperPosition()
+        {
+            string variableName;
+            switch (_waferSize)
+            {
+                case 150:
+                    variableName = FLIPPERS_IN_150;
+                    break;
+                case 200:
+                    variableName = FLIPPERS_IN_200;
+                    break;
+                default:
+                    NotifyError(eEvent.ERR_SRD, $"Wafer Size {_waferSize} is invalid", 0);
+                    return false;
+            }
+            string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{variableName}");
+            return IOModuleManager.Instance.WriteIoValue(ioName, _flipperIn);     
+        }
+        /// <summary>
+        /// CheckFlipperOutStatus
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckFlipperOutEndStatus()
+        {
+            bool result = false;
+            switch (_waferSize)
+            {
+                case 150:
+                    result = _flipperIn ? (!_srdCommon.CommonData.Flipper1Out150Status && !_srdCommon.CommonData.Flipper2Out150Status && !_srdCommon.CommonData.Flipper3Out150Status)
+                        : (_srdCommon.CommonData.Flipper1Out150Status && _srdCommon.CommonData.Flipper2Out150Status && _srdCommon.CommonData.Flipper3Out150Status);
+                    break;
+                case 200:
+                    result = _flipperIn ? (!_srdCommon.CommonData.Flipper1Out200Status && !_srdCommon.CommonData.Flipper2Out200Status && !_srdCommon.CommonData.Flipper3Out200Status)
+                        : (_srdCommon.CommonData.Flipper1Out200Status && _srdCommon.CommonData.Flipper2Out200Status && _srdCommon.CommonData.Flipper3Out200Status);
+                    break;
+                default:
+                    NotifyError(eEvent.WARN_SRD, $"Wafer Size {_waferSize} is invalid", 0);
+                    result = false;
+                    break;
+            }
+            return result;
+        }
+}
+    
+}

+ 2 - 0
CyberX8_RT/Devices/SRD/SrdCommonLiftUpRoutine.cs

@@ -22,6 +22,7 @@ namespace CyberX8_RT.Devices.SRD
         private enum LiftUpStep
         {
             LiftUp,
+            Delay,
             End
         }
         #region 内部变量
@@ -45,6 +46,7 @@ namespace CyberX8_RT.Devices.SRD
         public RState Monitor()
         {
             Runner.Run(LiftUpStep.LiftUp, LiftUp, CheckLiftUpStatus, _timeout)
+                .DelayIf(LiftUpStep.Delay, !_liftUp, 500)
                 .End(LiftUpStep.End, NullFun, 100);
             return Runner.Status;
         }

+ 81 - 15
CyberX8_RT/Modules/SRD/SRDEntity.cs

@@ -123,6 +123,10 @@ namespace CyberX8_RT.Modules.SRD
         /// </summary>
         private SRDProcessErrorRoutine _processErrorRoutine;
         /// <summary>
+        /// SRD Loader Routine
+        /// </summary>
+        private SRDLoaderRoutine _loaderRoutine;
+        /// <summary>
         /// RecipeCycle
         /// </summary>
         private int _cycle = 0;
@@ -397,6 +401,12 @@ namespace CyberX8_RT.Modules.SRD
             Transition(SRDState.ConfirmCompleting, SRDMSG.ProcessRecipe, ConfirmProcessRecipe, SRDState.Idle);
             //Enter Init
             Transition(SRDState.Idle, SRDMSG.Init, NullFunc, SRDState.Init);
+            //Loader 
+            Transition(SRDState.Idle, SRDMSG.Loader, LoaderWafer, SRDState.Loading);
+            Transition(SRDState.Loading, FSM_MSG.TIMER, LoaderWaferMonitor, SRDState.Idle);
+            //UnLoader 
+            Transition(SRDState.Idle, SRDMSG.Unloader, UnloaderWafer, SRDState.Unloading);
+            Transition(SRDState.Unloading, FSM_MSG.TIMER, UnloaderWaferMonitor, SRDState.Idle);
 
             EnumLoop<SRDState>.ForEach((item) => { fsm.MapState((int)item, item.ToString()); });
 
@@ -419,6 +429,7 @@ namespace CyberX8_RT.Modules.SRD
             _processRecipeRoutine = new SRDProcessRecipeRoutine(Module.ToString(), _rotationAxis, _armAxis, _srdCommon);
             _awcCycleRoutine = new SRDAWCCycleRoutine(Module);
             _processErrorRoutine=new SRDProcessErrorRoutine(Module.ToString());
+            _loaderRoutine = new SRDLoaderRoutine(Module.ToString());
         }
         /// <summary>
         /// 初始化操作
@@ -451,7 +462,10 @@ namespace CyberX8_RT.Modules.SRD
             OP.Subscribe($"{Module}.StartRotation", (cmd, args) => { return CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.StartRotation, "Rotation", args); });
             OP.Subscribe($"{Module}.StopRotation", (cmd, args) => { return CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.StopRotation); });
             OP.Subscribe($"{Module}.PresenceTestStart", (cmd, args) => { return CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.PresenceTestStart, args); });
-            OP.Subscribe($"{Module}.AWCCycle", (cmd, args) => { return CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.AWCCycleStart, args); });          
+            OP.Subscribe($"{Module}.AWCCycle", (cmd, args) => { return CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.AWCCycleStart, args); });
+
+            OP.Subscribe($"{Module}.Loader", (cmd, args) => { return CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.Loader); });
+            OP.Subscribe($"{Module}.Unloader", (cmd, args) => { return CheckToPostMessage<SRDState, SRDMSG>(eEvent.ERR_SRD, Module.ToString(), (int)SRDMSG.Unloader); });
         }
         /// <summary>
         /// Enter Init
@@ -844,7 +858,9 @@ namespace CyberX8_RT.Modules.SRD
         private bool InitializeHome(object[] param)
         {
             _isHomed = false;
-            return _initializeHomeRoutine.Start() == RState.Running;
+
+            //return _initializeHomeRoutine.Start() == RState.Running;
+            return true;
         }
         /// <summary>
         /// InitializeHome超时
@@ -853,19 +869,20 @@ namespace CyberX8_RT.Modules.SRD
         /// <returns></returns>
         private bool InitializeHomeTimeout(object[] param)
         {
-            RState ret = _initializeHomeRoutine.Monitor();
-            if (ret == RState.Failed || ret == RState.Timeout)
-            {
-                PostMsg(SRDMSG.Error);
-                return false;
-            }
+            //RState ret = _initializeHomeRoutine.Monitor();
+            //if (ret == RState.Failed || ret == RState.Timeout)
+            //{
+            //    PostMsg(SRDMSG.Error);
+            //    return false;
+            //}
 
-            bool result = ret == RState.End;
-            if (result)
-            {
-                _isHomed = true;
-            }
-            return result;
+            //bool result = ret == RState.End;
+            //if (result)
+            //{
+            //    _isHomed = true;
+            //}
+            //return result;
+            return true;
         }
         #endregion        
 
@@ -926,6 +943,53 @@ namespace CyberX8_RT.Modules.SRD
         }
         #endregion
 
+        #region Loader
+        /// <summary>
+        /// SRD Loader Wafer
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool LoaderWafer(object[] param)
+        {
+            return _loaderRoutine.Start(param) == RState.Running;
+        }
+        /// <summary>
+        /// SRD Loader Wafer Monitor
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool LoaderWaferMonitor(object[] param)
+        {
+            RState state = _loaderRoutine.Monitor();
+            if (state == RState.End || state == RState.Failed || state == RState.Timeout)
+            {
+                return true;
+            }
+            return false;
+        }
+        #endregion
+
+        #region Unloader
+        /// <summary>
+        /// SRD Unloader Wafer
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool UnloaderWafer(object[] param)
+        {
+            return true;
+        }
+        /// <summary>
+        /// SRD Unloader Wafer Monitor
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool UnloaderWaferMonitor(object[] param)
+        {
+            
+            return true;
+        }
+        #endregion
         public bool Check(int msg, out string reason, params object[] args)
         {
             reason = "";
@@ -1206,6 +1270,8 @@ namespace CyberX8_RT.Modules.SRD
         Init,
         ProcessError,
         Retry,
-        ConfirmComplete
+        ConfirmComplete,
+        Loader,
+        Unloader
     }
 }

+ 375 - 0
CyberX8_RT/Modules/SRD/SRDLoaderRoutine.cs

@@ -0,0 +1,375 @@
+using Aitex.Core.RT.Device;
+using Aitex.Core.RT.Log;
+using Aitex.Core.RT.Routine;
+using CyberX8_Core;
+using CyberX8_RT.Devices.AXIS;
+using CyberX8_RT.Devices.Facilities;
+using CyberX8_RT.Devices.SRD;
+using MECF.Framework.Common.Equipment;
+using MECF.Framework.Common.Routine;
+using MECF.Framework.Common.SubstrateTrackings;
+using Aitex.Core.Common;
+
+namespace CyberX8_RT.Modules.SRD
+{
+    public class SRDLoaderRoutine : RoutineBase, IRoutine
+    {
+        private enum SRDLoaderStep 
+        { 
+            LiftUpOff,
+            FlippersIn,
+            N2On,
+            Delay,
+            N2Off,
+            ChuckVacuumOn,
+            FlippersOut,
+            End
+        }
+        #region 常量 
+        #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;
+        #endregion
+
+        #region 属性
+        #endregion
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        /// <param name="module"></param>
+        public SRDLoaderRoutine(string module) : base(module)
+        {
+
+        }
+        /// <summary>
+        /// 中止
+        /// </summary>
+        public void Abort()
+        {
+            Runner.Stop("SRD Loader Abort");
+        }
+        /// <summary>
+        /// 监控
+        /// </summary>
+        /// <returns></returns>
+        public RState Monitor()
+        {
+            Runner.Run(SRDLoaderStep.LiftUpOff, LiftUpOff, CheckLiftUpOffEndStatus, CheckLiftUpOffStopStatus)
+                .Run(SRDLoaderStep.FlippersIn, FlippersIn, CheckFlippersInEndStatus, CheckFlippersInStopStatus)
+                .Run(SRDLoaderStep.N2On, N2On, _delay_1ms)
+                .Delay(SRDLoaderStep.Delay, 500)
+                .Run(SRDLoaderStep.N2Off, N2Off, _delay_1ms)
+                .Run(SRDLoaderStep.ChuckVacuumOn, ChuckVacuumOn, CheckChuckVacuumOnEndStatus, CheckChuckVacuumOnStopStatus)
+                .Run(SRDLoaderStep.FlippersOut, FlippersOut, CheckFlippersOutEndStatus, CheckFlippersOutStopStatus)
+                .End(SRDLoaderStep.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");
+            if (!GetWaferSize())
+            {
+                NotifyError(eEvent.ERR_SRD, "Wafer Size is invalid", 0);
+                return RState.Failed;
+            }
+            if (!CheckPreCondition())
+            {
+                return RState.Failed;
+            }
+            return Runner.Start(Module, "SRD Loader 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 off", 0);
+                return false;
+            }
+            //Check LiftUp Status
+            if (!_srdCommon.CommonData.LiftUpStatus)
+            {
+                NotifyError(eEvent.ERR_SRD, "LiftUp sensor is off", 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 Flippers
+            if (_srdCommon.CommonData.FlippersIn150 || _srdCommon.CommonData.FlippersIn200)
+            {
+                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)
+            {
+                NotifyError(eEvent.ERR_SRD, "Flippers are at In position", 0);
+                return false;
+            }
+           
+            return true;
+        }
+        /// <summary>
+        /// Get current WaferSize
+        /// </summary>
+        /// <returns></returns>
+        private bool GetWaferSize()
+        {
+            WaferInfo waferInfo = WaferManager.Instance.GetWafer(ModuleNameString.ToEnum(Module), 0);
+            switch (waferInfo.Size)
+            {
+                case WaferSize.WS0:
+                    _waferSize = 200;
+                    break;
+                case WaferSize.WS4:
+                    _waferSize = 100;
+                    break;
+                case WaferSize.WS6:
+                case WaferSize.WS150:
+                case WaferSize.WS159:
+                    _waferSize = 150;
+                    break;
+                case WaferSize.WS8:
+                    _waferSize = 200;
+                    break;
+                default:
+                    return false;
+            }
+            return true;
+        }
+        /// <summary>
+        /// LiftUpOff
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool LiftUpOff()
+        {
+            bool result = _srdCommon.LiftUpOffAction("", null);
+            if (!result)
+            {
+                NotifyError(eEvent.ERR_SRD, "Lift Up Off Action is failed", 0);
+                return result;
+            }           
+            return true;
+        }
+        /// <summary>
+        /// 检验LiftUpOff结束状态
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool CheckLiftUpOffEndStatus()
+        {
+            return _srdCommon.Status == RState.End && !_srdCommon.CommonData.LiftUpStatus;
+        }
+        /// <summary>
+        /// 检验LiftUpOff结束状态
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool CheckLiftUpOffStopStatus()
+        {
+            if (_srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout)
+            {
+                NotifyError(eEvent.ERR_SRD, "Check LiftUpOff is failed", 0);
+                return true;
+            }
+            return false;
+        }
+        /// <summary>
+        /// Flippers In
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool FlippersIn()
+        {
+            bool result = false;
+            object[] objects = new object[1];
+            objects[0] = _waferSize;
+            result = _srdCommon.FlipperInAction("", objects);
+            if (!result)
+            {
+                NotifyError(eEvent.ERR_SRD, $"FlipperIn{_waferSize} Action is failed", 0);
+                return result;
+            }
+            
+            return true;
+        }
+        /// <summary>
+        /// 检验FlippersIn结束状态
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool CheckFlippersInEndStatus()
+        {
+            return _srdCommon.Status == RState.End;
+        }
+        /// <summary>
+        /// 检验FlippersIn结束状态
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool CheckFlippersInStopStatus()
+        {
+            if (_srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout)
+            {
+                NotifyError(eEvent.ERR_SRD, $"Check FlipperIn{_waferSize} Action is failed", 0);
+                return true;
+            }
+            return false;
+        }
+        /// <summary>
+        /// 打开 Wafer N2
+        /// </summary>
+        /// <returns></returns>
+        private bool N2On()
+        {
+            bool result = _srdCommon.N2OnAction("", null);
+            if (!result)
+            {
+                NotifyError(eEvent.ERR_SRD, $"N2 On Action is failed", 0);
+            }
+            return result;
+        }
+        /// <summary>
+        /// 关闭 Wafer N2
+        /// </summary>
+        /// <returns></returns>
+        private bool N2Off()
+        {
+            bool result = _srdCommon.N2OffAction("", null);
+            if (!result)
+            {
+                NotifyError(eEvent.ERR_SRD, $"N2 Off Action is failed", 0);
+            }
+            return result;
+        }
+        /// <summary>
+        /// ChuckVacuumOn
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool ChuckVacuumOn()
+        {
+            bool result = _srdCommon.ChuckVacuumOnAction("", null);
+            if (!result)
+            {
+                NotifyError(eEvent.ERR_SRD, "ChuckVacuumOn Action is failed", 0);
+                return result;
+            }
+            return true;
+        }
+        /// <summary>
+        /// 检验ChuckVacuumOn结束状态
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool CheckChuckVacuumOnEndStatus()
+        {
+            return _srdCommon.Status == RState.End && _srdCommon.CommonData.ChuckVacuum;
+        }
+        /// <summary>
+        /// 检验ChuckVacuumOn结束状态
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool CheckChuckVacuumOnStopStatus()
+        {
+            if (_srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout)
+            {
+                NotifyError(eEvent.ERR_SRD, "Check ChuckVacuumOn is failed", 0);
+                return true;
+            }
+            return false;
+        }
+        /// <summary>
+        /// Flippers In
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool FlippersOut()
+        {
+            bool result = false;
+            object[] objects = new object[1];
+            objects[0] = _waferSize;
+            result = _srdCommon.FlipperOutAction("", objects);
+            if (!result)
+            {
+                NotifyError(eEvent.ERR_SRD, $"FlipperOut{_waferSize} Action is failed", 0);
+                return result;
+            }
+
+            return true;
+        }
+        /// <summary>
+        /// 检验FlippersIn结束状态
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool CheckFlippersOutEndStatus()
+        {
+            return _srdCommon.Status == RState.End;
+        }
+        /// <summary>
+        /// 检验FlippersIn结束状态
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool CheckFlippersOutStopStatus()
+        {
+            if (_srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout)
+            {
+                NotifyError(eEvent.ERR_SRD, $"Check FlipperOut{_waferSize} Action is failed", 0);
+                return true;
+            }
+            return false;
+        }
+    }
+}

+ 132 - 0
CyberX8_RT/Modules/SRD/SRDRunRecipeRoutine.cs

@@ -0,0 +1,132 @@
+using Aitex.Core.RT.Device;
+using Aitex.Core.RT.Log;
+using Aitex.Core.RT.Routine;
+using Aitex.Core.Util;
+using CyberX8_Core;
+using CyberX8_RT.Devices.AXIS;
+using CyberX8_RT.Devices.Facilities;
+using CyberX8_RT.Devices.SRD;
+using MECF.Framework.Common.Beckhoff.AxisProvider;
+using MECF.Framework.Common.RecipeCenter;
+using MECF.Framework.Common.Routine;
+
+namespace CyberX8_RT.Modules.SRD
+{
+    public class SRDRunRecipeRoutine : RoutineBase, IRoutine
+    {
+        private enum SRDRunRecipeStep
+        {
+            CloseDoor,
+            CheckDoorClosed,
+
+            End
+        }
+        #region 常量 
+        #endregion
+
+        #region 内部变量
+        /// <summary>
+        /// Rotation Axis
+        /// </summary>
+        private JetAxisBase _rotationAxis;
+        /// <summary>
+        /// SRD Common
+        /// </summary>
+        private SrdCommonDevice _srdCommon;
+        /// <summary>
+        /// Total SRD
+        /// </summary>
+        private TotalSRDDevice _totalSRDDevice;
+        /// <summary>
+        /// 另外SRD实例 
+        /// </summary>
+        private SRDEntity _otherSrdEntity;
+        /// <summary>
+        /// Loader Common
+        /// </summary>
+        private SystemFacilities _systemFacilities;
+        /// <summary>
+        /// 是否正在用水
+        /// </summary>
+        private bool _isUsingWater;
+        /// <summary>
+        /// Recipe
+        /// </summary>
+        private SrdRecipe _srdRecipe;
+        /// <summary>
+        /// SRD rotation Provider对象
+        /// </summary>
+        private BeckhoffProviderAxis _rotationProviderAxis;
+        #endregion
+
+        #region 属性
+        /// <summary>
+        /// 是否正在用水
+        /// </summary>
+        public bool IsUsingWater { get { return _isUsingWater; } }
+        #endregion
+
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        /// <param name="module"></param>
+        public SRDRunRecipeRoutine(string module) : base(module)
+        {
+
+        }
+        /// <summary>
+        /// 中止
+        /// </summary>
+        public void Abort()
+        {
+            Runner.Stop("SRD Run Recipe Abort");
+        }
+        /// <summary>
+        /// 监控
+        /// </summary>
+        /// <returns></returns>
+        public RState Monitor()
+        {
+            Runner//.Run(SRDRunRecipeStep.CloseDoor, !_presenceTestFlag, CheckFacilities, _delay_1ms)
+                .End(SRDRunRecipeStep.End, NullFun, _delay_1ms);
+            return Runner.Status;
+        }
+        /// <summary>
+        /// 启动
+        /// </summary>
+        /// <param name="objs"></param>
+        /// <returns></returns>
+        public RState Start(params object[] objs)
+        {
+            _srdRecipe = (SrdRecipe)objs[0];
+            if (_srdRecipe == null)
+            {
+                NotifyError(eEvent.ERR_SRD, "srd recipe is null", 0);
+                return RState.Failed;
+            }
+            _rotationAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Rotation");
+            if (!_rotationAxis.IsHomed)
+            {
+                NotifyError(eEvent.ERR_SRD, "Rotation is not homed", 0);
+                return RState.Failed;
+            }
+            _srdCommon = DEVICE.GetDevice<SrdCommonDevice>($"{Module}.Common");
+
+            _totalSRDDevice = DEVICE.GetDevice<TotalSRDDevice>("SRD");
+
+            _systemFacilities = DEVICE.GetDevice<SystemFacilities>("System.Facilities");
+            string otherSRD = Module == "SRD1" ? "SRD2" : "SRD1";
+            _otherSrdEntity = Singleton<RouteManager>.Instance.GetModule<SRDEntity>(otherSRD);
+
+            _rotationProviderAxis = BeckhoffAxisProviderManager.Instance.GetAxisProvider($"{Module}.Rotation");
+            if (_rotationProviderAxis == null)
+            {
+                NotifyError(eEvent.ERR_SRD, $"{Module}.Rotation Provider is not exist", 0);
+                return RState.Failed;
+            }
+            return Runner.Start(Module, "SRD Run Recipe Start");
+        }
+
+
+    }
+}

+ 8 - 2
CyberX8_Simulator/Devices/WagoSocketSimulator.cs

@@ -75,6 +75,7 @@ namespace CyberX8_Simulator.Devices
         private bool _rinse4DumpValve = false;
         private int _srd1currentVacuumValue;
         private int _srd2currentVacuumValue;
+        private int _port;
         //delegate
         #region Delegate
         public delegate void VariableValueChanged(object obj);
@@ -94,7 +95,8 @@ namespace CyberX8_Simulator.Devices
         {
             SimulatorCommManager.Instance.OnUpdateVariableValueChanged += UpdataDataCausedByOtherModule;
             MotorSimulator.Instance.OnUpdateWagoDatasChanged += UpdataDataCausedByOtherModule;
-            InitializeData(port);    
+            InitializeData(port);
+            _port = port;
         }  
         
         private void UpdataDataCausedByOtherModule(string sourceName,string name, bool value, bool invert)
@@ -397,7 +399,7 @@ namespace CyberX8_Simulator.Devices
             if (DINameIndexDic.ContainsKey("r_SRD1_SHUTTER_CLOSED")) DIBytes[DINameIndexDic["r_SRD1_SHUTTER_CLOSED"]] = 0;
             if (DINameIndexDic.ContainsKey("r_SRD2_SHUTTER_OPEN")) DIBytes[DINameIndexDic["r_SRD2_SHUTTER_OPEN"]] = 1;
             if (DINameIndexDic.ContainsKey("r_SRD2_SHUTTER_CLOSED")) DIBytes[DINameIndexDic["r_SRD2_SHUTTER_CLOSED"]] = 0;
-            if (DINameIndexDic.ContainsKey("r_SRD_FLUID_LEVEL")) DIBytes[DINameIndexDic["r_SRD_FLUID_LEVEL"]] = 0;
+            if (DINameIndexDic.ContainsKey("r_SRD_FLUID_LEVEL")) DIBytes[DINameIndexDic["r_SRD_FLUID_LEVEL"]] = 1;
             if (DINameIndexDic.ContainsKey("r_SRD1_CHUCK_VAC_OK")) DIBytes[DINameIndexDic["r_SRD1_CHUCK_VAC_OK"]] = 1;
             if (DINameIndexDic.ContainsKey("r_SRD2_CHUCK_VAC_OK")) DIBytes[DINameIndexDic["r_SRD2_CHUCK_VAC_OK"]] = 1;
             if (DINameIndexDic.ContainsKey("r_SRD1_150_FLIPPER1_OUT")) DIBytes[DINameIndexDic["r_SRD1_150_FLIPPER1_OUT"]] = 1;
@@ -412,6 +414,10 @@ namespace CyberX8_Simulator.Devices
             if (DINameIndexDic.ContainsKey("r_SRD2_200_FLIPPER1_OUT")) DIBytes[DINameIndexDic["r_SRD2_200_FLIPPER1_OUT"]] = 1;
             if (DINameIndexDic.ContainsKey("r_SRD2_200_FLIPPER2_OUT")) DIBytes[DINameIndexDic["r_SRD2_200_FLIPPER2_OUT"]] = 1;
             if (DINameIndexDic.ContainsKey("r_SRD2_200_FLIPPER3_OUT")) DIBytes[DINameIndexDic["r_SRD2_200_FLIPPER3_OUT"]] = 1;
+            if (DONameIndexDic.ContainsKey("c_SRD1_150_FLIPPERS_IN")) DOBytes[DONameIndexDic["c_SRD1_150_FLIPPERS_IN"]] = 1;
+            if (DONameIndexDic.ContainsKey("c_SRD2_150_FLIPPERS_IN")) DOBytes[DONameIndexDic["c_SRD2_150_FLIPPERS_IN"]] = 1;
+            if (DONameIndexDic.ContainsKey("c_SRD1_LIFT_UP")) DOBytes[DONameIndexDic["c_SRD1_LIFT_UP"]] = 1;
+            if (DONameIndexDic.ContainsKey("c_SRD2_LIFT_UP")) DOBytes[DONameIndexDic["c_SRD2_LIFT_UP"]] = 1;
             //Metal
             if (AINameIndexDic.ContainsKey("r_PUMP4_FLOW")) AIShorts[AINameIndexDic["r_PUMP4_FLOW"]] = 3277;
 

+ 4 - 4
CyberX8_Themes/UserControls/SRDFlipperControl.xaml.cs

@@ -62,19 +62,19 @@ namespace CyberX8_Themes.UserControls
         #region Operation
         private void FlipperIn150_Click(object sender, RoutedEventArgs e)
         {
-            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Common.FlipperIn150");
+            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Common.FlipperIn", 150);
         }
         private void FlipperOut150_Click(object sender, RoutedEventArgs e)
         {
-            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Common.FlipperOut150");
+            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Common.FlipperOut", 150);
         }
         private void FlipperIn200_Click(object sender, RoutedEventArgs e)
         {
-            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Common.FlipperIn200");
+            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Common.FlipperIn", 200);
         }
         private void FlipperOut200_Click(object sender, RoutedEventArgs e)
         {
-            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Common.FlipperOut200");
+            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Common.FlipperOut", 200);
         }
         #endregion
 

+ 2 - 1
CyberX8_Themes/UserControls/TransporterDebugControl.xaml

@@ -10,6 +10,7 @@
     <UserControl.Resources>
         <converters:BoolToColor x:Key="boolToColor"></converters:BoolToColor>
         <converters:BoolToBool x:Key="boolToBool"></converters:BoolToBool>
+        <converters:BoolToRedColor x:Key="boolToRedColor"></converters:BoolToRedColor>
     </UserControl.Resources>
     <Grid>
         <GroupBox Header="{Binding ElementName=self,Path=ModuleTitle}" Grid.Row="1" Grid.Column="1">
@@ -81,7 +82,7 @@
 
                             
                                 <Label Content="Jam" Grid.Row="2" VerticalAlignment="Center"></Label>
-                                <Ellipse Grid.Row="2" Width="16" Height="16"  Fill="{Binding ElementName=self,Path=ForwardLimit,Converter={StaticResource boolToColor}}" Stroke="Silver" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="180,0,0,0"/>
+                                <Ellipse Grid.Row="2" Width="16" Height="16"  Fill="{Binding ElementName=self,Path=ForwardLimit,Converter={StaticResource boolToRedColor}}" Stroke="Silver" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="180,0,0,0"/>
 
 
                                 <Label Content="WS Present" Grid.Row="1" VerticalAlignment="Center"></Label>

+ 26 - 6
Framework/Common/RecipeCenter/SrdRecipe.cs

@@ -21,9 +21,8 @@ namespace MECF.Framework.Common.RecipeCenter
         private int _backN2DryTime;
         private int _backRinseTime;
         private int _divertPlusPoolDelay;
-        private int _drySpeed;
         private int _exhaustFanDelay;
-        private int _flowCheckDelay;
+        
         private int _frontDivertTime;
         private int _frontPoolTime;
         private int _frontRinseTime;
@@ -32,10 +31,21 @@ namespace MECF.Framework.Common.RecipeCenter
         private int _maxWashPressure;
         private int _minDivertPlusPoolFlow;
         private int _minWashFlow;
-        private int _minWaterPressure;
+        
         private int _postN2DryTime;
         private int _preN2DryTime;
+        /// <summary>
+        /// X8
+        /// </summary>
+        private int _flowCheckDelay;
         private int _rinseSpeed;
+        private int _rinseTime;
+        private int _drySpeed;
+        private int _dryTime;
+        private int _minWaterPressure;
+        private int _maxWaterPressure;
+        private double _minSRDWaterFlow;
+        private double _maxSRDWaterFlow;
         #endregion
 
         #region 属性
@@ -97,15 +107,25 @@ namespace MECF.Framework.Common.RecipeCenter
         [JsonProperty]
         public int MinDivertPlusPoolFlow { get { return _minDivertPlusPoolFlow; } set { _minDivertPlusPoolFlow = value;InvokePropertyChanged(nameof(MinDivertPlusPoolFlow)); } }
         [JsonProperty]
-        public int MinWashFlow { get { return _minWashFlow; } set { _minWashFlow = value;InvokePropertyChanged(nameof(MinWashFlow)); } }
-        [JsonProperty]
-        public int MinWaterPressure { get { return _minWaterPressure; } set { _minWaterPressure = value;InvokePropertyChanged(nameof(MinWaterPressure)); } }
+        public int MinWashFlow { get { return _minWashFlow; } set { _minWashFlow = value;InvokePropertyChanged(nameof(MinWashFlow)); } }        
         [JsonProperty]
         public int PostN2DryTime { get { return _postN2DryTime; } set { _postN2DryTime = value;InvokePropertyChanged(nameof(PostN2DryTime)); } }
         [JsonProperty]
         public int PreN2DryTime { get { return _preN2DryTime; } set { _preN2DryTime = value;InvokePropertyChanged(nameof(PreN2DryTime)); } }
         [JsonProperty]
         public int RinseSpeed { get { return _rinseSpeed; } set { _rinseSpeed = value;InvokePropertyChanged(nameof(RinseSpeed)); } }
+        [JsonProperty]
+        public int RinseTime { get { return _rinseTime; } set { _rinseTime = value; InvokePropertyChanged(nameof(RinseTime)); } }
+        [JsonProperty]
+        public int DryTime { get { return _dryTime; } set { _dryTime = value; InvokePropertyChanged(nameof(DryTime)); } }
+        [JsonProperty]
+        public int MinWaterPressure { get { return _minWaterPressure; } set { _minWaterPressure = value; InvokePropertyChanged(nameof(MinWaterPressure)); } }
+        [JsonProperty]
+        public int MaxWaterPressure { get { return _maxWaterPressure; } set { _maxWaterPressure = value; InvokePropertyChanged(nameof(MaxWaterPressure)); } }
+        [JsonProperty]
+        public double MinSRDWaterFlow { get { return _minSRDWaterFlow; } set { _minSRDWaterFlow = value; InvokePropertyChanged(nameof(MinSRDWaterFlow)); } }
+        [JsonProperty]
+        public double MaxSRDWaterFlow { get { return _maxSRDWaterFlow; } set { _maxSRDWaterFlow = value; InvokePropertyChanged(nameof(MaxSRDWaterFlow)); } }
         #endregion
     }
 }

+ 2 - 2
Framework/Common/Simulator/MotorSimulator.cs

@@ -350,7 +350,7 @@ namespace MECF.Framework.Common.Simulator
                         motionData.MotionSignal = false;
                         //motionData.MotionPhase = MotionPhase.Accelerating;
                         motionData.ActualPosition = fwdLimit ? motionData.FwdSoftLimit : motionData.TargetPosition;
-                        motionData.ForwardLimit = fwdLimit;
+                        motionData.ForwardLimit = !fwdLimit;
                         motionData.ActualVelocity = 0;
                     }
                 }
@@ -366,7 +366,7 @@ namespace MECF.Framework.Common.Simulator
                         motionData.MotionSignal = false;
                         //motionData.MotionPhase = MotionPhase.Accelerating;
                         motionData.ActualPosition = revLimit ? motionData.RevSoftLimit : motionData.TargetPosition;
-                        motionData.ReverseLimit = revLimit;
+                        motionData.ReverseLimit = !revLimit;
                         motionData.ActualVelocity = 0;
                     }
                 }