Browse Source

添加PM Abort 下拉菜单功能

lixiang 1 year ago
parent
commit
5139f41e19

+ 18 - 57
Venus/Venus_Core/ProcessUnitDefine.cs

@@ -1,12 +1,6 @@
 using Newtonsoft.Json;
 using Newtonsoft.Json.Converters;
-using System;
-using System.Collections.Generic;
 using System.ComponentModel;
-using System.Linq;
-using System.Runtime.Serialization;
-using System.Text;
-using System.Threading.Tasks;
 using Venus_Core.Attributes;
 
 namespace Venus_Core
@@ -28,9 +22,10 @@ namespace Venus_Core
 
     public enum Suspect
     {
-        Home,
+        Origin,
         Position1,
-        Position2
+        Position2,
+        Position3
     }
     public enum VenusUnits
     {
@@ -51,9 +46,9 @@ namespace Venus_Core
     }
     public enum Kepler2200AUnits
     {
-        Kepler2200RFUnit,
         Kepler2200GasControlUnit,
-        HeaterUnit
+        HeaterUnit,
+        Kepler2200RFUnit
     }
     public enum Kepler2200BUnits
     {
@@ -82,45 +77,32 @@ namespace Venus_Core
         }
     }
 
-    //public class PressureByValveModeUnit : ProcessUnitBase
-    //{
-    //    public string UnitName { get; set; } = "PressureByValveModeUnit";
-    //    public bool EnableRamp { get; set; }
-    //    public int StartPosition { get; set; }
-    //    public int TargetPosition { get; set; }
-    //    public int HoldTime { get; set; }
-
-    //}
 
     public class HeaterUnit : ProcessUnitBase
     {
         public string UnitName { get; set; } = "HeaterUnit";
-
         public int HeaterPressure { get; set; }
         public int HeaterTemp { get; set; }
-
         public int HeaterRatio { get; set; }
-        public Suspect SuspectPosition { get; set; } = Suspect.Home;
-
+        public Suspect SuspectPosition { get; set; }
         public int PositionOffset { get; set; }
-
     }
+
     public class TCPUnit : ProcessUnitBase
     {
         private string m_UnitName = "TCPUnit";
         public string UnitName
-        { 
-        get { return m_UnitName; }
+        {
+            get { return m_UnitName; }
             set { m_UnitName = value; }
         }
-
         public int RFPower { get; set; }
         public int TuneCapPreset { get; set; }
         public int LoadCapPreset { get; set; }
         [IsOnlyRead]
-        public int AutoC1 { get; set; }
+        public int AutoTuneCapPreset { get; set; }
         [IsOnlyRead]
-        public int AutoC2 { get; set; }
+        public int AutoLoadCapPreset { get; set; }
         public int MaxReflectedPower { get; set; }
 
         private bool m_EnableRamp;
@@ -129,51 +111,37 @@ namespace Venus_Core
         {
             get { return m_EnableRamp;}
             set { m_EnableRamp = value; }
-        }
-        
+        }       
         public int StartPower { get; set; }
-        public int TargetPower { get; set; }
-        //public int HoldTime { get; set; }
-        
-
+        public int TargetPower { get; set; }       
     }
 
     public class Kepler2200RFUnit : ProcessUnitBase
     {
         public string UnitName { get; set; } = "RFUnit";
         public int TuneCapPreset { get; set; }
-        public int LoadCapPreset { get; set; }
-         
-
-        
-
+        public int LoadCapPreset { get; set; }                
     }
 
     public class BiasUnit : ProcessUnitBase
     {
         public string UnitName { get; set; } = "BiasUnit";
-
         public int BiasRFPower { get; set; }
         public int BiasTuneCapPreset { get; set; }
         public int BiasLoadCapPreset { get; set; }
         [IsOnlyRead]
-        public int AutoC1 { get; set; }
+        public int AutoBiasTuneCapPreset { get; set; }
         [IsOnlyRead]
-        public int AutoC2 { get; set; }
+        public int AutoBiasLoadCapPreset { get; set; }
         public int BiasMaxReflectedPower { get; set; }
         [JsonConverter(typeof(StringEnumConverter))]
         public GeneratorMode BiasGeneratorMode { get; set; }
         public int PulseRateFreq { get; set; }
         public int PulseDutyCycle { get; set; }
         [IsCanConfigIgnore]
-        public bool EnableRamp { get; set; }
-        
+        public bool EnableRamp { get; set; }    
         public int StartBiasRFPower { get; set; } 
-        public int TargetBiasRFPower { get; set; }
-        //public int BiasRFHoldTime { get; set; }
-       
-      
-
+        public int TargetBiasRFPower { get; set; }            
     }
 
     public class GasControlUnit : ProcessUnitBase
@@ -217,7 +185,6 @@ namespace Venus_Core
     public class ESCHVUnit : ProcessUnitBase
     {
         public string UnitName { get; set; } = "ESCHVUnit";
-
         public int BacksideHelum { get; set; } 
         public int MinHeFlow { get; set; } 
         public int MaxHeFlow { get; set; } 
@@ -228,11 +195,8 @@ namespace Venus_Core
     public class ProcessKitUnit : ProcessUnitBase
     {
         public string UnitName { get; set; } = "ProcessKitUnit";
-
-
         private MovementPosition m_LiftPinPostion;
         [JsonConverter(typeof(StringEnumConverter))]
-
         public MovementPosition LiftPinPostion
         {
             get { return m_LiftPinPostion; }
@@ -240,8 +204,5 @@ namespace Venus_Core
         }
         [JsonConverter(typeof(StringEnumConverter))]
         public MovementPosition WeprBasrPinPosition { get; set; }
-
-
- 
     }
 }

+ 27 - 1
Venus/Venus_MainPages/ViewModels/OverKepler2200AViewModel.cs

@@ -1037,7 +1037,9 @@ namespace Venus_MainPages.ViewModels
         private DelegateCommand _SwitchHighTemperatureHeaterCommand;
         public DelegateCommand SwitchHighTemperatureHeaterCommand =>
             _SwitchHighTemperatureHeaterCommand ?? (_SwitchHighTemperatureHeaterCommand = new DelegateCommand(OnSwitchHighTemperatureHeater));
-
+        private DelegateCommand<object> _AbortRecipeCommnad;
+        public DelegateCommand<object> AbortRecipeCommnad =>
+            _AbortRecipeCommnad ?? (_AbortRecipeCommnad = new DelegateCommand<object>(OnAbortRecipe));
         #endregion
 
         #region 构造函数
@@ -1442,6 +1444,30 @@ namespace Venus_MainPages.ViewModels
         {
             InvokeClient.Instance.Service.DoOperation($"{ModuleName}.HighTemperatureHeater.SetHighTemperatureHeaterTemperature", HighTemperatureHeaterTemperatureSetpoint);
         }
+        private async void OnAbortRecipe(object obj)
+        {
+            if (PMCurrentState != PMState.Processing)
+            {
+                return;
+            }
+            switch (obj.ToString())
+            {
+                case "0":
+                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Abort");
+                    break;
+                case "1":
+                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Abort");
+                    //if (ESCHVData.IsOn == true)
+                    //{
+                    //    await Task.Delay(3000);
+                    //    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.SetESCHVIsOn", false);
+                    //}
+                    break;
+                case "2":
+                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Abort");
+                    break;
+            }
+        }
         #endregion
 
         #region 私有方法

+ 27 - 1
Venus/Venus_MainPages/ViewModels/OverKepler2300ViewModel.cs

@@ -1082,7 +1082,9 @@ namespace Venus_MainPages.ViewModels
         private DelegateCommand _OfflineCommand;
         public DelegateCommand OfflineCommand =>
             _OfflineCommand ?? (_OfflineCommand = new DelegateCommand(OnOffline));
-
+        private DelegateCommand<object> _AbortRecipeCommnad;
+        public DelegateCommand<object> AbortRecipeCommnad =>
+            _AbortRecipeCommnad ?? (_AbortRecipeCommnad = new DelegateCommand<object>(OnAbortRecipe));
         #endregion
 
         #region 构造函数
@@ -1457,6 +1459,30 @@ namespace Venus_MainPages.ViewModels
         {
             InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.PmOffline}");
         }
+        private async void OnAbortRecipe(object obj)
+        {
+            if (PMCurrentState != PMState.Processing)
+            {
+                return;
+            }
+            switch (obj.ToString())
+            {
+                case "0":
+                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Abort");
+                    break;
+                case "1":
+                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Abort");
+                    //if (ESCHVData.IsOn == true)
+                    //{
+                    //    await Task.Delay(3000);
+                    //    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.SetESCHVIsOn", false);
+                    //}
+                    break;
+                case "2":
+                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Abort");
+                    break;
+            }
+        }
         #endregion
 
         #region 私有方法

+ 110 - 83
Venus/Venus_MainPages/ViewModels/OverVenusViewModel.cs

