Sfoglia il codice sorgente

1.添加PM控压功能
2.Revtech Match Device适配串口和网口两种模式,机台端测试通过·
3.高温Heater 伺服做配置文件设定

lixiang 1 anno fa
parent
commit
e511d1f387
31 ha cambiato i file con 740 aggiunte e 118 eliminazioni
  1. 2 1
      Venus/Framework/Common/Communications/AsyncSocketDevice.cs
  2. 1 1
      Venus/Framework/Common/Device/Bases/RfPowerBase.cs
  3. 3 0
      Venus/Venus_Core/EventDefine.cs
  4. 5 0
      Venus/Venus_Core/ProcessUnitDefine.cs
  5. 7 2
      Venus/Venus_Core/Recipe.cs
  6. 50 5
      Venus/Venus_MainPages/ViewModels/OperationOverViewModel.cs
  7. 30 6
      Venus/Venus_MainPages/ViewModels/OverVenusViewModel.cs
  8. 2 2
      Venus/Venus_MainPages/ViewModels/TMOperationViewModel.cs
  9. 34 26
      Venus/Venus_MainPages/Views/OperationOverView.xaml
  10. 5 2
      Venus/Venus_MainPages/Views/OverVenusView.xaml
  11. 27 0
      Venus/Venus_RT/Config/LogDefine.json
  12. 1 1
      Venus/Venus_RT/Config/PM/Kepler2200A/Kepler2200AIoDefine.xml
  13. 66 4
      Venus/Venus_RT/Config/System.sccfg
  14. 0 1
      Venus/Venus_RT/Devices/AdTecRF.cs
  15. 24 0
      Venus/Venus_RT/Devices/DeviceManager.cs
  16. 22 0
      Venus/Venus_RT/Devices/IODevices/IoHighTemperatureHeater.cs
  17. 25 5
      Venus/Venus_RT/Devices/JetKepler2200APM.cs
  18. 27 0
      Venus/Venus_RT/Devices/JetKepler2300PM.cs
  19. 20 7
      Venus/Venus_RT/Devices/JetPMBase.cs
  20. 26 2
      Venus/Venus_RT/Devices/JetVenusPM.cs
  21. 160 19
      Venus/Venus_RT/Devices/RevtechMatch.cs
  22. 72 0
      Venus/Venus_RT/Modules/PMs/PMControlPressureRoutine.cs
  23. 45 2
      Venus/Venus_RT/Modules/PMs/PMEntity.cs
  24. 10 0
      Venus/Venus_RT/Modules/PMs/ProcessDefine.cs
  25. 29 29
      Venus/Venus_RT/Modules/TM/MFHomeRoutine.cs
  26. 4 2
      Venus/Venus_RT/Modules/TM/MFVentRoutine.cs
  27. 1 0
      Venus/Venus_RT/Venus_RT.csproj
  28. 2 0
      Venus/Venus_Themes/UserControls/MainTM.xaml
  29. 16 0
      Venus/Venus_Themes/UserControls/MainTM.xaml.cs
  30. 8 1
      Venus/Venus_Themes/UserControls/TMChamber.xaml
  31. 16 0
      Venus/Venus_Themes/UserControls/TMChamber.xaml.cs

+ 2 - 1
Venus/Framework/Common/Communications/AsyncSocketDevice.cs

@@ -1,4 +1,5 @@
-using System;
+
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;

+ 1 - 1
Venus/Framework/Common/Device/Bases/RfPowerBase.cs

@@ -74,7 +74,7 @@ namespace MECF.Framework.Common.Device.Bases
         public virtual bool Initialize()
         {
 
-            DATA.Subscribe($"{Module}.{Name}.WorkMode", ()=>WorkMode.ToString());
+           // DATA.Subscribe($"{Module}.{Name}.WorkMode", ()=>WorkMode.ToString());
             DATA.Subscribe($"{Module}.{Name}.ControlMode", () => ControlMode.ToString());
             DATA.Subscribe($"{Module}.{Name}.RegulationMode", () => RegulationMode.ToString());
 

+ 3 - 0
Venus/Venus_Core/EventDefine.cs

@@ -70,6 +70,9 @@ namespace Aitex.Core.RT.Log{
 		INFO_IO_VALVE = 1031,
 		WARN_IO_VALVE = 1032,
 		ERR_IO_VALVE = 1033,
+		ERR_MATCH = 1034,
+		WARN_MATCH = 1035,
+		INFO_MATCH = 1036,
 		ERR_TM = 2000,
 		INFO_TM = 2001,
 		WARN_TM = 2002,

+ 5 - 0
Venus/Venus_Core/ProcessUnitDefine.cs

@@ -137,8 +137,13 @@ namespace Venus_Core
         public int AutoBiasTuneCapPreset { get; set; }
         [IsOnlyRead]
         public int AutoBiasLoadCapPreset { get; set; }
+
+
         public int BiasMaxReflectedPower { get; set; }
+
         [JsonConverter(typeof(StringEnumConverter))]
+        public MatchWorkMode BiasMatchWorkMode { get; set; }
+       [JsonConverter(typeof(StringEnumConverter))]
         public GeneratorMode BiasGeneratorMode { get; set; }
         public int PulseRateFreq { get; set; }
         public int PulseDutyCycle { get; set; }

+ 7 - 2
Venus/Venus_Core/Recipe.cs

@@ -66,9 +66,14 @@ namespace Venus_Core
         Value,
         Percent
     }
+    public enum MatchWorkMode
+    {
+        Auto,
+        Manual
+    }
     public class VenusTolerance
-    { 
-    
+    {
+
     }
     public class Kepler2300Tolerance
     {

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

@@ -85,8 +85,13 @@ namespace Venus_MainPages.ViewModels
 
         private string m_ATMModeIsOn;
 
+        private float m_PMAPressure;
         private float m_PMBPressure;
         private float m_PMCPressure;
+        private float m_PMDPressure;
+        private float m_TMPressure;
+
+
 
         #endregion
 
@@ -379,7 +384,11 @@ namespace Venus_MainPages.ViewModels
             get { return m_ATMModeIsOn; }
             set { SetProperty(ref m_ATMModeIsOn, value); }
         }
-
+        public float PMAPressure
+        {
+            get { return m_PMAPressure; }
+            set { SetProperty(ref m_PMAPressure, value); }
+        }
         public float PMBPressure
         {
             get { return  m_PMBPressure; }
@@ -391,7 +400,16 @@ namespace Venus_MainPages.ViewModels
             get { return m_PMCPressure; }
             set { SetProperty(ref m_PMCPressure, value); }
         }
-
+        public float PMDPressure
+        {
+            get { return m_PMDPressure; }
+            set { SetProperty(ref m_PMDPressure, value); }
+        }
+        public float TMPressure
+        {
+            get { return m_TMPressure; }
+            set { SetProperty(ref m_TMPressure, value); }
+        }
         #endregion
 
         #region 命令
@@ -675,6 +693,15 @@ namespace Venus_MainPages.ViewModels
             {
                 PMAWafer = ModuleManager.ModuleInfos["PMA"].WaferManager.Wafers[0];
                 PMARecipeResult = CommonFunction.GetValue<RecipeResult>(RtDataValues, $"PMA.CurrentRecipeResult");
+
+                if (Math.Abs(100 - CommonFunction.GetValue<float>(RtDataValues, $"PMA.ProcessLowPressure")) > 1 && CommonFunction.GetValue<float>(RtDataValues, $"PMA.ProcessLowPressure") < 100)
+                {
+                    PMAPressure = CommonFunction.GetValue<float>(RtDataValues, $"PMA.ProcessLowPressure");
+                }
+                else
+                {
+                    PMAPressure = CommonFunction.GetValue<float>(RtDataValues, $"PMA.ProcessHighPressure");
+                }
             }
             if (PMBIsInstalled == true)
             {
@@ -708,6 +735,14 @@ namespace Venus_MainPages.ViewModels
             {
                 PMDWafer = ModuleManager.ModuleInfos["PMD"].WaferManager.Wafers[0];
                 PMDRecipeResult = CommonFunction.GetValue<RecipeResult>(RtDataValues, $"PMD.CurrentRecipeResult");
+                if (Math.Abs(100 - CommonFunction.GetValue<float>(RtDataValues, $"PMD.ProcessLowPressure")) > 1 && CommonFunction.GetValue<float>(RtDataValues, $"PMD.ProcessLowPressure") < 100)
+                {
+                    PMDPressure = CommonFunction.GetValue<float>(RtDataValues, $"PMD.ProcessLowPressure");
+                }
+                else
+                {
+                    PMDPressure = CommonFunction.GetValue<float>(RtDataValues, $"PMD.ProcessHighPressure");
+                }
 
             }
 
@@ -715,7 +750,9 @@ namespace Venus_MainPages.ViewModels
             {
                 TMBladeAWafer = ModuleManager.ModuleInfos["TMRobot"].WaferManager.Wafers[0];
                 TMBladeBWafer = ModuleManager.ModuleInfos["TMRobot"].WaferManager.Wafers[1];
+                TMPressure= CommonFunction.GetValue<float>(RtDataValues, $"TM.TMProcessGauge.Value");             
             }
+
             if (EFEMIsInstalled == true)
             {
                 EFEMBladeAWafer = ModuleManager.ModuleInfos["EfemRobot"].WaferManager.Wafers[0];
@@ -1090,6 +1127,9 @@ namespace Venus_MainPages.ViewModels
                 m_RtDataKeys.Add("PMA.CurrentRecipeResult");
 
                 m_RtDataKeys.Add("PMA.IsOnline");
+
+                m_RtDataKeys.Add($"PMA.ProcessHighPressure");
+                m_RtDataKeys.Add($"PMA.ProcessLowPressure");
             }
 
             if (PMBIsInstalled == true)
@@ -1099,8 +1139,8 @@ namespace Venus_MainPages.ViewModels
 
                 m_RtDataKeys.Add("PMB.IsOnline");
 
-                m_RtDataKeys.Add("PMB.IsATM");
-                m_RtDataKeys.Add("PMB.IsVAC");
+                //m_RtDataKeys.Add("PMB.IsATM");
+                //m_RtDataKeys.Add("PMB.IsVAC");
 
                 m_RtDataKeys.Add($"PMB.ProcessHighPressure");
                 m_RtDataKeys.Add($"PMB.ProcessLowPressure");
@@ -1111,7 +1151,7 @@ namespace Venus_MainPages.ViewModels
                 m_RtDataKeys.Add("PMC.IsSlitDoorClosed");
                 m_RtDataKeys.Add("PMC.CurrentRecipeResult");
                 m_RtDataKeys.Add("PMC.IsATM");
-                m_RtDataKeys.Add("PMC.IsVAC");
+                //m_RtDataKeys.Add("PMC.IsVAC");
                 m_RtDataKeys.Add("PMC.IsOnline");
                 m_RtDataKeys.Add($"PMC.ProcessHighPressure");
                 m_RtDataKeys.Add($"PMC.ProcessLowPressure");
@@ -1123,6 +1163,9 @@ namespace Venus_MainPages.ViewModels
                 m_RtDataKeys.Add("PMD.CurrentRecipeResult");
 
                 m_RtDataKeys.Add("PMD.IsOnline");
+
+                m_RtDataKeys.Add($"PMD.ProcessHighPressure");
+                m_RtDataKeys.Add($"PMD.ProcessLowPressure");
             }
 
             if (TMIsInstalled == true)
@@ -1135,6 +1178,8 @@ namespace Venus_MainPages.ViewModels
                 m_RtDataKeys.Add($"TM.TMProcessGauge.Value");
                 m_RtDataKeys.Add("TM.TMATMSwitch.Value");
                 m_RtDataKeys.Add("TM.TMVacSwitch.Value");
+                m_RtDataKeys.Add("TM.TMProcessGauge.Value");
+
 
 
             }

+ 30 - 6
Venus/Venus_MainPages/ViewModels/OverVenusViewModel.cs

@@ -20,8 +20,6 @@ using MECF.Framework.Common.CommonData.DeviceData;
 using System.Windows.Shapes;
 using Path = System.IO.Path;
 using Aitex.Core.RT.Log;
-using MECF.Framework.Common.Equipment;
-using MECF.Framework.Common.CommonData;
 using RecipeStep = Venus_Core.RecipeStep;
 
 namespace Venus_MainPages.ViewModels
@@ -183,7 +181,7 @@ namespace Venus_MainPages.ViewModels
         //private float m_BRfForwardPowerFeedBack;
 
         //private int m_MatchWorkMode;
-        //private int m_BiasMatchWorkMode;
+        private string m_BiasMatchWorkMode;
 
         private float m_MatchC1;
         private float m_MatchC2;
@@ -255,6 +253,14 @@ namespace Venus_MainPages.ViewModels
             set { SetProperty(ref m_PendulumValvePosition, value); }
         }
 
