Explorar o código

1.根据tps sequence修改tm/ll vent/pump等功能
2.添加钟摆阀加热功能

# Conflicts:
# Venus/Venus_MainPages/Views/TMOperationView.xaml

lixiang hai 1 ano
pai
achega
379fe79c7b

+ 13 - 5
Venus/Venus_MainPages/ViewModels/OperationOverViewModel.cs

@@ -420,9 +420,9 @@ namespace Venus_MainPages.ViewModels
         public DelegateCommand ReturnAllWaferCommand =>
             _ReturnAllWaferCommand ?? (_ReturnAllWaferCommand = new DelegateCommand(OnReturnAllWafer));
 
-        private DelegateCommand _SetSequenceCommand;
-        public DelegateCommand SetSequenceCommand =>
-            _SetSequenceCommand ?? (_SetSequenceCommand = new DelegateCommand(OnSetSequence));
+        private DelegateCommand<object> _SetSequenceCommand;
+        public DelegateCommand<object> SetSequenceCommand =>
+            _SetSequenceCommand ?? (_SetSequenceCommand = new DelegateCommand<object>(OnSetSequence));
 
         private DelegateCommand<object> _CreateJobCommand;
         public DelegateCommand<object> CreateJobCommand =>
@@ -436,6 +436,7 @@ namespace Venus_MainPages.ViewModels
         public DelegateCommand EnableManualCommand =>
             _EnableManualCommand ?? (_EnableManualCommand = new DelegateCommand(OnEnableManual));
 
+        
         public bool SwitchFlag;
 
         #endregion
@@ -495,6 +496,8 @@ namespace Venus_MainPages.ViewModels
         private void OnSelectAll(object obj)
         {
             var info=obj as WaferAssociationInfo;
+            waferAssociationInfo = info;
+
             info.SlotFrom = 1;
             info.SlotTo = 25;
             AssociateSequence(info, true);
@@ -564,9 +567,14 @@ namespace Venus_MainPages.ViewModels
             }
             
         }
-        private void OnSetSequence()
+        private WaferAssociationInfo waferAssociationInfo = null;
+        private void OnSetSequence(object obj)
         {
-            //var info = obj as WaferAssociationInfo;
+            var info = obj as WaferInfo;
+            
+            bool flag = info.SequenceName != "" ? false : true;
+
+            AssociateSequence(waferAssociationInfo, flag,info.SlotID);
         }
         private void OnCreateJob(object obj)
         {

+ 35 - 9
Venus/Venus_MainPages/ViewModels/OverKepler2300ViewModel.cs

@@ -99,6 +99,8 @@ namespace Venus_MainPages.ViewModels
         private AITHeaterData m_ValveHeaterData;
         private AITHeaterData m_ForelineHeaterData;
         private AITHeaterData m_WallHeaterData;
+        private AITHeaterData m_PendulumHeaterData;
+
 
         private AITRfData m_SRFData;
         private AITRfData m_BRFData;
@@ -608,7 +610,11 @@ namespace Venus_MainPages.ViewModels
             get { return m_WallHeaterData; }
             set { SetProperty(ref m_WallHeaterData, value); }
         }
-
+        public AITHeaterData PendulumHeaterData
+        {
+            get { return m_PendulumHeaterData; }
+            set { SetProperty(ref m_PendulumHeaterData, value); }
+        }
         public AITRfData SRFData
         {
             get { return m_SRFData; }
@@ -1074,6 +1080,13 @@ namespace Venus_MainPages.ViewModels
         private DelegateCommand _EndStepCommand;
         public DelegateCommand EndStepCommand =>
             _EndStepCommand ?? (_EndStepCommand = new DelegateCommand(OnEndStep));
+        private DelegateCommand _OnlineCommand;
+        public DelegateCommand OnlineCommand =>
+            _OnlineCommand ?? (_OnlineCommand = new DelegateCommand(OnOnline));
+
+        private DelegateCommand _OfflineCommand;
+        public DelegateCommand OfflineCommand =>
+            _OfflineCommand ?? (_OfflineCommand = new DelegateCommand(OnOffline));
 
         #endregion
 
@@ -1513,6 +1526,14 @@ namespace Venus_MainPages.ViewModels
                 InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Abort");
             }
         }
+        private void OnOnline()
+        {
+            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.PmOnline}");
+        }
+        private void OnOffline()
+        {
+            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.PmOffline}");
+        }
         #endregion
 
         #region 私有方法
@@ -1621,24 +1642,26 @@ namespace Venus_MainPages.ViewModels
             ValveHeaterData = (AITHeaterData)RtDataValues[$"{ModuleName}.ValveHeater.DeviceData"];
             ForelineHeaterData = (AITHeaterData)RtDataValues[$"{ModuleName}.ForelineHeater.DeviceData"];
             WallHeaterData = (AITHeaterData)RtDataValues[$"{ModuleName}.WallHeater.DeviceData"];
+            PendulumHeaterData = (AITHeaterData)RtDataValues[$"{ModuleName}.PendulumHeater.DeviceData"];
+
 
             ProcessHighPressure = CommonFunction.GetValue<float>(RtDataValues, $"{ModuleName}.ProcessHighPressure");
             ProcessLowPressure = CommonFunction.GetValue<float>(RtDataValues, $"{ModuleName}.ProcessLowPressure");
             ForelinePressure = float.Parse(RtDataValues[$"{ModuleName}.ForelinePressure"].ToString());
             ESCHePressure = float.Parse(RtDataValues[$"{ModuleName}.ESCHePressure"].ToString());
 
-            ChillerTemperature = float.Parse(RtDataValues[$"{ModuleName}.Chiller.Temp"].ToString());
+            //ChillerTemperature = float.Parse(RtDataValues[$"{ModuleName}.Chiller.Temp"].ToString());
 
-            InnerTemperature = float.Parse(RtDataValues[$"{ModuleName}.ChillerInnerTemp"].ToString());
-            OuterTemperature = float.Parse(RtDataValues[$"{ModuleName}.ChillerOuterTemp"].ToString());
-            TopTemperature = float.Parse(RtDataValues[$"{ModuleName}.ChillerTopTemp"].ToString());
+            InnerTemperature = CommonFunction.GetValue<float>(RtDataValues, $"{ModuleName}.ChillerInnerTemp"); 
+            OuterTemperature = CommonFunction.GetValue<float>(RtDataValues, $"{ModuleName}.ChillerOuterTemp"); 
+            TopTemperature = CommonFunction.GetValue<float>(RtDataValues, $"{ModuleName}.ChillerTopTemp"); 
 
 
             //HVTemperature = float.Parse(RtDataValues[$"{ModuleName}.{VenusDevice.ESCHV}.Temp"].ToString());
 
 
 
-            ChillerIsOn = CommonFunction.GetValue<bool>(RtDataValues, $"{ModuleName}.Chiller.IsOn");
+            //ChillerIsOn = CommonFunction.GetValue<bool>(RtDataValues, $"{ModuleName}.Chiller.IsOn");
 
             SourceRFFanInterlock = CommonFunction.GetValue<bool>(RtDataValues, $"{ModuleName}.SourceRFFanInterlock");
             IsWLK = CommonFunction.GetValue<bool>(RtDataValues, $"{ModuleName}.IsWLK");
@@ -1688,6 +1711,7 @@ namespace Venus_MainPages.ViewModels
             {
                 ChamberPressureFeedBack = ProcessHighPressure;
             }