@@ -27,7 +27,7 @@ namespace Venus_MainPages.ViewModels
     internal class OverVenusViewModel : BindableBase
     {
         #region 私有字段
-        private List<string> m_CurrentModuleRecipes=new List<string>();
+        private List<string> m_CurrentModuleRecipes = new List<string>();
         private bool m_PVN21ValveIsOpen;
         private bool m_PVN22ValveIsOpen;
         private bool m_N2ValveIsOpen;
@@ -148,7 +148,7 @@ namespace Venus_MainPages.ViewModels
         private float m_ChillerTempSetpoint;
         private float m_WallTempSetpoint;
 
-        private bool m_HeIsPressureMode=true;
+        private bool m_HeIsPressureMode = true;
 
         private bool m_ChillerIsOn;
 
@@ -190,16 +190,16 @@ namespace Venus_MainPages.ViewModels
 
         private float m_PendulumValvePosition;
 
-        private bool m_IsTurboPumpAtSpeed; 
+        private bool m_IsTurboPumpAtSpeed;
         private bool m_TurboPumpWaterFlowSwitch;
 
         private bool m_IsHasWafer;
 
-        private Recipe m_CurrentRecipe=new Recipe ();
+        private Recipe m_CurrentRecipe = new Recipe();
 
-        private RecipeResult m_CurrentRecipeResult=new RecipeResult ();
+        private RecipeResult m_CurrentRecipeResult = new RecipeResult();
 
-        private RecipeStep   m_CurrentRecipeStep = new RecipeStep();
+        private RecipeStep m_CurrentRecipeStep = new RecipeStep();
 
         private double m_ChamberPressureFeedBack;
 
@@ -250,7 +250,7 @@ namespace Venus_MainPages.ViewModels
         public float PendulumValvePosition
         {
             get { return m_PendulumValvePosition; }
-            set{SetProperty(ref m_PendulumValvePosition, value);}
+            set { SetProperty(ref m_PendulumValvePosition, value); }
         }
 
         public float BiasMatchC1
@@ -510,11 +510,11 @@ namespace Venus_MainPages.ViewModels
         public double TurboN2FlowSetPoint
         {
             get { return m_TurboN2FlowSetPoint; }
-            set 
+            set
             {
                 if (value != m_TurboN2FlowSetPoint)
-                { 
-                InvokeClient.Instance.Service.DoOperation($"{ModuleName}.MfcN2.SetPoint", value);
+                {
+                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.MfcN2.SetPoint", value);
                 }
                 SetProperty(ref m_TurboN2FlowSetPoint, value);
             }
@@ -755,8 +755,8 @@ namespace Venus_MainPages.ViewModels
             get { return m_RtDataValues; }
             set { SetProperty(ref m_RtDataValues, value); }
         }
-       
-        
+
+
 
         public bool PumpIsOpen
         {
@@ -787,7 +787,7 @@ namespace Venus_MainPages.ViewModels
             set { SetProperty(ref m_IsVAC, value); }
         }
 
-       
+
         //public bool BRFIsOn
         //{
         //    get { return m_BRFIsOn; }
@@ -809,22 +809,22 @@ namespace Venus_MainPages.ViewModels
             get { return m_IsPositionMode; }
             set { SetProperty(ref m_IsPositionMode, value); }
         }
-        
+
 
         public double HeGasSetpoint
         {
             get { return m_HeGasSetpoint; }
-            set 
+            set
             {
-                SetProperty(ref m_HeGasSetpoint, value); 
+                SetProperty(ref m_HeGasSetpoint, value);
             }
         }
         public int HePressureSetpoint
         {
             get { return m_HePressureSetpoint; }
-            set 
+            set
             {
-                SetProperty(ref m_HePressureSetpoint, value); 
+                SetProperty(ref m_HePressureSetpoint, value);
             }
         }
         public float SRFFwdPowerSetpoint
@@ -1035,6 +1035,9 @@ namespace Venus_MainPages.ViewModels
         public DelegateCommand EndStepCommand =>
             _EndStepCommand ?? (_EndStepCommand = new DelegateCommand(OnEndStep));
 
+        private DelegateCommand<object> _AbortRecipeCommnad;
+        public DelegateCommand<object> AbortRecipeCommnad =>
+            _AbortRecipeCommnad ?? (_AbortRecipeCommnad = new DelegateCommand<object>(OnAbortRecipe));
         #endregion
 
         #region 构造函数
@@ -1045,7 +1048,7 @@ namespace Venus_MainPages.ViewModels
             m_IsATM = true;
 
             ModuleName = "PMA";
-            
+
             CurrentModuleRecipes = GetFilesNames(Path.Combine(QueryDataClient.Instance.Service.GetData("GetRTPath").ToString(), "Recipes", ModuleName)).ToList();
 
             DispatcherTimer timer = new DispatcherTimer();
@@ -1060,8 +1063,8 @@ namespace Venus_MainPages.ViewModels
         {
             CommonValveControl commonValveControl = (CommonValveControl)obj;
             if (commonValveControl.IsCanEdit == true)
-            { 
-            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.ControlValve",Convert.ToInt32( commonValveControl.Tag.ToString()), !commonValveControl.Status);
+            {
+                InvokeClient.Instance.Service.DoOperation($"{ModuleName}.ControlValve", Convert.ToInt32(commonValveControl.Tag.ToString()), !commonValveControl.Status);
             }
         }
         private void OnPMInit()
@@ -1070,43 +1073,43 @@ namespace Venus_MainPages.ViewModels
         }
         private async void OnGas()
         {
-            await Task.Run(async () => 
+            await Task.Run(async () =>
             {
-                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.MfcGas1.SetPoint", MFC1SetPoint);
-                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.MfcGas2.SetPoint", MFC2SetPoint);
-                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.MfcGas3.SetPoint", MFC3SetPoint);
-                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.MfcGas4.SetPoint", MFC4SetPoint);
-                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.MfcGas5.SetPoint", MFC5SetPoint);
-                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.MfcGas6.SetPoint", MFC6SetPoint);
-                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.MfcGas7.SetPoint", MFC7SetPoint);
-                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.MfcGas8.SetPoint", MFC8SetPoint);
-
-                    await Task.Delay(1000);
-                    object[] mfc = new object[8];
-                    string[] mfcSetPoint = new string[8];
-
-                    mfc[0] = MFC1Data.SetPoint;
-                    mfc[1] = MFC2Data.SetPoint;
-                    mfc[2] = MFC3Data.SetPoint;
-                    mfc[3] = MFC4Data.SetPoint;
-                    mfc[4] = MFC5Data.SetPoint;
-                    mfc[5] = MFC6Data.SetPoint;
-                    mfc[6] = MFC7Data.SetPoint;
-                    mfc[7] = MFC8Data.SetPoint;
-
-                   InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.GasFlow}", mfc);
-                
+                InvokeClient.Instance.Service.DoOperation($"{ModuleName}.MfcGas1.SetPoint", MFC1SetPoint);
+                InvokeClient.Instance.Service.DoOperation($"{ModuleName}.MfcGas2.SetPoint", MFC2SetPoint);
+                InvokeClient.Instance.Service.DoOperation($"{ModuleName}.MfcGas3.SetPoint", MFC3SetPoint);
+                InvokeClient.Instance.Service.DoOperation($"{ModuleName}.MfcGas4.SetPoint", MFC4SetPoint);
+                InvokeClient.Instance.Service.DoOperation($"{ModuleName}.MfcGas5.SetPoint", MFC5SetPoint);
+                InvokeClient.Instance.Service.DoOperation($"{ModuleName}.MfcGas6.SetPoint", MFC6SetPoint);
+                InvokeClient.Instance.Service.DoOperation($"{ModuleName}.MfcGas7.SetPoint", MFC7SetPoint);
+                InvokeClient.Instance.Service.DoOperation($"{ModuleName}.MfcGas8.SetPoint", MFC8SetPoint);
+
+                await Task.Delay(1000);
+                object[] mfc = new object[8];
+                string[] mfcSetPoint = new string[8];
+
+                mfc[0] = MFC1Data.SetPoint;
+                mfc[1] = MFC2Data.SetPoint;
+                mfc[2] = MFC3Data.SetPoint;
+                mfc[3] = MFC4Data.SetPoint;
+                mfc[4] = MFC5Data.SetPoint;
+                mfc[5] = MFC6Data.SetPoint;
+                mfc[6] = MFC7Data.SetPoint;
+                mfc[7] = MFC8Data.SetPoint;
+
+                InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.GasFlow}", mfc);
+
             });
-           
-           
+
+
         }