+        public string BiasMatchWorkMode
+        {
+            get { return m_BiasMatchWorkMode; }
+            set
+            {
+                SetProperty(ref m_BiasMatchWorkMode, value);
+            }
+        }
         public float BiasMatchC1
         {
             get { return m_BiasMatchC1; }
@@ -1397,7 +1403,7 @@ namespace Venus_MainPages.ViewModels
                 return;
             }
             ClearData();
-            var recipePath = Path.Combine(QueryDataClient.Instance.Service.GetData("GetRTPath").ToString(), "Recipes", ModuleName,"Process", recipeName + ".rcp");
+            var recipePath = Path.Combine(QueryDataClient.Instance.Service.GetData("GetRTPath").ToString(), "Recipes", ModuleName, "Process", recipeName + ".rcp");
             CurrentRecipe = Recipe.Load(File.ReadAllText(recipePath));
             InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.RunRecipe}", recipeName, ModuleManager.ModuleInfos[ModuleName].WaferManager.Wafers[0].WaferID, "Process");
         }
@@ -1467,7 +1473,7 @@ namespace Venus_MainPages.ViewModels
                     {
                         InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.RunRecipe}", CurrentRecipe.Header.DechuckRecipe, ModuleManager.ModuleInfos[ModuleName].WaferManager.Wafers[0].WaferID, RecipeType.DeChuck.ToString());
                     }
-                   
+
                     break;
                 case "2":
                     InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Abort");
@@ -1630,8 +1636,24 @@ namespace Venus_MainPages.ViewModels
                 MatchC1 = CommonFunction.GetValue<float>(RtDataValues, $"{ModuleName}.{VenusDevice.Match}.C1");
                 MatchC2 = CommonFunction.GetValue<float>(RtDataValues, $"{ModuleName}.{VenusDevice.Match}.C2");
 
+
                 BiasMatchC1 = CommonFunction.GetValue<float>(RtDataValues, $"{ModuleName}.{VenusDevice.BiasMatch}.C1");
                 BiasMatchC2 = CommonFunction.GetValue<float>(RtDataValues, $"{ModuleName}.{VenusDevice.BiasMatch}.C2");
+
+                var workmode = CommonFunction.GetValue<int>(RtDataValues, $"{ModuleName}.{VenusDevice.BiasMatch}.WorkMode");
+                if (workmode == 0)
+                {
+                    BiasMatchWorkMode = "Manual";
+                }
+                else if (workmode == 1)
+                { 
+                    BiasMatchWorkMode = "Auto";
+                }
+                else
+                {
+                    BiasMatchWorkMode = "";
+                }
+
                 TurboPumpWaterFlowSwitch = CommonFunction.GetValue<bool>(RtDataValues, $"{ModuleName}.TurboPumpWaterFlowSwitch.Value");
                 IsTurboPumpAtSpeed = CommonFunction.GetValue<bool>(RtDataValues, $"{ModuleName}.IsTurboPumpAtSpeed");
                 IsHasWafer = CommonFunction.GetValue<bool>(RtDataValues, $"{ModuleName}.HasWafer");
@@ -1644,7 +1666,7 @@ namespace Venus_MainPages.ViewModels
                     CurrentRecipeResult = CommonFunction.GetValue<RecipeResult>(RtDataValues, $"{ModuleName}.CurrentRecipeResult");
                     if (CurrentRecipeResult.RecipeStepNumber != null && CurrentRecipeResult.RecipeStepNumber != currentRecipeNumber)
                     {
-                        var recipePath = Path.Combine(QueryDataClient.Instance.Service.GetData("GetRTPath").ToString(), "Recipes", ModuleName,CurrentRecipe.Header.Type.ToString(), CurrentRecipeResult.RecipeName + ".rcp");
+                        var recipePath = Path.Combine(QueryDataClient.Instance.Service.GetData("GetRTPath").ToString(), "Recipes", ModuleName, CurrentRecipe.Header.Type.ToString(), CurrentRecipeResult.RecipeName + ".rcp");
                         CurrentRecipe = Recipe.Load(File.ReadAllText(recipePath));
                         CurrentRecipeStep = CurrentRecipe.Steps[Convert.ToInt32(CurrentRecipeResult.RecipeStepNumber) - 1];
                     }
@@ -1748,6 +1770,8 @@ namespace Venus_MainPages.ViewModels
 
             m_RtDataKeys.Add($"{ModuleName}.{VenusDevice.BiasMatch}.C1");
             m_RtDataKeys.Add($"{ModuleName}.{VenusDevice.BiasMatch}.C2");
+            m_RtDataKeys.Add($"{ModuleName}.{VenusDevice.BiasMatch}.WorkMode");
+
 
             m_RtDataKeys.Add($"{ModuleName}.{VenusDevice.PendulumValve}.DeviceData");
             m_RtDataKeys.Add($"{ModuleName}.{VenusDevice.ESCHV}.DeviceData");

+ 2 - 2
Venus/Venus_MainPages/ViewModels/TMOperationViewModel.cs

@@ -390,8 +390,8 @@ namespace Venus_MainPages.ViewModels
             HomeAllSteps.Add("Lid");
             HomeAllSteps.Add("Robot");
             HomeAllSteps.Add("Slit Door");
-            HomeAllSteps.Add("Pump");
-            HomeAllSteps.Add("ATM Switch");
+            HomeAllSteps.Add("Pump ");
+            //HomeAllSteps.Add("ATM Switch");
 
         }
 

File diff suppressed because it is too large
+ 34 - 26
Venus/Venus_MainPages/Views/OperationOverView.xaml


+ 5 - 2
Venus/Venus_MainPages/Views/OverVenusView.xaml

@@ -1076,7 +1076,7 @@
                 </TextBlock.Text>
             </TextBlock>
         </Grid>
-        <Grid Width="300" Height="260"  Canvas.Left="500" Canvas.Top="402" Background="#E8E8E8" unity:GridOptions.LineBrush="#afb4db" unity:GridOptions.ShowBorder="True">
+        <Grid Width="300" Height="280"  Canvas.Left="500" Canvas.Top="402" Background="#E8E8E8" unity:GridOptions.LineBrush="#afb4db" unity:GridOptions.ShowBorder="True">
             <Grid.RowDefinitions>
                 <RowDefinition/>
                 <RowDefinition/>
@@ -1088,7 +1088,7 @@
                 <RowDefinition/>
                 <RowDefinition/>
                 <RowDefinition/>
-                <!--<RowDefinition/>-->
+                <RowDefinition/>
             </Grid.RowDefinitions>
             <Grid.ColumnDefinitions>
                 <ColumnDefinition Width="2*"/>
