Browse Source

1.Add Venus DE processdefine content
2.Add Tru match only read c1 c2 cmd

hecl 1 year ago
parent
commit
7fe748b93a

+ 57 - 33
Venus/Venus_MainPages/ViewModels/OverVenusDEViewModel.cs

@@ -21,6 +21,7 @@ using Venus_Themes.UserControls;
 using Prism.Commands;
 using MECF.Framework.Common.DataCenter;
 using System.IO;
+using System.Windows.Controls;
 
 namespace Venus_MainPages.ViewModels
 {
@@ -196,9 +197,9 @@ namespace Venus_MainPages.ViewModels
         private int m_TurboPumpRotationalSpeed;
 
         private bool m_LiftPinIsUp;
-        private bool m_IsSlitDoorClosed=true;
+        private bool m_IsSlitDoorClosed = true;
         private bool m_IsLinerDoorClosed;
-        private bool m_IsLidClosed=true;
+        private bool m_IsLidClosed = true;
 
         private float m_ChillerTemperature;
         private float m_HVTemperature;
@@ -232,9 +233,9 @@ namespace Venus_MainPages.ViewModels
         private RecipeResult m_CurrentRecipeResult = new RecipeResult();
 
         private RecipeStep m_CurrentRecipeStep = new RecipeStep();
-
+        private int m_SelectedRecipeIndex = -1;
         private double m_ChamberPressureFeedBack;
-
+        private ComboBoxItem m_SelectedRecipeType;
         private string m_WaferID;
         private string m_ModuleName;
         private int? currentRecipeNumber;
@@ -258,6 +259,7 @@ namespace Venus_MainPages.ViewModels
             get { return m_CurrentRecipeResult; }
             set { SetProperty(ref m_CurrentRecipeResult, value); }
         }
+
         public RecipeStep CurrentRecipeStep
         {
             get { return m_CurrentRecipeStep; }
@@ -691,7 +693,11 @@ namespace Venus_MainPages.ViewModels
             get { return m_WallHeaterData; }
             set { SetProperty(ref m_WallHeaterData, value); }
         }
-
+        public int SelectedRecipeIndex
+        {
+            get { return m_SelectedRecipeIndex; }
+            set { SetProperty(ref m_SelectedRecipeIndex, value); }
+        }
         public AITRfData SRFData
         {
             get { return m_SRFData; }
@@ -702,7 +708,7 @@ namespace Venus_MainPages.ViewModels
             get { return m_BRFData; }
             set { SetProperty(ref m_BRFData, value); }
         }
-        public PMState PMCurrentState  
+        public PMState PMCurrentState
         {
             get { return m_PMCurrentState; }
             set { SetProperty(ref m_PMCurrentState, value); }
@@ -759,22 +765,22 @@ namespace Venus_MainPages.ViewModels
             get { return m_PurgeValveIsOpen; }
             set { SetProperty(ref m_PurgeValveIsOpen, value); }
         }
-        public bool PV51ValveIsOpen{ get{return m_PV51ValveIsOpen;} set{SetProperty(ref m_PV51ValveIsOpen,value);}}
-        public bool PV52ValveIsOpen{ get{return m_PV52ValveIsOpen;} set{SetProperty(ref m_PV52ValveIsOpen,value);}}
-        public bool PV61ValveIsOpen{ get{return m_PV61ValveIsOpen;} set{SetProperty(ref m_PV61ValveIsOpen,value);}}
-        public bool PV62ValveIsOpen{ get{return m_PV62ValveIsOpen;} set{SetProperty(ref m_PV62ValveIsOpen,value);}}
-        public bool PV71ValveIsOpen{ get{return m_PV71ValveIsOpen;} set{SetProperty(ref m_PV71ValveIsOpen,value);}}
-        public bool PV72ValveIsOpen{ get{return m_PV72ValveIsOpen;} set{SetProperty(ref m_PV72ValveIsOpen,value);}}
-        public bool PV81ValveIsOpen{ get{return m_PV81ValveIsOpen;} set{SetProperty(ref m_PV81ValveIsOpen,value);}}
-        public bool PV82ValveIsOpen{ get{return m_PV82ValveIsOpen;} set{SetProperty(ref m_PV82ValveIsOpen,value);}}
-        public bool PV91ValveIsOpen{ get{return m_PV91ValveIsOpen;} set{SetProperty(ref m_PV91ValveIsOpen,value);}}
-        public bool PV92ValveIsOpen{ get{return m_PV92ValveIsOpen;} set{SetProperty(ref m_PV92ValveIsOpen,value);}}
-        public bool PVA1ValveIsOpen{ get{return m_PVA1ValveIsOpen;} set{SetProperty(ref m_PVA1ValveIsOpen,value);}}
-        public bool PVA2ValveIsOpen{ get{return m_PVA2ValveIsOpen;} set{SetProperty(ref m_PVA2ValveIsOpen,value);}}
-        public bool PVB1ValveIsOpen{ get{return m_PVB1ValveIsOpen;} set{SetProperty(ref m_PVB1ValveIsOpen,value);}}
-        public bool PVB2ValveIsOpen{ get{return m_PVB2ValveIsOpen;} set{SetProperty(ref m_PVB2ValveIsOpen,value);}}
-        public bool PVC1ValveIsOpen{ get{return m_PVC1ValveIsOpen;} set{SetProperty(ref m_PVC1ValveIsOpen,value);}}
-        public bool PVC2ValveIsOpen{ get{return m_PVC2ValveIsOpen;} set{ SetProperty(ref m_PVC2ValveIsOpen, value); } }
+        public bool PV51ValveIsOpen { get { return m_PV51ValveIsOpen; } set { SetProperty(ref m_PV51ValveIsOpen, value); } }
+        public bool PV52ValveIsOpen { get { return m_PV52ValveIsOpen; } set { SetProperty(ref m_PV52ValveIsOpen, value); } }
+        public bool PV61ValveIsOpen { get { return m_PV61ValveIsOpen; } set { SetProperty(ref m_PV61ValveIsOpen, value); } }
+        public bool PV62ValveIsOpen { get { return m_PV62ValveIsOpen; } set { SetProperty(ref m_PV62ValveIsOpen, value); } }
+        public bool PV71ValveIsOpen { get { return m_PV71ValveIsOpen; } set { SetProperty(ref m_PV71ValveIsOpen, value); } }
+        public bool PV72ValveIsOpen { get { return m_PV72ValveIsOpen; } set { SetProperty(ref m_PV72ValveIsOpen, value); } }
+        public bool PV81ValveIsOpen { get { return m_PV81ValveIsOpen; } set { SetProperty(ref m_PV81ValveIsOpen, value); } }
+        public bool PV82ValveIsOpen { get { return m_PV82ValveIsOpen; } set { SetProperty(ref m_PV82ValveIsOpen, value); } }
+        public bool PV91ValveIsOpen { get { return m_PV91ValveIsOpen; } set { SetProperty(ref m_PV91ValveIsOpen, value); } }
+        public bool PV92ValveIsOpen { get { return m_PV92ValveIsOpen; } set { SetProperty(ref m_PV92ValveIsOpen, value); } }
+        public bool PVA1ValveIsOpen { get { return m_PVA1ValveIsOpen; } set { SetProperty(ref m_PVA1ValveIsOpen, value); } }
+        public bool PVA2ValveIsOpen { get { return m_PVA2ValveIsOpen; } set { SetProperty(ref m_PVA2ValveIsOpen, value); } }
+        public bool PVB1ValveIsOpen { get { return m_PVB1ValveIsOpen; } set { SetProperty(ref m_PVB1ValveIsOpen, value); } }
+        public bool PVB2ValveIsOpen { get { return m_PVB2ValveIsOpen; } set { SetProperty(ref m_PVB2ValveIsOpen, value); } }
+        public bool PVC1ValveIsOpen { get { return m_PVC1ValveIsOpen; } set { SetProperty(ref m_PVC1ValveIsOpen, value); } }
+        public bool PVC2ValveIsOpen { get { return m_PVC2ValveIsOpen; } set { SetProperty(ref m_PVC2ValveIsOpen, value); } }
 
         public bool MFC2ValveIsOpen
         {
@@ -1079,6 +1085,11 @@ namespace Venus_MainPages.ViewModels
             get { return m_WaferID; }
             set { SetProperty(ref m_WaferID, value); }
         }