-        private  void OnHe()
+        private void OnHe()
         {
             if (PVHe1ValveIsOpen == true)
             {
                 InvokeClient.Instance.Service.DoOperation($"{ModuleName}.SetBacksideHeFlow", 0.0d);
                 InvokeClient.Instance.Service.DoOperation($"{ModuleName}.SetBacksideHePressure", 0);
-                
+
                 InvokeClient.Instance.Service.DoOperation($"{ModuleName}.ControlValve", (int)ValveType.PVHe3, false);
                 InvokeClient.Instance.Service.DoOperation($"{ModuleName}.ControlValve", (int)ValveType.HeISO, false);
             }
@@ -1116,11 +1119,11 @@ namespace Venus_MainPages.ViewModels
 
                 if (HeIsPressureMode)
                 {
-                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.SetBacksideHePressure", HeGasSetpoint);             
+                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.SetBacksideHePressure", HeGasSetpoint);
                 }
                 else
-                { 
-                InvokeClient.Instance.Service.DoOperation($"{ModuleName}.SetBacksideHeFlow", HeGasSetpoint);
+                {
+                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.SetBacksideHeFlow", HeGasSetpoint);
                 }
                 InvokeClient.Instance.Service.DoOperation($"{ModuleName}.ControlValve", (int)ValveType.PVHe3, true);
                 InvokeClient.Instance.Service.DoOperation($"{ModuleName}.ControlValve", (int)ValveType.HeISO, true);
@@ -1190,7 +1193,7 @@ namespace Venus_MainPages.ViewModels
         private void OnPump()
         {
             //if (RtDataValues[$"{ModuleName}.FsmState"].ToString() == PMState.Pumping.ToString())
-            if (PMCurrentState==PMState.Pumping)
+            if (PMCurrentState == PMState.Pumping)
             {
                 InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.Abort}");
                 return;
@@ -1213,7 +1216,7 @@ namespace Venus_MainPages.ViewModels
 
             string BasePressureSetPoint = QueryDataClient.Instance.Service.GetConfig($"{ModuleName}.Pump.PumpBasePressure").ToString();
 
-            string PumpLimitSetPoint= QueryDataClient.Instance.Service.GetConfig($"{ModuleName}.Pump.PumpTimeLimit").ToString();
+            string PumpLimitSetPoint = QueryDataClient.Instance.Service.GetConfig($"{ModuleName}.Pump.PumpTimeLimit").ToString();
             // 设置底压
             double basePressure = string.IsNullOrEmpty(BasePressureSetPoint) ? 0 : Convert.ToDouble(BasePressureSetPoint);
 
@@ -1242,7 +1245,7 @@ namespace Venus_MainPages.ViewModels
         {
 
             //if (RtDataValues[$"{ModuleName}.FsmState"].ToString() == "LaunchingPump")
-            if (PMCurrentState==PMState.LaunchingPump)
+            if (PMCurrentState == PMState.LaunchingPump)
             {
                 InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.Abort}");
                 return;
@@ -1278,11 +1281,11 @@ namespace Venus_MainPages.ViewModels
 
         private void OnOpenPendulumValve()
         {
-            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.TurnPendulumValve",true);
+            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.TurnPendulumValve", true);
         }
         private void OnClosePendulumValve()
         {
-            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.TurnPendulumValve",false);
+            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.TurnPendulumValve", false);
         }
         private void OnPinUpDown(object upDown)
         {
@@ -1290,7 +1293,7 @@ namespace Venus_MainPages.ViewModels
         }
 
         private async void OnSetSRf()
-        {   
+        {
 
             if (SRFData.IsRfOn == true)
             {
@@ -1303,7 +1306,7 @@ namespace Venus_MainPages.ViewModels
                     InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{VenusDevice.Match}.{AITRfOperation.SetMatchPosition}", SRFMatchC1, SRFMatchC2);
                     await Task.Delay(100);
                     InvokeClient.Instance.Service.DoOperation($"{ModuleName}.SetSRf", SRFFwdPowerSetpoint, true);
-                }                   
+                }
             }
         }
         private async void OnSetBRf()
@@ -1320,8 +1323,8 @@ 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);
-                }             
-            }          
+                }
+            }
         }
 
         private void OnPMAbort()
@@ -1333,22 +1336,22 @@ namespace Venus_MainPages.ViewModels
         {
             //if (butterflyValveMessageBox == null)
             //{
-                var _mainWindow = Application.Current.Windows.Cast<Window>().FirstOrDefault(window => window is Window) as Window;
-                butterflyValveMessageBox = new ButterflyValveView(ModuleName.ToString());
-                butterflyValveMessageBox.WindowStartupLocation = WindowStartupLocation.Manual;
-                butterflyValveMessageBox.Left = 700;
-                butterflyValveMessageBox.Top = 600;
-                butterflyValveMessageBox.Show();
-                butterflyValveMessageBox.Owner = _mainWindow;
+            var _mainWindow = Application.Current.Windows.Cast<Window>().FirstOrDefault(window => window is Window) as Window;
+            butterflyValveMessageBox = new ButterflyValveView(ModuleName.ToString());
+            butterflyValveMessageBox.WindowStartupLocation = WindowStartupLocation.Manual;
+            butterflyValveMessageBox.Left = 700;
+            butterflyValveMessageBox.Top = 600;
+            butterflyValveMessageBox.Show();
+            butterflyValveMessageBox.Owner = _mainWindow;
             //}
-           
+
         }
         private void OnLoadRecipe()
         {
             CurrentModuleRecipes = GetFilesNames(Path.Combine(QueryDataClient.Instance.Service.GetData("GetRTPath").ToString(), "Recipes", ModuleName)).ToList();
         }
 
-        private  void OnHV()
+        private void OnHV()
         {
             if (ESCHVData.IsOn == true)
             {
@@ -1366,11 +1369,11 @@ namespace Venus_MainPages.ViewModels
 
                 //});
             }
-           
-            
+
+
         }
         private void OnHVSet()
-        { 
+        {
             InvokeClient.Instance.Service.DoOperation($"{ModuleName}.SetESCHV", ESCVoltage);
 
         }
@@ -1386,7 +1389,7 @@ namespace Venus_MainPages.ViewModels
             ClearData();
             var recipePath = Path.Combine(QueryDataClient.Instance.Service.GetData("GetRTPath").ToString(), "Recipes", ModuleName, recipeName + ".rcp");
             CurrentRecipe = Recipe.Load(File.ReadAllText(recipePath));
-            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.RunRecipe}",recipeName);
+            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.RunRecipe}", recipeName);
         }
 
         private void OnSetChillerTemp()
@@ -1394,12 +1397,12 @@ namespace Venus_MainPages.ViewModels
             var value = (QueryDataClient.Instance.Service.GetConfig($"{ModuleName}.Chiller.ChillerTemperatureOffset").ToString());
             float x;
             float.TryParse(value, out x);
-            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.HeatChiller", ChillerType.Chiller.ToString(),ChillerTempSetpoint, x);
+            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.HeatChiller", ChillerType.Chiller.ToString(), ChillerTempSetpoint, x);
         }
 
         private void OnOffChiller()
         {
-            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.OnOffChiller", ChillerType.Chiller.ToString(),!ChillerIsOn);
+            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.OnOffChiller", ChillerType.Chiller.ToString(), !ChillerIsOn);
         }
 
 
@@ -1428,6 +1431,30 @@ namespace Venus_MainPages.ViewModels
                 InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Abort");
             }
         }
+        private async void OnAbortRecipe(object obj)
+        {
+            if (PMCurrentState != PMState.Processing)
+            {
+                return;
+            }
+            switch (obj.ToString())
+            {
+                case "0":
+                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Abort");
+                    break;
+                case "1":
+                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Abort");
+                    if (ESCHVData.IsOn == true)
+                    {
+                        await Task.Delay(3000);
+                        InvokeClient.Instance.Service.DoOperation($"{ModuleName}.SetESCHVIsOn", false);
+                    }
+                    break;
+                case "2":
+                    InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Abort");
+                    break;
+            }
+        }
         #endregion
 
         #region 私有方法
@@ -1451,7 +1478,7 @@ namespace Venus_MainPages.ViewModels
             MFC8SetPoint = 0;
 
         }