@@ -1120,6 +1120,8 @@
             <TextBlock Grid.Row="7" Text="BRF Ref  Power(W)" FontSize="15" VerticalAlignment="Center" HorizontalAlignment="Left" Padding="10,0,0,0"/>
             <TextBlock Grid.Row="8" Text="BRF Match C1(%)" FontSize="15" VerticalAlignment="Center" HorizontalAlignment="Left" Padding="10,0,0,0"/>
             <TextBlock Grid.Row="9" Text="BRF Match C2(%)" FontSize="15" VerticalAlignment="Center" HorizontalAlignment="Left" Padding="10,0,0,0"/>
+            <TextBlock Grid.Row="10" Text="BRF Match Mode" FontSize="15" VerticalAlignment="Center" HorizontalAlignment="Left" Padding="10,0,0,0"/>
+
             <!--<TextBlock Grid.Row="10" Text="DC Bias(V)" FontSize="15" VerticalAlignment="Center" HorizontalAlignment="Left" Padding="10,0,0,0"/>-->
 
 
@@ -1133,6 +1135,7 @@
             <TextBlock Grid.Row="7" Grid.Column="1" Width="Auto" Height="Auto" Text="{Binding BRFData.ReflectPower,StringFormat='F1'}"  Background="#E8E8E8" TextBlock.TextAlignment="Center" VerticalAlignment="Center" Block.TextAlignment="Center" Grid.ColumnSpan="2"/>
             <TextBlock Grid.Row="8" Grid.Column="2" Width="Auto" Height="Auto" Text="{Binding BiasMatchC1,StringFormat='N0'}"  Background="#E8E8E8" TextBlock.TextAlignment="Center" VerticalAlignment="Center" Block.TextAlignment="Center"/>
             <TextBlock Grid.Row="9" Grid.Column="2" Width="Auto" Height="Auto" Text="{Binding BiasMatchC2,StringFormat='N0'}"  Background="#E8E8E8" TextBlock.TextAlignment="Center" VerticalAlignment="Center" Block.TextAlignment="Center"/>
+            <TextBlock Grid.Row="10" Grid.Column="1" Grid.ColumnSpan="2" Width="Auto" Height="Auto" Text="{Binding BiasMatchWorkMode}"  Background="#E8E8E8" TextBlock.TextAlignment="Center" VerticalAlignment="Center" Block.TextAlignment="Center"/>
             <!--<TextBlock Grid.Row="10" Grid.Column="2" Width="Auto" Height="Auto" Text="0.0"  Background="#E8E8E8" TextBlock.TextAlignment="Center" VerticalAlignment="Center" Block.TextAlignment="Center"/>-->
 
         </Grid>

+ 27 - 0
Venus/Venus_RT/Config/LogDefine.json

