ソースを参照

1.Recipe 添加 Stable/OverEtch 功能
2.Epd step start改为任意模式发送,之前只有endpoint模式发送
3.endpoint模式 加上最大值/最小值报警退出

# Conflicts:
# Venus/Venus_RT/Modules/SystemDispatcher.cs

lixiang 1 年間 前
コミット
7e15cb64a0

+ 1 - 0
Venus/Framework/Common/DataCollection/DataCollectionManager.cs

@@ -313,6 +313,7 @@ namespace Aitex.Core.RT.DataCollection
                             }
                             catch
                             {
+
                                 Connect();
                             }
 

+ 25 - 23
Venus/Framework/Common/IOCore/IoProviderManager.cs

@@ -276,30 +276,32 @@ namespace MECF.Framework.RT.Core.IoProviders
                     {
                         // JetChamber jetChamber = (JetChamber)Enum.Parse(typeof(JetChamber), SC.GetStringValue($"{mapModule}.ChamberType"));
                         JetChamber jetChamber = (JetChamber)SC.GetValue<int>($"{mapModule}.ChamberType");
-                        switch (jetChamber)
-                        {
-                            //case JetChamber.Venus:
-                            //    mapFile= "PM" + "\\" + "Venus" + "\\" + "VenusIoDefine.xml";
-                            //    break;
-
-                            case JetChamber.Kepler2300:
-                                mapFile = "PM" + "\\" + "Kepler2300" + "\\" + "Kepler2300IoDefine.xml";
-                                break;
-                            case JetChamber.Kepler2200A:
-                                mapFile = "PM" + "\\" + "Kepler2200A" + "\\" + "Kepler2200AIoDefine.xml";
-                                break;
-                            case JetChamber.Kepler2200B:
-                                //mapFile = jetChamber.ToString() + "\\" + "_ioDefineKepler.xml";
-                                mapFile= "PM" + "\\" + "Kepler2200B" + "\\" + "Kepler2200BIoDefine.xml";
-                                break;
-                            case JetChamber.VenusSE:
-                                mapFile = "PM" + "\\" + "VenusSE" + "\\" + "VenusSEIoDefine.xml";
-                                break;
-                            case JetChamber.VenusDE:
-                                mapFile = "PM" + "\\" + "VenusDE" + "\\" + "VenusDEIoDefine.xml";
-                                break;
+                        //switch (jetChamber)
+                        //{
+                        //    //case JetChamber.Venus:
+                        //    //    mapFile= "PM" + "\\" + "Venus" + "\\" + "VenusIoDefine.xml";
+                        //    //    break;
+
+                        //    case JetChamber.Kepler2300:
+                        //        mapFile = "PM" + "\\" + "Kepler2300" + "\\" + "Kepler2300IoDefine.xml";
+                        //        break;
+                        //    case JetChamber.Kepler2200A:
+                        //        mapFile = "PM" + "\\" + "Kepler2200A" + "\\" + "Kepler2200AIoDefine.xml";
+                        //        break;
+                        //    case JetChamber.Kepler2200B:
+                        //        //mapFile = jetChamber.ToString() + "\\" + "_ioDefineKepler.xml";
+                        //        mapFile= "PM" + "\\" + "Kepler2200B" + "\\" + "Kepler2200BIoDefine.xml";
+                        //        break;
+                        //    case JetChamber.VenusSE:
+                        //        mapFile = "PM" + "\\" + "VenusSE" + "\\" + "VenusSEIoDefine.xml";
+                        //        break;
+                        //    case JetChamber.VenusDE:
+                        //        mapFile = "PM" + "\\" + "VenusDE" + "\\" + "VenusDEIoDefine.xml";
+                        //        break;
+
+                        //}
+                        mapFile = $"PM" + "\\" + $"{jetChamber}" + "\\" + $"{jetChamber}IoDefine.xml";
 
-                        }
                     }
 
 

+ 23 - 20
Venus/Framework/Common/Tolerance/RecipeToleranceChecker.cs

@@ -1,10 +1,6 @@
 using Aitex.Core.RT.Log;
-using System;
 using System.Collections.Generic;
 using System.Diagnostics;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 using Venus_Core;
 
 namespace Aitex.Core.RT.Tolerance
@@ -15,6 +11,7 @@ namespace Aitex.Core.RT.Tolerance
         List<ToleranceObject> _toleranceObjects;
         string _Module;
 