+            IsAutoMode= CommonFunction.GetValue<bool>(RtDataValues, $"{ModuleName}.IsOnline");
         }
         public void addDataKeys()
         {
@@ -1772,7 +1796,7 @@ namespace Venus_MainPages.ViewModels
 
             m_RtDataKeys.Add($"{ModuleName}.GetPVPosition");
 
-            m_RtDataKeys.Add($"{ModuleName}.Chiller.Temp");
+            //m_RtDataKeys.Add($"{ModuleName}.Chiller.Temp");
             //m_RtDataKeys.Add($"{ModuleName}.{VenusDevice.ESCHV}.Temp");
 
             //m_RtDataKeys.Add($"{ModuleName}.ESCHV.OutputVoltage");
@@ -1789,11 +1813,13 @@ namespace Venus_MainPages.ViewModels
             m_RtDataKeys.Add($"{ModuleName}.GasBoxPressureSW.Value");
 
             //m_RtDataKeys.Add($"{ModuleName}.WallTempFeedBack");
-            m_RtDataKeys.Add($"{ModuleName}.Chiller.IsOn");
+            //m_RtDataKeys.Add($"{ModuleName}.Chiller.IsOn");
 
             m_RtDataKeys.Add($"{ModuleName}.ValveHeater.DeviceData");
             m_RtDataKeys.Add($"{ModuleName}.ForelineHeater.DeviceData");
             m_RtDataKeys.Add($"{ModuleName}.WallHeater.DeviceData");
+            m_RtDataKeys.Add($"{ModuleName}.PendulumHeater.DeviceData");
+
             m_RtDataKeys.Add($"{ModuleName}.FsmState");
 
             m_RtDataKeys.Add($"{ModuleName}.IsTurboPumpAtSpeed");
@@ -1805,7 +1831,7 @@ namespace Venus_MainPages.ViewModels
             m_RtDataKeys.Add($"{ModuleName}.ChillerInnerTemp");
             m_RtDataKeys.Add($"{ModuleName}.ChillerOuterTemp");
             m_RtDataKeys.Add($"{ModuleName}.ChillerTopTemp");
-
+            m_RtDataKeys.Add($"{ModuleName}.IsOnline");
 
 
 

+ 2 - 2
Venus/Venus_MainPages/Views/OverKepler2200AView.xaml

@@ -1201,8 +1201,8 @@
                     </Border.RenderTransform>
                 </Border>
                 <customControls:AduRadioButtonIcon Content="AF" IsChecked="{Binding IsAutoMode,Mode=TwoWay}"   Margin="-10,0,30,0" Height="40"  attach:IconElement.Margin="-20" />-->
-                <RadioButton Content="Manual"    Width="120" Height="28" Margin="0 0 5 0" Style="{StaticResource Button_RadioButton}" IsChecked="{Binding IsAutoMode,Converter={StaticResource BoolToBool},Mode=TwoWay}" FontSize="15"/>
-                <RadioButton Content="Auto"      Width="120" Height="28" Margin="0 0 30 0" Style="{StaticResource Button_RadioButton}" IsChecked="{Binding IsAutoMode,Mode=TwoWay}" FontSize="15"/>
+                <RadioButton Content="OffLine"     Width="120" Height="28" Margin="0 0 5 0" Style="{StaticResource Button_RadioButton}" IsChecked="{Binding IsAutoMode,Converter={StaticResource BoolToBool},Mode=TwoWay}" FontSize="15"/>
+                <RadioButton Content="OnLine"      Width="120" Height="28" Margin="0 0 30 0" Style="{StaticResource Button_RadioButton}" IsChecked="{Binding IsAutoMode,Mode=TwoWay}" FontSize="15"/>
                 <customControls:PathButton  Width="130" Height="30" Content="Vent"          Command="{Binding VentCommand}"         IsEnabled="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}" />
                 <customControls:PathButton  Width="134" Height="30" Content="Pump Purge"    Command="{Binding PurgeCommand}"         Margin="50,0,0,0" IsEnabled="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}"/>
                 <customControls:PathButton  Width="134" Height="30" Content="Pump Down"     Command="{Binding PumpCommand}"         Margin="50,0,0,0" IsEnabled="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}"/>

+ 6 - 3
Venus/Venus_MainPages/Views/OverKepler2300View.xaml

@@ -763,7 +763,10 @@
                 <TextBlock Text="Wall Heater"/>
                 <Button Height="18" Width="50" Content="{Binding WallHeaterData.FeedBack}" ToolTip="{Binding WallHeaterData,Converter={StaticResource HeaterToStringConverter}}"  Foreground="White" ContentStringFormat="F1" Background="{Binding WallHeaterData.IsPowerOnSetPoint,Converter={StaticResource boolToColor5}}" Style="{x:Null}" Command="{Binding HeaterCommand}" CommandParameter="{Binding WallHeaterData}" Cursor="Hand"/>
             </StackPanel>
-
+            <StackPanel Canvas.Top="420" Canvas.Left="1280" Orientation="Vertical">
+                <TextBlock Text="Pendulum Heater"/>
+                <Button Height="18" Width="50" Content="{Binding PendulumHeaterData.FeedBack}" ToolTip="{Binding PendulumHeaterData,Converter={StaticResource HeaterToStringConverter}}"  Foreground="White" ContentStringFormat="F1" Background="{Binding PendulumHeaterData.IsPowerOnSetPoint,Converter={StaticResource boolToColor5}}" Style="{x:Null}" Command="{Binding HeaterCommand}" CommandParameter="{Binding PendulumHeaterData}" Cursor="Hand"/>
+            </StackPanel>
             <!--Chamber-->
             <ctrls:Chamber Canvas.Left="1034" Canvas.Top="224" 
                        IsLiftPinUp="{Binding LiftPinIsUp}" 
@@ -1233,8 +1236,8 @@
                     </Border.RenderTransform>
                 </Border>
                 <customControls:AduRadioButtonIcon Content="AF" IsChecked="{Binding IsAutoMode,Mode=TwoWay}"   Margin="-10,0,30,0" Height="40"  attach:IconElement.Margin="-20" />-->
-                <RadioButton Content="Manual"    Width="120" Height="28" Margin="0 0 5 0" Style="{StaticResource Button_RadioButton}" IsChecked="{Binding IsAutoMode,Converter={StaticResource BoolToBool},Mode=TwoWay}" FontSize="15"/>
-                <RadioButton Content="Auto"      Width="120" Height="28" Margin="0 0 30 0" Style="{StaticResource Button_RadioButton}" IsChecked="{Binding IsAutoMode,Mode=TwoWay}" FontSize="15"/>
+                <RadioButton Content="OffLine"     Width="120" Height="28" Margin="0 0 5 0" Style="{StaticResource Button_RadioButton}" IsChecked="{Binding IsAutoMode,Converter={StaticResource BoolToBool},Mode=TwoWay}" FontSize="15" Command="{Binding OfflineCommand}"/>
+                <RadioButton Content="OnLine"      Width="120" Height="28" Margin="0 0 30 0" Style="{StaticResource Button_RadioButton}" IsChecked="{Binding IsAutoMode,Mode=TwoWay}" FontSize="15"                                      Command="{Binding OnlineCommand}"/>
                 <customControls:PathButton  Width="130" Height="30" Content="Vent"          Command="{Binding VentCommand}"         IsEnabled="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}" />
                 <customControls:PathButton  Width="134" Height="30" Content="Pump Purge"    Command="{Binding PurgeCommand}"         Margin="50,0,0,0" IsEnabled="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}"/>
                 <customControls:PathButton  Width="134" Height="30" Content="Pump Down"     Command="{Binding PumpCommand}"         Margin="50,0,0,0" IsEnabled="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}"/>

+ 4 - 4
Venus/Venus_MainPages/Views/OverVenusView.xaml

@@ -1250,11 +1250,11 @@
                         </ContextMenu>
                     </customControls:PathButton.ContextMenu>
                 </customControls:PathButton>
-               
 
-               
-                <RadioButton Content="Manual"  FontSize="15"   Width="120" Height="28" Margin="0 0 5 0" Style="{StaticResource Button_RadioButton}" IsChecked="{Binding IsAutoMode,Converter={StaticResource BoolToBool},Mode=TwoWay}"/>
-                <RadioButton Content="Auto"    FontSize="15"   Width="120" Height="28" Margin="0 0 30 0" Style="{StaticResource Button_RadioButton}" IsChecked="{Binding IsAutoMode,Mode=TwoWay}"/>
+
+
+                <RadioButton Content="OffLine"   FontSize="15"   Width="120" Height="28" Margin="0 0 5 0" Style="{StaticResource Button_RadioButton}" IsChecked="{Binding IsAutoMode,Converter={StaticResource BoolToBool},Mode=TwoWay}"/>
+                <RadioButton Content="OnLine"    FontSize="15"   Width="120" Height="28" Margin="0 0 30 0" Style="{StaticResource Button_RadioButton}" IsChecked="{Binding IsAutoMode,Mode=TwoWay}"/>
                 <customControls:PathButton  Width="130" Height="30" Content="Vent"          Command="{Binding VentCommand}"         IsEnabled="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}" />
                 <customControls:PathButton  Width="134" Height="30" Content="Pump Purge"    Command="{Binding PurgeCommand}"         Margin="50,0,0,0" IsEnabled="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}"/>
                 <customControls:PathButton  Width="134" Height="30" Content="Pump Down"     Command="{Binding PumpCommand}"         Margin="50,0,0,0" IsEnabled="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}"/>

+ 12 - 27
Venus/Venus_MainPages/Views/TMOperationView.xaml

@@ -28,21 +28,7 @@
 
         <converters2:AllMultiValueConverter  x:Key="AllMultiValueConverter"/>
         <converters2:AnyMultiValueConverter  x:Key="AnyMultiValueConverter"/>
-        <ControlTemplate TargetType="RadioButton" x:Key="TabRadio">
-            <Border BorderThickness="0,0,0,3" BorderBrush="White" CornerRadius="3" x:Name="ShadowBorder" Margin="5,0">
-                <Border x:Name="TabBorder" BorderThickness="1" CornerRadius="3" Background="#009ad6" Padding="5,3" Margin="0,-1,0,0">
-                    <TextBlock x:Name="TabText" Text="{TemplateBinding Content}" Foreground="White" Background="#009ad6" VerticalAlignment="Center" HorizontalAlignment="Center"/>
-                </Border>
-            </Border>
-            <ControlTemplate.Triggers>
-                <Trigger Property="IsChecked" Value="True">
-                    <Setter TargetName="TabText" Property="Background" Value="#009ad6"></Setter>
-                    <Setter TargetName="TabBorder" Property="Background" Value="#009ad6"></Setter>
-                    <Setter TargetName="ShadowBorder" Property="Background" Value="#009ad6"></Setter>
-                    <Setter TargetName="ShadowBorder" Property="BorderThickness" Value="0"></Setter>
-                </Trigger>
-            </ControlTemplate.Triggers>
-        </ControlTemplate>
+
 
     </UserControl.Resources>
     <Canvas>
@@ -369,7 +355,7 @@
             </Border>
             <Ellipse Width="20" Height="20"  Canvas.Left="817" Canvas.Top="210" Fill="{Binding RtDataValues[TM.TMATMSwitch.Value],Converter={StaticResource boolToColor}}"  Stroke="Silver" StrokeThickness="2"></Ellipse>
             <Ellipse Width="20" Height="20"  Canvas.Left="797" Canvas.Top="264" Fill="{Binding RtDataValues[TM.TMVacSwitch.Value],Converter={StaticResource boolToColor}}"  Stroke="Silver" StrokeThickness="2"></Ellipse>
-            <userControls:TextboxWithLabel  Canvas.Left="838" Canvas.Top="218" LabelValue="CM3(Torr)" TextBoxValue="{Binding RtDataValues[TM.TMProcessGauge.Value],StringFormat='F1'}" TextBoxColor="#D7E4BD"/>
+            <userControls:TextboxWithLabel  Canvas.Left="838" Canvas.Top="218" LabelValue="CM3(mTorr)" TextBoxValue="{Binding RtDataValues[TM.TMProcessGauge.Value],StringFormat='F1'}" TextBoxColor="#D7E4BD"/>
             <TextBlock Text="ATM" Canvas.Left="814" Canvas.Top="195"/>
             <TextBlock Text="VAC" Canvas.Left="795" Canvas.Top="286"/>
             
@@ -410,7 +396,7 @@
             </Border>
             <Ellipse Width="20" Height="20"  Canvas.Left="837" Canvas.Top="490" Fill="{Binding RtDataValues[TM.LLBATMSwitch.Value],Converter={StaticResource boolToColor}}"  Stroke="Silver" StrokeThickness="2"></Ellipse>
             <Ellipse Width="20" Height="20"  Canvas.Left="817" Canvas.Top="544" Fill="{Binding RtDataValues[TM.LLBVacSwitch.Value],Converter={StaticResource boolToColor}}"  Stroke="Silver" StrokeThickness="2"></Ellipse>
-            <userControls:TextboxWithLabel  Canvas.Left="858" Canvas.Top="498" LabelValue="CM4(Torr)" TextBoxValue="{Binding RtDataValues[TM.LLBPressureGauge.Value],StringFormat='F1'}" TextBoxColor="#D7E4BD"/>
+            <userControls:TextboxWithLabel  Canvas.Left="858" Canvas.Top="498" LabelValue="CM4(mTorr)" TextBoxValue="{Binding RtDataValues[TM.LLBPressureGauge.Value],StringFormat='F1'}" TextBoxColor="#D7E4BD"/>
             <TextBlock Text="ATM" Canvas.Left="464" Canvas.Top="474"/>
             <TextBlock Text="VAC" Canvas.Left="444" Canvas.Top="565"/>
 
@@ -452,7 +438,7 @@
             </Border>
             <Ellipse Width="20" Height="20"  Canvas.Left="467" Canvas.Top="490" Fill="{Binding RtDataValues[TM.LLAATMSwitch.Value],Converter={StaticResource boolToColor}}"  Stroke="Silver" StrokeThickness="2"></Ellipse>
             <Ellipse Width="20" Height="20"  Canvas.Left="447" Canvas.Top="544" Fill="{Binding RtDataValues[TM.LLAVacSwitch.Value],Converter={StaticResource boolToColor}}"  Stroke="Silver" StrokeThickness="2"></Ellipse>
-            <userControls:TextboxWithLabel  Canvas.Left="378" Canvas.Top="498" LabelValue="CM5(Torr)" TextBoxValue="{Binding RtDataValues[TM.LLAPressureGauge.Value],StringFormat='F1'}" TextBoxColor="#D7E4BD"/>
+            <userControls:TextboxWithLabel  Canvas.Left="378" Canvas.Top="498" LabelValue="CM5(mTorr)" TextBoxValue="{Binding RtDataValues[TM.LLAPressureGauge.Value],StringFormat='F1'}" TextBoxColor="#D7E4BD"/>
 
             <TextBlock Text="ATM" Canvas.Left="834" Canvas.Top="474"/>
             <TextBlock Text="VAC" Canvas.Left="814" Canvas.Top="565"/>
@@ -466,7 +452,7 @@
                     </LinearGradientBrush>
                 </Border.Background>
             </Border>
-            <userControls:TextboxWithLabel  Canvas.Left="668" Canvas.Top="619" LabelValue="CM6(Torr)" TextBoxValue="{Binding RtDataValues[TM.TMForelineGauge.Value],StringFormat='F1'}" TextBoxColor="#D7E4BD"/>
+            <userControls:TextboxWithLabel  Canvas.Left="668" Canvas.Top="619" LabelValue="CM6(mTorr)" TextBoxValue="{Binding RtDataValues[TM.TMForelineGauge.Value],StringFormat='F1'}" TextBoxColor="#D7E4BD"/>
 
             <Ellipse Width="20" Height="20"  Canvas.Left="100" Canvas.Top="44"  Stroke="Silver" StrokeThickness="2" ToolTip="Pressure Alarm" Fill="{Binding RtDataValues[TM.N2PressureSwitch.Value],Converter={StaticResource boolToColor4}}"></Ellipse>
 
@@ -479,7 +465,7 @@
                     </LinearGradientBrush>
                 </Border.Background>
             </Border>
-            <userControls:TextboxWithLabel  Canvas.Left="668" Canvas.Top="729" LabelValue="CM7(Torr)" TextBoxValue="{Binding RtDataValues[TM.LoadlockForelineGauge.Value],StringFormat='F1'}" TextBoxColor="#D7E4BD"/>
+            <userControls:TextboxWithLabel  Canvas.Left="668" Canvas.Top="729" LabelValue="CM7(mTorr)" TextBoxValue="{Binding RtDataValues[TM.LoadlockForelineGauge.Value],StringFormat='F1'}" TextBoxColor="#D7E4BD"/>
             
         </Canvas>
         
@@ -522,21 +508,21 @@
                 </Border>
                 <Border  Grid.Row="1" BorderBrush="{DynamicResource Table_BD}" Background="{DynamicResource Table_BG_Content}" BorderThickness="1,0,1,0" Padding="5,1">
                     <WrapPanel Margin="10,10,10,0" Orientation="Horizontal" HorizontalAlignment="Center">
-                    <RadioButton Content="TM"  Width="80" Margin="2 0 0 10" IsChecked="True" x:Name="tmRadioButton" Template="{StaticResource TabRadio}">
+                    <RadioButton Content="TM"  Width="80" Height="30" Margin="2 0 0 10" IsChecked="True" x:Name="tmRadioButton" Style="{StaticResource Button_RadioButton}">
                             <i:Interaction.Triggers>
                                 <i:EventTrigger EventName="Checked">
                                     <i:InvokeCommandAction Command="{Binding ModuleCheckedCommand}" CommandParameter="TM"/>
                                 </i:EventTrigger>
                             </i:Interaction.Triggers>
                         </RadioButton>
-                    <RadioButton Content="LLA" Width="80" Margin="2 0 0 10" Visibility="{Binding LLAIsInstalled,Converter={StaticResource bool2VisibilityConverter}}" Template="{StaticResource TabRadio}">
+                    <RadioButton Content="LLA" Width="80" Height="30" Margin="2 0 0 10" Visibility="{Binding LLAIsInstalled,Converter={StaticResource bool2VisibilityConverter}}" Style="{StaticResource Button_RadioButton}">
                             <i:Interaction.Triggers>
                                 <i:EventTrigger EventName="Checked">
                                     <i:InvokeCommandAction Command="{Binding ModuleCheckedCommand}" CommandParameter="LLA"/>
                                 </i:EventTrigger>
                             </i:Interaction.Triggers>
                         </RadioButton>
-                    <RadioButton Content="LLB" Width="80" Margin="2 0 0 10" Visibility="{Binding LLBIsInstalled,Converter={StaticResource bool2VisibilityConverter}}" Template="{StaticResource TabRadio}">
+                    <RadioButton Content="LLB" Width="80" Height="30" Margin="2 0 0 10" Visibility="{Binding LLBIsInstalled,Converter={StaticResource bool2VisibilityConverter}}" Style="{StaticResource Button_RadioButton}">
                             <i:Interaction.Triggers>
                                 <i:EventTrigger EventName="Checked">
                                     <i:InvokeCommandAction Command="{Binding ModuleCheckedCommand}" CommandParameter="LLB"/>
@@ -568,7 +554,6 @@
 
                     <StackPanel Grid.Row="1" Grid.ColumnSpan="5" Orientation="Horizontal" HorizontalAlignment="Center" Height="35">
                         <customControls:PathButton Content="Home"              Width="110" Height="28" Margin="0,0,5,0"   Command="{Binding HomeCommand}" IsEnabled="{Binding Path=IsOFFline}"/>
-                        <!--<customControls:PathButton Content="Robot Home"              Width="120" Height="28" Margin="0,0,5,0"   Command="{Binding RobotHomeCommand}" IsEnabled="{Binding Path=IsOFFline}"/>-->
                         <customControls:PathButton Content="Vent"              Width="110" Height="28" Margin="0 0 5 0"  IsEnabled="{Binding Path=IsOFFline}" Command="{Binding VentCommand}"/>
                         <customControls:PathButton Content="Pump"              Width="110" Height="28" Margin="0 0 0 0"  IsEnabled="{Binding Path=IsOFFline}" Command="{Binding PumpCommand}"/>
                         <!--<customControls:PathButton Content="Check Load"        Width="114" Height="28" Margin="5,0,0,0" Visibility="{Binding ElementName=tmRadioButton,Path=IsChecked,Converter={StaticResource bool2VisibilityConverter}}" IsEnabled="{Binding Path=TMIsOFFline}"/>-->
@@ -613,21 +598,21 @@
                 </Border>
                 <Border  Grid.Row="1" BorderBrush="{DynamicResource Table_BD}" Background="{DynamicResource Table_BG_Content}" BorderThickness="1,0,1,0" Padding="5,1">
                     <WrapPanel Margin="10,10,10,0" Orientation="Horizontal" HorizontalAlignment="Center">
-                        <RadioButton Content="TM"  Width="80" Margin="2 0 0 10" IsChecked="True"  Template="{StaticResource TabRadio}">
+                        <RadioButton Content="TM"  Width="80" Margin="2 0 0 10" IsChecked="True">
                             <i:Interaction.Triggers>
                                 <i:EventTrigger EventName="Checked">
                                     <i:InvokeCommandAction Command="{Binding ModuleCheckedCommand}" CommandParameter="TM"/>
                                 </i:EventTrigger>
                             </i:Interaction.Triggers>
                         </RadioButton>
-                        <RadioButton Content="LLA" Width="80" Margin="2 0 0 10" Visibility="{Binding LLAIsInstalled,Converter={StaticResource bool2VisibilityConverter}}"  Template="{StaticResource TabRadio}">
+                        <RadioButton Content="LLA" Width="80" Margin="2 0 0 10" Visibility="{Binding LLAIsInstalled,Converter={StaticResource bool2VisibilityConverter}}">
                             <i:Interaction.Triggers>
                                 <i:EventTrigger EventName="Checked">
                                     <i:InvokeCommandAction Command="{Binding ModuleCheckedCommand}" CommandParameter="LLA"/>
                                 </i:EventTrigger>
                             </i:Interaction.Triggers>
                         </RadioButton>
-                        <RadioButton Content="LLB" Width="80" Margin="2 0 0 10" Visibility="{Binding LLBIsInstalled,Converter={StaticResource bool2VisibilityConverter}}"  Template="{StaticResource TabRadio}">
+                        <RadioButton Content="LLB" Width="80" Margin="2 0 0 10" Visibility="{Binding LLBIsInstalled,Converter={StaticResource bool2VisibilityConverter}}">
                             <i:Interaction.Triggers>
                                 <i:EventTrigger EventName="Checked">
                                     <i:InvokeCommandAction Command="{Binding ModuleCheckedCommand}" CommandParameter="LLB"/>

+ 4 - 3
Venus/Venus_MainPages/Views/WaferAssociationUnit.xaml

@@ -6,6 +6,7 @@
              xmlns:local="Venus_MainPages.Views"
              xmlns:unity="clr-namespace:Venus_MainPages.Unity"
              xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
+             xmlns:sys="clr-namespace:System;assembly=mscorlib"
              mc:Ignorable="d" 
              d:DesignHeight="450" d:DesignWidth="800" x:Name="WaferUnit">
     <Grid>
@@ -113,7 +114,7 @@
                 </StackPanel>
             </Grid>
 
-            <ListBox Grid.Row="1" 
+            <ListBox Grid.Row="1" SelectedIndex="{Binding ElementName=WaferUnit,Path=Index}"
                  ItemsSource="{Binding ElementName=WaferUnit,Path=WAInfo.ModuleData.WaferManager.Wafers}" Name="list1">
                 <ListBox.Resources>
                     <Style TargetType="ListBoxItem" BasedOn="{StaticResource ResourceKey={x:Type ListBoxItem}}">
@@ -151,7 +152,7 @@
                                 <TextBlock Name="txtSeqName" ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=Text}" Text="{Binding SequenceName}" Foreground="{DynamicResource FG_Black}" FontSize="12" FontFamily="Arial" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
                             </Border>
                             <Border  Grid.Column="2" BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,1,1,1"  Width="110" Padding="5,1">