@@ -622,6 +622,33 @@
     "Note": "IO Valve:  Alarm"
   },
   {
+    "Id": 1034,
+    "Level": "Error",
+    "LogEnum": "ERR_MATCH",
+    "GlobalDescription_zh": "MATCH error: {0}",
+    "GlobalDescription_en": "MATCH error: {0}",
+    "Module": "PM",
+    "Note": "MATCH Alarm"
+  },
+  {
+    "Id": 1035,
+    "Level": "Warning",
+    "LogEnum": "WARN_MATCH",
+    "GlobalDescription_zh": "MATCH warning: {0}",
+    "GlobalDescription_en": "MATCH warning: {0}",
+    "Module": "PM",
+    "Note": "MATCH Alarm"
+  },
+  {
+    "Id": 1036,
+    "Level": "Info",
+    "LogEnum": "INFO_MATCH",
+    "GlobalDescription_zh": "MATCH Info: {0}",
+    "GlobalDescription_en": "MATCH Info: {0}",
+    "Module": "PM",
+    "Note": "MATCH Info"
+  },
+  {
     "Id": 2000,
     "Level": "Error",
     "LogEnum": "ERR_TM",

+ 1 - 1
Venus/Venus_RT/Config/PM/Kepler2200A/Kepler2200AIoDefine.xml

@@ -198,7 +198,7 @@
 		<DO_ITEM Index="77" Name="" />
 		<DO_ITEM Index="78" Name="" />
 		<DO_ITEM Index="79" Name="" />
-		<DO_ITEM Index="80" Name="DO_Lid_Servo_MATC_Mode" Device="去位置5" Addr="w5.00"/>
+		<DO_ITEM Index="80" Name="DO_Lid_Servo_MATC_Mode" Device="维修模式" Addr="w5.00"/>
 		<DO_ITEM Index="81" Name="" />
 		<DO_ITEM Index="82" Name="" />
 		<DO_ITEM Index="83" Name="" />

+ 66 - 4
Venus/Venus_RT/Config/System.sccfg

@@ -132,7 +132,7 @@
 		<config default="2000" name="PumpCrossingPressure" nameView="Pump Crossing Pressure" description="" max="300000" 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="2000" name="OverVentTime" nameView="Over Vent Time Delay" description="" max="60000" 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" />
 		<config default="30" name="PurgeCycleCount" description="Purge Cycle Count" max="200" min="0" paramter="" tag="" unit="" type="Integer" />
 		<config default="120" name="PurgePumpTime" description="Purge Pump Time" max="7200" min="0" paramter="" tag="" unit="second" type="Integer" />
@@ -201,7 +201,7 @@
 		<config default="300" name="LeakCheckWaitTime" description="Leak Check Wait Time" max="7200" min="0" paramter="" tag="" unit="second" type="Integer" />
 		<config default="30" name="LeakRate" description="Leak Rate" max="756000" min="0" paramter="" tag="" unit="mTorrPerMin" type="Double" />
 		<config default="2" name="SlotNumber" nameView="Slot number"  description="槽位个数" max="60" min="1" paramter="" tag="" unit="" type="Integer" />
-
+		<config default="2000" name="OverVentTime" nameView="Over Vent Time Delay" description="" max="60000" min="0" paramter="" tag="" unit="ms" type="Integer"/>
 		<configs name="DryPump" nameView="Dry Pump" >
 			<config default="1" name="MFG" nameView="MFG" description="厂商, 1:Sky; 2:Edwards" max="10" min="0" paramter="" tag="" unit="" type="Integer" />
 			<config default="1" name="CommunicationType" nameView="Communication Type" description="0:Analogue; 1:RS232; 2:Ethernet" max="10" min="0" paramter="" tag="" unit="" type="Integer" />
@@ -227,6 +227,7 @@
 		<config default="300" name="LeakCheckWaitTime" description="Leak Check Wait Time" max="7200" min="0" paramter="" tag="" unit="second" type="Integer" />
 		<config default="30" name="LeakRate" description="Leak Rate" max="756000" min="0" paramter="" tag="" unit="mTorrPerMin" type="Double" />
 		<config default="4" name="SlotNumber" nameView="Slot number"  description="槽位个数" max="60" min="1" paramter="" tag="" unit="" type="Integer" />
+		<config default="2000" name="OverVentTime" nameView="Over Vent Time Delay" description="" max="60000" min="0" paramter="" tag="" unit="ms" type="Integer" />
     <configs name="DryPump" nameView="Dry Pump" >
       <config default="1" name="MFG" nameView="MFG" description="厂商, 1:Sky; 2:Edwards" max="10" min="0" paramter="" tag="" unit="" type="Integer" />
       <config default="1" name="CommunicationType" nameView="Communication Type" description="0:Analogue; 1:RS232; 2:Ethernet" max="10" min="0" paramter="" tag="" unit="" type="Integer" />
@@ -327,7 +328,7 @@
 		<config default="140" name="ForeLineHeaterSetPointLimit" nameView="ForeLine Heater Set Point Limit" description="" max="500" min="0" paramter="" tag="" unit="" type="Integer" />
 		<config default="120" name="CheckSubstrateTempTimeout" nameView="Check Substrate Temp Timeout" description="" max="3600" min="0" paramter="" tag="" unit="" type="Integer" />
 		<config default="90" name="CheckATMTimeout" nameView="Check ATM Timeout" description="" max="3000" min="0" paramter="" tag="" unit="s" type="Integer" />
-		<config default="2000" name="OverVentTime" nameView="Over Vent Time Delay" description="" max="60000" min="0" paramter="" tag="" unit="s" type="Integer" />
+		<config default="2000" name="OverVentTime" nameView="Over Vent Time Delay" description="" max="60000" min="0" paramter="" tag="" unit="ms" type="Integer" />
 		<config default="780000" name="ChamberBasePressureThreshold" nameView="Chamber Base Pressure Threshold" description="" max="1000000" min="0" paramter="" tag="" unit="mtorr" type="Double" />
 		<config default="120" name="ChamberBaseTemperatureThreshold" nameView="Chamber Base Temperature Threshold" description="" max="1000" min="0" paramter="" tag="" unit="°C" type="Double" />
 		<config default="10" name="ProcessPressureOffset" nameView="Process Pressure Offset" description="" max="100" min="0" paramter="" tag="" unit="mtorr" type="Double" />
@@ -348,6 +349,8 @@
 		<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="false" name="IsEnableRecipeExtension" nameView="Is Enable Recipe Extension"  description="" max="10" min="0" paramter="" tag="" unit="" type="Bool" />
+		<config default="80"   name="ControlPressureSetPoint"       nameView="Control Pressure SetPoint"   description="PM Chamber 控压 设定值" max="200" min="0" paramter="" tag="" unit="mTorr" type="Integer" />
+		<config default="300"  name="ControlPressureN2FlowSetPoint"   nameView="Control Pressure N2 Flow SetPoint"   description="PM Chamber 控压 设定值" max="500" min="0" paramter="" tag="" unit="sccm" 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" />
@@ -831,7 +834,20 @@
 			<config default="127.0.0.1:1102" name="IPAddress" nameView="IP Address" description="EPD IP、端口设置;default 10.0.0.100:13000" max="" min="" paramter="" tag="" unit="" type="String" />
 			<config default="0" name="EPDType" nameView="EPD Type" description="EPD type, 0) by socket, 1) by WCF" max="32" min="0" paramter="" tag="" unit="" type="Integer" />
 		</configs>
+		<configs name="HighTemperatureChiller" nameView="HighTemperatureChiller" >
+			<config default="60" name="LiftServoPosition1"    nameView="Lift Servo Position1"     description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="LiftServoPosition2"    nameView="Lift Servo Position2"     description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="LiftServoPosition3"    nameView="Lift Servo Position3"     description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="LiftServoPosition4"    nameView="Lift Servo Position4"     description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="LiftServoPosition5"    nameView="Lift Servo Position5"     description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="OriginSearchHighSpeed" nameView="Origin Search High Speed" description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="OriginSearchLowSpeed"  nameView="Origin Search Low Speed"  description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="AbsMoveSpeed"          nameView="Abs Move Speed"           description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="MaximusMoveSpeed"      nameView="Maximus Move Speed"       description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="SoftDownLimit"         nameView="Soft Down Limit"          description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="SoftUpLimit"           nameView="Soft Up Limit"            description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
 
+		</configs>
 	</configs>
 
 	<!--PMB-->
@@ -853,7 +869,7 @@
 		<config default="140" name="ForeLineHeaterSetPointLimit" nameView="ForeLine Heater Set Point Limit" description="" max="500" min="0" paramter="" tag="" unit="" type="Integer" />
 		<config default="120" name="CheckSubstrateTempTimeout" nameView="Check Substrate Temp Timeout" description="" max="3600" min="0" paramter="" tag="" unit="" type="Integer" />
 		<config default="90" name="CheckATMTimeout" nameView="Check ATM Timeout" description="" max="3000" min="0" paramter="" tag="" unit="s" type="Integer" />
-		<config default="2000" name="OverVentTime" nameView="Over Vent Time Delay" description="" max="60000" min="0" paramter="" tag="" unit="s" type="Integer" />
+		<config default="2000" name="OverVentTime" nameView="Over Vent Time Delay" description="" max="60000" min="0" paramter="" tag="" unit="ms" type="Integer" />
 		<config default="780000" name="ChamberBasePressureThreshold" nameView="Chamber Base Pressure Threshold" description="" max="1000000" min="0" paramter="" tag="" unit="mtorr" type="Double" />
 		<config default="120" name="ChamberBaseTemperatureThreshold" nameView="Chamber Base Temperature Threshold" description="" max="1000" min="0" paramter="" tag="" unit="°C" type="Double" />
 		<config default="10" name="ProcessPressureOffset" nameView="Process Pressure Offset" description="" max="100" min="0" paramter="" tag="" unit="mtorr" type="Double" />
@@ -873,6 +889,8 @@
 		<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" />
 		<config default="false" name="IsEnableRecipeExtension" nameView="Is Enable Recipe Extension"  description="" max="10" min="0" paramter="" tag="" unit="" type="Bool" />
+		<config default="80"  name="ControlPressureSetPoint"   nameView="Control Pressure SetPoint"   description="PM Chamber 控压 设定值" max="200" min="0" paramter="" tag="" unit="mTorr" type="Integer" />
+		<config default="300"  name="ControlPressureN2FlowSetPoint"   nameView="Control Pressure N2 Flow SetPoint"   description="PM Chamber 控压 设定值" max="500" min="0" paramter="" tag="" unit="sccm" 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" />
@@ -1340,7 +1358,20 @@
 			<config default="127.0.0.1:1102" name="IPAddress" nameView="IP Address" description="EPD IP、端口设置;default 10.0.0.100:13000" max="" min="" paramter="" tag="" unit="" type="String" />
 			<config default="0" name="EPDType" nameView="EPD Type" description="EPD type, 0) by socket, 1) by WCF" max="32" min="0" paramter="" tag="" unit="" type="Integer" />
 		</configs>
+		<configs name="HighTemperatureChiller" nameView="HighTemperatureChiller" >
+			<config default="60" name="LiftServoPosition1"    nameView="Lift Servo Position1"     description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="LiftServoPosition2"    nameView="Lift Servo Position2"     description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="LiftServoPosition3"    nameView="Lift Servo Position3"     description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="LiftServoPosition4"    nameView="Lift Servo Position4"     description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="LiftServoPosition5"    nameView="Lift Servo Position5"     description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="OriginSearchHighSpeed" nameView="Origin Search High Speed" description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="OriginSearchLowSpeed"  nameView="Origin Search Low Speed"  description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="AbsMoveSpeed"          nameView="Abs Move Speed"           description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="MaximusMoveSpeed"      nameView="Maximus Move Speed"       description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="SoftDownLimit"         nameView="Soft Down Limit"          description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="SoftUpLimit"           nameView="Soft Up Limit"            description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
 
+		</configs>
 	</configs>
 
 	<!--PMC-->
@@ -1382,6 +1413,8 @@
 		<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" />
 		<config default="false" name="IsEnableRecipeExtension" nameView="Is Enable Recipe Extension"  description="" max="10" min="0" paramter="" tag="" unit="" type="Bool" />
+		<config default="80"  name="ControlPressureSetPoint"   nameView="Control Pressure SetPoint"   description="PM Chamber 控压 设定值" max="200" min="0" paramter="" tag="" unit="mTorr" type="Integer" />
+		<config default="300"  name="ControlPressureN2FlowSetPoint"   nameView="Control Pressure N2 Flow SetPoint"   description="PM Chamber 控压 设定值" max="500" min="0" paramter="" tag="" unit="sccm" 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" />
@@ -1849,7 +1882,21 @@
 			<config default="127.0.0.1:1102" name="IPAddress" nameView="IP Address" description="EPD IP、端口设置;default 10.0.0.100:13000" max="" min="" paramter="" tag="" unit="" type="String" />
 			<config default="0" name="EPDType" nameView="EPD Type" description="EPD type, 0) by socket, 1) by WCF" max="32" min="0" paramter="" tag="" unit="" type="Integer" />
 		</configs>
+		
+		<configs name="HighTemperatureChiller" nameView="HighTemperatureChiller" >			
+			<config default="60" name="LiftServoPosition1"    nameView="Lift Servo Position1"     description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="LiftServoPosition2"    nameView="Lift Servo Position2"     description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="LiftServoPosition3"    nameView="Lift Servo Position3"     description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="LiftServoPosition4"    nameView="Lift Servo Position4"     description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="LiftServoPosition5"    nameView="Lift Servo Position5"     description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="OriginSearchHighSpeed" nameView="Origin Search High Speed" description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="OriginSearchLowSpeed"  nameView="Origin Search Low Speed"  description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="AbsMoveSpeed"          nameView="Abs Move Speed"           description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="MaximusMoveSpeed"      nameView="Maximus Move Speed"       description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="SoftDownLimit"         nameView="Soft Down Limit"          description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="SoftUpLimit"           nameView="Soft Up Limit"            description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
 
+		</configs>
 	</configs>
 
   <!--PMD-->
@@ -1891,6 +1938,8 @@
     <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" />
 	<config default="false" name="IsEnableRecipeExtension" nameView="Is Enable Recipe Extension"  description="" max="10" min="0" paramter="" tag="" unit="" type="Bool" />
+	<config default="80"  name="ControlPressureSetPoint"   nameView="Control Pressure SetPoint"   description="PM Chamber 控压 设定值" max="200" min="0" paramter="" tag="" unit="mTorr" type="Integer" />
+	<config default="300"  name="ControlPressureN2FlowSetPoint"   nameView="Control Pressure N2 Flow SetPoint"   description="PM Chamber 控压 设定值" max="500" min="0" paramter="" tag="" unit="sccm" 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" />
@@ -2358,7 +2407,20 @@
       <config default="127.0.0.1:1102" name="IPAddress" nameView="IP Address" description="EPD IP、端口设置;default 10.0.0.100:13000" max="" min="" paramter="" tag="" unit="" type="String" />
       <config default="0" name="EPDType" nameView="EPD Type" description="EPD type, 0) by socket, 1) by WCF" max="32" min="0" paramter="" tag="" unit="" type="Integer" />
     </configs>
+		<configs name="HighTemperatureChiller" nameView="HighTemperatureChiller" >
+			<config default="60" name="LiftServoPosition1"    nameView="Lift Servo Position1"     description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="LiftServoPosition2"    nameView="Lift Servo Position2"     description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="LiftServoPosition3"    nameView="Lift Servo Position3"     description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="LiftServoPosition4"    nameView="Lift Servo Position4"     description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="LiftServoPosition5"    nameView="Lift Servo Position5"     description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="OriginSearchHighSpeed" nameView="Origin Search High Speed" description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="OriginSearchLowSpeed"  nameView="Origin Search Low Speed"  description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="AbsMoveSpeed"          nameView="Abs Move Speed"           description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="MaximusMoveSpeed"      nameView="Maximus Move Speed"       description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="SoftDownLimit"         nameView="Soft Down Limit"          description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
+			<config default="60" name="SoftUpLimit"           nameView="Soft Up Limit"            description="Lift Servo Position1" max="600" min="-600" paramter="" tag="" unit="mm" type="Integer" />
 
+		</configs>
   </configs>
 	
 	<!--Recipe-->

+ 0 - 1
Venus/Venus_RT/Devices/AdTecRF.cs

@@ -824,7 +824,6 @@ namespace Venus_RT.Devices
 
             SetPresetMemory(0);
             await Task.Delay(200);
-
             SetWorkMode(EnumRfMatchTuneMode.Auto);
         }
         public override void SetMatchPosition(float c1, float c2, out string reason)

+ 24 - 0
Venus/Venus_RT/Devices/DeviceManager.cs

@@ -182,6 +182,18 @@ namespace Venus_RT.Instances
             {
                 AddCustomModuleDevice(new AdTecMatch(mod, Venus_Core.VenusDevice.Match));
             }