+        public ComboBoxItem SelectedRecipeType
+        {
+            get { return m_SelectedRecipeType; }
+            set { SetProperty(ref m_SelectedRecipeType, value); }
+        }
         #endregion
         #region 命令
 
@@ -1090,6 +1101,10 @@ namespace Venus_MainPages.ViewModels
         public DelegateCommand PMAbortCommnad =>
             _PMAbortCommnad ?? (_PMAbortCommnad = new DelegateCommand(OnPMAbort));
 
+        private DelegateCommand _SwitchTypeCommand;
+        public DelegateCommand SwitchTypeCommand =>
+        _SwitchTypeCommand ?? (_SwitchTypeCommand = new DelegateCommand(OnSwitchType));
+
         private DelegateCommand _GasCommand;
         public DelegateCommand GasCommand =>
             _GasCommand ?? (_GasCommand = new DelegateCommand(OnGas));
@@ -1213,7 +1228,7 @@ namespace Venus_MainPages.ViewModels
         #endregion
 
         #region 构造函数
-        public OverVenusDEViewModel()   
+        public OverVenusDEViewModel()
         {
             m_RtDataKeys = new List<string>();
 
@@ -1489,10 +1504,10 @@ namespace Venus_MainPages.ViewModels
         //    }
         //}
         private async void OnSetBRf()
-        {   
+        {
             if (BRFData.IsRfOn == true)
             {
-                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.SetBRf", BRFFwdPowerSetpoint, false);
+                InvokeClient.Instance.Service.DoOperation($"{ModuleName}.SetBRf", BRFFwdPowerSetpoint, false);
             }
             else
             {
@@ -1500,7 +1515,7 @@ namespace Venus_MainPages.ViewModels
                 {
                     InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{VenusDevice.BiasMatch}.{AITRfOperation.SetMatchPosition}", BRFMatchC1, BRFMatchC2);
                     await Task.Delay(100);
-                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.SetBRf", BRFFwdPowerSetpoint, true);                                                   
+                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.SetBRf", BRFFwdPowerSetpoint, true);
                 }
             }
         }
@@ -1527,7 +1542,8 @@ namespace Venus_MainPages.ViewModels
         }
         private void OnLoadRecipe()
         {
-            CurrentModuleRecipes = GetFilesNames(Path.Combine(QueryDataClient.Instance.Service.GetData("GetRTPath").ToString(), "Recipes", ModuleName, "Process")).ToList();
+            string recipeType = SelectedRecipeType.Content.ToString();
+            CurrentModuleRecipes = GetFilesNames(Path.Combine(QueryDataClient.Instance.Service.GetData("GetRTPath").ToString(), "Recipes", ModuleName, recipeType)).ToList();
         }
 
         private void OnHV()
@@ -1557,10 +1573,18 @@ namespace Venus_MainPages.ViewModels
 
         }
 