-                                <Button Width="60" Height="16"  Command="{Binding Path=DataContext.SetSequenceCommand, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ListBox}}">
+                                <Button Width="60" Height="16"  Command="{Binding Path=DataContext.SetSequenceCommand, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ListBox}}" CommandParameter="{Binding}">
                                     <!--<i:Interaction.Triggers>
                                                 <i:EventTrigger EventName="Click">
                                                     <cal:ActionMessage MethodName="SetSequence">
@@ -166,7 +167,7 @@
                                             <Setter Property="Button.Content" Value="Remove"/>
                                             <Setter Property="FontSize" Value="10" />
                                             <Style.Triggers>
-                                                <DataTrigger Binding="{Binding ElementName=txtSeqName, Path=Text}" >
+                                                <DataTrigger Binding="{Binding ElementName=txtSeqName, Path=Text}" Value="{x:Static sys:String.Empty}">
                                                     <Setter Property="Button.Content" Value="Set"/>
                                                 </DataTrigger>
                                                 <DataTrigger Binding="{Binding WaferStatus}" Value="0">

+ 3 - 0
Venus/Venus_MainPages/Views/WaferAssociationUnit.xaml.cs

@@ -35,6 +35,9 @@ namespace Venus_MainPages.Views
         }
         public static readonly DependencyProperty WAInfoProperty = DependencyProperty.Register("WAInfo", typeof(WaferAssociationInfo), typeof(WaferAssociationUnit));
 