+            else if (SC.GetValue<bool>($"{mod}.Match.EnableMatch") &&
+                SC.GetValue<int>($"{mod}.Match.CommunicationType") == (int)CommunicationType.RS232 &&
+                SC.GetValue<int>($"{mod}.Match.MFG") == (int)MatchMFG.Revtech)
+            {
+                AddCustomModuleDevice(new RevtechMatch(mod, Venus_Core.VenusDevice.Match, MatchCommunicationType.RS232));
+            }
+            else if (SC.GetValue<bool>($"{mod}.Match.EnableMatch") &&
+                SC.GetValue<int>($"{mod}.Match.CommunicationType") == (int)CommunicationType.Ethernet&&
+                SC.GetValue<int>($"{mod}.Match.MFG") == (int)MatchMFG.Revtech)
+            {
+                AddCustomModuleDevice(new RevtechMatch(mod, Venus_Core.VenusDevice.Match, MatchCommunicationType.Ethernet));
+            }
 
             if (SC.GetValue<bool>($"{mod}.BiasMatch.EnableBiasMatch") &&
                 SC.GetValue<int>($"{mod}.BiasMatch.CommunicationType") == (int)CommunicationType.RS232 &&
@@ -189,6 +201,18 @@ namespace Venus_RT.Instances
             {
                 AddCustomModuleDevice(new AdTecMatch(mod, Venus_Core.VenusDevice.BiasMatch));
             }
+            else if (SC.GetValue<bool>($"{mod}.BiasMatch.EnableBiasMatch") &&
+                SC.GetValue<int>($"{mod}.BiasMatch.CommunicationType") == (int)CommunicationType.RS232 &&
+                SC.GetValue<int>($"{mod}.BiasMatch.MFG") == (int)MatchMFG.Revtech)
+            {
+                AddCustomModuleDevice(new RevtechMatch(mod, Venus_Core.VenusDevice.BiasMatch,MatchCommunicationType.RS232));
+            }
+            else if (SC.GetValue<bool>($"{mod}.BiasMatch.EnableBiasMatch") &&
+                SC.GetValue<int>($"{mod}.BiasMatch.CommunicationType") == (int)CommunicationType.Ethernet &&
+                SC.GetValue<int>($"{mod}.BiasMatch.MFG") == (int)MatchMFG.Revtech)
+            {
+                AddCustomModuleDevice(new RevtechMatch(mod, Venus_Core.VenusDevice.BiasMatch, MatchCommunicationType.Ethernet));
+            }
 
             if (SC.GetValue<int>($"{mod}.DryPump.CommunicationType") == (int)CommunicationType.RS232)
             {

+ 22 - 0
Venus/Venus_RT/Devices/IODevices/IoHighTemperatureHeater.cs

@@ -3,6 +3,7 @@ using Aitex.Core.RT.Device;
 using Aitex.Core.RT.IOCore;
 using Aitex.Core.RT.Log;
 using Aitex.Core.RT.OperationCenter;
+using Aitex.Core.RT.SCCore;
 using Aitex.Core.Util;
 using MECF.Framework.Common.CommonData.DeviceData;
 using System;
@@ -396,6 +397,27 @@ namespace Venus_RT.Devices.IODevices
                     _position5Timer.Stop();
                 }
             }
+
+            
+            _SetRealFloat(_aoLiftServoPosition1, SC.GetValue<int>($"{Module}.HighTemperatureChiller.LiftServoPosition1"));
+            _SetRealFloat(_aoLiftServoPosition2, SC.GetValue<int>($"{Module}.HighTemperatureChiller.LiftServoPosition2"));
+            _SetRealFloat(_aoLiftServoPosition3, SC.GetValue<int>($"{Module}.HighTemperatureChiller.LiftServoPosition3"));
+            _SetRealFloat(_aoLiftServoPosition4, SC.GetValue<int>($"{Module}.HighTemperatureChiller.LiftServoPosition4"));
+            _SetRealFloat(_aoLiftServoPosition5, SC.GetValue<int>($"{Module}.HighTemperatureChiller.LiftServoPosition5"));
+
+
+          
+
+            _SetRealFloat(_aoOriginSearchHighSpeed, SC.GetValue<int>($"{Module}.HighTemperatureChiller.OriginSearchHighSpeed"));
+            _SetRealFloat(_aoOriginSearchLowSpeed, SC.GetValue<int>($"{Module}.HighTemperatureChiller.OriginSearchLowSpeed"));
+            _SetRealFloat(_aoAbsMoveSpeed, SC.GetValue<int>($"{Module}.HighTemperatureChiller.AbsMoveSpeed"));
+            _SetRealFloat(_aoMaximusMoveSpeed, SC.GetValue<int>($"{Module}.HighTemperatureChiller.MaximusMoveSpeed"));
+            _SetRealFloat(_aoSoftDownLimit, SC.GetValue<int>($"{Module}.HighTemperatureChiller.SoftDownLimit"));
+            _SetRealFloat(_aoSoftUpLimit, SC.GetValue<int>($"{Module}.HighTemperatureChiller.SoftUpLimit"));
+
+         
+
+
         }
         public void Reset()
         {

+ 25 - 5
Venus/Venus_RT/Devices/JetKepler2200APM.cs

@@ -394,23 +394,29 @@ namespace Venus_RT.Devices
                 }
             }
 
-            // RS232 AdTec match
-
             if (SC.GetValue<int>($"{Module}.Match.CommunicationType") == (int)CommunicationType.RS232 &&
-               SC.GetValue<int>($"{Module}.Match.MFG") == (int)MatchMFG.AdTec)
+                SC.GetValue<int>($"{Module}.Match.MFG") == (int)MatchMFG.AdTec)
             {
                 _Match = DEVICE.GetDevice<AdTecMatch>($"{Module}.{VenusDevice.Match}");
             }
+            else if (
+                SC.GetValue<int>($"{Module}.Match.MFG") == (int)MatchMFG.Revtech)
+            {
+                _Match = DEVICE.GetDevice<RevtechMatch>($"{Module}.{VenusDevice.BiasMatch}");
+            }
 
 
-
-            // Bias Match
             if (SC.GetValue<bool>($"{Module}.BiasMatch.EnableBiasMatch") &&
                 SC.GetValue<int>($"{Module}.BiasMatch.CommunicationType") == (int)CommunicationType.RS232 &&
                 SC.GetValue<int>($"{Module}.BiasMatch.MFG") == (int)MatchMFG.AdTec)
             {
                 _BiasMatch = DEVICE.GetDevice<AdTecMatch>($"{Module}.{VenusDevice.BiasMatch}");
             }
+            else if (SC.GetValue<bool>($"{Module}.BiasMatch.EnableBiasMatch") &&               
+                SC.GetValue<int>($"{Module}.BiasMatch.MFG") == (int)MatchMFG.Revtech)
+            {
+                _BiasMatch = DEVICE.GetDevice<RevtechMatch>($"{Module}.{VenusDevice.BiasMatch}");
+            }
 
             _foreline_interlock_pressure = SC.GetValue<double>($"{Module}.ForelineInterlockPressure");
 
@@ -950,6 +956,20 @@ namespace Venus_RT.Devices
             if (_backsideHe == null) return false;
             return _backsideHe.SetFlowThreshold(nMin, nMax);
         }
+        public override bool StartControlPressure(int pressureSetpoint, int flowSetpoint)
+        {
+            OpenValve(ValveType.GasFinal, true);
+            FlowGas(5, flowSetpoint);
+            TurnPendulumValve(true);
+            SetPVPressure(pressureSetpoint);
+            return true;
+        }
+        public override bool AbortControlPressure()
+        {
+            OpenValve(ValveType.GasFinal, false);
+            FlowGas(5, 0);
+            return true;
+        }
         public override bool HighTemperatureHeaterGotoPosition(HighTemperatureHeaterPosition highTemperatureHeaterPosition)
         {
             return  _highTemperatureHeater.GotoPosition(highTemperatureHeaterPosition);           

+ 27 - 0
Venus/Venus_RT/Devices/JetKepler2300PM.cs

@@ -983,6 +983,19 @@ namespace Venus_RT.Devices
             return true;
         }
 
+        public override bool SetBiasMatchWorkMode(MatchWorkMode matchWorkMode)
+        {
+            if (_BiasMatch == null) return false;
+            if (matchWorkMode == MatchWorkMode.Auto)
+            {
+                return _BiasMatch.SetMatchMode(EnumRfMatchTuneMode.Auto, out _);
+            }
+            else if (matchWorkMode == MatchWorkMode.Manual)
+            {
+                return _BiasMatch.SetMatchMode(EnumRfMatchTuneMode.Manual, out _);
+            }
+            return false;
+        }
         public override bool SetBiasPulseMode(bool on)
         {
             if (_GeneratorBias == null) return false;
@@ -1075,6 +1088,20 @@ namespace Venus_RT.Devices
             if (_backsideHe == null) return false;
             return _backsideHe.SetFlowThreshold(nMin, nMax);
         }
+        public override bool StartControlPressure(int pressureSetpoint, int flowSetpoint)
+        {
+            OpenValve(ValveType.GasFinal, true);
+            FlowGas(5, flowSetpoint);
+            TurnPendulumValve(true);
+            SetPVPressure(pressureSetpoint);
+            return true;
+        }
+        public override bool AbortControlPressure()
+        {
+            OpenValve(ValveType.GasFinal, false);
+            FlowGas(5, 0);
+            return true;
+        }
         public override bool PreparePlace()
         {
             if (!SetSlitDoor(true, out string reason))

+ 20 - 7
Venus/Venus_RT/Devices/JetPMBase.cs

@@ -129,13 +129,13 @@ namespace Venus_RT.Devices
                 {
                     return Singleton<RouteManager>.Instance.seTM.TMIsATM;
                 }
-            } 
+            }
         }
 