-
+        private void OnSwitchType()
+        {
+            SelectedRecipeIndex = -1;
+        }
         private void OnRunRecipe(object obj)
         {
-            string recipeName = SelectedRecipe;
+            if (SelectedRecipeIndex == -1)
+            {
+                return;
+            }
+            string recipeName = CurrentModuleRecipes[SelectedRecipeIndex];
+            string recipeType = SelectedRecipeType.Content.ToString();
             if (recipeName == null)
             {
                 return;
@@ -1796,14 +1820,14 @@ namespace Venus_MainPages.ViewModels
                 MFCHeData = CommonFunction.GetValue<AITMfcData>(RtDataValues, $"{ModuleName}.MfcHe");
                 MFCN2Data = CommonFunction.GetValue<AITMfcData>(RtDataValues, $"{ModuleName}.MfcN2");
 
-               // SRFData = CommonFunction.GetValue<AITRfData>(RtDataValues, $"{ModuleName}.{VenusDevice.Rf}.DeviceData");
+                // SRFData = CommonFunction.GetValue<AITRfData>(RtDataValues, $"{ModuleName}.{VenusDevice.Rf}.DeviceData");
                 BRFData = CommonFunction.GetValue<AITRfData>(RtDataValues, $"{ModuleName}.{VenusDevice.BiasRf}.DeviceData");
                 PendulumValveData = CommonFunction.GetValue<AITPendulumValveData>(RtDataValues, $"{ModuleName}.{VenusDevice.PendulumValve}.DeviceData");
                 ESCHVData = CommonFunction.GetValue<AITHVData>(RtDataValues, $"{ModuleName}.{VenusDevice.ESCHV}.DeviceData");
                 SecondPurgeValveIsOpen = CommonFunction.GetValue<bool>(RtDataValues, $"{ModuleName}.ValveSecondPurge.IsOpen");
 
                 ValveHeaterData = (AITHeaterData)RtDataValues[$"{ModuleName}.ValveHeater.DeviceData"];
-                MagnetData= CommonFunction.GetValue<AITMagnetData>(RtDataValues, $"{ModuleName}.AIoMagnet.DeviceData");
+                MagnetData = CommonFunction.GetValue<AITMagnetData>(RtDataValues, $"{ModuleName}.AIoMagnet.DeviceData");
                 ForelineHeaterData = (AITHeaterData)RtDataValues[$"{ModuleName}.ForelineHeater.DeviceData"];
                 //WallHeaterData = (AITHeaterData)RtDataValues[$"{ModuleName}.WallHeater.DeviceData"];
                 MainPurgeValveIsOpen = CommonFunction.GetValue<bool>(RtDataValues, $"{ModuleName}.ValveMainPurge.IsOpen");
@@ -1947,7 +1971,7 @@ namespace Venus_MainPages.ViewModels
             m_RtDataKeys.Add($"{ModuleName}.ValveMfc9.IsOpen");
             m_RtDataKeys.Add($"{ModuleName}.ValveMfc10.IsOpen");
             m_RtDataKeys.Add($"{ModuleName}.ValveMfc11.IsOpen");
-           // m_RtDataKeys.Add($"{ModuleName}.ValveMfc12.IsOpen");
+            // m_RtDataKeys.Add($"{ModuleName}.ValveMfc12.IsOpen");
             m_RtDataKeys.Add($"{ModuleName}.ValveGasFinal.IsOpen");
             //m_RtDataKeys.Add($"{ModuleName}.ValveSoftPump.IsOpen");
             m_RtDataKeys.Add($"{ModuleName}.ValveFastPump.IsOpen");
@@ -1982,7 +2006,7 @@ namespace Venus_MainPages.ViewModels
             m_RtDataKeys.Add($"{ModuleName}.{VenusDevice.BiasMatch}.C2");
 
             m_RtDataKeys.Add($"{ModuleName}.{VenusDevice.PendulumValve}.DeviceData");
-            m_RtDataKeys.Add($"{ModuleName}.{VenusDevice.ESCHV}.DeviceData");          
+            m_RtDataKeys.Add($"{ModuleName}.{VenusDevice.ESCHV}.DeviceData");
             m_RtDataKeys.Add($"{ModuleName}.AIoMagnet.DeviceData");
             m_RtDataKeys.Add($"{ModuleName}.TurboPumpRotationalSpeed");
 

+ 20 - 5
Venus/Venus_MainPages/Views/OverVenusDEView.xaml

@@ -1296,9 +1296,9 @@
 
             <!--<Button Width="120" Height="30" Content="Flash"  Canvas.Left="700" Canvas.Top="100" Command="{Binding LoadRecipeCommand}" IsEnabled="{Binding IsAutoMode}" Style="{x:Null}"/>-->
             <!--<TextBlock Background="Silver"  Height="30" Width="230" Canvas.Left="820" Canvas.Top="100" Text="{Binding SelectedRecipe}" TextBlock.TextAlignment="Center"    Block.TextAlignment="Center" Padding="0,7,0,0"/>-->
-            <TextBox  Width="140" Height="30" Text="Recipe:"  Canvas.Left="700" Canvas.Top="100" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="15" IsReadOnly="True" Background="Transparent"/>
+            <!--<TextBox  Width="140" Height="30" Text="Recipe:"  Canvas.Left="700" Canvas.Top="100" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="15" IsReadOnly="True" Background="Transparent"/>-->
             <Border Width="210" Height="28"  Canvas.Left="840" Canvas.Top="101" BorderBrush="Black" BorderThickness=".7">
-                <ComboBox  ItemsSource="{Binding CurrentModuleRecipes}" SelectedItem="{Binding SelectedRecipe}" IsEnabled="{Binding IsAutoMode}" Style="{StaticResource customeComboBoxStyle}" BorderBrush="White" FontSize="15">
+                <ComboBox  ItemsSource="{Binding CurrentModuleRecipes}" SelectedIndex="{Binding SelectedRecipeIndex}" IsEnabled="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}"  Style="{StaticResource customeComboBoxStyle}" BorderBrush="White" FontSize="15">
                     <i:Interaction.Triggers>
                         <i:EventTrigger EventName="DropDownOpened">
                             <i:InvokeCommandAction Command="{Binding LoadRecipeCommand}"/>
@@ -1306,10 +1306,25 @@
                     </i:Interaction.Triggers>
                 </ComboBox>
             </Border>
+            <ComboBox  Width="120" Height="28" Canvas.Left="710" Canvas.Top="101" Style="{StaticResource customeComboBoxStyle}"  SelectedItem="{Binding SelectedRecipeType}" IsEnabled="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}" BorderThickness="1" BorderBrush="Silver" FontSize="15" SelectedIndex="0">
+                <ComboBoxItem>Process</ComboBoxItem>
+                <ComboBoxItem>Clean</ComboBoxItem>
+                <ComboBoxItem>Chuck</ComboBoxItem>
+                <ComboBoxItem>DeChuck</ComboBoxItem>
+                <i:Interaction.Triggers>
+                    <i:EventTrigger EventName="SelectionChanged">
+                        <i:InvokeCommandAction Command="{Binding SwitchTypeCommand}"/>
+                    </i:EventTrigger>
+                </i:Interaction.Triggers>
+            </ComboBox>
+            <StackPanel Orientation="Horizontal" Canvas.Left="710" Canvas.Top="140">
+                <customControls:PathButton Width="110" Height="30" Content="Start"   IsEnabled="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}" Command="{Binding RunRecipeCommand}"/>
+                <customControls:PathButton Width="110" Height="30" Content="Next"    IsEnabled="{Binding IsProcessing}" Command="{Binding EndStepCommand}" Margin="15 0 0 0"/>
+                <customControls:PathButton Width="110" Height="30" Content="Abort"   IsEnabled="{Binding IsProcessing}" Command="{Binding PMAbortCommnad}" Margin="15 0 0 0"/>
+            </StackPanel>
+           
 
-            <customControls:PathButton Width="120" Height="30" Content="Start"  Canvas.Left="1100" Canvas.Top="100" IsEnabled="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}" Command="{Binding RunRecipeCommand}"/>
-
-            <Grid  Width="540" Height="550" Canvas.Left="700" Canvas.Top="150"  unity:GridOptions.ShowBorder="True" unity:GridOptions.LineBrush="#afb4db"  unity:GridOptions.LineThickness="1">
+            <Grid  Width="540" Height="500" Canvas.Left="700" Canvas.Top="200"  unity:GridOptions.ShowBorder="True" unity:GridOptions.LineBrush="#afb4db"  unity:GridOptions.LineThickness="1">
                 <Grid.RowDefinitions>
                     <!--<RowDefinition/>
                     <RowDefinition/>-->

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

@@ -359,49 +359,9 @@ namespace Venus_RT.Devices
             });
             OP.Subscribe($"{Module}.ControlValve", (cmd, args) =>
             {
-                if (ChamberType == JetChamber.VenusSE || ChamberType == JetChamber.VenusDE)
+                if (Enum.TryParse(args[0].ToString(), out ValveType targetvalve))
                 {
-                    if (Enum.TryParse(args[0].ToString(), out ValveType targetvalve))
-                    {
-                        if (targetvalve == ValveType.TurboPumpPurge && (bool)args[1] == true)
-                        {
-                            if (IsISOOpen)
-                            {
-                                OpenValve(targetvalve, (bool)args[1]);
-                            }
-                            else
-                            {
-                                LOG.Write(eEvent.WARN_DEFAULT_WARN, Module, $"Chamber TurboPumpPumping valve is not open, can not turn on TurboPumpPurge valve.");
-                            }
-                        }
-                        else if (targetvalve == ValveType.TurboPumpPumping && (bool)args[1] == false)
-                        {
-                            if (IsTurboPumpRunning)
-                            {
-                                if (!IsPenVOpen)
-                                {
-                                    OpenValve(targetvalve, (bool)args[1]);
-                                }
-                                else if (IsPenVOpen)
-                                {
-                                    LOG.Write(eEvent.WARN_DEFAULT_WARN, Module, $"Chamber TurboPump is open but Pendulum Valve is open, can not turn off TurboPumpPumping valve.");
-                                }
-                            }
-                            else
-                            {
-                                OpenValve(targetvalve, (bool)args[1]);
-                            }
-
-                        }
-                        else
-                        {
-                            OpenValve(targetvalve, (bool)args[1]);
-                        }
-                    }
-                }
-                else
-                {
-                    OpenValve((ValveType)((int)args[0]), (bool)args[1]);
+                    OpenValve(targetvalve, (bool)args[1]);
                 }
                 return true;
             });

