Kaynağa Gözat

Interlock 优化

sangwq 2 yıl önce
ebeveyn
işleme
6187ad5b4f

BIN
Venus/Venus_RT/Config/Interlock.Venus.xml


+ 1 - 0
Venus/Venus_RT/Config/System.sccfg

@@ -14,6 +14,7 @@
 		<config default="1" name="MaxTemperatureToleranceToTarget" nameView="Max Temperature Tolerance To Target" description="工艺最大温度差" max="100" min="1" paramter="" tag="" unit="℃" type="Double" />
 		<!--<config default="30" name="DefaultCoolingTime" nameView="Default Cooling Time" description="晶圆默认冷却时间" max="300" min="1" paramter="" tag="" unit="s" type="Integer" />-->
 		<config default="true" name="DisplayPopDialogWhenJobComplete" nameView="Pop Dialog When Job Complete" description="是否弹出Job结束对话框" max="" min="" paramter="" tag="" unit="" type="Bool" />
+		<config default="100" name="PMLLMaxPressureDifference" nameView="Max Pressure difference for open slit valve" description="" max="500" min="20" paramter="" tag="" unit="mtorr" type="Double" />
 
 		<!--FA-->
 		<configs name="FA" nameView="FA" visible="false">

+ 4 - 5
Venus/Venus_RT/Devices/ESC5HighVoltage.cs

@@ -94,7 +94,7 @@ namespace Venus_RT.Devices
 
         private Operation _lastReadCommand = Operation.Invalid;
         private string _lastAlarmString = string.Empty;
-        private const string EOF = "\r\n>";
+        private const string EOF = ">";
 
         private Regex _rex = new Regex(@"[0-9]{1,4}");
 
@@ -167,17 +167,16 @@ namespace Venus_RT.Devices
                 switch (operation)
                 {
                     case "SB\r":
-                        
                         if(int.TryParse(obj.Substring(3,4), out nData))
                         {
-                            OutputVoltage = nData;
-                            LOG.Write(eEvent.EV_DEVICE_INFO, Module, $" HV OutputVoltage: {OutputVoltage}");
+                            IsOn = (nData & 0x04) != 0;
                         }
                         break;
                     case "RV\r":
                         if (int.TryParse(obj.Substring(5, 4), out nData))
                         {
-                            IsOn = (nData & 0x04) != 0;
+                            OutputVoltage = nData;
+                            LOG.Write(eEvent.EV_DEVICE_INFO, Module, $" HV OutputVoltage: {OutputVoltage}");
                         }
                         break;
                 }

+ 5 - 2
Venus/Venus_RT/Devices/JetPM.cs

@@ -661,17 +661,20 @@ namespace Venus_RT.Devices
                 gas.Monitor();
             }
 
-            //CheckInterlock();
+            CheckPermanentInterlock();
         }
 
-        public void CheckInterlock()
+        private void CheckPermanentInterlock()
         {
             if (ProcessPressure > 100 && _GuageValve.SetPoint)
             {
                 _GuageValve.TurnValve(false, out _);
                 LOG.Write(eEvent.WARN_DEVICE_INFO, Module, $"Process pressure:{ProcessPressure} exceed 100 mtorr, Guage Valve (DO-31) closed automaticlly.");
             }
+        }
 