-        public bool IsTMVAC 
-        { 
-        	get 
-        	{
+        public bool IsTMVAC
+        {
+            get
+            {
                 if (Singleton<RouteManager>.Instance.TM != null)
                 {
                     return Singleton<RouteManager>.Instance.TM.IsTMVac;
@@ -144,7 +144,7 @@ namespace Venus_RT.Devices
                 {
                     return Singleton<RouteManager>.Instance.seTM.TMIsVAC;
                 }
-            } 
+            }
         }
 
         // EndPoint 
@@ -433,6 +433,11 @@ namespace Venus_RT.Devices
 
         public abstract bool SetBiasMatchPosition(float c1, float c2);
 
+        public virtual bool SetBiasMatchWorkMode(MatchWorkMode matchWorkMode)
+        {
+            return false;
+        }
+
         public abstract bool SetBiasPulseMode(bool on);
         public abstract bool SetBiasPulseRateFreq(int nFreq);
 
@@ -501,6 +506,14 @@ namespace Venus_RT.Devices
         {
             return false;
         }
+        public virtual bool StartControlPressure(int pressureSetpoint, int flowSetpoint)
+        {
+            return false;
+        }
+        public virtual bool AbortControlPressure()
+        {
+            return false;
+        }
         public virtual bool PreparePlace()
         {
             return false;
@@ -513,7 +526,7 @@ namespace Venus_RT.Devices
         {
             return false;
         }
-        
+
         public virtual bool PreparePickIsOK()
         {
             return false;

+ 26 - 2
Venus/Venus_RT/Devices/JetVenusPM.cs

@@ -396,20 +396,31 @@ namespace Venus_RT.Devices
                 }
             }
 
-            // RS232 AdTec match
+            
             if (SC.GetValue<int>($"{Module}.Match.CommunicationType") == (int)CommunicationType.RS232 &&
                 SC.GetValue<int>($"{Module}.Match.MFG") == (int)MatchMFG.AdTec)
             {
                 _Match = DEVICE.GetDevice<AdTecMatch>($"{Module}.{VenusDevice.Match}");
             }
+            else if (SC.GetValue<int>($"{Module}.Match.CommunicationType") == (int)CommunicationType.Ethernet&&
+                SC.GetValue<int>($"{Module}.Match.MFG") == (int)MatchMFG.Revtech)
+            {
+                _Match = DEVICE.GetDevice<RevtechMatch>($"{Module}.{VenusDevice.BiasMatch}");
+            }
 
-            // Bias Match
+           
             if (SC.GetValue<bool>($"{Module}.BiasMatch.EnableBiasMatch") &&
                 SC.GetValue<int>($"{Module}.BiasMatch.CommunicationType") == (int)CommunicationType.RS232 &&
                 SC.GetValue<int>($"{Module}.BiasMatch.MFG") == (int)MatchMFG.AdTec)
             {
                 _BiasMatch = DEVICE.GetDevice<AdTecMatch>($"{Module}.{VenusDevice.BiasMatch}");
             }
+            else if (SC.GetValue<bool>($"{Module}.BiasMatch.EnableBiasMatch") &&
+                SC.GetValue<int>($"{Module}.BiasMatch.CommunicationType") == (int)CommunicationType.Ethernet &&
+                SC.GetValue<int>($"{Module}.BiasMatch.MFG") == (int)MatchMFG.Revtech)
+            {
+                _BiasMatch = DEVICE.GetDevice<RevtechMatch>($"{Module}.{VenusDevice.BiasMatch}");
+            }
 
             
             _foreline_interlock_pressure = SC.GetValue<double>($"{Module}.ForelineInterlockPressure");
@@ -879,6 +890,19 @@ namespace Venus_RT.Devices
             return true;
         }
 
+        public override bool SetBiasMatchWorkMode(MatchWorkMode matchWorkMode)
+        {
+            if (_BiasMatch == null) return false;
+            if (matchWorkMode == MatchWorkMode.Auto)
+            {
+               return _BiasMatch.SetMatchMode(EnumRfMatchTuneMode.Auto, out _);
+            }
+            else if (matchWorkMode == MatchWorkMode.Manual)
+            { 
+              return  _BiasMatch.SetMatchMode(EnumRfMatchTuneMode.Manual, out _);
+            }
+            return false;
+        }
         public override bool SetBiasPulseMode(bool on)
         {
             if (_GeneratorBias == null) return false;

+ 160 - 19
Venus/Venus_RT/Devices/RevtechMatch.cs

@@ -1,59 +1,200 @@
-using Aitex.Core.RT.Log;
+using Aitex.Core.Common.DeviceData;
+using Aitex.Core.RT.DataCenter;
+using Aitex.Core.RT.Log;
+using Aitex.Core.RT.OperationCenter;
 using Aitex.Core.RT.SCCore;
 using MECF.Framework.Common.Communications;
 using MECF.Framework.Common.Device.Bases;
 using MECF.Framework.Common.Equipment;
 using System;
-using System.Collections;
 using System.Collections.Generic;
-using System.Linq;
-using System.Net;
 using System.Text;
-using System.Threading.Tasks;
 using Venus_Core;
 
 namespace Venus_RT.Devices
 {
     static class RevtechMatchMessage
     {
-        public const string EOF = "\n";
-        public const string QUERY_STATE_INFORMATION = "MATCH:FETCH?";
+        public const string QUERY_STATE_INFORMATION = "MATCH:FETCH?\n";
         public const string SET_C1_POS = "MATCH:POS:C1";
         public const string SET_C2_POS = "MATCH:POS:C2";
         public const string SET_WORK_MODE = "MATCH:MODE";
     }
 
+    public enum MatchCommunicationType
+    {
+        RS232,
+        Ethernet
+    }
     public class RevtechMatch : RfMatchBase
     {
         private AsyncSocketDevice _socket;
-        public RevtechMatch(ModuleName mod, string address) : base(mod.ToString(), VenusDevice.Match.ToString())
+        private AsyncSerialPort _serial;
+        private MatchCommunicationType _matchCommunicationType;
+        private string _address;
+        public int WorkMode { get; set; } = -1;
+        public RevtechMatch(ModuleName mod, VenusDevice venusDevice, MatchCommunicationType matchCommunicationType) : base(mod.ToString(), venusDevice.ToString())
         {
-            _socket = new AsyncSocketDevice(address);
-            _socket.OnDataChanged += new AsyncSocketDevice.MessageHandler(OnDataChanged);
+            _matchCommunicationType = matchCommunicationType;
+            if (matchCommunicationType == MatchCommunicationType.RS232)
+            {
+                var portNum = SC.GetStringValue($"{mod}.{venusDevice}.Port");
+                _serial = new AsyncSerialPort(portNum, 115200, 8, System.IO.Ports.Parity.None, System.IO.Ports.StopBits.One,"\n",false);
+            }
+            else if (matchCommunicationType == MatchCommunicationType.Ethernet)
+            {
+                var address = SC.GetStringValue($"{mod}.{venusDevice}.IPAddress");
+                _address = address;
+                _socket = new AsyncSocketDevice(address);
+            }
+
             SerachCommandList = new List<string>()
             {
-            SkyPumpMessage.READ_DATA
+            RevtechMatchMessage.QUERY_STATE_INFORMATION
             };
             sendDataChangedEvent += RevtechMatch_sendDataChangedEvent;
             baseStopwatch.Start();
             baseTimer.Enabled = true;
         }
-        private void RevtechMatch_sendDataChangedEvent(string obj)
+
+        public override bool Initialize()
         {
-           
+            base.Initialize();
+
+            if (_matchCommunicationType == MatchCommunicationType.RS232)
+            {
+                if (_serial!=null && _serial.Open())
+                {
+                    _serial.OnBinaryDataChanged += OnDataChanged;
+                    LOG.Write(eEvent.INFO_MATCH, Module, $"{Name} 串口成功打开");
+                }
+                else
+                {
+                    LOG.Write(eEvent.ERR_MATCH, Module, $"{Name} 串口无法打开");
+                }
+            }
+            else if (_matchCommunicationType == MatchCommunicationType.Ethernet)
+            {
+                //_socket?.Connect(_address);
+
+                if (_socket?.IsConnected == true)
+                {
+                    LOG.Write(eEvent.INFO_MATCH, Module, $"{Name} 网口连接成功");
+                }
+                else
+                {
+                    LOG.Write(eEvent.INFO_MATCH, Module, $"{Name} 网口连接失败");
+                }
+            }
+
+            DATA.Subscribe($"{Module}.{Name}.C1", () => TunePosition1);
+            DATA.Subscribe($"{Module}.{Name}.C2", () => TunePosition2);
+            DATA.Subscribe($"{Module}.{Name}.WorkMode", () => WorkMode);
+
+
+
+            OP.Subscribe($"{Module}.{Name}.SetC1", (func, args) =>
+            {
+                return true;
+            });
+            OP.Subscribe($"{Module}.{Name}.SetC2", (func, args) =>
+            {
+                return true;
+            });
+
+            OP.Subscribe($"{Module}.{Name}.{AITRfOperation.SetMatchPositionC1}", (out string reason, int time, object[] param) =>
+            {
+                SetMatchPositionC1((float)Convert.ToDouble(param[0]), out reason);
+                return true;
+            });
+
+            OP.Subscribe($"{Module}.{Name}.{AITRfOperation.SetMatchPositionC2}", (out string reason, int time, object[] param) =>
+            {
+                SetMatchPositionC2((float)Convert.ToDouble(param[0]), out reason);
+                return true;
+            });
+
+            OP.Subscribe($"{Module}.{Name}.{AITRfOperation.SetMatchPosition}", (out string reason, int time, object[] param) =>
+            {
+                SetMatchPosition((float)Convert.ToDouble(param[0]), (float)Convert.ToDouble(param[1]), out reason);
+                return true;
+            });
+
+            OP.Subscribe($"{Module}.{Name}.{AITRfOperation.SetMatchProcessMode}", (out string reason, int time, object[] param) =>
+            {
+                SetMatchMode((string)param[0] == "Auto" ? EnumRfMatchTuneMode.Auto : EnumRfMatchTuneMode.Manual, out reason);
+                return true;
+            });
+
+
+            return true;
         }
-        public void OnDataChanged(byte[] rawMessage)
+
+
+        private void OnDataChanged(byte[] obj)
         {
-            string data = System.Text.Encoding.Default.GetString(rawMessage);
+            string data = System.Text.Encoding.ASCII.GetString(obj);
+            if (data.Length < 10)
+            {
+                return;
+            }
             string[] matchData = data.Split(',');
+            if (matchData.Length > 9)
+            {
+                WorkMode = Convert.ToInt32(matchData[0]);
+                TunePosition1 = Convert.ToSingle(matchData[7]);
+                TunePosition2 = Convert.ToSingle(matchData[8]);
+            }
         }
+        private void RevtechMatch_sendDataChangedEvent(string obj)
+        {
+            if ((_matchCommunicationType == MatchCommunicationType.Ethernet && _socket?.IsConnected == true))
+            {
+                byte[] value = Encoding.ASCII.GetBytes(obj);
+                _socket?.Write(value);
+            }
+            else if ((_matchCommunicationType == MatchCommunicationType.RS232 && _serial?.IsOpen() == true))
+            {
+                _serial?.Write(obj);
+            }
+        }
+
+       
+
         public override void SetMatchPosition(float c1, float c2, out string reason)
         {
-            byte[] c1Value = Encoding.ASCII.GetBytes($"{RevtechMatchMessage.SET_C1_POS} {c1}\n");
-            byte[] c2Value = Encoding.ASCII.GetBytes($"{RevtechMatchMessage.SET_C2_POS} {c2}\n");
-            _socket?.Write(c1Value);
-            _socket?.Write(c2Value);            
+            base.SetMatchPosition(c1, c2, out reason);
+            executeMatchPostion(c1, c2);
             reason = "";
         }
+        private void executeMatchPostion(float c1, float c2)
+        {
+            SetWorkMode(EnumRfMatchTuneMode.Manual);
+            SetPosition(c1, c2);
+            SetWorkMode(EnumRfMatchTuneMode.Auto);
+        }
+        private void SetPosition(float c1val, float c2val)
+        {
+            SetPointCommandQueue.Add($"{RevtechMatchMessage.SET_C1_POS} {c1val}\n");
+            SetPointCommandQueue.Add($"{RevtechMatchMessage.SET_C2_POS} {c2val}\n");
+        }
+        public override bool SetMatchMode(EnumRfMatchTuneMode enumRfMatchTuneMode, out string reason)
+        {
+            reason = string.Empty;
+            SetWorkMode(enumRfMatchTuneMode);
+            return true;
+        }
+
+        private void SetWorkMode(EnumRfMatchTuneMode mode)
+        {
+            if (mode == EnumRfMatchTuneMode.Auto)
+            {
+                SetPointCommandQueue.Add($"{RevtechMatchMessage.SET_WORK_MODE} AUTO\n");
+            }
+            else if (mode == EnumRfMatchTuneMode.Manual)
+            {
+                SetPointCommandQueue.Add($"{RevtechMatchMessage.SET_WORK_MODE} MANUAL\n");
+            }
+        }
     }
 }

+ 72 - 0
Venus/Venus_RT/Modules/PMs/PMControlPressureRoutine.cs

@@ -0,0 +1,72 @@
+using Aitex.Core.RT.Routine;
+using Aitex.Core.RT.SCCore;
+using MECF.Framework.Common.Equipment;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Venus_Core;
+using Venus_RT.Devices;
+using Venus_RT.Modules.PMs;
+
+namespace Venus_RT.Modules.PMs
+{
+   
+    class PMControlPressureRoutine :  PMRoutineBase, IRoutine
+    {
+        private enum ControlPressureStep
+        {
+            Delay1s,
+            StartControlPressure,
+            End
+        }
+
+        private readonly JetPMBase _chamber;
+
+        private int _controlPressureSetPoint = 90;
+        private int  _controlFlowSetPoint = 90;
+
+        public PMControlPressureRoutine(JetPMBase chamber) : base(chamber)
+        {
+            _chamber = chamber;
+        }
+        public RState Start(params object[] objs)
+        {
+            _controlPressureSetPoint= SC.GetValue<int>($"{Module}.ControlPressureSetPoint");
+            _controlFlowSetPoint= SC.GetValue<int>($"{Module}.ControlPressureN2FlowSetPoint");
+            return Runner.Start(Module, Name);
+        }
+
+        public RState Monitor()
+        {
+
+            Runner.Delay(ControlPressureStep.Delay1s,               _delay_1s)
+                  .Run(ControlPressureStep.StartControlPressure,    StartControlPressure)
+                  .End(ControlPressureStep.End,                     End);
+            return Runner.Status;
+        }
+
+     
+        private bool StartControlPressure()
+        {
+
+            _chamber.StartControlPressure(_controlPressureSetPoint, _controlFlowSetPoint);
+
+
+            return true;
+        }
+
+
+
+        private bool End()
+        {
+
+            return true;
+        }
+        public void Abort()
+        {
+            _chamber.AbortControlPressure();
+        }
+    }
+}

+ 45 - 2
Venus/Venus_RT/Modules/PMs/PMEntity.cs

@@ -151,6 +151,9 @@ namespace Venus_RT.Modules.PMs
         private readonly PMPartialPressureRoutine   _pmPartialPressureRoutine;
         private readonly PMVATPerformanceRoutine    _pmVATPerformanceRoutine;
 
+        private readonly PMControlPressureRoutine _pmControlPressureRoutine;
+
+
 
         private AutoFlag _AutoMode;
         private bool _isOnline = false;
@@ -164,7 +167,7 @@ namespace Venus_RT.Modules.PMs
         //private MovementPosition _goalLiftPin;
         //private ushort _ActivatedActionID;
         //private Stopwatch _LifpinSleepTimer;
-
+        private bool startControlPressureFlag = true;
         public JetChamber ChamberType => _chamber.ChamberType;
         public bool IsIdle
         {
@@ -386,8 +389,10 @@ namespace Venus_RT.Modules.PMs
             _gasVerificationRoutine = new PMGasVerificationRoutine(_chamber, _pumpRoutine);
             _pmPartialPressureRoutine=new PMPartialPressureRoutine(_chamber);
             _pmVATPerformanceRoutine = new PMVATPerformanceRoutine(_chamber);
+            _pmControlPressureRoutine = new PMControlPressureRoutine(_chamber);
+
 
-            fsm                     = new StateMachine<PMEntity>(Module.ToString(), (int)PMState.Init, 50);
+            fsm = new StateMachine<PMEntity>(Module.ToString(), (int)PMState.Init, 50);
 
             //Idle
             EnterExitTransition((int)PMState.Idle,                          FnIdle,                 (int)FSM_MSG.NONE,      null);
@@ -397,6 +402,8 @@ namespace Venus_RT.Modules.PMs
             EnterExitTransition<PMState, FSM_MSG>(PMState.ReadyForPlace,    fnEnterPlaceReady,      FSM_MSG.NONE,   fnExitPlaceReady);
             EnterExitTransition<PMState, FSM_MSG>(PMState.DropDownReady,    fnEnterDropDownReady,   FSM_MSG.NONE,   fnExitDropDownReady);
             EnterExitTransition<PMState, FSM_MSG>(PMState.LiftUpReady,      fnEnterLiftUpReady,     FSM_MSG.NONE,   fnExitLiftUpReady);
+   
+
 
 
             //Home
@@ -560,6 +567,7 @@ namespace Venus_RT.Modules.PMs
             Transition(PMState.VATPerformanceTesting,   FSM_MSG.TIMER,          FnVATPerformanceTimeout,    PMState.Idle);
             Transition(PMState.VATPerformanceTesting,   MSG.Abort,              FnAbortVATPerformance,      PMState.Idle);
 
+            AnyStateTransition(FSM_MSG.TIMER, FnControlPressure, FSM_STATE.SAME);
             Running = true;
 
             WaferManager.Instance.SubscribeLocation(Module, 1);
@@ -1222,6 +1230,41 @@ namespace Venus_RT.Modules.PMs
             _gasVerificationRoutine.Abort();
             return true;
         }
+        private bool FnControlPressure(object[] param)
+        {
+            if (IsOnline == true && fsm.State!=(int)PMState.Processing && fsm.State!=(int)PMState.Clean)
+            {
+                if (startControlPressureFlag == true)
+                {
+                    _pmControlPressureRoutine.Start(param);
+                    startControlPressureFlag = false;
+                }
+
+                RState ret = _pmControlPressureRoutine.Monitor();
+                if (ret == RState.Failed)
+                {
+                    PostMsg(MSG.Error);
+                    return false;
+                }
+                return ret == RState.End;
+            }
+            else
+            {
+                if (startControlPressureFlag == false)
+                {
+                    _pmControlPressureRoutine.Abort();
+                    startControlPressureFlag = true;
+                }
+
+                return true;
+            }
+            
+        }
+        private bool FnAbortControlPressure(object[] param)
+        {
+            _pmControlPressureRoutine.Abort();
+            return true;
+        }
 
         #region Exchange wafer with TM
         private bool FnStartPreparePick(object[] param)

+ 10 - 0
Venus/Venus_RT/Modules/PMs/ProcessDefine.cs

@@ -308,6 +308,16 @@ namespace Venus_RT.Modules.PMs
                 p2 = ProcessUnit.AutoBiasLoadCapPreset;
             }
             Chamber.SetBiasMatchPosition(p1, p2);
+
+            if (ProcessUnit.BiasMatchWorkMode == MatchWorkMode.Auto)
+            {
+                Chamber.SetBiasMatchWorkMode(MatchWorkMode.Auto);
+            }
+            else if(ProcessUnit.BiasMatchWorkMode == MatchWorkMode.Manual)
+            { 
+                Chamber.SetBiasMatchWorkMode(MatchWorkMode.Manual);
+            }
+
             if (ProcessUnit.BiasGeneratorMode == GeneratorMode.Pulsing)
             {
                 Chamber.SetBiasPulseMode(true);

+ 29 - 29
Venus/Venus_RT/Modules/TM/MFHomeRoutine.cs

@@ -20,7 +20,7 @@ namespace Venus_RT.Modules.TM
             kSlitDoorDelay,
             kPump,
             kPumpDelay,
-            kATMSwitch,
+            //kATMSwitch,
             kEnd,
         }
 
@@ -70,7 +70,7 @@ namespace Venus_RT.Modules.TM
                   .Delay(HomeStep.kSlitDoorDelay,   500)
                   .Run(HomeStep.kPump,              HomePump,       CheckPumpReady,        _pumpHomingTimeout)
                   .Delay(HomeStep.kPumpDelay,       500)
-                  .Run(HomeStep.kATMSwitch,         HomePumpDown,   CheckATMSwitchReady,   _pumpDownHomingTimeout)
+                  //.Run(HomeStep.kATMSwitch,         HomePumpDown,   CheckATMSwitchReady,   _pumpDownHomingTimeout)
                   .End(HomeStep.kEnd,               NullFun,        _delay_50ms);
 
             return Runner.Status;
@@ -131,33 +131,33 @@ namespace Venus_RT.Modules.TM
                 return false;
             }
         }