+        public bool IsStable = true;
         public RecipeToleranceChecker(string module)
         {
             _stopwatch = new Stopwatch();
@@ -24,31 +21,37 @@ namespace Aitex.Core.RT.Tolerance
         {
             _stopwatch.Restart();
             _toleranceObjects = toleranceObjects;
-
-
+            IsStable = false;
         }
-        public void Monitor(params double[] feedBacks)
+        public RState Monitor(params double[] feedBacks)
         {
             if (_toleranceObjects == null)
             {
-                return;
+                return RState.Running;
             }
             for (int i = 0; i < _toleranceObjects.Count; i++)
             {
                 if (_stopwatch.ElapsedMilliseconds > _toleranceObjects[i].DelayTime)
                 {
-                    if ((feedBacks[i] < _toleranceObjects[i].WarningMin || feedBacks[i] > _toleranceObjects[i].WarningMax) && _toleranceObjects[i].WarningFlag == false)
+                    if ((feedBacks[i] < _toleranceObjects[i].AlarmMin || feedBacks[i] > _toleranceObjects[i].AlarmMax) && _toleranceObjects[i].AlarmFlag == false && _toleranceObjects[i].SetPoint!=0 && _toleranceObjects[i].WarningFlag == true)
+                    {
+                        _toleranceObjects[i].AlarmFlag = true;
+                        LOG.Write(eEvent.ERR_PM_TOLERANCE, _Module, $"{_toleranceObjects[i].Name}:Currnt Value:{feedBacks[i]},Over Range {_toleranceObjects[i].AlarmMin}-{_toleranceObjects[i].AlarmMax}" );
+                        return RState.Failed;
+                    }
+                    else if ((feedBacks[i] < _toleranceObjects[i].WarningMin || feedBacks[i] > _toleranceObjects[i].WarningMax) && _toleranceObjects[i].WarningFlag == false && _toleranceObjects[i].SetPoint != 0)
                     {
+                        IsStable = false;
                         _toleranceObjects[i].WarningFlag = true;
                         LOG.Write(eEvent.WARN_PM_TOLERANCE, _Module, $"{_toleranceObjects[i].Name}:Currnt Value:{feedBacks[i]},Over Range {_toleranceObjects[i].WarningMin}-{_toleranceObjects[i].WarningMax}");
                     }
-                    if ((feedBacks[i] < _toleranceObjects[i].AlarmMin || feedBacks[i] > _toleranceObjects[i].AlarmMax) && _toleranceObjects[i].AlarmFlag == false && _toleranceObjects[i].WarningFlag == true)
+                    else
                     {
-                        _toleranceObjects[i].AlarmFlag = true;
-                        LOG.Write(eEvent.ERR_PM_TOLERANCE, _Module, $"{_toleranceObjects[i].Name}:Currnt Value:{feedBacks[i]},Over Range {_toleranceObjects[i].AlarmMin}-{_toleranceObjects[i].AlarmMax}");
+                        IsStable = true;
                     }
                 }
             }
+            return RState.Running;
         }
         public void End()
         {
@@ -58,19 +61,19 @@ namespace Aitex.Core.RT.Tolerance
     public class ToleranceObject
     {
         public string Name { get; set; }
-        public int SetPoint { get; set; }
-        public int WarningScale { get; set; }
-        public int AlarmScale { get; set; }
+        public float SetPoint { get; set; }
+        public float WarningScale { get; set; }
+        public float AlarmScale { get; set; }
         public bool WarningFlag { get; set; }
         public bool AlarmFlag { get; set; }
         public int DelayTime { get; set; }
-        public int WarningMax { get; set; }
-        public int WarningMin { get; set; }
-        public int AlarmMax { get; set; }
-        public int AlarmMin { get; set; }
+        public float WarningMax { get; set; }
+        public float WarningMin { get; set; }
+        public float AlarmMax { get; set; }
+        public float AlarmMin { get; set; }
 
 
-        public ToleranceObject(string name, int setPoint, int warningScale, int alarmScale, int delayTime, ToleranceMode toleranceMode)
+        public ToleranceObject(string name, float setPoint, float warningScale, float alarmScale, int delayTime, ToleranceMode toleranceMode)
         {
             Name = name;
             SetPoint = setPoint;

+ 120 - 37
Venus/Venus_Core/ProcessUnitDefine.cs

@@ -75,7 +75,7 @@ namespace Venus_Core
         TCPUnit,
         BiasUnit,
         VenusSEGasControlUnit,
-        SEESCHVUnit,
+        ESCHVUnit,
         ProcessKitUnit
     }
 
@@ -87,24 +87,32 @@ namespace Venus_Core
     public partial class PressureByPressureModeUnit : ProcessUnitBase
     {
         public string UnitName { get; set; } = "PressureModeUnit";
-
+        [IsTolerance]
+        public ToleranceMode ToleranceMode { get; set; }
+        [IsTolerance]
+        [CustomName("ToleranceDelayTime(ms)")]
+        public int ToleranceDelayTime { get; set; }
+       
         public PressureUnitMode PressureUnitMode { get; set; }
         public float StartValue { get; set; }
-
+        [IsTolerance]
+        public int StartValueWarningRange { get; set; }
+        [IsTolerance]
+        public int StartValueAlarmRange { get; set; }
         public int ValvePositionPreset { get; set; }
         [IsCanConfigIgnore]
         public bool EnableRamp { get; set; }
         public int HoldTime { get; set; }
         public float TargetValue { get; set; }
 
-        public event PropertyChangedEventHandler PropertyChanged;
-        public void InvokePropertyChanged(string propertyName)
-        {
-            if (PropertyChanged != null)
-            {
-                PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
-            }
-        }
+        //public event PropertyChangedEventHandler PropertyChanged;
+        //public void InvokePropertyChanged(string propertyName)
+        //{
+        //    if (PropertyChanged != null)
+        //    {
+        //        PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
+        //    }
+        //}
     }
 
 
@@ -150,7 +158,7 @@ namespace Venus_Core
         [IsOnlyRead]
         [CustomName("AutoC2(%)")]
         public float AutoC2 { get; set; }
-        [CustomName("Max Reflected Power (W)")]
+        [CustomName("RF Max ReflectedPower(W)")]
         public int MaxReflectedPower { get; set; }
         [JsonConverter(typeof(StringEnumConverter))]
         public MatchWorkMode MatchWorkMode { get; set; }
@@ -181,13 +189,22 @@ namespace Venus_Core
         public int RFPowerWarningRange { get; set; }
         [IsTolerance]
         public int RFPowerAlarmRange { get; set; }
+        [CustomName("BiasRF Power(W)")]
+
         public int BiasRFPower { get; set; }
+        [CustomName("BiasC1(%)")]
         public float BiasC1{ get; set; }
+        [CustomName("BiasC2(%)")]
         public float BiasC2 { get; set; }
         [IsOnlyRead]
+        [CustomName("AutoBiasC1(%)")]
+
         public float AutoBiasC1 { get; set; }
+        [CustomName("AutoBiasC2(%)")]
         [IsOnlyRead]
         public float AutoBiasC2 { get; set; }
+        [CustomName("BiasRF Max ReflectedPower(W)")]
+
         public int BiasMaxReflectedPower { get; set; }
 
         [JsonConverter(typeof(StringEnumConverter))]
@@ -221,7 +238,6 @@ namespace Venus_Core
         public ToleranceMode ToleranceMode { get; set; }
         [IsTolerance]
         [CustomName("ToleranceDelayTime(ms)")]
-
         public int ToleranceDelayTime { get; set; }
         public int Gas1 { get; set; }
         [IsTolerance]
@@ -285,7 +301,6 @@ namespace Venus_Core
         public ToleranceMode ToleranceMode { get; set; }
         [IsTolerance]
         [CustomName("ToleranceDelayTime(ms)")]
-
         public int ToleranceDelayTime { get; set; }
         public int Gas1 { get; set; }
         [IsTolerance]
@@ -322,41 +337,109 @@ namespace Venus_Core
     public class VenusSEGasControlUnit : ProcessUnitBase
     {
         public string UnitName { get; set; } = "SEGasControlUnit";
-        public int Gas1 { get; set;}
-        public int Gas2 { get; set;}
-        public int Gas3 { get; set;}
-        public int Gas4 { get; set;}
-        public int Gas5 { get; set;}
-        public int Gas6 { get; set;}
-        public int Gas7 { get; set;}
-        public int Gas8 { get; set;}
+        [IsTolerance]
+        public ToleranceMode ToleranceMode { get; set; }
+        [IsTolerance]
+        [CustomName("ToleranceDelayTime(ms)")]
+        public int ToleranceDelayTime { get; set; }
+        public int Gas1 { get; set; }
+        [IsTolerance]
+        public int Gas1WarningRange { get; set; }
+        [IsTolerance]
+        public int Gas1AlarmRange { get; set; }
+        public int Gas2 { get; set; }
+        [IsTolerance]
+        public int Gas2WarningRange { get; set; }
+        [IsTolerance]
+        public int Gas2AlarmRange { get; set; }
+        public int Gas3 { get; set; }
+        [IsTolerance]
+        public int Gas3WarningRange { get; set; }
+        [IsTolerance]
+        public int Gas3AlarmRange { get; set; }
+        public int Gas4 { get; set; }
+        [IsTolerance]
+        public int Gas4WarningRange { get; set; }
+        [IsTolerance]
+        public int Gas4AlarmRange { get; set; }
+        public int Gas5 { get; set; }
+        [IsTolerance]
+        public int Gas5WarningRange { get; set; }
+        [IsTolerance]
+        public int Gas5AlarmRange { get; set; }
+        public int Gas6 { get; set; }
+        [IsTolerance]
+        public int Gas6WarningRange { get; set; }
+        [IsTolerance]
+        public int Gas6AlarmRange { get; set; }
+        public int Gas7 { get; set; }
+        [IsTolerance]
+        public int Gas7WarningRange { get; set; }
+        [IsTolerance]
+        public int Gas7AlarmRange { get; set; }
+        public int Gas8 { get; set; }
+        [IsTolerance]
+        public int Gas8WarningRange { get; set; }
+        [IsTolerance]
+        public int Gas8AlarmRange { get; set; }
         public int Gas9 { get; set;}
+        [IsTolerance]
+        public int Gas9WarningRange { get; set; }
+        [IsTolerance]
+        public int Gas9AlarmRange { get; set; }
         public int Gas10 { get; set;}
+        [IsTolerance]
+        public int Gas10WarningRange { get; set; }
+        [IsTolerance]
+        public int Gas10AlarmRange { get; set; }
         public int Gas11 { get; set;}
+        [IsTolerance]
+        public int Gas11WarningRange { get; set; }
+        [IsTolerance]
+        public int Gas11AlarmRange { get; set; }
         public int Gas12 { get; set;}
+        [IsTolerance]
+        public int Gas12WarningRange { get; set; }
+        [IsTolerance]
+        public int Gas12AlarmRange { get; set; }
     }
 
     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; }
-        [CustomName("CheckDelay(ms)")]
-        public int CheckDelay { get; set; }
-        public int ESCClampValtage { get; set; }
-        public int Temperature { get; set; }
-    }
-    public class SEESCHVUnit : ProcessUnitBase
-    {
-        public string UnitName { get; set; } = "SEESCHVUnit";
-        public int BacksideHelum { get; set; }
-        public float MinHeFlow { get; set; }
-        public float MaxHeFlow { get; set; }
-        public int CheckDelay_ms { get; set; }
+        [IsTolerance]
+        public ToleranceMode ToleranceMode { get; set; }
+        [IsTolerance]
+        [CustomName("ToleranceDelayTime(ms)")]
+        public int ToleranceDelayTime { get; set; }
+        public int BacksideHelium { get; set; }
+        [IsTolerance]
+        public float HeliumWarningRange { get; set; }
+        [IsTolerance]
+        public float HeliumAlarmRange { get; set; }
+        //public int MinHeFlow { get; set; } 
+        //public int MaxHeFlow { get; set; }
+        //[CustomName("CheckDelay(ms)")]
+        //public int CheckDelay { get; set; }
         public int ESCClampValtage { get; set; }
         public int Temperature { get; set; }
     }
+    //public class SEESCHVUnit : ProcessUnitBase
+    //{
+    //    public string UnitName { get; set; } = "SEESCHVUnit";
+    //    [IsTolerance]
+    //    public ToleranceMode ToleranceMode { get; set; }
+    //    [IsTolerance]
+    //    [CustomName("ToleranceDelayTime(ms)")]
+    //    public int ToleranceDelayTime { get; set; }
+    //    public int BacksideHelium { get; set; }
+    //    [IsTolerance]
+    //    public int HeliumWarningRange { get; set; }
+    //    [IsTolerance]
+    //    public int HeliumAlarmRange { get; set; }
+    //    public int ESCClampValtage { get; set; }
+    //    public int Temperature { get; set; }
+    //}
     public class ProcessKitUnit : ProcessUnitBase
     {
         public string UnitName { get; set; } = "ProcessKitUnit";

+ 25 - 12
Venus/Venus_Core/Recipe.cs

@@ -277,6 +277,8 @@ namespace Venus_Core
             set { m_EPDConfigName = value; InvokePropertyChanged("EPDConfig"); }
         }
         private int m_MinEndPointTime;
+        [CustomName("MinEndPointTime(s)")]
+
         public int MinEndPointTime
         {
             get { return m_MinEndPointTime; }
@@ -284,6 +286,8 @@ namespace Venus_Core
         }
 
         private int m_MaxEndPointTime;
+        [CustomName("MaxEndPointTime(s)")]
+
         public int MaxEndPointTime
         {
             get { return m_MaxEndPointTime; }
@@ -301,6 +305,8 @@ namespace Venus_Core
 
 
         private int m_OverEtchPercent;
+        [CustomName("OverEtchPercent(%)")]
+
         public int OverEtchPercent
         {
             get { return m_OverEtchPercent; }
@@ -344,16 +350,16 @@ namespace Venus_Core
             _stepTimer.Restart();
         }
 
-        private long _lastEPDStepTimne = 0;
-        public void RecordEPDStepTime()
-        {
-            _lastEPDStepTimne = _stepTimer.ElapsedMilliseconds;
-        }
+        //private long _lastEPDStepTime = 0;
+        //public void RecordEPDStepTime()
+        //{
+        //    _lastEPDStepTime = _stepTimer.ElapsedMilliseconds;
+        //}
 
-        public long GetLastEPDStepTime()
-        {
-            return _lastEPDStepTimne;
-        }
+        //public long GetLastEPDStepTime()
+        //{
+        //    return _lastEPDStepTime;
+        //}
 
         public RState Start()
         {
@@ -397,9 +403,16 @@ namespace Venus_Core
         }
         public RState Run()
         {
-            if (checker(this) == RState.End)
+            var checkerState= checker(this);
+            if (checkerState == RState.End)
+            {
                 return RState.End;
-
+            }
+            else if (checkerState == RState.Failed)
+            {
+                return RState.Failed;
+            }
+            
             bool bStable = true;
             foreach (var unit in lstUnit)
             {
@@ -521,7 +534,7 @@ namespace Venus_Core
                             unit.Add(JsonConvert.DeserializeObject<ESCHVUnit>(step.LstUnit[i].ToString()));
                             break;
                         case "SEESCHVUnit":
-                            unit.Add(JsonConvert.DeserializeObject<SEESCHVUnit>(step.LstUnit[i].ToString()));
+                            unit.Add(JsonConvert.DeserializeObject<ESCHVUnit>(step.LstUnit[i].ToString()));
                             break;
                         case "ProcessKitUnit":
                             unit.Add(JsonConvert.DeserializeObject<ProcessKitUnit>(step.LstUnit[i].ToString()));

+ 0 - 87
Venus/Venus_Core/RecipeToleranceChecker.cs

@@ -1,87 +0,0 @@
-//using System;
-//using System.Collections.Generic;
-//using System.Diagnostics;
-//using System.Linq;
-//using System.Text;
-//using System.Threading.Tasks;
-
-//namespace Venus_Core
-//{
-//    public class RecipeToleranceChecker
-//    {
-//        Stopwatch _stopwatch;
-//        ToleranceMode _toleranceMode;
-//        List<ToleranceObject> _toleranceObjects;
-
-//        public RecipeToleranceChecker()
-//        {
-//            _stopwatch = new Stopwatch();
-//        }
-//        public void Start(ToleranceMode toleranceMode, List<ToleranceObject> toleranceObjects)
-//        {
-//            _stopwatch.Start();
-//            _toleranceMode = toleranceMode;
-//            _toleranceObjects = toleranceObjects;
-
-//            _toleranceObjects.ForEach(_toleranceObject =>
-//            {
-//                if (_toleranceMode == ToleranceMode.Percent)
-//                {
-//                    _toleranceObject.WarningScale = _toleranceObject.SetPoint * _toleranceObject.WarningScale / 100;
-//                    _toleranceObject.AlarmScale = _toleranceObject.SetPoint * _toleranceObject.AlarmScale / 100;
-//                }
-//            });
-
-
-//        }
-//        public void Monitor(params int[] feedBacks)
-//        {
-//            for (int i = 0; i < _toleranceObjects.Count; i++)
-//            {
-//                if (_stopwatch.ElapsedMilliseconds > _toleranceObjects[i].DelayTime)
-//                {
-//                    if ((feedBacks[i] < _toleranceObjects[i].SetPoint - _toleranceObjects[i].WarningScale || feedBacks[i] > _toleranceObjects[i].SetPoint + _toleranceObjects[i].WarningScale) && _toleranceObjects[i].WarningFlag == false)
-//                    {
-//                        _toleranceObjects[i].WarningFlag = true;
-//                    }
-//                }
-//            }
-
-
-//            for (int i = 0; i < _toleranceObjects.Count; i++)
-//            {
-//                if (_stopwatch.ElapsedMilliseconds > _toleranceObjects[i].DelayTime)
-//                {
-//                    if ((feedBacks[i] < _toleranceObjects[i].SetPoint - _toleranceObjects[i].AlarmScale || feedBacks[i] > _toleranceObjects[i].SetPoint + _toleranceObjects[i].AlarmScale) && _toleranceObjects[i].AlarmFlag == false)
-//                    {
-//                        _toleranceObjects[i].AlarmFlag = true;
-//                    }
-//                }
-//            }
-//        }
-//        public void End()
-//        {
-//            _stopwatch.Stop();
-//        }
-//    }
-//    public class ToleranceObject
-//    {
-//        public string Name { get; set; }
-//        public int SetPoint { get; set; }
-//        public int WarningScale { get; set; }
-//        public int AlarmScale { get; set; }
-//        public bool WarningFlag { get; set; }
-//        public bool AlarmFlag { get; set; }
-//        public int DelayTime { get; set; }
-
-//        public ToleranceObject(string name, int setPoint, int warningScale, int alarmScale, int delayTime)
-//        {
-//            Name = name;
-//            SetPoint = setPoint;
-//            WarningScale = warningScale;
-//            AlarmScale = alarmScale;
-//            DelayTime = delayTime;
-//        }
-
-//    }
-//}

+ 0 - 1
Venus/Venus_Core/Venus_Core.csproj

@@ -67,7 +67,6 @@
     <Compile Include="PMLeakCheckResult.cs" />
     <Compile Include="PressureType.cs" />
     <Compile Include="RecipeResult.cs" />
-    <Compile Include="RecipeToleranceChecker.cs" />
     <Compile Include="RobotArmPan.cs" />
     <Compile Include="SignalTowerItem.cs" />
     <Compile Include="StepItem.cs" />

+ 7 - 0
Venus/Venus_MainPages/ViewModels/OperationOverViewModel.cs

@@ -1180,6 +1180,7 @@ namespace Venus_MainPages.ViewModels
                 m_RtDataKeys.Add("PMA.CurrentRecipeResult");
                 m_RtDataKeys.Add("PMA.IsOnline");
                 m_RtDataKeys.Add("PMA.CalculationPressure");
+                m_RtDataKeys.Add("PMA.IsLidClosed");
             }
 
             if (PMBIsInstalled == true)
@@ -1188,6 +1189,8 @@ namespace Venus_MainPages.ViewModels
                 m_RtDataKeys.Add("PMB.CurrentRecipeResult");
                 m_RtDataKeys.Add("PMB.IsOnline");
                 m_RtDataKeys.Add("PMB.CalculationPressure");
+                m_RtDataKeys.Add("PMB.IsLidClosed");
+
             }
 
             if (PMCIsInstalled == true)
@@ -1196,6 +1199,8 @@ namespace Venus_MainPages.ViewModels
                 m_RtDataKeys.Add("PMC.CurrentRecipeResult");
                 m_RtDataKeys.Add("PMC.IsOnline");
                 m_RtDataKeys.Add("PMC.CalculationPressure");
+                m_RtDataKeys.Add("PMC.IsLidClosed");
+
             }
 
             if (PMDIsInstalled == true)
@@ -1204,6 +1209,8 @@ namespace Venus_MainPages.ViewModels
                 m_RtDataKeys.Add("PMD.CurrentRecipeResult");
                 m_RtDataKeys.Add("PMD.IsOnline");
                 m_RtDataKeys.Add("PMD.CalculationPressure");
+                m_RtDataKeys.Add("PMD.IsLidClosed");
+
             }
 
             if (TMIsInstalled == true)