-        private  IEnumerable<string> GetFilesNames(string path)
+        private IEnumerable<string> GetFilesNames(string path)
         {
             return Directory.GetFiles(path, "*.rcp")?
       .Select(Path.GetFileNameWithoutExtension);
@@ -1585,7 +1612,7 @@ namespace Venus_MainPages.ViewModels
 
 
                     CurrentRecipeResult = CommonFunction.GetValue<RecipeResult>(RtDataValues, $"{ModuleName}.CurrentRecipeResult");
-                    if (CurrentRecipeResult.RecipeStepNumber != null && CurrentRecipeResult.RecipeStepNumber!= currentRecipeNumber)
+                    if (CurrentRecipeResult.RecipeStepNumber != null && CurrentRecipeResult.RecipeStepNumber != currentRecipeNumber)
                     {
                         var recipePath = Path.Combine(QueryDataClient.Instance.Service.GetData("GetRTPath").ToString(), "Recipes", ModuleName, CurrentRecipeResult.RecipeName + ".rcp");
                         CurrentRecipe = Recipe.Load(File.ReadAllText(recipePath));
@@ -1613,7 +1640,7 @@ namespace Venus_MainPages.ViewModels
             {
                 LOG.WriteExeption(ex.Message, ex);
             }
-        }       
+        }
         public void addDataKeys()
         {
             m_RtDataKeys.Clear();
@@ -1627,7 +1654,7 @@ namespace Venus_MainPages.ViewModels
             m_RtDataKeys.Add($"{ModuleName}.MfcGas8");
             m_RtDataKeys.Add($"{ModuleName}.MfcHe");
             m_RtDataKeys.Add($"{ModuleName}.MfcN2");
-       
+
 
             m_RtDataKeys.Add($"{ModuleName}.ForelinePressure");
             m_RtDataKeys.Add($"{ModuleName}.ProcessHighPressure");
@@ -1687,7 +1714,7 @@ namespace Venus_MainPages.ViewModels
 
             m_RtDataKeys.Add($"{ModuleName}.{VenusDevice.Match}.C1");
             m_RtDataKeys.Add($"{ModuleName}.{VenusDevice.Match}.C2");
-           // m_RtDataKeys.Add($"{ModuleName}.{VenusDevice.Match}.WorkMode");
+            // m_RtDataKeys.Add($"{ModuleName}.{VenusDevice.Match}.WorkMode");
 
             m_RtDataKeys.Add($"{ModuleName}.{VenusDevice.BiasMatch}.C1");
             m_RtDataKeys.Add($"{ModuleName}.{VenusDevice.BiasMatch}.C2");
@@ -1706,7 +1733,7 @@ namespace Venus_MainPages.ViewModels
             //m_RtDataKeys.Add($"{ModuleName}.ESCHV.IsOn");
 
 
-            m_RtDataKeys.Add($"{ModuleName}.IsWaterFlowOk"); 
+            m_RtDataKeys.Add($"{ModuleName}.IsWaterFlowOk");
             m_RtDataKeys.Add($"{ModuleName}.IsWLK");
             m_RtDataKeys.Add($"{ModuleName}.IsCDA_OK");
             m_RtDataKeys.Add($"{ModuleName}.SourceRFFanInterlock");

File diff suppressed because it is too large
+ 1 - 1
Venus/Venus_MainPages/Views/DataHistoryView.xaml


+ 6 - 1
Venus/Venus_MainPages/Views/OverKepler2200AView.xaml

@@ -1155,7 +1155,7 @@
         <Border BorderThickness="0,0,0,1" BorderBrush="Black" Canvas.Top="20" Canvas.Left="40">
             <StackPanel Orientation="Horizontal" Margin="0,0,0,5">
                 <customControls:PathButton PathData="{StaticResource Icon_Home}"  DefaultFillBrush="White"  Command="{Binding PMInitCommnad}"  Width="120" Height="30" Content="Initialize"    Margin="10,0,0,0"/>
-                <customControls:PathButton PathData="{StaticResource Icon_Abort}" DefaultFillBrush="White"  Command="{Binding PMAbortCommnad}" Width="120" Height="30" Content="Abort"   Margin="50,0,30,0"/>
+                <!--<customControls:PathButton PathData="{StaticResource Icon_Abort}" DefaultFillBrush="White"  Command="{Binding PMAbortCommnad}" Width="120" Height="30" Content="Abort"   Margin="50,0,30,0"/>-->
                 <!--<customControls:AduRadioButtonIcon Content="MF"  IsChecked="{Binding IsAutoMode,Converter={StaticResource BoolToBool},Mode=TwoWay}" Height="40"  attach:IconElement.Margin="-20" />
                 <Border BorderThickness="1" Height="30" Width="2" BorderBrush="Black" Margin="10,0,0,0">
                     <Border.RenderTransform>
@@ -1163,6 +1163,11 @@
                     </Border.RenderTransform>
                 </Border>
                 <customControls:AduRadioButtonIcon Content="AF" IsChecked="{Binding IsAutoMode,Mode=TwoWay}"   Margin="-10,0,30,0" Height="40"  attach:IconElement.Margin="-20" />-->
+                <customControls:SplitButton Width="120" Height="30" Content="Abort"   Margin="50,0,30,0" Style="{StaticResource SplitButtonStyle}" Command="{Binding PMAbortCommnad}" Cursor="Hand"  Foreground="White" FontSize="18" Background="#009ad6">
+                    <MenuItem Header="Stop Recipe" Cursor="Hand"                                          Command="{Binding AbortRecipeCommnad}" CommandParameter="0"/>
+                    <MenuItem Header="Stop Recipe/Stop Dechuck Step" Cursor="Hand"                        Command="{Binding AbortRecipeCommnad}" CommandParameter="1"/>
+                    <MenuItem Header="Stop Recipe/Stop Dechuck Step/Return Wafer To Foup" Cursor="Hand"   Command="{Binding AbortRecipeCommnad}" CommandParameter="2"/>
+                </customControls:SplitButton>
                 <RadioButton Content="OffLine"     Width="120" Height="28" Margin="0 0 5 0" Style="{StaticResource Button_RadioButton}" IsChecked="{Binding IsAutoMode,Converter={StaticResource BoolToBool},Mode=TwoWay}" FontSize="15"/>
                 <RadioButton Content="OnLine"      Width="120" Height="28" Margin="0 0 30 0" Style="{StaticResource Button_RadioButton}" IsChecked="{Binding IsAutoMode,Mode=TwoWay}" FontSize="15"/>
                 <customControls:PathButton  Width="130" Height="30" Content="Vent"          Command="{Binding VentCommand}"         IsEnabled="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}" />

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

@@ -1231,7 +1231,7 @@
         <Border BorderThickness="0,0,0,1" BorderBrush="Black" Canvas.Top="20" Canvas.Left="40">
             <StackPanel Orientation="Horizontal" Margin="0,0,0,5">
                 <customControls:PathButton PathData="{StaticResource Icon_Home}"  DefaultFillBrush="White"  Command="{Binding PMInitCommnad}"  Width="120" Height="30" Content="Initialize"    Margin="10,0,0,0"/>
-                <customControls:PathButton PathData="{StaticResource Icon_Abort}" DefaultFillBrush="White"  Command="{Binding PMAbortCommnad}" Width="120" Height="30" Content="Abort"   Margin="50,0,30,0"/>
+                <!--<customControls:PathButton PathData="{StaticResource Icon_Abort}" DefaultFillBrush="White"  Command="{Binding PMAbortCommnad}" Width="120" Height="30" Content="Abort"   Margin="50,0,30,0"/>-->
                 <!--<customControls:AduRadioButtonIcon Content="MF"  IsChecked="{Binding IsAutoMode,Converter={StaticResource BoolToBool},Mode=TwoWay}" Height="40"  attach:IconElement.Margin="-20" />
                 <Border BorderThickness="1" Height="30" Width="2" BorderBrush="Black" Margin="10,0,0,0">
                     <Border.RenderTransform>
@@ -1239,6 +1239,11 @@
                     </Border.RenderTransform>
                 </Border>
                 <customControls:AduRadioButtonIcon Content="AF" IsChecked="{Binding IsAutoMode,Mode=TwoWay}"   Margin="-10,0,30,0" Height="40"  attach:IconElement.Margin="-20" />-->
+                <customControls:SplitButton Width="120" Height="30" Content="Abort"   Margin="50,0,30,0" Style="{StaticResource SplitButtonStyle}" Command="{Binding PMAbortCommnad}" Cursor="Hand"  Foreground="White" FontSize="18" Background="#009ad6">
+                    <MenuItem Header="Stop Recipe" Cursor="Hand"                                          Command="{Binding AbortRecipeCommnad}" CommandParameter="0"/>
+                    <MenuItem Header="Stop Recipe/Stop Dechuck Step" Cursor="Hand"                        Command="{Binding AbortRecipeCommnad}" CommandParameter="1"/>
+                    <MenuItem Header="Stop Recipe/Stop Dechuck Step/Return Wafer To Foup" Cursor="Hand"   Command="{Binding AbortRecipeCommnad}" CommandParameter="2"/>
+                </customControls:SplitButton>
                 <RadioButton Content="OffLine"     Width="120" Height="28" Margin="0 0 5 0" Style="{StaticResource Button_RadioButton}" IsChecked="{Binding IsAutoMode,Converter={StaticResource BoolToBool},Mode=TwoWay}" FontSize="15" Command="{Binding OfflineCommand}"/>
                 <RadioButton Content="OnLine"      Width="120" Height="28" Margin="0 0 30 0" Style="{StaticResource Button_RadioButton}" IsChecked="{Binding IsAutoMode,Mode=TwoWay}" FontSize="15"                                      Command="{Binding OnlineCommand}"/>
                 <customControls:PathButton  Width="130" Height="30" Content="Vent"          Command="{Binding VentCommand}"         IsEnabled="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}" />

+ 7 - 3
Venus/Venus_MainPages/Views/OverVenusView.xaml

@@ -1236,7 +1236,7 @@
             <StackPanel Orientation="Horizontal" Margin="0,0,0,5">
                 <customControls:PathButton PathData="{StaticResource Icon_Home}"  DefaultFillBrush="White"  Command="{Binding PMInitCommnad}"  Width="120" Height="30" Content="Initialize"    Margin="10,0,0,0"/>
 
-                <customControls:PathButton PathData="{StaticResource Icon_Abort}" DefaultFillBrush="White"  Command="{Binding PMAbortCommnad}" Width="120" Height="30" Content="Abort"   Margin="50,0,30,0">
+                <!--<customControls:PathButton PathData="{StaticResource Icon_Abort}" DefaultFillBrush="White"  Command="{Binding PMAbortCommnad}" Width="120" Height="30" Content="Abort"   Margin="50,0,30,0">
                     <customControls:PathButton.ContextMenu>
                         <ContextMenu>
                             <MenuItem Width="120" Header="Abort"/>
@@ -1245,9 +1245,13 @@
 
                         </ContextMenu>
                     </customControls:PathButton.ContextMenu>
-                </customControls:PathButton>
-
+                </customControls:PathButton>-->
 
+                <customControls:SplitButton Width="120" Height="30" Content="Abort"   Margin="50,0,30,0" Style="{StaticResource SplitButtonStyle}" Command="{Binding PMAbortCommnad}" Cursor="Hand"  Foreground="White" FontSize="18" Background="#009ad6">
+                    <MenuItem Header="Stop Recipe" Cursor="Hand"                                          Command="{Binding AbortRecipeCommnad}" CommandParameter="0"/>
+                    <MenuItem Header="Stop Recipe/Stop Dechuck Step" Cursor="Hand"                        Command="{Binding AbortRecipeCommnad}" CommandParameter="1"/>
+                    <MenuItem Header="Stop Recipe/Stop Dechuck Step/Return Wafer To Foup" Cursor="Hand"   Command="{Binding AbortRecipeCommnad}" CommandParameter="2"/>
+                </customControls:SplitButton>
 
                 <RadioButton Content="OffLine"   FontSize="15"   Width="120" Height="28" Margin="0 0 5 0" Style="{StaticResource Button_RadioButton}" IsChecked="{Binding IsAutoMode,Converter={StaticResource BoolToBool},Mode=TwoWay}"/>
                 <RadioButton Content="OnLine"    FontSize="15"   Width="120" Height="28" Margin="0 0 30 0" Style="{StaticResource Button_RadioButton}" IsChecked="{Binding IsAutoMode,Mode=TwoWay}"/>

+ 210 - 210
Venus/Venus_RT/Config/PM/Kepler2200A/Kepler2200AInterlock.xml

@@ -2,214 +2,214 @@
 <Interlock xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 
 
- 
-
-  <!--<Action do="DO_PVN21" value="true" tip="PVN21" tip.zh-CN="" tip.en-US="DO-00" >
-	<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
-	<Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
-	<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
-	<Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
-	<Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
-  </Action>
-
-  <Action do="DO_PVN22" value="true" tip="PVN22" tip.zh-CN="" tip.en-US="DO-01" >
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
-    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
-  </Action>
-
-  <Action do="DO_PVN22" value="true" tip="PV11" tip.zh-CN="" tip.en-US="DO-02" >
-    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
-    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
-    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
-  </Action>
-
-  <Action do="DO_PV12" value="true" tip="PV12" tip.zh-CN="" tip.en-US="DO-03" >
-    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
-    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
-    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
-  </Action>
-
-  <Action do="DO_PV21" value="true" tip="PV21" tip.zh-CN="" tip.en-US="DO-04" >
-    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
-    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
-    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
-  </Action>
-  
-  <Action do="DO_PV22" value="true" tip="PV22" tip.zh-CN="" tip.en-US="DO-05" >
-    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
-    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
-    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
-  </Action>
-
-  <Action do="DO_PV31" value="true" tip="PV31" tip.zh-CN="" tip.en-US="DO-06" >
-    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
-    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
-    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
-  </Action>
-  
-  <Action do="DO_PV32" value="true" tip="PV32" tip.zh-CN="" tip.en-US="DO-07" >
-    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
-    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
-    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
-  </Action>
-
-  <Action do="DO_PV41" value="true" tip="PV41" tip.zh-CN="" tip.en-US="DO-08" >
-    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
-    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
-    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
-  </Action>
-
-  <Action do="DO_PV42" value="true" tip="PV42" tip.zh-CN="" tip.en-US="DO-09" >
-    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
-    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
-    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
-  </Action>
-
-  <Action do="DO_N2_Valve" value="true" tip="N2 Valve" tip.zh-CN="" tip.en-US="DO-10" >
-    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
-    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
-    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
-    <Limit do="DO_Soft_Pumping_Valve"		value="false" tip="Soft Pumping Valve"		tip.zh-CN="" tip.en-US="DO-22" />
-    <Limit do="DO_Fast_Pumping_Valve"	value="false" tip="Fast Pumping Valve"	tip.zh-CN="" tip.en-US="DO-23" />
-  </Action>
-
-  <Action do="DO_MFC1_Valve" value="true" tip="MFC1 Valve" tip.zh-CN="" tip.en-US="DO-11" >
-    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
-    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
-    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
-  </Action>
-  
-  <Action do="DO_MFC2_Valve" value="true" tip="MFC2 Valve" tip.zh-CN="" tip.en-US="DO-12" >
-    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
-    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
-    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
-  </Action>
-
-  <Action do="DO_MFC3_Valve" value="true" tip="MFC3 Valve" tip.zh-CN="" tip.en-US="DO-13" >
-    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
-    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
-    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
-  </Action>
-
-  <Action do="DO_MFC4_Valve" value="true" tip="MFC4 Valve" tip.zh-CN="" tip.en-US="DO-14" >
-    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
-    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
-    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
-  </Action>
-
-  <Action do="DO_MFC5_Valve" value="true" tip="MFC5 Valve" tip.zh-CN="" tip.en-US="DO-15" >
-    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
-    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
-    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
-  </Action>
-  
-  <Action do="DO_MFC6_Valve" value="true" tip="MFC6 Valve" tip.zh-CN="" tip.en-US="DO-16" >
-    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
-    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
-    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
-  </Action>
-  
-  <Action do="DO_MFC7_Valve" value="true" tip="MFC7 Valve" tip.zh-CN="" tip.en-US="DO-17" >
-    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
-    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
-    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
-  </Action>
-
-  <Action do="DO_MFC8_Valve" value="true" tip="MFC8 Valve" tip.zh-CN="" tip.en-US="DO-18" >
-    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
-    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
-    <Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
-  </Action>
-
-  
-  <Action do="DO_Gas_Final_Valve" value="true" tip="Gas final valve" tip.zh-CN="" tip.en-US="DO-21" >
-    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0"/>
-    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
-  </Action>
-
-  <Action do="DO_Soft_Pumping_Valve" value="true" tip="Soft Pumping Valve" tip.zh-CN="" tip.en-US="DO-22">
-    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0"/>
-    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit do="DO_N2_Valve"			value="false" tip="N2 Valve"			tip.zh-CN="" tip.en-US="DO-10" />
-  </Action>
-  
-  <Action do="DO_Fast_Pumping_Valve" value="true" tip="Fast Pumping Valve" tip.zh-CN="" tip.en-US="DO-23" >
-    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0"/>
-    <Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit do="DO_N2_Valve"			value="false" tip="N2 Valve"			tip.zh-CN="" tip.en-US="DO-10" />
-  </Action>
-
-  <Action do="DO_Slit_Door_Open" value="true" tip="Slit Door Open" tip.zh-CN="" tip.en-US="DO-24" >
-    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0"/>
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
-    <Limit di="DI_Arm_Not_Extend_to_PM"	value="true" tip="Arm Not Extend to PM"	tip.zh-CN="" tip.en-US="DI-76" />
-
-  </Action>
-
-  
-  <Action do="DO_Slit_Door_Close" value="true" tip="Slit Door Close" tip.zh-CN="" tip.en-US="DO-25" >
-    <Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0"/>
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12"/>
-    <Limit di="DI_Arm_Not_Extend_to_PM"	value="true" tip="Arm Not Extend to PM"	tip.zh-CN="" tip.en-US="DI-76" />
-  </Action>
-
-  <Action do="DO_Turbo_Pump_Pumping_Valve" value="true" tip="Turbo Pump Pumping Valve" tip.zh-CN="" tip.en-US="DO-29" >
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12"/>
-  </Action>
-
-  <Action do="DO_Turbo_Pump_Pumping_Valve" value="true" tip="Turbo Pump Purge Valve" tip.zh-CN="" tip.en-US="DO-30" >
-    <Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12"/>
-  </Action>
-
-
-  <Action do="DO_S_Valve_Heater_On" value="true" tip="S-Valve Heater On" tip.zh-CN="" tip.en-US="DO-33" >
-    <Limit di="DI_S_Valve_OT_Switch_Alarm"			value="false" tip="S_Valve OT Switch Alarm"			tip.zh-CN="" tip.en-US="DI-66"/> 
-  </Action>
-
-
-  <Action do="DO_Lid_Up" value="true" tip="Lid UP" tip.zh-CN="" tip.en-US="DO-50">
-    <Limit di="DI_Lid_Up_Limit_Pos_SW"			value="false" tip="Lid Up Limit Pos SW"			tip.zh-CN="" tip.en-US="DI-74"/>
-  </Action>
-
-  <Action do="DO_Lid_Down" value="true" tip="Lid Down" tip.zh-CN="" tip.en-US="DO-51">
-    <Limit di="DI_Lid_Down_Limit_Pos_SW"			value="false" tip="Lid Down Limit Pos SW"			tip.zh-CN="" tip.en-US="DI-75"/>
-  </Action>-->
+
+
+	<Action do="DO_PVN21" value="true" tip="PVN21" tip.zh-CN="" tip.en-US="DO-00" >
+		<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+		<Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+		<Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+	</Action>
+
+	<Action do="DO_PVN22" value="true" tip="PVN22" tip.zh-CN="" tip.en-US="DO-01" >
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+		<Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+	</Action>
+
+	<Action do="DO_PVN22" value="true" tip="PV11" tip.zh-CN="" tip.en-US="DO-02" >
+		<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+		<Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+		<Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+	</Action>
+
+	<Action do="DO_PV12" value="true" tip="PV12" tip.zh-CN="" tip.en-US="DO-03" >
+		<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+		<Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+		<Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+	</Action>
+
+	<Action do="DO_PV21" value="true" tip="PV21" tip.zh-CN="" tip.en-US="DO-04" >
+		<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+		<Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+		<Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+	</Action>
+
+	<Action do="DO_PV22" value="true" tip="PV22" tip.zh-CN="" tip.en-US="DO-05" >
+		<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+		<Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+		<Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+	</Action>
+
+	<Action do="DO_PV31" value="true" tip="PV31" tip.zh-CN="" tip.en-US="DO-06" >
+		<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+		<Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+		<Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+	</Action>
+
+	<Action do="DO_PV32" value="true" tip="PV32" tip.zh-CN="" tip.en-US="DO-07" >
+		<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+		<Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+		<Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+	</Action>
+
+	<Action do="DO_PV41" value="true" tip="PV41" tip.zh-CN="" tip.en-US="DO-08" >
+		<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+		<Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+		<Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+	</Action>
+
+	<Action do="DO_PV42" value="true" tip="PV42" tip.zh-CN="" tip.en-US="DO-09" >
+		<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+		<Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+		<Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+	</Action>
+
+	<Action do="DO_N2_Valve" value="true" tip="N2 Valve" tip.zh-CN="" tip.en-US="DO-10" >
+		<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+		<Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+		<Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+		<Limit do="DO_Soft_Pumping_Valve"		value="false" tip="Soft Pumping Valve"		tip.zh-CN="" tip.en-US="DO-22" />
+		<Limit do="DO_Fast_Pumping_Valve"	value="false" tip="Fast Pumping Valve"	tip.zh-CN="" tip.en-US="DO-23" />
+	</Action>
+
+	<Action do="DO_MFC1_Valve" value="true" tip="MFC1 Valve" tip.zh-CN="" tip.en-US="DO-11" >
+		<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+		<Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+		<Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+	</Action>
+
+	<Action do="DO_MFC2_Valve" value="true" tip="MFC2 Valve" tip.zh-CN="" tip.en-US="DO-12" >
+		<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+		<Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+		<Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+	</Action>
+
+	<Action do="DO_MFC3_Valve" value="true" tip="MFC3 Valve" tip.zh-CN="" tip.en-US="DO-13" >
+		<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+		<Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+		<Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+	</Action>
+
+	<Action do="DO_MFC4_Valve" value="true" tip="MFC4 Valve" tip.zh-CN="" tip.en-US="DO-14" >
+		<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+		<Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+		<Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+	</Action>
+
+	<Action do="DO_MFC5_Valve" value="true" tip="MFC5 Valve" tip.zh-CN="" tip.en-US="DO-15" >
+		<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+		<Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+		<Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+	</Action>
+
+	<Action do="DO_MFC6_Valve" value="true" tip="MFC6 Valve" tip.zh-CN="" tip.en-US="DO-16" >
+		<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+		<Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+		<Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+	</Action>
+
+	<Action do="DO_MFC7_Valve" value="true" tip="MFC7 Valve" tip.zh-CN="" tip.en-US="DO-17" >
+		<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+		<Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+		<Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+	</Action>
+
+	<Action do="DO_MFC8_Valve" value="true" tip="MFC8 Valve" tip.zh-CN="" tip.en-US="DO-18" >
+		<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0" />
+		<Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_Gas_Box_Door_Switch"		value="true" tip="DI Gas Box Door SW"		tip.zh-CN="" tip.en-US="DI-51" />
+		<Limit di="DI_Gas_Box_Pressure_Switch"	value="true" tip="DI Gas Box Pressure SW"	tip.zh-CN="" tip.en-US="DI-52" />
+	</Action>
+
+
+	<Action do="DO_Gas_Final_Valve" value="true" tip="Gas final valve" tip.zh-CN="" tip.en-US="DO-21" >
+		<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0"/>
+		<Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+	</Action>
+
+	<Action do="DO_Soft_Pumping_Valve" value="true" tip="Soft Pumping Valve" tip.zh-CN="" tip.en-US="DO-22">
+		<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0"/>
+		<Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit do="DO_N2_Valve"			value="false" tip="N2 Valve"			tip.zh-CN="" tip.en-US="DO-10" />
+	</Action>
+
+	<Action do="DO_Fast_Pumping_Valve" value="true" tip="Fast Pumping Valve" tip.zh-CN="" tip.en-US="DO-23" >
+		<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0"/>
+		<Limit di="DI_Slit_Door_Close_POS"	value="true" tip="DI Slit Door Close POS"	tip.zh-CN="" tip.en-US="DI-11" />
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit do="DO_N2_Valve"			value="false" tip="N2 Valve"			tip.zh-CN="" tip.en-US="DO-10" />
+	</Action>
+
+	<Action do="DO_Slit_Door_Open" value="true" tip="Slit Door Open" tip.zh-CN="" tip.en-US="DO-24" >
+		<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0"/>
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12" />
+		<Limit di="DI_Arm_Not_Extend_to_PM"	value="true" tip="Arm Not Extend to PM"	tip.zh-CN="" tip.en-US="DI-76" />
+
+	</Action>
+
+
+	<Action do="DO_Slit_Door_Close" value="true" tip="Slit Door Close" tip.zh-CN="" tip.en-US="DO-25" >
+		<Limit di="DI_Lid_Closed"		value="true" tip="DI Lid Closed"			tip.zh-CN="" tip.en-US="DI-0"/>
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12"/>
+		<Limit di="DI_Arm_Not_Extend_to_PM"	value="true" tip="Arm Not Extend to PM"	tip.zh-CN="" tip.en-US="DI-76" />
+	</Action>
+
+	<Action do="DO_Turbo_Pump_Pumping_Valve" value="true" tip="Turbo Pump Pumping Valve" tip.zh-CN="" tip.en-US="DO-29" >
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12"/>
+	</Action>
+
+	<Action do="DO_Turbo_Pump_Pumping_Valve" value="true" tip="Turbo Pump Purge Valve" tip.zh-CN="" tip.en-US="DO-30" >
+		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="DI CDA Pressure"			tip.zh-CN="" tip.en-US="DI-12"/>
+	</Action>
+
+
+	<Action do="DO_S_Valve_Heater_On" value="true" tip="S-Valve Heater On" tip.zh-CN="" tip.en-US="DO-33" >
+		<Limit di="DI_S_Valve_OT_Switch_Alarm"			value="false" tip="S_Valve OT Switch Alarm"			tip.zh-CN="" tip.en-US="DI-66"/>
+	</Action>
+
+
+	<Action do="DO_Lid_Up" value="true" tip="Lid UP" tip.zh-CN="" tip.en-US="DO-50">
+		<Limit di="DI_Lid_Up_Limit_Pos_SW"			value="false" tip="Lid Up Limit Pos SW"			tip.zh-CN="" tip.en-US="DI-74"/>
+	</Action>
+
+	<Action do="DO_Lid_Down" value="true" tip="Lid Down" tip.zh-CN="" tip.en-US="DO-51">
+		<Limit di="DI_Lid_Down_Limit_Pos_SW"			value="false" tip="Lid Down Limit Pos SW"			tip.zh-CN="" tip.en-US="DI-75"/>
+	</Action>
 </Interlock>

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


+ 3 - 3
Venus/Venus_RT/Modules/PMs/PMProcessRoutine.cs

@@ -475,7 +475,7 @@ namespace Venus_RT.Modules.PMs
             }
         }
 