-        private bool HomePumpDown()
-        {
-            if (RouteManager.IsATMMode || _TMHomeRBFlag)
-                return true;
-
-            currentStepNo = 4;
-            return _pumpDownRoutine.Start() == RState.Running;
-        }
-
-        private bool CheckATMSwitchReady()
-        {
-            if (RouteManager.IsATMMode || _TMHomeRBFlag)
-                return true;
-
-            var status = _pumpDownRoutine.Monitor();
-            if (_JetTM.IsTMVac && status == RState.End)
-            {
-                _JetTM.TurnSoftPumpValve(ModuleName.TM, false);
-                _JetTM.TurnFastPumpValve(ModuleName.TM, false);
-                return true;
-            }
-            else
-            {
-                //_pumpDownRoutine.Monitor();
-                return false;
-            }
-        }
+        //private bool HomePumpDown()
+        //{
+        //    if (RouteManager.IsATMMode || _TMHomeRBFlag)
+        //        return true;
+
+        //    currentStepNo = 4;
+        //    return _pumpDownRoutine.Start() == RState.Running;
+        //}
+
+        //private bool CheckATMSwitchReady()
+        //{
+        //    if (RouteManager.IsATMMode || _TMHomeRBFlag)
+        //        return true;
+
+        //    var status = _pumpDownRoutine.Monitor();
+        //    if (_JetTM.IsTMVac && status == RState.End)
+        //    {
+        //        _JetTM.TurnSoftPumpValve(ModuleName.TM, false);
+        //        _JetTM.TurnFastPumpValve(ModuleName.TM, false);
+        //        return true;
+        //    }
+        //    else
+        //    {
+        //        //_pumpDownRoutine.Monitor();
+        //        return false;
+        //    }
+        //}
         public void Abort()
         {
         }