+ 16 - 9
Venus/Venus_MainPages/ViewModels/RecipeViewModel.cs

@@ -222,17 +222,24 @@ namespace Venus_MainPages.ViewModels
         {
            var PMCurrentState = (PMState)Enum.Parse(typeof(PMState), QueryDataClient.Instance.Service.GetData($"{ModuleName}.FsmState").ToString());
            var SystemCurrentState = Convert.ToBoolean( QueryDataClient.Instance.Service.GetData($"System.IsAutoMode"));
-
-            if (SystemCurrentState)
+            //if (PMCurrentState == PMState.Clean || PMCurrentState == PMState.Processing)
+            //{
+            //    WPFMessageBox.ShowError($"{ModuleName} is Processing,can not edit recipe {CurrentRecipeName}");
+            //    return;
+            //}
+            //QueryDataClient.Instance.Service.GetData($"Scheduler.InUsingRecipe");
+            
+            var inUseRecipe= QueryDataClient.Instance.Service.GetData($"Scheduler.InUsingRecipe");
+            if (inUseRecipe != null)
             {
-                WPFMessageBox.ShowError("System is Auto Mode,can not edit recipe");
-                return;
-            }
-            if (PMCurrentState == PMState.Clean || PMCurrentState == PMState.Processing)
-            { 
-                WPFMessageBox.ShowError($"{ModuleName} is Processing,can not edit recipe");
-                return;
+                if ((inUseRecipe as List<string>).Contains($"{ModuleName}.{CurrentRecipe.Header.Type}.{CurrentRecipeName}"))
+                {
+                    WPFMessageBox.ShowError($"{CurrentRecipeName} Recipe is In Use,can not edit");
+                    return;
+                }
             }
+           
+           
             CurrentRecipe.Header.EditTime = DateTime.Now.ToString();
             //SaveRecipe(CurrentRecipeName, RecipeUnity.RecipeToString(CurrentRecipe));
             var newrecipePath = Path.Combine(QueryDataClient.Instance.Service.GetData("GetRTPath").ToString(), "Recipes", ModuleName, typeFolder, CurrentRecipeName + ".rcp");

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


+ 1 - 1
Venus/Venus_RT/App.config

@@ -32,7 +32,7 @@
 	<connectionStrings>
 		<add name="PostgreSQL"   connectionString="Server=localhost;Port=5432;User Id=postgres;Password=123456;Database=postgres;Enlist=true;Preload Reader=true;" />
 		<!--0是other,1是kepler2300,2是Kepler2200,3是VenusSE,4是VenusDE-->
-		<add name="ConfigType"   connectionString="2"/>
+		<add name="ConfigType"   connectionString="1"/>
 	</connectionStrings>
 	<system.serviceModel>
 		<!--<diagnostics>

+ 4 - 0
Venus/Venus_RT/Devices/JetKepler2200APM.cs

@@ -187,6 +187,10 @@ namespace Venus_RT.Devices
         public override double MFC5FeedBack => DEVICE.GetDevice<IoMfc>($"{Module}.MfcGas5").FeedBack;
         public override double MFC6FeedBack => DEVICE.GetDevice<IoMfc>($"{Module}.MfcGas6").FeedBack;
         public override float ChamberTemperature => _highTemperatureHeater.HighTemperatureHighHeaterTemperature;
+
+        public override float PendulumPressure => _pendulumValve.Pressure;
+        public override float PendulumPosition => _pendulumValve.Position;
+
         public new ModuleName Module { get; }
 
         //public override MovementPosition LiftPinPosition

+ 2 - 1
Venus/Venus_RT/Devices/JetKepler2200BPM.cs

@@ -219,7 +219,8 @@ namespace Venus_RT.Devices
         public override double MFC6FeedBack => DEVICE.GetDevice<IoMfc>($"{Module}.MfcGas6").FeedBack;
 
         public override float ChamberTemperature => _highTemperatureHeater.HighTemperatureHighHeaterTemperature;
-
+        public override float PendulumPressure => _pendulumValve.Pressure;
+        public override float PendulumPosition => _pendulumValve.Position;
         public new ModuleName Module { get; }
 
         //public override MovementPosition LiftPinPosition

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

@@ -303,6 +303,8 @@ namespace Venus_RT.Devices
         public override double MFC7FeedBack => DEVICE.GetDevice<IoMfc>($"{Module}.MfcGas7").FeedBack;
         public override double MFC8FeedBack => DEVICE.GetDevice<IoMfc>($"{Module}.MfcGas8").FeedBack;
 
+        public override float PendulumPressure => _pendulumValve.Pressure;
+        public override float PendulumPosition => _pendulumValve.Position;
         public override bool PendulumValveIsOpen()
         {
             return _pendulumValve.IsOpen;

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

@@ -152,8 +152,14 @@ namespace Venus_RT.Devices
         public virtual double MFC6FeedBack { get; }
         public virtual double MFC7FeedBack { get; }
         public virtual double MFC8FeedBack { get; }
-
-
+        public virtual double MFC9FeedBack { get; }
+        public virtual double MFC10FeedBack { get; }
+        public virtual double MFC11FeedBack { get; }
+        public virtual double MFC12FeedBack { get; }
+
+        public virtual double HeliumFeedBack { get; }
+        public virtual float PendulumPressure { get; }
+        public virtual float PendulumPosition { get; }
         public double TMPressure { get { return Singleton<RouteManager>.Instance.TM.TMPressure; } }
 
         public bool IsTMATM

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

@@ -122,6 +122,21 @@ namespace Venus_RT.Devices
         private readonly double _foreline_interlock_pressure = 750;
 
         private readonly Dictionary<ValveType, IoValve> Valve2IO;
+        public override double MFC1FeedBack => DEVICE.GetDevice<IoMfc>($"{Module}.MfcGas1").FeedBack;
+        public override double MFC2FeedBack => DEVICE.GetDevice<IoMfc>($"{Module}.MfcGas2").FeedBack;
+        public override double MFC3FeedBack => DEVICE.GetDevice<IoMfc>($"{Module}.MfcGas3").FeedBack;
+        public override double MFC4FeedBack => DEVICE.GetDevice<IoMfc>($"{Module}.MfcGas4").FeedBack;
+        public override double MFC5FeedBack => DEVICE.GetDevice<IoMfc>($"{Module}.MfcGas5").FeedBack;
+        public override double MFC6FeedBack => DEVICE.GetDevice<IoMfc>($"{Module}.MfcGas6").FeedBack;
+        public override double MFC7FeedBack => DEVICE.GetDevice<IoMfc>($"{Module}.MfcGas7").FeedBack;
+        public override double MFC8FeedBack => DEVICE.GetDevice<IoMfc>($"{Module}.MfcGas8").FeedBack;
+        public override double MFC9FeedBack => DEVICE.GetDevice<IoMfc>($"{Module}.MfcGas9").FeedBack;
+        public override double MFC10FeedBack => DEVICE.GetDevice<IoMfc>($"{Module}.MfcGas10").FeedBack;
+        public override double MFC11FeedBack => DEVICE.GetDevice<IoMfc>($"{Module}.MfcGas11").FeedBack;
+        public override double MFC12FeedBack => DEVICE.GetDevice<IoMfc>($"{Module}.MfcGas12").FeedBack;
+        public override double HeliumFeedBack => DEVICE.GetDevice<IoMfc>($"{Module}.MfcHe").FeedBack;
+        public override float PendulumPressure => _pendulumValve.Pressure;
+        public override float PendulumPosition => _pendulumValve.Position;
         #endregion
 
         #region 构造函数

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

@@ -468,7 +468,7 @@ namespace Venus_RT.Modules.PMs
             }
             else if (result == RState.End || isMaualEndStep == true)
             {
-                if (_currentRecipe.Steps.Count > _currentStep + 1 && _currentRecipe.Steps[_currentStep + 1].Type != StepType.OverEtch)
+                if (_currentRecipe.Steps.Count > _currentStep + 1)
                 {
                     _currentRecipe.Steps[_currentStep].End();
                 }

+ 155 - 74
Venus/Venus_RT/Modules/PMs/ProcessDefine.cs

@@ -6,6 +6,7 @@ using Aitex.Core.RT.Log;
 using Venus_Core;
 using Aitex.Core.RT.SCCore;
 using Aitex.Core.RT.Tolerance;
+using System.Diagnostics;
 //#pragma warning disable 0436
 
 namespace Venus_RT.Modules.PMs
@@ -40,6 +41,10 @@ namespace Venus_RT.Modules.PMs
         private RecipeToleranceChecker _GasFlowToleranceChecker;
         private RecipeToleranceChecker _RFToleranceChecker;
         private RecipeToleranceChecker _BiasRFToleranceChecker;
+        private RecipeToleranceChecker _HeliumToleranceChecker;
+        private RecipeToleranceChecker _PressureToleranceChecker;
+
+
 
 
         private bool _isEnableMatchC1C2Offset;
@@ -47,7 +52,8 @@ namespace Venus_RT.Modules.PMs
         private bool _isEnableBiasMatchC1C2Offset;
         private int _biasMatchC1C2OffsetValue;
 
-
+        private bool _isInstalledEPD;
+        private Stopwatch _lastEPDStepTimeStopwatch;
         public ProcessHelper(JetPMBase pm)
         {
             Chamber = pm;
@@ -56,6 +62,18 @@ namespace Venus_RT.Modules.PMs
             _GasFlowToleranceChecker = new RecipeToleranceChecker(Module);
             _RFToleranceChecker = new RecipeToleranceChecker(Module);
             _BiasRFToleranceChecker = new RecipeToleranceChecker(Module);
+            _HeliumToleranceChecker = new RecipeToleranceChecker(Module);
+            _PressureToleranceChecker = new RecipeToleranceChecker(Module);
+
+            if (Chamber.ChamberType == JetChamber.Kepler2300 || Chamber.ChamberType == JetChamber.VenusSE || Chamber.ChamberType == JetChamber.VenusDE)
+            {
+                _isInstalledEPD = SC.GetValue<bool>($"{Module}.EPD.IsEnabled");
+            }
+            if (_isInstalledEPD)
+            {
+                _lastEPDStepTimeStopwatch = new Stopwatch();
+            }
+
         }
 
         private void Init()
@@ -88,9 +106,9 @@ namespace Venus_RT.Modules.PMs
             checkerHelper[$"{Module}.ESCHVUnit"] = (ProcessUnitBase unit, RecipeStep step) => ESCHVUnit_Check(unit, step);
             endHelper[$"{Module}.ESCHVUnit"] = (ProcessUnitBase unit, RecipeStep step) => ESCHVUnit_End(unit, step);
 
-            startHelper[$"{Module}.SEESCHVUnit"] = (ProcessUnitBase unit, RecipeStep step) => SEESCHVUnit_Start(unit, step);
-            checkerHelper[$"{Module}.SEESCHVUnit"] = (ProcessUnitBase unit, RecipeStep step) => SEESCHVUnit_Check(unit, step);
-            endHelper[$"{Module}.SEESCHVUnit"] = (ProcessUnitBase unit, RecipeStep step) => SEESCHVUnit_End(unit, step);
+            //startHelper[$"{Module}.SEESCHVUnit"] = (ProcessUnitBase unit, RecipeStep step) => SEESCHVUnit_Start(unit, step);
+            //checkerHelper[$"{Module}.SEESCHVUnit"] = (ProcessUnitBase unit, RecipeStep step) => SEESCHVUnit_Check(unit, step);
+            //endHelper[$"{Module}.SEESCHVUnit"] = (ProcessUnitBase unit, RecipeStep step) => SEESCHVUnit_End(unit, step);
 
             startHelper[$"{Module}.ProcessKitUnit"] = (ProcessUnitBase unit, RecipeStep step) => ProcessKitUnit_Start(unit, step);
             checkerHelper[$"{Module}.ProcessKitUnit"] = (ProcessUnitBase unit, RecipeStep step) => ProcessKitUnit_Check(unit, step);
@@ -112,7 +130,14 @@ namespace Venus_RT.Modules.PMs
         private RState PressureByPressureModeUnit_Start(ProcessUnitBase unit, RecipeStep step)
         {
             var ProcessUnit = unit as PressureByPressureModeUnit;
+            List<ToleranceObject> toleranceObjects = new List<ToleranceObject>();
 
+            if (ProcessUnit.ToleranceMode != ToleranceMode.None)
+            {
+                toleranceObjects.Add(new ToleranceObject("Pressure", ProcessUnit.StartValue, ProcessUnit.StartValueWarningRange, ProcessUnit.StartValueAlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+
+                _PressureToleranceChecker.Start(toleranceObjects);
+            }
             if (ProcessUnit.PressureUnitMode == PressureUnitMode.Pressure)
             {
                 if (Chamber.SetPVPressure(ProcessUnit.StartValue))
@@ -151,20 +176,13 @@ namespace Venus_RT.Modules.PMs
                 }
             }
 
-            if (ProcessUnit.PressureUnitMode == PressureUnitMode.Pressure)
+            if (ProcessUnit.PressureUnitMode == PressureUnitMode.Pressure && ProcessUnit.ToleranceMode != ToleranceMode.None)
             {
-                if (step.Type == StepType.Stable && Chamber.ChamberPressure == ProcessUnit.StartValue)
-                {
-                    return RState.End;
-                }
+                return _PressureToleranceChecker.Monitor(Chamber.PendulumPressure);
             }
-            else if (ProcessUnit.PressureUnitMode == PressureUnitMode.Valve)
+            else if (ProcessUnit.PressureUnitMode == PressureUnitMode.Valve && ProcessUnit.ToleranceMode != ToleranceMode.None)
             {
-                if (step.Type == StepType.Stable && Chamber.GetPVPosition() == ProcessUnit.StartValue)
-                {
-                    return RState.End;
-                }
-
+                return _PressureToleranceChecker.Monitor(Chamber.PendulumPosition);
             }
 
 
@@ -173,7 +191,11 @@ namespace Venus_RT.Modules.PMs
 
         private void PressureByPressureModeUnit_End(ProcessUnitBase unit, RecipeStep step)
         {
-
+            var ProcessUnit = unit as PressureByPressureModeUnit;
+            if (ProcessUnit.ToleranceMode != ToleranceMode.None)
+            {
+                _PressureToleranceChecker.End();
+            }
         }
 
 
@@ -266,7 +288,7 @@ namespace Venus_RT.Modules.PMs
             }
             if (ProcessUnit.ToleranceMode != ToleranceMode.None)
             {
-                _RFToleranceChecker.Monitor(Chamber.ForwardPower);
+                return _RFToleranceChecker.Monitor(Chamber.ForwardPower);
             }
 
             return RState.Running;
@@ -463,7 +485,6 @@ namespace Venus_RT.Modules.PMs
 
         private RState GasControlUnit_Start(ProcessUnitBase unit, RecipeStep step)
         {
-            List<ToleranceObject> toleranceObjects = new List<ToleranceObject>();
             Chamber.OpenValve(ValveType.GasFinal, true);
             var ProcessUnit = unit as GasControlUnit;
 
@@ -541,6 +562,7 @@ namespace Venus_RT.Modules.PMs
 
             if (ProcessUnit.ToleranceMode != ToleranceMode.None)
             {
+                List<ToleranceObject> toleranceObjects = new List<ToleranceObject>();
                 toleranceObjects.Add(new ToleranceObject("Gas1", ProcessUnit.Gas1, ProcessUnit.Gas1WarningRange, ProcessUnit.Gas1AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
                 toleranceObjects.Add(new ToleranceObject("Gas2", ProcessUnit.Gas2, ProcessUnit.Gas2WarningRange, ProcessUnit.Gas2AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
                 toleranceObjects.Add(new ToleranceObject("Gas3", ProcessUnit.Gas3, ProcessUnit.Gas3WarningRange, ProcessUnit.Gas3AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
@@ -549,10 +571,6 @@ namespace Venus_RT.Modules.PMs
                 toleranceObjects.Add(new ToleranceObject("Gas6", ProcessUnit.Gas6, ProcessUnit.Gas6WarningRange, ProcessUnit.Gas6AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
                 toleranceObjects.Add(new ToleranceObject("Gas7", ProcessUnit.Gas7, ProcessUnit.Gas7WarningRange, ProcessUnit.Gas7AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
                 toleranceObjects.Add(new ToleranceObject("Gas8", ProcessUnit.Gas8, ProcessUnit.Gas8WarningRange, ProcessUnit.Gas8AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
-            }
-
-            if (ProcessUnit.ToleranceMode != ToleranceMode.None)
-            {
                 _GasFlowToleranceChecker.Start(toleranceObjects);
             }
             return RState.Running;
@@ -575,7 +593,7 @@ namespace Venus_RT.Modules.PMs
             }
             if (ProcessUnit.ToleranceMode != ToleranceMode.None)
             {
-                _GasFlowToleranceChecker.Monitor(Chamber.MFC1FeedBack, Chamber.MFC2FeedBack, Chamber.MFC3FeedBack, Chamber.MFC4FeedBack, Chamber.MFC5FeedBack, Chamber.MFC6FeedBack, Chamber.MFC7FeedBack, Chamber.MFC8FeedBack);
+                return _GasFlowToleranceChecker.Monitor(Chamber.MFC1FeedBack, Chamber.MFC2FeedBack, Chamber.MFC3FeedBack, Chamber.MFC4FeedBack, Chamber.MFC5FeedBack, Chamber.MFC6FeedBack, Chamber.MFC7FeedBack, Chamber.MFC8FeedBack);
             }
             return RState.Running;
         }
@@ -655,11 +673,6 @@ namespace Venus_RT.Modules.PMs
                 toleranceObjects.Add(new ToleranceObject("Gas4", ProcessUnit.Gas4, ProcessUnit.Gas4WarningRange, ProcessUnit.Gas4AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
                 toleranceObjects.Add(new ToleranceObject("Gas5", ProcessUnit.Gas5, ProcessUnit.Gas5WarningRange, ProcessUnit.Gas5AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
                 toleranceObjects.Add(new ToleranceObject("Gas6", ProcessUnit.Gas6, ProcessUnit.Gas6WarningRange, ProcessUnit.Gas6AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
-            }
-
-
-            if (ProcessUnit.ToleranceMode != ToleranceMode.None)
-            {
                 _GasFlowToleranceChecker.Start(toleranceObjects);
             }
             return RState.Running;
@@ -670,7 +683,7 @@ namespace Venus_RT.Modules.PMs
             var ProcessUnit = unit as Kepler2200GasControlUnit;
             if (ProcessUnit.ToleranceMode != ToleranceMode.None)
             {
-                _GasFlowToleranceChecker.Monitor(Chamber.MFC1FeedBack, Chamber.MFC2FeedBack, Chamber.MFC3FeedBack, Chamber.MFC4FeedBack, Chamber.MFC5FeedBack, Chamber.MFC6FeedBack);
+                return _GasFlowToleranceChecker.Monitor(Chamber.MFC1FeedBack, Chamber.MFC2FeedBack, Chamber.MFC3FeedBack, Chamber.MFC4FeedBack, Chamber.MFC5FeedBack, Chamber.MFC6FeedBack);
             }
             return RState.Running;
         }
@@ -747,11 +760,36 @@ namespace Venus_RT.Modules.PMs
             {
                 Chamber.OpenValve(ValveType.PVC1, true);
             }
+
+            if (ProcessUnit.ToleranceMode != ToleranceMode.None)
+            {
+                List<ToleranceObject> toleranceObjects = new List<ToleranceObject>();
+
+                toleranceObjects.Add(new ToleranceObject("Gas1", ProcessUnit.Gas1, ProcessUnit.Gas1WarningRange, ProcessUnit.Gas1AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+                toleranceObjects.Add(new ToleranceObject("Gas2", ProcessUnit.Gas2, ProcessUnit.Gas2WarningRange, ProcessUnit.Gas2AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+                toleranceObjects.Add(new ToleranceObject("Gas3", ProcessUnit.Gas3, ProcessUnit.Gas3WarningRange, ProcessUnit.Gas3AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+                toleranceObjects.Add(new ToleranceObject("Gas4", ProcessUnit.Gas4, ProcessUnit.Gas4WarningRange, ProcessUnit.Gas4AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+                toleranceObjects.Add(new ToleranceObject("Gas5", ProcessUnit.Gas5, ProcessUnit.Gas5WarningRange, ProcessUnit.Gas5AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+                toleranceObjects.Add(new ToleranceObject("Gas6", ProcessUnit.Gas6, ProcessUnit.Gas6WarningRange, ProcessUnit.Gas6AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+                toleranceObjects.Add(new ToleranceObject("Gas7", ProcessUnit.Gas7, ProcessUnit.Gas7WarningRange, ProcessUnit.Gas7AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+                toleranceObjects.Add(new ToleranceObject("Gas8", ProcessUnit.Gas8, ProcessUnit.Gas8WarningRange, ProcessUnit.Gas8AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+                toleranceObjects.Add(new ToleranceObject("Gas9", ProcessUnit.Gas9, ProcessUnit.Gas9WarningRange, ProcessUnit.Gas9AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+                toleranceObjects.Add(new ToleranceObject("Gas10", ProcessUnit.Gas10, ProcessUnit.Gas10WarningRange, ProcessUnit.Gas10AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+                toleranceObjects.Add(new ToleranceObject("Gas11", ProcessUnit.Gas11, ProcessUnit.Gas11WarningRange, ProcessUnit.Gas11AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+                toleranceObjects.Add(new ToleranceObject("Gas12", ProcessUnit.Gas12, ProcessUnit.Gas12WarningRange, ProcessUnit.Gas12AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+
+                _GasFlowToleranceChecker.Start(toleranceObjects);
+            }
             return RState.Running;
         }
 
         private RState VenusSEGasControlUnit_Check(ProcessUnitBase unit, RecipeStep step)
         {
+            var ProcessUnit = unit as VenusSEGasControlUnit;
+            if (ProcessUnit.ToleranceMode != ToleranceMode.None)
+            {
+                return _GasFlowToleranceChecker.Monitor(Chamber.MFC1FeedBack, Chamber.MFC2FeedBack, Chamber.MFC3FeedBack, Chamber.MFC4FeedBack, Chamber.MFC5FeedBack, Chamber.MFC6FeedBack, Chamber.MFC7FeedBack, Chamber.MFC8FeedBack, Chamber.MFC9FeedBack, Chamber.MFC10FeedBack, Chamber.MFC11FeedBack, Chamber.MFC12FeedBack);
+            }
             return RState.Running;
         }
 
@@ -770,65 +808,60 @@ namespace Venus_RT.Modules.PMs
             Chamber.FlowGas(10, 0);
             Chamber.FlowGas(11, 0);
             Chamber.FlowGas(12, 0);
+            var ProcessUnit = unit as VenusSEGasControlUnit;
+            if (ProcessUnit.ToleranceMode != ToleranceMode.None)
+            {
+                _GasFlowToleranceChecker.End();
+            }
         }
 
         private RState ESCHVUnit_Start(ProcessUnitBase unit, RecipeStep step)
         {
             var ProcessUnit = unit as ESCHVUnit;
 
-            Chamber.SetESCClampVoltage(ProcessUnit.ESCClampValtage);
+            if (ProcessUnit.ESCClampValtage > 0)
+            {
+                Chamber.SetESCClampVoltage(ProcessUnit.ESCClampValtage);
+            }
+            else
+            {
+                Chamber.SetESCClampVoltage(0);
+            }
+            Chamber.SetBacksideHePressure(ProcessUnit.BacksideHelium);
 
-            Chamber.SetBacksideHePressure(ProcessUnit.BacksideHelum);
-            Chamber.SetBacksideHeThreshold(ProcessUnit.MinHeFlow, ProcessUnit.MaxHeFlow);
+            List<ToleranceObject> toleranceObjects = new List<ToleranceObject>();
+            if (ProcessUnit.ToleranceMode != ToleranceMode.None)
+            {
+                toleranceObjects.Add(new ToleranceObject("BacksideHelium", ProcessUnit.BacksideHelium, ProcessUnit.HeliumWarningRange, ProcessUnit.HeliumAlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
+                _HeliumToleranceChecker.Start(toleranceObjects);
+            }
             return RState.Running;
         }
-
         private RState ESCHVUnit_Check(ProcessUnitBase unit, RecipeStep step)
         {
             var ProcessUnit = unit as ESCHVUnit;
-            if (Chamber.BackSideHeOutOfRange && step.ElapsedTime() > ProcessUnit.CheckDelay)
+            //if (Chamber.BackSideHeOutOfRange && step.ElapsedTime() > ProcessUnit.CheckDelay)
+            //{
+            //    LOG.Write(eEvent.ERR_PROCESS, Chamber.Module, $"Step:{step.StepNo} failed, Backside Helium out of range.");
+            //    return RState.Failed;
+            //}
+            if (ProcessUnit.ToleranceMode != ToleranceMode.None)
             {
-                LOG.Write(eEvent.ERR_PROCESS, Chamber.Module, $"Step:{step.StepNo} failed, Backside Helium out of range.");
-                return RState.Failed;
+                return _HeliumToleranceChecker.Monitor(Chamber.HeliumFeedBack);
             }
-
             return RState.Running;
         }
-
-        private void SEESCHVUnit_End(ProcessUnitBase unit, RecipeStep step)
+        private void ESCHVUnit_End(ProcessUnitBase unit, RecipeStep step)
         {
             //Chamber.SetESCClampVoltage(0);
-            Chamber.SESetBacksideHeThreshold(0, 0);
-        }
-
-        private RState SEESCHVUnit_Start(ProcessUnitBase unit, RecipeStep step)
-        {
-            var ProcessUnit = unit as SEESCHVUnit;
-
-            Chamber.SetESCClampVoltage(ProcessUnit.ESCClampValtage);
-
-            Chamber.SetBacksideHePressure(ProcessUnit.BacksideHelum);
-            Chamber.SESetBacksideHeThreshold(ProcessUnit.MinHeFlow, ProcessUnit.MaxHeFlow);
-            return RState.Running;
-        }
-
-        private RState SEESCHVUnit_Check(ProcessUnitBase unit, RecipeStep step)
-        {
-            var ProcessUnit = unit as SEESCHVUnit;
-            if (Chamber.BackSideHeOutOfRange && step.ElapsedTime() > ProcessUnit.CheckDelay_ms)
+            //Chamber.SetBacksideHeThreshold(0, 0);
+            var ProcessUnit = unit as ESCHVUnit;
+            if (ProcessUnit.ToleranceMode != ToleranceMode.None)
             {
-                LOG.Write(eEvent.ERR_PROCESS, Chamber.Module, $"Step:{step.StepNo} failed, Backside Helium out of range.");
-                return RState.Failed;
+                _HeliumToleranceChecker.End();
             }
-
-            return RState.Running;
         }
 
-        private void ESCHVUnit_End(ProcessUnitBase unit, RecipeStep step)
-        {
-            Chamber.SetESCClampVoltage(0);
-            Chamber.SetBacksideHeThreshold(0, 0);
-        }
         private RState ProcessKitUnit_Start(ProcessUnitBase unit, RecipeStep step)
         {
             var ProcessUnit = unit as ProcessKitUnit;
@@ -853,8 +886,6 @@ namespace Venus_RT.Modules.PMs
         {
         }
 
-
-
         private RState RFBoxUnit_Start(ProcessUnitBase unit, RecipeStep step)
         {
             var ProcessUnit = unit as RFBoxUnit;
@@ -924,7 +955,15 @@ namespace Venus_RT.Modules.PMs
             //        Chamber.EPDStepStart(step.EPDConfig, step.StepNo);
             //        break;
             //}
-            Chamber.EPDStepStart(step.EPDConfig, step.StepNo);
+            if (_isInstalledEPD)
+            {
+                Chamber.EPDStepStart(step.EPDConfig, step.StepNo);
+
+                if (step.Type == StepType.EndPoint)
+                {
+                    _lastEPDStepTimeStopwatch.Restart();
+                }
+            }
 
             return RState.Running;
         }
@@ -936,17 +975,49 @@ namespace Venus_RT.Modules.PMs
                 case StepType.Time:
                     return step.ElapsedTime() >= step.Time * 1000 ? RState.End : RState.Running;
                 case StepType.OverEtch:
-                    return step.ElapsedTime() >= (step.GetLastEPDStepTime() * step.OverEtchPercent / 100) ? RState.End : RState.Running;
+                    var time = _lastEPDStepTimeStopwatch.ElapsedMilliseconds;
+                    return step.ElapsedTime() >= (time * step.OverEtchPercent / 100) ? RState.End : RState.Running;
                 case StepType.EndPoint:
                     if (step.ElapsedTime() > step.MaxEndPointTime * 1000)
                     {
-                        LOG.Write(eEvent.INFO_PROCESS, Chamber.Module, $"Step:{step.StepNo} timeout, did not capture endpoint signal in {step.MaxEndPointTime} seconds");
-                        return RState.End;
+                        LOG.Write(eEvent.ERR_PROCESS, Chamber.Module, $"Step:{step.StepNo} timeout, did not capture endpoint signal in {step.MaxEndPointTime} seconds");
+                        return RState.Failed;
                     }
                     else
                     {
-                        return Chamber.EPDCaptured ? RState.End : RState.Running;
+                        if (Chamber.EPDCaptured)
+                        {
+                            if (step.ElapsedTime() < step.MinEndPointTime * 1000)
+                            {
+                                LOG.Write(eEvent.ERR_PROCESS, Chamber.Module, $"Step:{step.StepNo} timeout,  capture endpoint signal less than {step.MinEndPointTime} seconds");
+                                return RState.Failed;
+                            }
+                            else
+                            {
+                                return RState.End;
+                            }
+                        }
+                        else
+                        {
+                            return RState.Running;
+                        }
+                        //return Chamber.EPDCaptured ? RState.End : RState.Running;
                     }
+                case StepType.Stable:
+                    if (step.ElapsedTime() >= step.Time * 1000)
+                    {
+                        LOG.Write(eEvent.ERR_PROCESS, Chamber.Module, $"Step:{step.StepNo} timeout, did not Stable in {step.Time} seconds");
+
+                        return RState.Failed;
+                    }
+                    else
+                    {
+                        if (_GasFlowToleranceChecker.IsStable && _PressureToleranceChecker.IsStable && _HeliumToleranceChecker.IsStable)
+                        {
+                            return RState.End;
+                        }
+                    }
+                    return RState.Running;
             }
 
             return RState.Running;
@@ -954,10 +1025,20 @@ namespace Venus_RT.Modules.PMs
 
         private RState stepEnder(RecipeStep step)
         {
-            if (step.Type == StepType.EndPoint)
+            //if (step.Type == StepType.EndPoint)
+            //{
+            //    Chamber.EPDStepStop();
+            //}
+
+            if (_isInstalledEPD)
             {
                 Chamber.EPDStepStop();
+                if (step.Type == StepType.EndPoint)
+                {
+                    _lastEPDStepTimeStopwatch.Stop();
+                }
             }
+
             return RState.End;
         }
 

+ 1 - 1
Venus/Venus_RT/Modules/TM/MFPMPickRoutine.cs

@@ -149,7 +149,7 @@ namespace Venus_RT.Modules.TM
                 case JetChamber.Kepler2200B:
          Runner.Wait(PickStepWithHeater.WaitPMReady,           () => _pmModule.IsIdle, _delay_60s)
                .Wait(PickStepWithHeater.WaitPressreDifference, TMPMPressureIsOK,   _delay_60s)
-               .Run(PickStep.OpenPMSlitDoor,                   OpenPMSlitDoor,     OpenPMSlitDoorIsOK)
+               .Run(PickStepWithHeater.OpenPMSlitDoor,                   OpenPMSlitDoor,     OpenPMSlitDoorIsOK)
                .Run(PickStepWithHeater.PMPrepare,              PMPrepare,          IsPMPrepareReady)
                .Run(PickStepWithHeater.Picking,                Picking,            WaitPickDone)
                .Run(PickStepWithHeater.QueryAWC,               QueryAWC,           WaitRobotQueryDone)