-        public async void Abort()
+        public  void Abort()
         {
             WaferInfo waferInfo = WaferManager.Instance.GetWafer(ModuleHelper.Converter(Module.ToString()), 0);
             if (!waferInfo.IsEmpty)
@@ -492,8 +492,8 @@ namespace Venus_RT.Modules.PMs
             CloseAllValves();
             _chamber.OpenValve(ValveType.TurboPumpPumping, true);
             _chamber.OpenValve(ValveType.TurboPumpPurge, true);
-            await Task.Delay(3000);
-            _chamber.OnOffSetESCHV(false);
+            //await Task.Delay(3000);
+            //_chamber.OnOffSetESCHV(false);
 
         }
     }

+ 8 - 9
Venus/Venus_RT/Modules/PMs/ProcessDefine.cs

@@ -12,7 +12,6 @@ using System.Diagnostics;
 
 namespace Venus_RT.Modules.PMs
 {
-
     class ProcessHelper
     {
         protected JetPMBase Chamber;
@@ -189,7 +188,7 @@ namespace Venus_RT.Modules.PMs
             }
             else
             { 
-                p1 = ProcessUnit.AutoC1;
+                p1 = ProcessUnit.AutoTuneCapPreset;
             }
             if (ProcessUnit.LoadCapPreset > 0)
             {
@@ -197,7 +196,7 @@ namespace Venus_RT.Modules.PMs
             }
             else
             {
-                p2 = ProcessUnit.AutoC2;
+                p2 = ProcessUnit.AutoLoadCapPreset;
             }
             Chamber.SetMatchPosition(p1, p2);
             rfMatchC1.Clear();
@@ -244,7 +243,7 @@ namespace Venus_RT.Modules.PMs
                     allValue += rfMatchC1[i];
                 }
                 var average=allValue/ (rfMatchC1.Count-4);