+
+       
+
         private void cb_DropDownOpened(object sender, EventArgs e)
         {
             cb.ItemsSource= GetFilesNames(System.IO.Path.Combine(QueryDataClient.Instance.Service.GetData("GetRTPath").ToString(), "Recipes", "Sequence")).ToList();

BIN=BIN
Venus/Venus_RT/Config/PM/Kepler2300/Kepler2300DeviceModel.xml


+ 118 - 6
Venus/Venus_RT/Config/System.sccfg

@@ -67,7 +67,6 @@
 		</configs>
 	</configs>
 
-
 	<!--Router-->
 	<configs name="Scheduler" nameView="Scheduler" >
 		<config default="true" name="GroupWaferBySequence" nameView="Group Wafer By Sequence" description="GroupWaferBySequence" max="0" min="0" paramter="" tag="" unit="" type="Bool" />
@@ -111,7 +110,7 @@
 
 		<config default="1" name="TMRobotType" nameView="TM Robot Type" description="TM 类型,1=SIASUN新松 2==Brooks" max="10" min="1" paramter="" tag="" unit="" type="Integer" />
 
-		<config default="100" name="SoftVentEndPressure" nameView="Soft Vent End Pressure" description="" max="30000" min="0" paramter="" tag="" unit="s" type="Integer" />
+		<config default="100" name="SoftVentEndPressure" nameView="Soft Vent End Pressure" description="" max="30000" min="0" paramter="" tag="" unit="mTorr" type="Integer" />
 
 		<config default="1" name="LLAStationNumber" nameView="LLA Station Number" description="LLA Station Number" max="99" min="0" paramter="" tag="" unit="" type="Integer" />
 		<config default="2" name="LLBStationNumber" nameView="LLB Station Number" description="LLB Station Number" max="99" min="0" paramter="" tag="" unit="" type="Integer" />
@@ -174,7 +173,7 @@
 		<config default="2000" name="PumpCrossingPressure" nameView="Pump Crossing Pressure" description="" max="500000" min="200" paramter="" tag="" unit="mTorr" type="Double" />
 		<config default="60" name="PumpingTimeout" nameView="Pumping Timeout" description="" max="3000" min="0" paramter="" tag="" unit="s" type="Integer" />
 		<config default="60" name="VentingTimeout" nameView="Venting Timeout" description="" max="3000" min="0" paramter="" tag="" unit="s" type="Integer" />
-		<config default="100" name="SoftVentEndPressure" nameView="Soft Vent End Pressure" description="" max="300" min="0" paramter="" tag="" unit="s" type="Integer" />
+		<config default="100" name="SoftVentEndPressure" nameView="Soft Vent End Pressure" description="" max="30000" min="0" paramter="" tag="" unit="mTorr" type="Integer" />
 		<config default="500" name="SwitchLLPumpDelay" nameView="Switch LL Pump Delay" description="让渡LL Pump前延迟" max="50000" min="0" paramter="" tag="" unit="ms" type="Integer" />
 		
 		<config default="2000" name="PurgeVentPressure" description="Purge Vent Pressure" max="760000" min="0" paramter="" tag="" unit="mTorr" type="Double" />
@@ -200,7 +199,7 @@
 		<config default="2000" name="PumpCrossingPressure" nameView="Pump Crossing Pressure" description="" max="500000" min="200" paramter="" tag="" unit="mTorr" type="Double" />
 		<config default="60" name="PumpingTimeout" nameView="Pumping Timeout" description="" max="3000" min="0" paramter="" tag="" unit="s" type="Integer" />
 		<config default="60" name="VentingTimeout" nameView="Venting Timeout" description="" max="3000" min="0" paramter="" tag="" unit="s" type="Integer" />
-		<config default="100" name="SoftVentEndPressure" nameView="Soft Vent End Pressure" description="" max="300" min="0" paramter="" tag="" unit="s" type="Integer" />
+		<config default="100" name="SoftVentEndPressure" nameView="Soft Vent End Pressure" description="" max="30000" min="0" paramter="" tag="" unit="mTorr" type="Integer" />
 		<config default="500" name="SwitchLLPumpDelay" nameView="Switch LL Pump Delay" description="让渡LL Pump前延迟" max="50000" min="0" paramter="" tag="" unit="ms" type="Integer" />
 		
 		<config default="2000" name="PurgeVentPressure" description="Purge Vent Pressure" max="760000" min="0" paramter="" tag="" unit="mTorr" type="Double" />
@@ -251,6 +250,8 @@
 		<config default="Strip" name="ChamberLabel"  nameView="Chamber Label" description="Chamber名称" max="" min="" paramter="" tag=""  unit="" type="String" />
 		<config default="30" name="MaxDeviationInMFCVerification" nameView="MFC verification允许的最大偏差值(%)" max="100000" min="0" paramter="" tag="" unit="%" visible="false" type="Double" />
 		<config default="150" name="WallHeaterSetPointLimit" nameView="Wall Heater Set Point Limit" description="" max="500" min="0" paramter="" tag="" unit="" type="Integer" />
+		<config default="150" name="PendulumHeaterSetPointLimit" nameView="Pendulum Heater Set Point Limit" description="" max="500" min="0" paramter="" tag="" unit="" type="Integer" />
+
 		<config default="false" name="EnableWallHeater" nameView="Enable Chamber Wall Heater" description="" max="10" min="0" paramter="" tag="" unit="" type="Bool" />
 		<config default="false" name="EnableGridHeater" nameView="Enable Chamber Grid Heater" description="" max="10" min="0" paramter="" tag="" unit="" type="Bool" />
 		<config default="5" name="RecipeToleranceIgnoreTime" nameView="Ignore Time Before Check Recipe Step Tolerance" description="" max="60" min="0" paramter="" tag="" unit="s" type="Integer" />
@@ -680,6 +681,32 @@
 			<config name="TempOffsetPoint_9" nameView="Temp Offset Point 9" description="温度补偿点 9" unit="degree" type="Integer" max="300" min="0" />
 			<config name="OffsetValue_9" nameView="Offset Value 9" description="补偿值 9" unit="degree" type="Double" max="300" min="0" />
 		</configs>
+		<configs name="PendulumHeater" nameView="Heater Pendulum" >
+			<config default="false" name="HeaterEnableTolerance" nameView="Enable Heater Deviation Check" description="" max="0" min="0" paramter="" tag="" unit="" type="Bool" />
+			<config default="200" name="HeaterAlarmRange" nameView="Heater deviation Alarm Range" description="" max="200" min="0" paramter="" tag="" unit="℃" type="Integer" />
+			<config default="10" name="HeaterAlarmTime" nameView="Heater deviation Alarm Time" description="" max="3600" min="0" paramter="" tag="" unit="second" type="Integer" />
+			<config default="100" name="HeaterWarningRange" nameView="Heater deviation Warning Range" description="" max="200" min="0" paramter="" tag="" unit="℃" type="Integer" />
+			<config default="10" name="HeaterWarningTime" nameView="Heater deviation Warning Time" description="" max="3600" min="0" paramter="" tag="" unit="second" type="Integer" />
+
+			<config name="TempOffsetPoint_1" nameView="Temp Offset Point 1" description="温度补偿点 1" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_1" nameView="Offset Value 1" description="补偿值 1" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_2" nameView="Temp Offset Point 2" description="温度补偿点 2" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_2" nameView="Offset Value 2" description="补偿值 2" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_3" nameView="Temp Offset Point 3" description="温度补偿点 3" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_3" nameView="Offset Value 3" description="补偿值 3" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_4" nameView="Temp Offset Point 4" description="温度补偿点 4" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_4" nameView="Offset Value 4" description="补偿值 4" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_5" nameView="Temp Offset Point 5" description="温度补偿点 5" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_5" nameView="Offset Value 5" description="补偿值 5" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_6" nameView="Temp Offset Point 6" description="温度补偿点 6" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_6" nameView="Offset Value 6" description="补偿值 6" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_7" nameView="Temp Offset Point 7" description="温度补偿点 7" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_7" nameView="Offset Value 7" description="补偿值 7" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_8" nameView="Temp Offset Point 8" description="温度补偿点 8" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_8" nameView="Offset Value 8" description="补偿值 8" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_9" nameView="Temp Offset Point 9" description="温度补偿点 9" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_9" nameView="Offset Value 9" description="补偿值 9" unit="degree" type="Double" max="300" min="0" />
+		</configs>
 		<configs name="ElectrostaticVoltageSource" nameView="Electrostatic Voltage Source">
 			<config default="COM64" name="Port" nameView="Port" description="serial port name of ElectrostaticVoltageSource" max="" min="" paramter="" tag="" unit="" type="String" />
 		</configs>
@@ -758,6 +785,7 @@
 		<config default="5" name="RecipeToleranceIgnoreTime" nameView="Ignore Time Before Check Recipe Step Tolerance" description="" max="60" min="0" paramter="" tag="" unit="s" type="Integer" />
 		<config default="1" name="RecipeRunningMode" nameView="0, only run current recipe; 1, include chuck/dechuck recipe" description="" max="5" min="0" paramter="" tag="" unit="" type="Integer" />
 		<config default="751" name="ForelineInterlockPressure" nameView="Foreline Interlock Pressure" description="" max="2000" min="500" paramter="" tag="" unit="°C" type="Double" />
+		<config default="150" name="PendulumHeaterSetPointLimit" nameView="Pendulum Heater Set Point Limit" description="" max="500" min="0" paramter="" tag="" unit="" type="Integer" />
 
 		<configs name="MFCVerification" nameView="MFC Verification" >
 			<config default="1" name="BasePressure" nameView="开始条件:腔体压力达到时开始流气" max="100" min="1" paramter="" tag="" unit="mTorr" visible="true" type="Double" />
@@ -1166,6 +1194,33 @@
 			<config name="TempOffsetPoint_9" nameView="Temp Offset Point 9" description="温度补偿点 9" unit="degree" type="Integer" max="300" min="0" />
 			<config name="OffsetValue_9" nameView="Offset Value 9" description="补偿值 9" unit="degree" type="Double" max="300" min="0" />
 		</configs>
+		<configs name="PendulumHeater" nameView="Heater Pendulum" >
+			<config default="false" name="HeaterEnableTolerance" nameView="Enable Heater Deviation Check" description="" max="0" min="0" paramter="" tag="" unit="" type="Bool" />
+			<config default="200" name="HeaterAlarmRange" nameView="Heater deviation Alarm Range" description="" max="200" min="0" paramter="" tag="" unit="℃" type="Integer" />
+			<config default="10" name="HeaterAlarmTime" nameView="Heater deviation Alarm Time" description="" max="3600" min="0" paramter="" tag="" unit="second" type="Integer" />
+			<config default="100" name="HeaterWarningRange" nameView="Heater deviation Warning Range" description="" max="200" min="0" paramter="" tag="" unit="℃" type="Integer" />
+			<config default="10" name="HeaterWarningTime" nameView="Heater deviation Warning Time" description="" max="3600" min="0" paramter="" tag="" unit="second" type="Integer" />
+
+			<config name="TempOffsetPoint_1" nameView="Temp Offset Point 1" description="温度补偿点 1" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_1" nameView="Offset Value 1" description="补偿值 1" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_2" nameView="Temp Offset Point 2" description="温度补偿点 2" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_2" nameView="Offset Value 2" description="补偿值 2" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_3" nameView="Temp Offset Point 3" description="温度补偿点 3" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_3" nameView="Offset Value 3" description="补偿值 3" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_4" nameView="Temp Offset Point 4" description="温度补偿点 4" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_4" nameView="Offset Value 4" description="补偿值 4" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_5" nameView="Temp Offset Point 5" description="温度补偿点 5" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_5" nameView="Offset Value 5" description="补偿值 5" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_6" nameView="Temp Offset Point 6" description="温度补偿点 6" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_6" nameView="Offset Value 6" description="补偿值 6" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_7" nameView="Temp Offset Point 7" description="温度补偿点 7" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_7" nameView="Offset Value 7" description="补偿值 7" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_8" nameView="Temp Offset Point 8" description="温度补偿点 8" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_8" nameView="Offset Value 8" description="补偿值 8" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_9" nameView="Temp Offset Point 9" description="温度补偿点 9" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_9" nameView="Offset Value 9" description="补偿值 9" unit="degree" type="Double" max="300" min="0" />
+		</configs>
+
 		<configs name="ElectrostaticVoltageSource" nameView="Electrostatic Voltage Source">
 			<config default="COM82" name="Port" nameView="Port" description="serial port name of ElectrostaticVoltageSource" max="" min="" paramter="" tag="" unit="" type="String" />
 		</configs>
@@ -1244,6 +1299,7 @@
 		<config default="5" name="RecipeToleranceIgnoreTime" nameView="Ignore Time Before Check Recipe Step Tolerance" description="" max="60" min="0" paramter="" tag="" unit="s" type="Integer" />
 		<config default="1" name="RecipeRunningMode" nameView="0, only run current recipe; 1, include chuck/dechuck recipe" description="" max="5" min="0" paramter="" tag="" unit="" type="Integer" />
 		<config default="751" name="ForelineInterlockPressure" nameView="Foreline Interlock Pressure" description="" max="2000" min="500" paramter="" tag="" unit="°C" type="Double" />
+		<config default="150" name="PendulumHeaterSetPointLimit" nameView="Pendulum Heater Set Point Limit" description="" max="500" min="0" paramter="" tag="" unit="" type="Integer" />
 
 		<configs name="MFCVerification" nameView="MFC Verification" >
 			<config default="1" name="BasePressure" nameView="开始条件:腔体压力达到时开始流气" max="100" min="1" paramter="" tag="" unit="mTorr" visible="true" type="Double" />
@@ -1652,6 +1708,33 @@
 			<config name="TempOffsetPoint_9" nameView="Temp Offset Point 9" description="温度补偿点 9" unit="degree" type="Integer" max="300" min="0" />
 			<config name="OffsetValue_9" nameView="Offset Value 9" description="补偿值 9" unit="degree" type="Double" max="300" min="0" />
 		</configs>
+		<configs name="PendulumHeater" nameView="Heater Pendulum" >
+			<config default="false" name="HeaterEnableTolerance" nameView="Enable Heater Deviation Check" description="" max="0" min="0" paramter="" tag="" unit="" type="Bool" />
+			<config default="200" name="HeaterAlarmRange" nameView="Heater deviation Alarm Range" description="" max="200" min="0" paramter="" tag="" unit="℃" type="Integer" />
+			<config default="10" name="HeaterAlarmTime" nameView="Heater deviation Alarm Time" description="" max="3600" min="0" paramter="" tag="" unit="second" type="Integer" />
+			<config default="100" name="HeaterWarningRange" nameView="Heater deviation Warning Range" description="" max="200" min="0" paramter="" tag="" unit="℃" type="Integer" />
+			<config default="10" name="HeaterWarningTime" nameView="Heater deviation Warning Time" description="" max="3600" min="0" paramter="" tag="" unit="second" type="Integer" />
+
+			<config name="TempOffsetPoint_1" nameView="Temp Offset Point 1" description="温度补偿点 1" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_1" nameView="Offset Value 1" description="补偿值 1" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_2" nameView="Temp Offset Point 2" description="温度补偿点 2" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_2" nameView="Offset Value 2" description="补偿值 2" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_3" nameView="Temp Offset Point 3" description="温度补偿点 3" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_3" nameView="Offset Value 3" description="补偿值 3" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_4" nameView="Temp Offset Point 4" description="温度补偿点 4" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_4" nameView="Offset Value 4" description="补偿值 4" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_5" nameView="Temp Offset Point 5" description="温度补偿点 5" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_5" nameView="Offset Value 5" description="补偿值 5" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_6" nameView="Temp Offset Point 6" description="温度补偿点 6" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_6" nameView="Offset Value 6" description="补偿值 6" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_7" nameView="Temp Offset Point 7" description="温度补偿点 7" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_7" nameView="Offset Value 7" description="补偿值 7" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_8" nameView="Temp Offset Point 8" description="温度补偿点 8" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_8" nameView="Offset Value 8" description="补偿值 8" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_9" nameView="Temp Offset Point 9" description="温度补偿点 9" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_9" nameView="Offset Value 9" description="补偿值 9" unit="degree" type="Double" max="300" min="0" />
+		</configs>
+
 		<configs name="ElectrostaticVoltageSource" nameView="Electrostatic Voltage Source">
 			<config default="COM17" name="Port" nameView="Port" description="serial port name of ElectrostaticVoltageSource" max="" min="" paramter="" tag="" unit="" type="String" />
 		</configs>
@@ -1730,8 +1813,9 @@
     <config default="5" name="RecipeToleranceIgnoreTime" nameView="Ignore Time Before Check Recipe Step Tolerance" description="" max="60" min="0" paramter="" tag="" unit="s" type="Integer" />
     <config default="1" name="RecipeRunningMode" nameView="0, only run current recipe; 1, include chuck/dechuck recipe" description="" max="5" min="0" paramter="" tag="" unit="" type="Integer" />
     <config default="751" name="ForelineInterlockPressure" nameView="Foreline Interlock Pressure" description="" max="2000" min="500" paramter="" tag="" unit="°C" type="Double" />
+	<config default="150" name="PendulumHeaterSetPointLimit" nameView="Pendulum Heater Set Point Limit" description="" max="500" min="0" paramter="" tag="" unit="" type="Integer" />
 
-    <configs name="MFCVerification" nameView="MFC Verification" >
+	  <configs name="MFCVerification" nameView="MFC Verification" >
       <config default="1" name="BasePressure" nameView="开始条件:腔体压力达到时开始流气" max="100" min="1" paramter="" tag="" unit="mTorr" visible="true" type="Double" />
       <config default="180" name="PumpingTime" nameView="抽气时间" max="7200" min="0" paramter="" tag="" unit="second" visible="true" type="Integer" />
       <config default="10" name="GasFlowTime" nameView="结束条件:流气多长时间" max="600" min="0" paramter="" tag="" unit="second" visible="true" type="Integer" />
@@ -2138,7 +2222,34 @@
       <config name="TempOffsetPoint_9" nameView="Temp Offset Point 9" description="温度补偿点 9" unit="degree" type="Integer" max="300" min="0" />
       <config name="OffsetValue_9" nameView="Offset Value 9" description="补偿值 9" unit="degree" type="Double" max="300" min="0" />
     </configs>
-    <configs name="ElectrostaticVoltageSource" nameView="Electrostatic Voltage Source">
+		<configs name="PendulumHeater" nameView="Heater Pendulum" >
+			<config default="false" name="HeaterEnableTolerance" nameView="Enable Heater Deviation Check" description="" max="0" min="0" paramter="" tag="" unit="" type="Bool" />
+			<config default="200" name="HeaterAlarmRange" nameView="Heater deviation Alarm Range" description="" max="200" min="0" paramter="" tag="" unit="℃" type="Integer" />
+			<config default="10" name="HeaterAlarmTime" nameView="Heater deviation Alarm Time" description="" max="3600" min="0" paramter="" tag="" unit="second" type="Integer" />
+			<config default="100" name="HeaterWarningRange" nameView="Heater deviation Warning Range" description="" max="200" min="0" paramter="" tag="" unit="℃" type="Integer" />
+			<config default="10" name="HeaterWarningTime" nameView="Heater deviation Warning Time" description="" max="3600" min="0" paramter="" tag="" unit="second" type="Integer" />
+
+			<config name="TempOffsetPoint_1" nameView="Temp Offset Point 1" description="温度补偿点 1" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_1" nameView="Offset Value 1" description="补偿值 1" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_2" nameView="Temp Offset Point 2" description="温度补偿点 2" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_2" nameView="Offset Value 2" description="补偿值 2" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_3" nameView="Temp Offset Point 3" description="温度补偿点 3" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_3" nameView="Offset Value 3" description="补偿值 3" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_4" nameView="Temp Offset Point 4" description="温度补偿点 4" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_4" nameView="Offset Value 4" description="补偿值 4" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_5" nameView="Temp Offset Point 5" description="温度补偿点 5" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_5" nameView="Offset Value 5" description="补偿值 5" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_6" nameView="Temp Offset Point 6" description="温度补偿点 6" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_6" nameView="Offset Value 6" description="补偿值 6" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_7" nameView="Temp Offset Point 7" description="温度补偿点 7" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_7" nameView="Offset Value 7" description="补偿值 7" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_8" nameView="Temp Offset Point 8" description="温度补偿点 8" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_8" nameView="Offset Value 8" description="补偿值 8" unit="degree" type="Double" max="300" min="0" />
+			<config name="TempOffsetPoint_9" nameView="Temp Offset Point 9" description="温度补偿点 9" unit="degree" type="Integer" max="300" min="0" />
+			<config name="OffsetValue_9" nameView="Offset Value 9" description="补偿值 9" unit="degree" type="Double" max="300" min="0" />
+		</configs>
+
+		<configs name="ElectrostaticVoltageSource" nameView="Electrostatic Voltage Source">
       <config default="COM56" name="Port" nameView="Port" description="serial port name of ElectrostaticVoltageSource" max="" min="" paramter="" tag="" unit="" type="String" />
     </configs>
     <configs name="TurboPump" nameView="Turbo Pump">
@@ -2178,6 +2289,7 @@
     </configs>
 
   </configs>
+	
 	<!--Recipe-->
 	<configs name="Recipe" nameView="Recipe">		
 		<configs name="Venus" nameView="Venus Module" >

+ 20 - 3
Venus/Venus_RT/Devices/AIRSYSChiller.cs

@@ -14,6 +14,7 @@ using Aitex.Core.Util;
 using MECF.Framework.Common.Communications;
 using MECF.Framework.Common.Device.Bases;
 using MECF.Framework.Common.Equipment;
+using Venus_Core;
 
 namespace Venus_RT.Devices
 {
@@ -96,7 +97,15 @@ namespace Venus_RT.Devices
         {
             get
             {
-                return GetAiValue($"{Module}.AI_Coolant_Inlet_Temp");
+                if (jetChamber == JetChamber.Venus)
+                {
+                    return GetAiValue($"{Module}.AI_Coolant_Inlet_Temp");
+
+                }
+                else
+                {
+                    return 0;
+                }             
             }
         }
 
@@ -106,7 +115,14 @@ namespace Venus_RT.Devices
         {
             get
             {
-                return GetAiValue($"{Module}.AI_Coolant_Outlet_Temp");
+                if (jetChamber == JetChamber.Venus)
+                {
+                    return GetAiValue($"{Module}.AI_Coolant_Outlet_Temp");
+                }
+                else
+                {
+                    return 0;
+                }
             }
         }
 
@@ -143,7 +159,7 @@ namespace Venus_RT.Devices
         private ToleranceChecker _toleranceChecker = new ToleranceChecker();
         private string _lastAlarmString;
         private int _operation_flag = 0;
-
+        JetChamber jetChamber;
         public AIRSYSChiller(ModuleName mod, string name) : base(mod.ToString(), name, name, "")
         {
             if (Module == "PMB" && SC.GetValue<bool>($"PMB.Chiller.ChillerSameWithPMA") && SC.GetValue<bool>($"PMB.Chiller.EnableChiller")) return;
@@ -156,6 +172,7 @@ namespace Venus_RT.Devices
             _scAlarmTime = SC.GetConfigItem($"{Module}.{Name}.ToleranceAlarmTime");
 
             _serial = new AsyncSerialPort(_PortNum, 9600, 8, System.IO.Ports.Parity.None, System.IO.Ports.StopBits.Two, "\r", true);
+            jetChamber = (JetChamber)SC.GetValue<int>($"{mod.ToString()}.ChamberType");
         }
 
         public override bool Initialize()

+ 52 - 12
Venus/Venus_RT/Devices/JetKepler2300PM.cs

@@ -17,6 +17,7 @@ using IoMfc = Venus_RT.Devices.IODevices.IoMfc;
 using System.Threading.Tasks;
 using Aitex.Core.RT.DataCenter;
 using Aitex.Core.Backend;
+using Aitex.Core.RT.OperationCenter;
 
 namespace Venus_RT.Devices
 {
@@ -108,11 +109,11 @@ namespace Venus_RT.Devices
         private readonly double _foreline_interlock_pressure = 750;
 
 
-        private float _chillerInnerTemp=>GetAiValue($"{Module}.AI_ESC_inner_coolant_outlet_TC_Temp");
+        private float _chillerInnerTemp => GetAiValue($"{Module}.AI_ESC_inner_coolant_outlet_TC_Temp");
         private float _chillerOuterTemp => GetAiValue($"{Module}.AI_ESC_outer_coolant_outlet_TC_Temp");
         private float _chillerTopTemp => GetAiValue($"{Module}.AI_Top_Plate_coolant_outlet_TC_Temp");
 
-
+        
 
         // 盖子的状态
         public override bool IsLidClosed => _Lid.OFFFeedback;
@@ -177,10 +178,15 @@ namespace Venus_RT.Devices
         public override double ESCNegativeOutputCurrent => _ESCHV.NegativeOutputCurrent;
         public override bool IsHVOn => _ESCHV.IsOn;
 
-        public override float CoolantInletTempFB => _Chiller.CoolantInletTcFeedback;
-        public override float CoolantOutletTempFB => _Chiller.CoolantOutletTcFeedback;
+        public override float CoolantInletTempFB => 0;
+        public override float CoolantOutletTempFB => 0;
+
+        public override bool ChillerIsRunning => false;
+
+        public bool innerChillerIsRunning=>_InnerChiller.IsRunning;
+        public bool outerChillerIsRunning => _OuterChiller.IsRunning;
+        public bool topChillerIsRunning => _TopChiller.IsRunning;
 
-        public override bool ChillerIsRunning => _Chiller.IsRunning;
 
         //Loadlock_Arm
         public override bool IsLoadlockArmRetract => _LoadLockArm.OFFFeedback;
@@ -452,6 +458,21 @@ namespace Venus_RT.Devices
             DATA.Subscribe($"{Module}.ChillerOuterTemp", () => _chillerOuterTemp);
             DATA.Subscribe($"{Module}.ChillerTopTemp",   () => _chillerTopTemp);
 
+            //DATA.Subscribe($"{Module}.InnerChiller.IsRunning", () => innerChillerIsRunning);
+            //DATA.Subscribe($"{Module}.OuterChiller.IsRunning", () => outerChillerIsRunning);
+            //DATA.Subscribe($"{Module}.TopChiller.IsRunning",   () => topChillerIsRunning);
+
+
+            //OP.Subscribe($"{Module}.HeatChiller", (cmd, args) => {
+            //    HeatChiller(ChillerType.InnerChiller, Convert.ToDouble(args[1]), Convert.ToDouble(args[2]));
+            //    return true;
+            //});
+            //OP.Subscribe($"{Module}.OnOffChiller", (cmd, args) => {
+            //    //HeatChiller(ChillerType.InnerChiller, Convert.ToDouble(args[1]), Convert.ToDouble(args[2]));
+            //    OnOffChiller(ChillerType.InnerChiller, (bool)(args[1]));
+            //    return true;
+            //});
+
         }
 
         #endregion
@@ -620,15 +641,34 @@ namespace Venus_RT.Devices
 
         protected override void CheckPermanentInterlock()
         {
-            if (ProcessPressure > 100 && _GuageValve.SetPoint)
+            var isOnline= DATA.Poll(Module.ToString(), "IsOnline");
+            if (isOnline==null)
             {
-                _GuageValve.TurnValve(false, out _);
-                LOG.Write(eEvent.WARN_DEVICE_INFO, Module, $"Process pressure:{ProcessPressure} exceed 100 mtorr, Guage Valve (DO-31) closed automaticlly.");
+                return;
             }
-        }
-        private void WriteTMPressure()
-        { 
-        
+            if (Convert.ToBoolean(isOnline) == false)
+            {
+                if (ProcessLowPressure > 95 && _GuageValve.SetPoint)
+                {
+                    _GuageValve.TurnValve(false, out _);
+                    //LOG.Write(eEvent.WARN_DEVICE_INFO, Module, $"Low pressure:{ProcessPressure} > 100 mtorr, Guage Valve (DO-31) closed automaticlly.");
+                }
+            }
+            else
+            {
+                if (ProcessLowPressure > 95 && _GuageValve.SetPoint)
+                {
+                    _GuageValve.TurnValve(false, out _);
+                    //LOG.Write(eEvent.WARN_DEVICE_INFO, Module, $"Low pressure:{ProcessPressure} > 100 mtorr, Guage Valve (DO-31) closed automaticlly.");
+                }
+                if (ProcessHighPressure < 95 && _GuageValve.SetPoint == false)
+                {
+                    _GuageValve.TurnValve(true, out _);
+                    //LOG.Write(eEvent.WARN_DEVICE_INFO, Module, $"High pressure:{ProcessPressure} < 100 mtorr, Guage Valve (DO-31) open automaticlly.");
+
+                }
+            }
+           
         }
         public override void CheckIdleInterlock()
         {

+ 2 - 2
Venus/Venus_RT/Devices/JetPMBase.cs

@@ -260,8 +260,8 @@ namespace Venus_RT.Devices
             });
             OP.Subscribe($"{Module}.OnOffChiller", (cmd, args) => {
                 var chillerType = (ChillerType)Enum.Parse(typeof(ChillerType), args[0].ToString());
-
-                OnOffChiller(chillerType, (bool)args[1]);
+                var ison = Convert.ToBoolean(args[1]);
+                OnOffChiller(chillerType, ison);
                 return true;
             });
             OP.Subscribe($"{Module}.WallChiller", (cmd, args) => {

+ 3 - 3
Venus/Venus_RT/Devices/PendulumValve.cs

@@ -451,7 +451,7 @@ namespace Venus_RT.Devices
                 return false;
             }
 
-            if (_chamber.ForelinePressure > 500)
+            if (_chamber.ForelinePressure > 750)
             {
                 
                 LOG.Write(eEvent.WARN_DEVICE_INFO, Module, $"Foreline Pressure:{_chamber.ForelinePressure} is higher than 500mtorr, can not turn on pendulum valve.");
@@ -459,9 +459,9 @@ namespace Venus_RT.Devices
                 return false;
             }
 
-            if(_chamber.ProcessHighPressure > 500 && _chamber.TurboPumpSpeed > 100)
+            if(_chamber.ProcessHighPressure > 600 && _chamber.TurboPumpSpeed > 100)
             {
-                LOG.Write(eEvent.WARN_DEVICE_INFO, Module, $"Chamber Pressure:{_chamber.ChamberPressure} is higher than 500mtorr and Chamber.TurboPumpSpeed is higher than 100, can not turn on pendulum valve.");
+                LOG.Write(eEvent.WARN_DEVICE_INFO, Module, $"Chamber Pressure:{_chamber.ChamberPressure} is higher than 600mtorr and Chamber.TurboPumpSpeed is higher than 100, can not turn on pendulum valve.");
                 //_noRepeatAlarm($"Foreline Pressure:{_chamber.ForelinePressure} is too high, can not turn on pendulum valve.");
                 return false;
             }

+ 12 - 5
Venus/Venus_RT/Modules/PMs/PMEntity.cs

@@ -333,11 +333,11 @@ namespace Venus_RT.Modules.PMs
 
         private bool FnSetOnline(object[] param)
         {
-            if (!IsAutoMode)
-            {
-                EV.PostWarningLog(Module.ToString(), $"{Module} in manual mode,can not set online.");
-                return false;
-            }
+            //if (!IsAutoMode)
+            //{
+            //    EV.PostWarningLog(Module.ToString(), $"{Module} in manual mode,can not set online.");
+            //    return false;
+            //}
 
             if (!_chamber.CheckSlitDoorClose())
             {
@@ -397,6 +397,8 @@ namespace Venus_RT.Modules.PMs
             //EnterExitTransition((int)PMState.Homing, FnEnterHome, (int)FSM_MSG.NONE, FnExitHome);
 
             AnyStateTransition(MSG.Error,       FnError,            PMState.Error);
+            AnyStateTransition(MSG.Online,      FnSetOnline,        FSM_STATE.SAME);
+            AnyStateTransition(MSG.Offline,     FnSetOffline,       FSM_STATE.SAME);
 
             Transition(PMState.Init,            FSM_MSG.TIMER,      FnTimeout,                  PMState.Init);
             Transition(PMState.Init,            MSG.Home,           FnStartHome,                PMState.Homing);
@@ -593,6 +595,7 @@ namespace Venus_RT.Modules.PMs
 
             WaferManager.Instance.SubscribeLocation(Module, 1);
         }
+       
         protected override bool Init()
         {
             DATA.Subscribe($"{Module}.FsmState", () => (((PMState)fsm.State)));
@@ -613,6 +616,8 @@ namespace Venus_RT.Modules.PMs
             DATA.Subscribe($"{Module}.IsAlarm", () => IsError);
             DATA.Subscribe($"{Module}.IsBusy", () => IsBusy);
             DATA.Subscribe($"{Module}.IsInit", () => IsInit);
+            DATA.Subscribe($"{Module}.IsOnline", () => _isOnline);
+
 
             //DATA.Subscribe($"{Module}.GetLeakCheckDatas", () => LeakCheckDataRecorder.GetAllLeakCheckData(Module.ToString()));
 
@@ -653,6 +658,8 @@ namespace Venus_RT.Modules.PMs
 
             OP.Subscribe($"{Module}.ManualEndStep", (cmd, args) => ManualEndStep() );
 
+            OP.Subscribe($"{Module}.{RtOperation.PmOnline}", (cmd, args) => CheckToPostMessage((int)MSG.Online));
+            OP.Subscribe($"{Module}.{RtOperation.PmOffline}", (cmd, args) => CheckToPostMessage((int)MSG.Offline));
 
 
             return true;

+ 30 - 4
Venus/Venus_RT/Modules/TM/MFPurgeRoutine.cs

@@ -70,11 +70,11 @@ namespace Venus_RT.Modules.TM
                 .Run((int)PurgeStep.kPumpToCrossing,            HOFs.WrapAction(_JetTM.TurnSoftPumpValve, Module, true),    () => { return _JetTM.GetModulePressure(Module) < _CrossingPressure; })
                 .Run((int)PurgeStep.kPumpToBase,                SwitchFastPump,                                             () => { return _JetTM.GetModulePressure(Module) < _basePressure; })
                 .LoopStart((int)PurgeStep.kPurgeDelay_1,        "Purge",            _purgeCycleCounter,                     HOFs.WrapAction(_JetTM.TurnFastPumpValve, Module, false),           _delay_1s)
-                .LoopRun((int)PurgeStep.kPurgeVent,             HOFs.WrapAction(_JetTM.TurnVentValve, Module, true),        () => { return _JetTM.GetModulePressure(Module) >= _purgeVentPressure; })
-                .LoopRun((int)PurgeStep.kPurgeDelay_2,          HOFs.WrapAction(_JetTM.TurnVentValve, Module, false),       _delay_1s)
-                .LoopRun((int)PurgeStep.kPurgePumpToCrossing,   HOFs.WrapAction(_JetTM.TurnSoftPumpValve, Module, true),    () => { return _JetTM.GetModulePressure(Module) < _basePressure; })
+                .LoopRun((int)PurgeStep.kPurgeVent,             OpenPurge,                                                  () => { return _JetTM.GetModulePressure(Module) >= _purgeVentPressure; })
+                .LoopRun((int)PurgeStep.kPurgeDelay_2,          ClosePurge,                                                  _delay_1s)
+                //.LoopRun((int)PurgeStep.kPurgePumpToCrossing,   HOFs.WrapAction(_JetTM.TurnSoftPumpValve, Module, true),    () => { return _JetTM.GetModulePressure(Module) < _basePressure; })
                 .LoopRun((int)PurgeStep.kPurgePumpToBase,       SwitchFastPump,                                             () => { return _JetTM.GetModulePressure(Module) < _basePressure; })
-                .LoopRun((int)PurgeStep.kPurgePumpDelay,        NullFun,                                                    _purgePumpTime * 1000)
+                //.LoopRun((int)PurgeStep.kPurgePumpDelay,        NullFun,                                                    _purgePumpTime * 1000)
                 .LoopEnd((int)PurgeStep.kPurgeEnd,              HOFs.WrapAction(_JetTM.CloseModuleAllValves, Module),       _delay_1s)
                 .End((int)PurgeStep.kEnd,                       NullFun,                                                    _delay_50ms);
 
@@ -93,5 +93,31 @@ namespace Venus_RT.Modules.TM
 
             return true;
         }
+        private bool OpenPurge()
+        {
+            _JetTM.TurnN2Valve(true);
+            if (Module == ModuleName.TM)
+            {
+                _JetTM.TurnVentValve(Module, true);
+            }
+            else
+            { 
+               _JetTM.TurnPurgeValve(Module, true);
+            }
+            return true;
+        }
+        public bool ClosePurge()
+        {
+            _JetTM.TurnN2Valve(false);
+            if (Module == ModuleName.TM)
+            {
+                _JetTM.TurnVentValve(Module, false);
+            }
+            else
+            {
+                _JetTM.TurnPurgeValve(Module, false);
+            }
+            return true;
+        }
     }
 }

+ 13 - 14
Venus/Venus_RT/Modules/TM/MFVentRoutine.cs

@@ -48,7 +48,7 @@ namespace Venus_RT.Modules.TM
             //    .End((int)VentStep.kCloseVentValves,    CloseVentValve,     _delay_50ms);
 
             Runner.Run((int)VentStep.kOpenSoftVent,     OpenSoftVentValve,    IsSoftVentEnd)
-                  .Run((int)VentStep.KSwitchFastVent,   SwitchFastVentValve, IsPressureReady)
+                  .Run((int)VentStep.KSwitchFastVent,   SwitchFastVentValve, IsPressureReady, _ventingTimeout)
                   .Delay((int)VentStep.KDelay2S,        2*1000)
                   .End((int)VentStep.kCloseVentValves,  CloseVentValve,        _delay_50ms);
 
@@ -59,7 +59,6 @@ namespace Venus_RT.Modules.TM
         {
             _JetTM.TurnN2Valve(true);
             _JetTM.TurnPurgeValve(Module, true);
-            // _JetTM.TurnSoftPumpValve(Module, true);
             return true;
         }
         private bool IsSoftVentEnd()
@@ -68,21 +67,18 @@ namespace Venus_RT.Modules.TM
         }
         private bool SwitchFastVentValve()
         {
-            _JetTM.TurnPurgeValve(Module, false);
-            _JetTM.TurnSoftPumpValve(Module, false);
+            if (Module == ModuleName.TM)
+            {
+                _JetTM.TurnPurgeValve(Module, false);
+
+                _JetTM.SetTMFlow(100);
+
+            }
 
             _JetTM.TurnVentValve(Module, true);
+
             return true;
         }
-        //private bool OpenVentValve()
-        //{
-        //    if(!IsPressureReady())
-        //    {
-        //        _JetTM.TurnVentValve(Module, true);
-        //    }
-
-        //    return true;
-        //}
 
         private bool CloseVentValve()
         {
@@ -90,7 +86,10 @@ namespace Venus_RT.Modules.TM
              _JetTM.TurnPurgeValve(Module, false);
              _JetTM.TurnVentValve(Module, false);
 
-            // _JetTM.TurnVentValve(Module, false);
+            if (Module == ModuleName.TM)
+            {
+                _JetTM.SetTMFlow(0);
+            }
             return true;
         }