+        public void CheckIdleInterlock()
+        {
             if(ForelinePressure > _foreline_interlock_pressure)
             {
                 if(_TurboPumpPumpingValve.SetPoint || _TurboPumpPurgeValve.SetPoint || _pendulumValve.IsOpen)

+ 5 - 4
Venus/Venus_RT/Devices/PendulumValve.cs

@@ -156,6 +156,7 @@ namespace Venus_RT.Devices
 
         private readonly string EOF = "\r\n";
         private readonly int _readInterval = 1000;
+        private readonly int _position_unit = 100;
         private int _queryFlag = 0;
         private readonly AsyncSerialPort _serial;
         private Stopwatch _queryWatch = new Stopwatch();
@@ -234,7 +235,7 @@ namespace Venus_RT.Devices
                         {
                             int position;
                             if (int.TryParse(data[1], out position))
-                                Position = position / 1000;
+                                Position = position / _position_unit;
                         }
                         break;
                     case "i":
@@ -363,7 +364,7 @@ namespace Venus_RT.Devices
             if(_CheckStatus())
             {
                 IsOpen = postion > 0;
-                return SendCommand(Operation.SetPosition, postion * 1000);
+                return SendCommand(Operation.SetPosition, postion * _position_unit);
             }
 
             return false;
@@ -413,8 +414,8 @@ namespace Venus_RT.Devices
 
             if (_chamber.ForelinePressure > 500)
             {
-                if(IsOpen)
-                    LOG.Write(eEvent.WARN_DEVICE_INFO, Module, $"Foreline Pressure:{_chamber.ForelinePressure} is too high, can not turn on pendulum valve.");
+                
+                LOG.Write(eEvent.WARN_DEVICE_INFO, Module, $"Foreline Pressure:{_chamber.ForelinePressure} is too high, can not turn on pendulum valve.");
                 //_noRepeatAlarm($"Foreline Pressure:{_chamber.ForelinePressure} is too high, can not turn on pendulum valve.");
                 return false;
             }

+ 4 - 3
Venus/Venus_RT/Modules/PMs/PMEntity.cs

@@ -391,14 +391,14 @@ namespace Venus_RT.Modules.PMs
 
         private bool FnIdleTimeout(object[] objs)
         {
-            _chamber.CheckInterlock();
-            _debugRoutine();
+            _chamber.CheckIdleInterlock();
+            //_debugRoutine();
             return true;
         }
 
         private bool FnErrorTimeout(object[] objs)
         {
-            _debugRoutine();
+            //_debugRoutine();
             return true;
         }
 
@@ -769,6 +769,7 @@ namespace Venus_RT.Modules.PMs
         }
         private bool FnProcessTimeout(object[] param)
         {
+            _chamber.CheckIdleInterlock();
             RState ret = _processRoutine.Monitor();
             if (ret == RState.Failed || ret == RState.Timeout)
             {

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

@@ -120,6 +120,12 @@ namespace Venus_RT.Modules.PMs
                 return RState.Failed;
             }
 
+            if (!_chamber.IsRFGInterlockOn)
+            {
+                Stop("射频电源 Interlock条件不满足");
+                return RState.Failed;
+            }
+
             if (!CheckSlitDoor() || !CheckDryPump() || !CheckTurboPump())
             {
                 return RState.Failed;
@@ -289,6 +295,7 @@ namespace Venus_RT.Modules.PMs
             var result = step.Run();
             if(result == RState.Failed)
             {
+                UpdateWaferStatus(false);
                 Runner.Stop($"Recipe:{CurrentRunningRecipe}, Step:{_currentStep + 1} Failed");
                 return true;
             }
@@ -335,8 +342,17 @@ namespace Venus_RT.Modules.PMs
             return true;
         }
 
-        private void UpdateWaferStatus()
+        private void UpdateWaferStatus(bool bDone = true)
         {
+            if(bDone == false)
+            {
+                WaferManager.Instance.UpdateWaferProcessStatus(ModuleName.PMA, 0, EnumWaferProcessStatus.Failed);
+                if(_currentRecipe.Header.Type == RecipeType.Chuck)
+                {
+                    // set wafer chucked flag even if the chuck recipe failed.
+                    WaferManager.Instance.UpdateWaferChuckStatus(ModuleName.PMA, 0, EnumWaferChuckStatus.Chucked);
+                }
+            }
             switch(_currentRecipe.Header.Type)
             {
                 case RecipeType.Process:

+ 4 - 4
Venus/Venus_Simulator/Devices/ESCHVMockPMA.cs

@@ -62,16 +62,16 @@ namespace Venus_Simulator.Devices
                     break;
                 case "RV":
                     int out_valtage = _simEscHvStatus == EscHvStatus.ON ? _voltage + _rd.Next(-3, 5) : 0;
-                    sRes = $"{out_valtage}\r\n>";
+                    sRes = string.Format("RV\r\n\r{0:D4}\n\r>", out_valtage);//$"{out_valtage}\n\r>";
                     break;
                 case "R+":
-                    sRes = $"{_rd.Next(0, _current_limit)}\r\n>";
+                    sRes = $"{_rd.Next(0, _current_limit)}\n\r>";
                     break;
                 case "R-":
-                    sRes = $"{_rd.Next(0, -_current_limit)}\r\n>";
+                    sRes = $"{_rd.Next(0, -_current_limit)}\n\r>";
                     break;
                 case "SB":
-                    sRes = $"{(_simEscHvStatus == EscHvStatus.ON ? 4 : 0)}\r\n>";
+                    sRes = string.Format("SB\r{0:D4}\n\r>", _simEscHvStatus == EscHvStatus.ON ? 4 : 0); //$"{(_simEscHvStatus == EscHvStatus.ON ? 4 : 0)}\r\n>";
                     break;
                 case "EV":
                     _simEscHvStatus = EscHvStatus.ON;