-                ProcessUnit.AutoC1 = (int)average;
+                ProcessUnit.AutoTuneCapPreset = (int)average;
             }
             if (rfMatchC2.Count >= 6)
             {
@@ -254,7 +253,7 @@ namespace Venus_RT.Modules.PMs
                     allValue += rfMatchC2[i];
                 }
                 var average = allValue / (rfMatchC2.Count - 4);
-                ProcessUnit.AutoC2 = (int)average;
+                ProcessUnit.AutoLoadCapPreset = (int)average;
             }
 
             rfMatchC1.Clear();
@@ -278,7 +277,7 @@ namespace Venus_RT.Modules.PMs
             }
             else
             {
-                p1 = ProcessUnit.AutoC1;
+                p1 = ProcessUnit.AutoBiasTuneCapPreset;
             }
             if (ProcessUnit.BiasLoadCapPreset > 0)
             {
@@ -286,7 +285,7 @@ namespace Venus_RT.Modules.PMs
             }
             else
             {
-                p2 = ProcessUnit.AutoC2;
+                p2 = ProcessUnit.AutoBiasLoadCapPreset;
             }
             Chamber.SetBiasMatchPosition(p1, p2);
             if(ProcessUnit.BiasGeneratorMode == GeneratorMode.Pulsing)