+ 41 - 0
Venus/Venus_RT/Devices/JetVenusDEPM.cs

@@ -995,6 +995,47 @@ namespace Venus_RT.Devices
             {
                 if (Valve2IO.ContainsKey(vlvType))
                 {
+                    if (vlvType == ValveType.TurboPumpPurge && on)
+                    {
+                        if (!IsISOOpen)
+                        {
+                            LOG.Write(eEvent.WARN_DEFAULT_WARN, Module, $"Chamber TurboPumpPumping valve is not open, can not turn on TurboPumpPurge valve.");
+                            return;
+                        }
+                    }
+                    else if (vlvType == ValveType.TurboPumpPumping && !on)
+                    {
+                        if (IsTurboPumpRunning)
+                        {
+                            if (IsPenVOpen)
+                            {
+                                LOG.Write(eEvent.WARN_DEFAULT_WARN, Module, $"Chamber TurboPump is open but Pendulum Valve is open, can not turn off TurboPumpPumping valve.");
+                                return;
+                            }
+                        }
+
+                    }
+
+                    if (vlvType == ValveType.TurboPumpPurge && !_TurboPumpPumpingValve.Status && on)
+                    {
+                        LOG.Write(eEvent.WARN_DEVICE_INFO, Module, $"cannot open Turbo Pump Purge, cause Turbo Pump Valve not open");
+                        return;
+                    }
+
+                    if (vlvType == ValveType.TurboPumpPumping && on)
+                    {
+                        if (!_MainPump.IsRunning)
+                        {
+                            LOG.Write(eEvent.WARN_DEVICE_INFO, Module, $"cannot open Turbo Pump Pump, cause Dry Pump Valve is not open");
+                            return;
+                        }
+
+                        if (ForelinePressure > SC.GetValue<int>($"{Module}.TurboPumpPumpingValveMinForelinePressure"))
+                        {
+                            LOG.Write(eEvent.WARN_DEVICE_INFO, Module, $"cannot open Turbo Pump Pump, cause forelinePressure:{ForelinePressure}");
+                            return;
+                        }
+                    }
                     Valve2IO[vlvType].TurnValve(on, out _);
                     LOG.Write(eEvent.EV_DEVICE_INFO, Module, $"{(on ? "打开" : "关闭")} 阀 {vlvType.ToString()}");
                 }

+ 21 - 0
Venus/Venus_RT/Devices/JetVenusSEPM.cs

@@ -979,6 +979,27 @@ namespace Venus_RT.Devices
         {
             if (Valve2IO.ContainsKey(vlvType))
             {
+                    if (vlvType == ValveType.TurboPumpPurge && on)
+                    {
+                        if (!IsISOOpen)
+                        {
+                           LOG.Write(eEvent.WARN_DEFAULT_WARN, Module, $"Chamber TurboPumpPumping valve is not open, can not turn on TurboPumpPurge valve.");
+                           return;
+                        }
+                    }
+                    else if (vlvType == ValveType.TurboPumpPumping && !on)
+                    {
+                        if (IsTurboPumpRunning)
+                        {
+                            if (IsPenVOpen)
+                            {
+                            LOG.Write(eEvent.WARN_DEFAULT_WARN, Module, $"Chamber TurboPump is open but Pendulum Valve is open, can not turn off TurboPumpPumping valve.");
+                            return;
+                            }
+                        }
+
+                    }
+                
                 if (vlvType == ValveType.TurboPumpPurge && !_TurboPumpPumpingValve.Status && on)
                 {
                     LOG.Write(eEvent.WARN_DEVICE_INFO, Module, $"cannot open Turbo Pump Purge, cause Turbo Pump Valve not open");

+ 108 - 23
Venus/Venus_RT/Devices/TruPlasmaRF.cs

@@ -373,6 +373,7 @@ namespace Venus_RT.Devices
         private const ushort S3_HEAD_LENGTH = 2;
         private readonly DeviceTimer _timerQueryStatus = new DeviceTimer();
         private int QUERY_INTERVAL = 1000;
+        private List<byte> buffer = new List<byte>(4096);
         [Subscription("MatchWorkMode")]
         public EnumRfMatchTuneMode WorkMode { get; set; }
         public float C1 { get; set; }
@@ -465,8 +466,7 @@ namespace Venus_RT.Devices
 
         public override void Monitor()
         {
-
-
+            ReadPosition(40,20);
         }
 
         public override void Terminate()
@@ -485,8 +485,8 @@ namespace Venus_RT.Devices
         /// 
         private void executeMatchPostion(float c1, float c2)
         {
-
-            SetPosition(c1, c2);
+            SetPositionManual(c1, c2);
+            SetPositionManualAuto(c1, c2);          
         }
         public override void SetMatchPosition(float c1, float c2, out string reason)
         {
@@ -503,31 +503,53 @@ namespace Venus_RT.Devices
         //
         private void SerialBinaryPortDataReceived(byte[] message)
         {
-            if (message.Count()<10)
+            if (message.Count()<29)
             {
                 LOG.Write(eEvent.ERR_RF, Module, "收到 Match 数据为空");
-                       return;
+                return;
             }
             else 
             {
-                if (message[0] ==0x1D && message[8]==0x60)
+                try
                 {
-                    TunePosition1 = BitConverter.ToSingle(new byte[] { message[10], message[11], message[12], message[13] }, 0) * 100;
-                    TunePosition2 = BitConverter.ToSingle(new byte[] { message[14], message[15], message[16], message[17] }, 0) * 100;
-                    switch (message[7])
+                    buffer.AddRange(message);
+                    while (buffer.Count >= 29) //至少包含帧头(2字节)、长度(1字节)、校验位(1字节);根据设计不同而不同
                     {
-                        case 0x01:
-                            this.WorkMode = EnumRfMatchTuneMode.Manual;
-                            break;
-                        case 0x02:
-                            this.WorkMode = EnumRfMatchTuneMode.Auto;
-                            break;
-                        case 0x20:
-                            this.WorkMode = EnumRfMatchTuneMode.Undefined;
-                            break;                           
-                        default:
-                            break;
-                    }                                       
+                        //2.1 查找数据头
+                        if (buffer[0] == 0x1D && buffer[1] == 0xE2) //传输数据有帧头,用于判断
+                        {
+                            //得到完整的数据,复制到ReceiveBytes中进行校验
+                            byte[] ReceiveBytes = new byte[29];
+                            buffer.CopyTo(0, ReceiveBytes, 0, 29);
+                            TunePosition1 = BitConverter.ToSingle(new byte[] { ReceiveBytes[10], ReceiveBytes[11], ReceiveBytes[12], ReceiveBytes[13] }, 0) * 100;
+                            TunePosition2 = BitConverter.ToSingle(new byte[] { ReceiveBytes[14], ReceiveBytes[15], ReceiveBytes[16], ReceiveBytes[17] }, 0) * 100;
+                            buffer.RemoveRange(0, 29);
+                            switch (message[7])
+                             {
+                               case 0x01:
+                                   this.WorkMode = EnumRfMatchTuneMode.Manual;
+                                   break;
+                               case 0x02:
+                                   this.WorkMode = EnumRfMatchTuneMode.Auto;
+                                   break;
+                               case 0x20:
+                                   this.WorkMode = EnumRfMatchTuneMode.Undefined;
+                                   break;
+                               default:
+                                   break;
+                                }                          
+                        }                      
+                        else //帧头不正确时,记得清除
+                        {
+                            buffer.Clear();
+                            LOG.Write(eEvent.ERR_MATCH, Module, $"Match通讯错误");
+                        }
+                    }
+                }
+                catch (Exception ex)
+                {
+                    buffer.Clear();
+                    LOG.WriteExeption(ex);
                 }
             }               
         }
@@ -537,7 +559,38 @@ namespace Venus_RT.Devices
             LOG.Write(eEvent.ERR_RF, Module, $"AdTec Match error [{str}]");
         }
 
-        private void SetPosition(float c1val, float c2val)
+        private void SetPositionManual(float c1val, float c2val)
+        {
+            List<byte> Len = new List<byte>() { 0x16, 0xE9 };
+            List<byte> DstSrc = new List<byte>() { 0x00, 0x02, 0x00, 0x01 };
+            List<byte> Cmd = new List<byte> { 0x60, 0x40 };
+            byte[] val1Bytes = BitConverter.GetBytes(c1val / 100);
+            byte[] val2Bytes = BitConverter.GetBytes(c2val / 100);
+            List<byte> Act = new List<byte>() { 0x00 };
+            List<byte> Ctr123 = new List<byte> { 0x08, 0x00, 0x00 };
+            List<byte> baseBytes = new List<byte>() { };
+            baseBytes.AddRange(Len);
+            baseBytes.AddRange(DstSrc);
+            baseBytes.AddRange(Cmd);
+            baseBytes.AddRange(val1Bytes);
+            baseBytes.AddRange(val2Bytes);
+            baseBytes.AddRange(Act);
+            baseBytes.AddRange(Ctr123);
+            int a = 0;
+            for (int i = 2; i < baseBytes.Count; i++)
+            {
+                a += (Int16)baseBytes[i];
+            }
+            byte[] ackture = new byte[2];
+
+            byte[] ackbyte = BitConverter.GetBytes(a);
+            ackture[0] = ackbyte[1];
+            ackture[1] = ackbyte[0];
+            baseBytes.AddRange(ackture);
+            _serial.Write(baseBytes.ToArray());
+            string hexString = BitConverter.ToString(baseBytes.ToArray()).Replace("-", " ");
+        }
+        private void SetPositionManualAuto(float c1val, float c2val)
         {
             List<byte> Len = new List<byte>() { 0x16, 0xE9};
             List<byte> DstSrc = new List<byte>() { 0x00, 0x02, 0x00, 0x01};
@@ -566,6 +619,38 @@ namespace Venus_RT.Devices
             ackture[1] = ackbyte[0];
             baseBytes.AddRange(ackture);
             _serial.Write(baseBytes.ToArray());
+            string hexString = BitConverter.ToString(baseBytes.ToArray()).Replace("-", " ");
+        }
+        private void ReadPosition(float c1val, float c2val)
+        {
+            List<byte> Len = new List<byte>() { 0x16, 0xE9 };
+            List<byte> DstSrc = new List<byte>() { 0x00, 0x02, 0x00, 0x01 };
+            List<byte> Cmd = new List<byte> { 0x60, 0x40 };
+            byte[] val1Bytes = BitConverter.GetBytes(c1val / 100);
+            byte[] val2Bytes = BitConverter.GetBytes(c2val / 100);
+            List<byte> Act = new List<byte>() { 0x00 };
+            List<byte> Ctr123 = new List<byte> { 0x10, 0x00, 0x00 };
+            List<byte> baseBytes = new List<byte>() { };
+            baseBytes.AddRange(Len);
+            baseBytes.AddRange(DstSrc);
+            baseBytes.AddRange(Cmd);
+            baseBytes.AddRange(val1Bytes);
+            baseBytes.AddRange(val2Bytes);
+            baseBytes.AddRange(Act);
+            baseBytes.AddRange(Ctr123);
+            int a = 0;
+            for (int i = 2; i < baseBytes.Count; i++)
+            {
+                a += (Int16)baseBytes[i];
+            }
+            byte[] ackture = new byte[2];
+
+            byte[] ackbyte = BitConverter.GetBytes(a);
+            ackture[0] = ackbyte[1];
+            ackture[1] = ackbyte[0];
+            baseBytes.AddRange(ackture);
+            _serial.Write(baseBytes.ToArray());
+            string hexString = BitConverter.ToString(baseBytes.ToArray()).Replace("-", " ");
         }
         public override bool SetMatchMode(EnumRfMatchTuneMode enumRfMatchTuneMode, out string reason)
         {

+ 148 - 4
Venus/Venus_RT/Modules/PMs/ProcessDefine.cs

@@ -104,14 +104,14 @@ namespace Venus_RT.Modules.PMs
             checkerHelper[$"{Module}.VenusSEGasControlUnit"] = (ProcessUnitBase unit, RecipeStep step) => VenusSEGasControlUnit_Check(unit, step);
             endHelper[$"{Module}.VenusSEGasControlUnit"] = (ProcessUnitBase unit, RecipeStep step) => VenusSEGasControlUnit_End(unit, step);
 
+            startHelper[$"{Module}.VenusDEGasControlUnit"] = (ProcessUnitBase unit, RecipeStep step) => VenusDEGasControlUnit_Start(unit, step);
+            checkerHelper[$"{Module}.VenusDEGasControlUnit"] = (ProcessUnitBase unit, RecipeStep step) => VenusDEGasControlUnit_Check(unit, step);
+            endHelper[$"{Module}.VenusDEGasControlUnit"] = (ProcessUnitBase unit, RecipeStep step) => VenusDEGasControlUnit_End(unit, step);
+
             startHelper[$"{Module}.ESCHVUnit"] = (ProcessUnitBase unit, RecipeStep step) => ESCHVUnit_Start(unit, step);
             checkerHelper[$"{Module}.ESCHVUnit"] = (ProcessUnitBase unit, RecipeStep step) => ESCHVUnit_Check(unit, step);
             endHelper[$"{Module}.ESCHVUnit"] = (ProcessUnitBase unit, RecipeStep step) => ESCHVUnit_End(unit, step);
 
-            //startHelper[$"{Module}.SEESCHVUnit"] = (ProcessUnitBase unit, RecipeStep step) => SEESCHVUnit_Start(unit, step);
-            //checkerHelper[$"{Module}.SEESCHVUnit"] = (ProcessUnitBase unit, RecipeStep step) => SEESCHVUnit_Check(unit, step);
-            //endHelper[$"{Module}.SEESCHVUnit"] = (ProcessUnitBase unit, RecipeStep step) => SEESCHVUnit_End(unit, step);
-
             startHelper[$"{Module}.ProcessKitUnit"] = (ProcessUnitBase unit, RecipeStep step) => ProcessKitUnit_Start(unit, step);
             checkerHelper[$"{Module}.ProcessKitUnit"] = (ProcessUnitBase unit, RecipeStep step) => ProcessKitUnit_Check(unit, step);
             endHelper[$"{Module}.ProcessKitUnit"] = (ProcessUnitBase unit, RecipeStep step) => ProcessKitUnit_End(unit, step);
@@ -127,6 +127,10 @@ namespace Venus_RT.Modules.PMs
             startHelper[$"{Module}.RFBoxUnit"] = (ProcessUnitBase unit, RecipeStep step) => RFBoxUnit_Start(unit, step);
             checkerHelper[$"{Module}.RFBoxUnit"] = (ProcessUnitBase unit, RecipeStep step) => RFBoxUnit_Check(unit, step);
             endHelper[$"{Module}.RFBoxUnit"] = (ProcessUnitBase unit, RecipeStep step) => RFBoxUnit_End(unit, step);
+
+            startHelper[$"{Module}.MagnetUnit"] = (ProcessUnitBase unit, RecipeStep step) => MagnetUnit_Start(unit, step);
+            checkerHelper[$"{Module}.MagnetUnit"] = (ProcessUnitBase unit, RecipeStep step) => MagnetUnit_Check(unit, step);
+            endHelper[$"{Module}.MagnetUnit"] = (ProcessUnitBase unit, RecipeStep step) => MagnetUnit_End(unit, step);
         }
 
         private RState PressureByPressureModeUnit_Start(ProcessUnitBase unit, RecipeStep step)
@@ -831,6 +835,124 @@ namespace Venus_RT.Modules.PMs
                 _GasFlowToleranceChecker.End();
             }
         }
+        private RState VenusDEGasControlUnit_Start(ProcessUnitBase unit, RecipeStep step)
+        {
+            Chamber.OpenValve(ValveType.GasFinal, true);
+            var ProcessUnit = unit as VenusDEGasControlUnit;
+            Chamber.FlowGas(0, ProcessUnit.Gas1);
+            if (ProcessUnit.Gas1 >= 1)
+            {
+                Chamber.OpenValve(ValveType.PV11, true);
+            }
+            Chamber.FlowGas(1, ProcessUnit.Gas2);
+            if (ProcessUnit.Gas2 >= 1)
+            {
+                Chamber.OpenValve(ValveType.PV21, true);
+            }
+            Chamber.FlowGas(2, ProcessUnit.Gas3);
+            if (ProcessUnit.Gas3 >= 1)
+            {
+                Chamber.OpenValve(ValveType.PV31, true);
+            }
+            Chamber.FlowGas(3, ProcessUnit.Gas4);
+            if (ProcessUnit.Gas4 >= 1)
+            {
+                Chamber.OpenValve(ValveType.PV41, true);
+            }
+            Chamber.FlowGas(4, ProcessUnit.Gas5);
+            if (ProcessUnit.Gas5 >= 1)
+            {
+                Chamber.OpenValve(ValveType.PV51, true);
+            }
+            Chamber.FlowGas(5, ProcessUnit.Gas6);
+            if (ProcessUnit.Gas6 >= 1)
+            {
+                Chamber.OpenValve(ValveType.PV61, true);
+            }
+            Chamber.FlowGas(6, ProcessUnit.Gas7);
+            if (ProcessUnit.Gas7 >= 1)
+            {
+                Chamber.OpenValve(ValveType.PV71, true);
+            }
+            Chamber.FlowGas(7, ProcessUnit.Gas8);
+            if (ProcessUnit.Gas8 >= 1)
+            {
+                Chamber.OpenValve(ValveType.PV81, true);
+            }
+            Chamber.FlowGas(8, ProcessUnit.Gas9);
+            if (ProcessUnit.Gas9 >= 1)
+            {
+                Chamber.OpenValve(ValveType.PV91, true);
+            }
+            Chamber.FlowGas(9, ProcessUnit.Gas10);
+            if (ProcessUnit.Gas10 >= 1)
+            {
+                Chamber.OpenValve(ValveType.PVA1, true);
+            }
+            Chamber.FlowGas(10, ProcessUnit.Gas11);
+            if (ProcessUnit.Gas11 >= 1)
+            {
+                Chamber.OpenValve(ValveType.PVB1, true);
+            }
+            Chamber.FlowGas(11, ProcessUnit.Gas12);
+            if (ProcessUnit.Gas12 >= 1)
+            {
+                Chamber.OpenValve(ValveType.PVC1, true);
+            }
+            _GasFlowToleranceChecker.IsStable = true;
+            if (ProcessUnit.ToleranceMode != ToleranceMode.None)
+            {
+                List<ToleranceObject> toleranceObjects = new List<ToleranceObject>();
+
+                toleranceObjects.Add(new ToleranceObject("Gas1", ProcessUnit.Gas1, ProcessUnit.Gas1WarningRange, ProcessUnit.Gas1AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+                toleranceObjects.Add(new ToleranceObject("Gas2", ProcessUnit.Gas2, ProcessUnit.Gas2WarningRange, ProcessUnit.Gas2AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+                toleranceObjects.Add(new ToleranceObject("Gas3", ProcessUnit.Gas3, ProcessUnit.Gas3WarningRange, ProcessUnit.Gas3AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+                toleranceObjects.Add(new ToleranceObject("Gas4", ProcessUnit.Gas4, ProcessUnit.Gas4WarningRange, ProcessUnit.Gas4AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+                toleranceObjects.Add(new ToleranceObject("Gas5", ProcessUnit.Gas5, ProcessUnit.Gas5WarningRange, ProcessUnit.Gas5AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+                toleranceObjects.Add(new ToleranceObject("Gas6", ProcessUnit.Gas6, ProcessUnit.Gas6WarningRange, ProcessUnit.Gas6AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+                toleranceObjects.Add(new ToleranceObject("Gas7", ProcessUnit.Gas7, ProcessUnit.Gas7WarningRange, ProcessUnit.Gas7AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+                toleranceObjects.Add(new ToleranceObject("Gas8", ProcessUnit.Gas8, ProcessUnit.Gas8WarningRange, ProcessUnit.Gas8AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+                toleranceObjects.Add(new ToleranceObject("Gas9", ProcessUnit.Gas9, ProcessUnit.Gas9WarningRange, ProcessUnit.Gas9AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+                toleranceObjects.Add(new ToleranceObject("Gas10", ProcessUnit.Gas10, ProcessUnit.Gas10WarningRange, ProcessUnit.Gas10AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+                toleranceObjects.Add(new ToleranceObject("Gas11", ProcessUnit.Gas11, ProcessUnit.Gas11WarningRange, ProcessUnit.Gas11AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+                toleranceObjects.Add(new ToleranceObject("Gas12", ProcessUnit.Gas12, ProcessUnit.Gas12WarningRange, ProcessUnit.Gas12AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+
+                _GasFlowToleranceChecker.Start(toleranceObjects, step.Type == StepType.Stable);
+            }
+            return RState.Running;
+        }
+
+        private RState VenusDEGasControlUnit_Check(ProcessUnitBase unit, RecipeStep step)
+        {
+            var ProcessUnit = unit as VenusDEGasControlUnit;
+            if (ProcessUnit.ToleranceMode != ToleranceMode.None)
+            {
+                return _GasFlowToleranceChecker.Monitor(Chamber.MFC1FeedBack, Chamber.MFC2FeedBack, Chamber.MFC3FeedBack, Chamber.MFC4FeedBack, Chamber.MFC5FeedBack, Chamber.MFC6FeedBack, Chamber.MFC7FeedBack, Chamber.MFC8FeedBack, Chamber.MFC9FeedBack, Chamber.MFC10FeedBack, Chamber.MFC11FeedBack, Chamber.MFC12FeedBack);
+            }
+            return RState.Running;
+        }
+
+        private void VenusDEGasControlUnit_End(ProcessUnitBase unit, RecipeStep step)
+        {
+            Chamber.FlowGas(0, 0);
+            Chamber.FlowGas(1, 0);
+            Chamber.FlowGas(2, 0);
+            Chamber.FlowGas(3, 0);
+            Chamber.FlowGas(4, 0);
+            Chamber.FlowGas(5, 0);
+            Chamber.FlowGas(6, 0);
+            Chamber.FlowGas(7, 0);
+            Chamber.FlowGas(8, 0);
+            Chamber.FlowGas(9, 0);
+            Chamber.FlowGas(10, 0);
+            Chamber.FlowGas(11, 0);
+            Chamber.FlowGas(12, 0);
+            var ProcessUnit = unit as VenusDEGasControlUnit;
+            if (ProcessUnit.ToleranceMode != ToleranceMode.None)
+            {
+                _GasFlowToleranceChecker.End();
+            }
+        }
 
         private RState ESCHVUnit_Start(ProcessUnitBase unit, RecipeStep step)
         {
@@ -904,7 +1026,29 @@ namespace Venus_RT.Modules.PMs
         private void ProcessKitUnit_End(ProcessUnitBase unit, RecipeStep step)
         {
         }
+        private RState MagnetUnit_Start(ProcessUnitBase unit, RecipeStep step)
+        {
+            var ProcessUnit = unit as MagnetUnit;
+            if (Chamber.MagnetSetpower(ProcessUnit.MagnetIntensity))
+            {
+                return RState.Running;
+            }
+            else
+            {
+                LOG.Write(eEvent.ERR_PROCESS, Chamber.Module, $"Step:{step.StepNo} failed duo to Magnet Write C1 failed ");
+                return RState.Failed;
+            }
+        }
+
+        private RState MagnetUnit_Check(ProcessUnitBase unit, RecipeStep step)
+        {
+            return RState.Running;
+        }
+
+        private void MagnetUnit_End(ProcessUnitBase unit, RecipeStep step)
+        {
 
+        }
         private RState RFBoxUnit_Start(ProcessUnitBase unit, RecipeStep step)
         {
             var ProcessUnit = unit as RFBoxUnit;