+ 4 - 2
Venus/Venus_RT/Modules/TM/MFVentRoutine.cs

@@ -14,13 +14,14 @@ namespace Venus_RT.Modules.TM
             kVenting,
             kOpenSoftVent,
             KSwitchFastVent,
-            KDelay2S,
+            KDelay,
             kCloseVentValves,
         }
 
         private int _ventingTimeout;
         private int _SoftVentEndPressure;
         private readonly JetTM _JetTM;
+        private int _ventTimeDelay = 1;
         public MFVentRoutine(JetTM jetTM, ModuleName mod) : base(mod)
         {
             _JetTM = jetTM;
@@ -36,6 +37,7 @@ namespace Venus_RT.Modules.TM
                 Reset();
                 _ventingTimeout = SC.GetValue<int>($"{Module}.VentingTimeout") * 1000;
                 _SoftVentEndPressure= SC.GetValue<int>($"{Module}.SoftVentEndPressure");
+                _ventTimeDelay = SC.GetValue<int>($"{Module}.OverVentTime");
                 return Runner.Start(Module, Name);
             }
 
@@ -49,7 +51,7 @@ namespace Venus_RT.Modules.TM
 
             Runner.Run(VentStep.kOpenSoftVent,     OpenSoftVentValve,    IsSoftVentEnd)
                   .Run(VentStep.KSwitchFastVent,   SwitchFastVentValve, IsPressureReady, _ventingTimeout)
-                  .Delay(VentStep.KDelay2S,        2*1000)
+                  .Delay(VentStep.KDelay, _ventTimeDelay)
                   .End(VentStep.kCloseVentValves,  CloseVentValve,        _delay_50ms);
 
             return Runner.Status;

+ 1 - 0
Venus/Venus_RT/Venus_RT.csproj

@@ -216,6 +216,7 @@
     <Compile Include="Modules\PMs\LoadLockPumpRoutine.cs" />
     <Compile Include="Modules\PMs\LoadLockPurgeRoutine.cs" />
     <Compile Include="Modules\PMs\LoadLockVentRoutine.cs" />
+    <Compile Include="Modules\PMs\PMControlPressureRoutine.cs" />
     <Compile Include="Modules\PMs\PMPartialPressureRoutine.cs" />
     <Compile Include="Modules\PMs\PMEntity.cs" />
     <Compile Include="Modules\PMs\PMGaslinePurgeRoutine.cs" />

+ 2 - 0
Venus/Venus_Themes/UserControls/MainTM.xaml

@@ -5,6 +5,7 @@
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
              xmlns:local="clr-namespace:Venus_Themes.UserControls"
              mc:Ignorable="d" 
+             x:Name="mainTM"
              >
     <Viewbox Stretch="Fill">
         <Canvas Width="999" Height="884">
@@ -28,6 +29,7 @@
                 </Ellipse.Fill>
             </Ellipse>
             <Polyline Points="28,735 28,263 438,28 843,263 843,735 435,970 28,735" Stroke="#FF000000" StrokeThickness="3" />
+            <TextBox Canvas.Top="760" Canvas.Left="135" HorizontalContentAlignment="Center" Text="{Binding ElementName=mainTM,Path=PressureValue,StringFormat={}TM({0}mtorr)}" FontSize="70" Background="Transparent" Width="600" BorderThickness="0" Visibility="{Binding ElementName=mainTM,Path=IsShowPressureValue,Converter={StaticResource bool2VisibilityConverter}}"/>
         </Canvas>
     </Viewbox>
     

+ 16 - 0
Venus/Venus_Themes/UserControls/MainTM.xaml.cs

@@ -24,5 +24,21 @@ namespace Venus_Themes.UserControls
         {
             InitializeComponent();
         }
+        public static readonly DependencyProperty PressureValueProperty = DependencyProperty.Register(
+       "PressureValue", typeof(int), typeof(MainTM));
+
+        public int PressureValue
+        {
+            get { return (int)this.GetValue(PressureValueProperty); }
+            set { this.SetValue(PressureValueProperty, value); }
+        }
+        public static readonly DependencyProperty IsShowPressureValueProperty = DependencyProperty.Register(
+         "IsShowPressureValue", typeof(bool), typeof(MainTM),
+         new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
+        public bool IsShowPressureValue
+        {
+            get { return (bool)this.GetValue(IsShowPressureValueProperty); }
+            set { this.SetValue(IsShowPressureValueProperty, value); }
+        }
     }
 }

+ 8 - 1
Venus/Venus_Themes/UserControls/TMChamber.xaml

@@ -42,7 +42,14 @@
 
 
             <Canvas Width="200" Height="200" Grid.Row="1">
-                <TextBlock Text="{Binding ElementName=tmChamber,Path=Name}" Canvas.Top="-50" Canvas.Left="65" FontSize="30" Visibility="{Binding ElementName=tmChamber,Path=PMVisibility}"/>
+                <TextBlock  Canvas.Top="-50" Canvas.Left="-5" FontSize="30" Visibility="{Binding ElementName=tmChamber,Path=PMVisibility}">
+                    <TextBlock.Text>
+                        <MultiBinding  StringFormat=" {0}({1}mtorr)">
+                            <Binding  ElementName="tmChamber" Path="Name"></Binding>
+                            <Binding  ElementName="tmChamber" Path="PressureValue"></Binding>
+                        </MultiBinding> 
+                    </TextBlock.Text>
+                </TextBlock>
                 <Polygon Stroke="Black"  StrokeThickness="2" Points="00,200 0,3 3,0 197,0 200,3 200,200" Visibility="{Binding ElementName=tmChamber,Path=PMVisibility}">
                     <Polygon.Fill>
                         <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">

+ 16 - 0
Venus/Venus_Themes/UserControls/TMChamber.xaml.cs

@@ -61,6 +61,22 @@ namespace Venus_Themes.UserControls
             }
         }
 
+        public static readonly DependencyProperty PressureValueProperty = DependencyProperty.Register(
+       "PressureValue", typeof(int), typeof(TMChamber));
+
+        public int PressureValue
+        {
+            get { return (int)this.GetValue(PressureValueProperty); }
+            set { this.SetValue(PressureValueProperty, value); }
+        }
+        public static readonly DependencyProperty IsShowPressureValueProperty = DependencyProperty.Register(
+        "IsShowPressureValue", typeof(bool), typeof(TMChamber),
+        new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
+        public bool IsShowPressureValue
+        {
+            get { return (bool)this.GetValue(IsShowPressureValueProperty); }
+            set { this.SetValue(IsShowPressureValueProperty, value); }
+        }
         private void OpenDoor_Click(object sender, RoutedEventArgs e)
         {
             //var t = ((((this.Parent as Canvas).Parent as Canvas).Parent as UserControl).DataContext).;