@@ -339,7 +338,7 @@ namespace Venus_RT.Modules.PMs
                     allValue += biasRfMatchC1[i];
                 }
                 var average = allValue / (biasRfMatchC1.Count - 4);
-                ProcessUnit.AutoC1 = (int)average;
+                ProcessUnit.AutoBiasTuneCapPreset = (int)average;
             }
             if (biasRfMatchC2.Count >= 6)
             {
@@ -349,7 +348,7 @@ namespace Venus_RT.Modules.PMs
                     allValue += biasRfMatchC2[i];
                 }
                 var average = allValue / (biasRfMatchC2.Count - 4);
-                ProcessUnit.AutoC2 = (int)average;
+                ProcessUnit.AutoBiasLoadCapPreset = (int)average;
             }
             biasRfMatchC1.Clear();
             biasRfMatchC1.Clear();

+ 286 - 0
Venus/Venus_Themes/CustomControls/SplitButton.cs

@@ -0,0 +1,286 @@
+using System.ComponentModel;
+using System.Windows.Controls.Primitives;
+using System.Windows.Controls;
+using System.Windows.Markup;
+using System.Windows;
+using System.Windows.Media.Animation;
+using System.Windows.Media;
+using System;
+
+namespace Venus_Themes.CustomControls
+{
+    /// <summary>
+    /// Implemetation of a Split Button
+    /// </summary>
+    [TemplatePart(Name = "PART_DropDown", Type = typeof(Button))]
+    [ContentProperty("Items")]
+    [DefaultProperty("Items")]
+    public class SplitButton : Button
+    {
+        // AddOwner Dependency properties
+        public static readonly DependencyProperty HorizontalOffsetProperty;
+        public static readonly DependencyProperty IsContextMenuOpenProperty;
+        public static readonly DependencyProperty ModeProperty;
+        public static readonly DependencyProperty PlacementProperty;
+        public static readonly DependencyProperty PlacementRectangleProperty;
+        public static readonly DependencyProperty VerticalOffsetProperty;
+
+        /// <summary>
+        /// Static Constructor
+        /// </summary>
+        static SplitButton()
+        {
+            DefaultStyleKeyProperty.OverrideMetadata(typeof(SplitButton), new FrameworkPropertyMetadata(typeof(SplitButton)));
+            IsContextMenuOpenProperty = DependencyProperty.Register("IsContextMenuOpen", typeof(bool), typeof(SplitButton), new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnIsContextMenuOpenChanged)));
+            ModeProperty = DependencyProperty.Register("Mode", typeof(SplitButtonMode), typeof(SplitButton), new FrameworkPropertyMetadata(SplitButtonMode.Split));
+
+            // AddOwner properties from the ContextMenuService class, we need callbacks from these properties
+            // to update the Buttons ContextMenu properties
+            PlacementProperty = ContextMenuService.PlacementProperty.AddOwner(typeof(SplitButton), new FrameworkPropertyMetadata(PlacementMode.Bottom, new PropertyChangedCallback(OnPlacementChanged)));
+            PlacementRectangleProperty = ContextMenuService.PlacementRectangleProperty.AddOwner(typeof(SplitButton), new FrameworkPropertyMetadata(Rect.Empty, new PropertyChangedCallback(OnPlacementRectangleChanged)));
+            HorizontalOffsetProperty = ContextMenuService.HorizontalOffsetProperty.AddOwner(typeof(SplitButton), new FrameworkPropertyMetadata(0.0, new PropertyChangedCallback(OnHorizontalOffsetChanged)));
+            VerticalOffsetProperty = ContextMenuService.VerticalOffsetProperty.AddOwner(typeof(SplitButton), new FrameworkPropertyMetadata(0.0, new PropertyChangedCallback(OnVerticalOffsetChanged)));
+        }
+
+
+        /*
+         * Overrides
+         * 
+        */
+        /// <summary>
+        /// OnApplyTemplate override, set up the click event for the dropdown if present in the template
+        /// </summary>
+        public override void OnApplyTemplate()
+        {
+            base.OnApplyTemplate();
+
+            // set up the click event handler for the dropdown button
+            ButtonBase dropDown = this.Template.FindName("PART_DropDown", this) as ButtonBase;
+            if (dropDown != null)
+                dropDown.Click += Dropdown_Click;
+        }
+
+        /// <summary>
+        ///     Handles the Base Buttons OnClick event
+        /// </summary>
+        protected override void OnClick()
+        {
+            switch (Mode)
+            {
+                case SplitButtonMode.Dropdown:
+                    OnDropdown();
+                    break;
+
+                default:
+                    base.OnClick(); // forward on the Click event to the user
+                    break;
+            }
+        }
+
+        /*
+         * Properties
+         * 
+        */
+
+
+        /// <summary>
+        /// The Split Button's Items property maps to the base classes ContextMenu.Items property
+        /// </summary>
+        public ItemCollection Items
+        {
+            get
+            {
+                EnsureContextMenuIsValid();
+                return this.ContextMenu.Items;
+            }
+        }
+
+        /*
+         * DependencyProperty CLR wrappers
+         * 
+        */
+
+        /// <summary>
+        /// Gets or sets the IsContextMenuOpen property. 
+        /// </summary>
+        public bool IsContextMenuOpen
+        {
+            get { return (bool)GetValue(IsContextMenuOpenProperty); }
+            set { SetValue(IsContextMenuOpenProperty, value); }
+        }
+
+
+        /// <summary>
+        /// Placement of the Context menu
+        /// </summary>
+        public PlacementMode Placement
+        {
+            get { return (PlacementMode)GetValue(PlacementProperty); }
+            set { SetValue(PlacementProperty, value); }
+        }
+
+
+        /// <summary>
+        /// PlacementRectangle of the Context menu
+        /// </summary>
+        public Rect PlacementRectangle
+        {
+            get { return (Rect)GetValue(PlacementRectangleProperty); }
+            set { SetValue(PlacementRectangleProperty, value); }
+        }
+
+
+        /// <summary>
+        /// HorizontalOffset of the Context menu
+        /// </summary>
+        public double HorizontalOffset
+        {
+            get { return (double)GetValue(HorizontalOffsetProperty); }
+            set { SetValue(HorizontalOffsetProperty, value); }
+        }
+
+
+        /// <summary>
+        /// VerticalOffset of the Context menu
+        /// </summary>
+        public double VerticalOffset
+        {
+            get { return (double)GetValue(VerticalOffsetProperty); }
+            set { SetValue(VerticalOffsetProperty, value); }
+        }
+
+        /// <summary>
+        /// Defines the Mode of operation of the Button
+        /// </summary>
+        /// <remarks>
+        ///     The SplitButton two Modes are
+        ///     Split (default),    - the button has two parts, a normal button and a dropdown which exposes the ContextMenu
+        ///     Dropdown            - the button acts like a combobox, clicking anywhere on the button opens the Context Menu
+        /// </remarks>
+        public SplitButtonMode Mode
+        {
+            get { return (SplitButtonMode)GetValue(ModeProperty); }
+            set { SetValue(ModeProperty, value); }
+        }
+
+        /*
+         * DependencyPropertyChanged callbacks
+         * 
+        */
+
+        private static void OnIsContextMenuOpenChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+        {
+            SplitButton s = (SplitButton)d;
+            s.EnsureContextMenuIsValid();
+
+            if (!s.ContextMenu.HasItems)
+                return;
+
+            bool value = (bool)e.NewValue;
+
+            if (value && !s.ContextMenu.IsOpen)
+                s.ContextMenu.IsOpen = true;
+            else if (!value && s.ContextMenu.IsOpen)
+                s.ContextMenu.IsOpen = false;
+        }
+
+
+        /// <summary>
+        /// Placement Property changed callback, pass the value through to the buttons context menu
+        /// </summary>
+        private static void OnPlacementChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+        {
+            SplitButton s = d as SplitButton;
+            if (s == null) return;
+
+            s.EnsureContextMenuIsValid();
+            s.ContextMenu.Placement = (PlacementMode)e.NewValue;
+        }
+
+        /// <summary>
+        /// PlacementRectangle Property changed callback, pass the value through to the buttons context menu
+        /// </summary>
+        private static void OnPlacementRectangleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+        {
+            SplitButton s = d as SplitButton;
+            if (s == null) return;
+
+            s.EnsureContextMenuIsValid();
+            s.ContextMenu.PlacementRectangle = (Rect)e.NewValue;
+        }
+
+        /// <summary>
+        /// HorizontalOffset Property changed callback, pass the value through to the buttons context menu
+        /// </summary>
+        private static void OnHorizontalOffsetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+        {
+            SplitButton s = d as SplitButton;
+            if (s == null) return;
+
+            s.EnsureContextMenuIsValid();
+            s.ContextMenu.HorizontalOffset = (double)e.NewValue;
+        }
+
+        /// <summary>
+        /// VerticalOffset Property changed callback, pass the value through to the buttons context menu
+        /// </summary>
+        private static void OnVerticalOffsetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+        {
+            SplitButton s = d as SplitButton;
+            if (s == null) return;
+
+            s.EnsureContextMenuIsValid();
+            s.ContextMenu.VerticalOffset = (double)e.NewValue;
+        }
+
+        /*
+         * Helper Methods
+         * 
+        */
+
+        /// <summary>
+        /// Make sure the Context menu is not null
+        /// </summary>
+        private void EnsureContextMenuIsValid()
+        {
+            if (this.ContextMenu == null)
+            {
+                this.ContextMenu = new ContextMenu();
+                this.ContextMenu.PlacementTarget = this;
+                this.ContextMenu.Placement = Placement;
+
+                this.ContextMenu.Opened += ((sender, routedEventArgs) => IsContextMenuOpen = true);
+                this.ContextMenu.Closed += ((sender, routedEventArgs) => IsContextMenuOpen = false);
+            }
+        }
+
+        private void OnDropdown()
+        {
+            EnsureContextMenuIsValid();
+            if (!this.ContextMenu.HasItems)
+                return;
+
+            this.ContextMenu.IsOpen = !IsContextMenuOpen; // open it if closed, close it if open
+        }
+
+        /*
+         * Events
+         * 
+        */
+
+        /// <summary>
+        /// Event Handler for the Drop Down Button's Click event
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void Dropdown_Click(object sender, RoutedEventArgs e)
+        {
+            OnDropdown();
+            e.Handled = true;
+        }
+    }
+    public enum SplitButtonMode
+    {
+        Split, Dropdown, Button
+    }
+}

+ 63 - 0
Venus/Venus_Themes/Themes/Generic.xaml

@@ -1323,4 +1323,67 @@ Header,RelativeSource={RelativeSource TemplatedParent}}" />
         </Setter>
     </Style>
 
+    <Style x:Key="SplitButtonStyle" TargetType="{x:Type customControls:SplitButton}">
+        <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>
+        <Setter Property="Foreground" Value="White"/>
+        <Setter Property="HorizontalContentAlignment" Value="Center"/>
+        <Setter Property="VerticalContentAlignment" Value="Center"/>
+        <Setter Property="Padding" Value="0"/>
+        <Setter Property="Template">
+            <Setter.Value>
+                <ControlTemplate TargetType="{x:Type customControls:SplitButton}">
+                    <Grid>
+                        <Grid  VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
+                            <Grid.ColumnDefinitions>
+                                <ColumnDefinition Width="*"/>
+                                <ColumnDefinition Width="25"/>
+                            </Grid.ColumnDefinitions>
+
+                            <Border x:Name="Bd"  CornerRadius="4,0,0,4" Background="{TemplateBinding Background}">
+                                <ContentPresenter
+										HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
+										VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
+										Margin="{TemplateBinding Padding}"
+										RecognizesAccessKey="True"
+										/>
+                            </Border>
+
+
+                            <Button x:Name="PART_DropDown"
+									Background="{TemplateBinding Background}"
+									BorderBrush="{TemplateBinding BorderBrush}"
+									Foreground="White"
+									IsDefault="{TemplateBinding IsDefault}"
+									VerticalAlignment="Stretch" 
+									HorizontalAlignment="Stretch"
+									Grid.Column="1"                                    
+									Opacity="1">
+                                <Path Data="M0,0L3,3 6,0z" Margin="2,1,0,-1" Stroke="{TemplateBinding Foreground}" Fill="{TemplateBinding Foreground}" />
+                            </Button>
+
+                        </Grid>
+                    </Grid>
+                    <ControlTemplate.Triggers>
+                        <Trigger Property="Mode" Value="Dropdown">
+                            <Setter Property="Visibility" TargetName="PART_DropDown" Value="Collapsed"/>
+                        </Trigger>
+                        <Trigger Property="Mode" Value="Button">
+                            <Setter Property="Visibility" TargetName="PART_DropDown" Value="Collapsed"/>
+                            <!--<Setter Property="Visibility" TargetName="path" Value="Collapsed"/>-->
+                            <Setter Property="Grid.ColumnSpan" TargetName="Bd" Value="2"/>
+                        </Trigger>
+                        <Trigger Property="IsMouseOver" SourceName="Bd" Value="true">
+                            <Setter Property="Background"  TargetName="Bd" Value="{StaticResource Color_BG_WindowButton_Highlight}"/>
+                        </Trigger>
+                        <Trigger Property="IsEnabled" Value="false">
+                            <Setter Property="Foreground" Value="#ADADAD"/>
+                        </Trigger>
+                    </ControlTemplate.Triggers>
+                </ControlTemplate>
+            </Setter.Value>
+        </Setter>
+        <Style.Triggers>
+        </Style.Triggers>
+    </Style>
+
 </ResourceDictionary>

+ 1 - 0
Venus/Venus_Themes/Venus_Themes.csproj

@@ -99,6 +99,7 @@
     <Compile Include="CustomControls\CustomRobot.cs" />
     <Compile Include="CustomControls\MultiComboBox.cs" />
     <Compile Include="CustomControls\PathButton.cs" />
+    <Compile Include="CustomControls\SplitButton.cs" />
     <Compile Include="CustomControls\StepBar.cs" />
     <Compile Include="CustomControls\StepBarItem.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />