ソースを参照

1revise UI create new role bug
2reivse keep wet bug。
3add rinse sock time monitor
4revise sequence recipe wafersize view bug

chenzk 1 日 前
コミット
8e08f8bdac

+ 1 - 0
CyberX8_MainPages/ViewModels/SequenceRecipeViewModel.cs

@@ -341,6 +341,7 @@ namespace CyberX8_MainPages.ViewModels
         {
             //Wafer尺寸集合
             WaferSizeLst = new List<int>();
+            WaferSizeLst.Add(0);
             WaferSizeLst.Add(100);
             WaferSizeLst.Add(150);
             WaferSizeLst.Add(200);

+ 1 - 1
CyberX8_RT/Devices/Loader/LoaderLoadRoutine.cs

@@ -569,7 +569,7 @@ namespace CyberX8_RT.Devices.Loader
             WaferHolderInfo waferHolderInfo = WaferHolderManager.Instance.GetWaferHolder("Loader");
             if (waferHolderInfo != null)
             {
-                if (!string.IsNullOrEmpty(waferHolderInfo.CrsAId)&&_side=="SideA")
+                if (!string.IsNullOrEmpty(waferHolderInfo.CrsAId) && _side == "SideA")
                 {
                     waferHolderInfo.CrsATotalUses++;
                     WaferHolderManager.Instance.UpdateWaferHolderInfo(waferHolderInfo);

+ 46 - 0
CyberX8_RT/Modules/Rinse/RinseEntity.cs

@@ -89,6 +89,18 @@ namespace CyberX8_RT.Modules.Rinse
         /// 是否Retry
         /// </summary>
         private bool _isRetry = false;
+        /// <summary>
+        /// 当前recipe是否完成
+        /// </summary>
+        private bool _isCurrentReceipeComplete;
+        /// <summary>
+        ///  当前wafershuttle开始浸泡时间
+        /// </summary>
+        private DateTime _currentWaferShuttleStartSoakTime;
+        /// <summary>
+        /// Wafershuttle最浸泡超时waring时长
+        /// </summary>
+        private int _waferShuttleSoakMaxTime;
 
         #region 计算recipe运行时间相关的配置文件参数
         /// <summary>
@@ -289,6 +301,7 @@ namespace CyberX8_RT.Modules.Rinse
             Transition(RinseState.RunReciping, FSM_MSG.TIMER, RunRecipeMonitor, RinseState.RunRecipeComplete);
             Transition(RinseState.RunRecipeComplete, RinseMsg.RecipeComplete, NullFunc, RinseState.Idle);
             Transition(RinseState.RunReciping, RinseMsg.Abort, RunRecipeAbort, RinseState.Abort);
+            Transition(RinseState.Idle, FSM_MSG.TIMER, RinseCompleteSoakTimeMonitor, RinseState.Idle);
             //KeepWet
             Transition(RinseState.RunRecipeComplete, RinseMsg.Keepwet, Keepwet, RinseState.KeepWeting);
             Transition(RinseState.KeepWetComplete, RinseMsg.Keepwet, Keepwet, RinseState.KeepWeting);
@@ -316,6 +329,8 @@ namespace CyberX8_RT.Modules.Rinse
             {
                 LOG.WriteLog(eEvent.ERR_RESERVOIR, Module.ToString(), "Persistent Value Object is not exist");
             }
+            _isCurrentReceipeComplete = false;
+            _waferShuttleSoakMaxTime = SC.GetValue<int>($"QDR.PickupDelayWarningSeconds");
         }
         /// <summary>
         /// 初始化DATA
@@ -588,6 +603,11 @@ namespace CyberX8_RT.Modules.Rinse
                 if (WaferHolderInfo != null && _currentRecipe != null)
                 {
                     FaModuleNotifier.Instance.NotifyWaferShuttleRecipeEnd(WaferHolderInfo, _currentRecipe.Ppid, timeLength);
+                    if (_persistentValue.OperatingMode == "Auto")
+                    {
+                        _isCurrentReceipeComplete = true;
+                        _currentWaferShuttleStartSoakTime = DateTime.Now;
+                    }
                 }
             }
             return result;
@@ -620,6 +640,32 @@ namespace CyberX8_RT.Modules.Rinse
                 _cycleManualProcessRoutine.RinseLotTrackHeaderDatas, IsAuto, _isRetry);
             return true;
         }
+        /// <summary>
+        /// Rinse完成recipe后监控wafershuttle浸泡时间
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool RinseCompleteSoakTimeMonitor(object[] param)
+        {
+            if (WaferHolderInfo != null && _persistentValue.OperatingMode == "Auto")
+            {
+                double sockSeconds = (DateTime.Now - _currentWaferShuttleStartSoakTime).TotalSeconds;
+                if (_isCurrentReceipeComplete && sockSeconds > _waferShuttleSoakMaxTime)
+                {
+                    if (!AlarmListManager.Instance.IsContainDataWarn(Module.ToString(), "RinseSockTime"))
+                    {
+                        AlarmListManager.Instance.AddWarn(Module.ToString(),
+                           $"RinseSockTime", $"Current waferShuttle:{WaferHolderInfo.Id} sock time is over PickupDelayWarningSeconds:{_waferShuttleSoakMaxTime} seconds");
+                        LOG.WriteLog(eEvent.WARN_RINSE, Module.ToString(), $"Current waferShuttle:{WaferHolderInfo.Id} sock time is over PickupDelayWarningSeconds:{_waferShuttleSoakMaxTime} seconds");
+                    }
+                }
+            }
+            else
+            {
+                _isCurrentReceipeComplete = false;  //wafershuttle拿走后重置当前recipe是否完成变量
+            }
+            return true;
+        }
         #endregion
 
         #region Keepwet

+ 9 - 5
CyberX8_RT/Modules/Rinse/RinseKeepwetRoutine.cs

@@ -22,6 +22,7 @@ namespace CyberX8_RT.Modules.Rinse
         private const string DI_WATER_PRESSURE_VALUE = "DiWaterPressure";
         private enum KeepwetStep
         {
+            CloseDumpValve,
             KeepWetStart,
             KeepWetWait,
             CloseFillValve,
@@ -71,6 +72,8 @@ namespace CyberX8_RT.Modules.Rinse
         /// </summary>
         public void Abort()
         {
+            _device.FillValveOff();
+            _device.DrainValveOn();
             Runner.Stop("Manual Abort");
         }
         /// <summary>
@@ -80,11 +83,12 @@ namespace CyberX8_RT.Modules.Rinse
         public RState Monitor()
         {
             LottrackRecord();
-            Runner.Run(KeepwetStep.KeepWetStart, () => _device.FillValveOn(), _delay_1ms)
-             .Wait(KeepwetStep.KeepWetWait, CheckFillFullStatus)
-             .Wait(KeepwetStep.CloseFillValve, () => _device.FillValveOff(), _delay_1ms)
-             .Wait(KeepwetStep.KeepWetSlowDrain, CheckDrainStatus)
-             .End(KeepwetStep.End, NullFun, _delay_1ms);
+            Runner.Run(KeepwetStep.CloseDumpValve, () => _device.DrainValveOff(), _delay_1ms)
+                .Run(KeepwetStep.KeepWetStart, () => _device.FillValveOn(), _delay_1ms)
+               .Wait(KeepwetStep.KeepWetWait, CheckFillFullStatus)
+               .Run(KeepwetStep.CloseFillValve, () => _device.FillValveOff(), _delay_1ms)
+               .Wait(KeepwetStep.KeepWetSlowDrain, CheckDrainStatus)
+               .End(KeepwetStep.End, NullFun, _delay_1ms);
             return Runner.Status;
         }
         /// <summary>

+ 14 - 8
CyberX8_UI/Views/ShellView.xaml.cs

@@ -322,11 +322,14 @@ namespace CyberX8_UI.Views
                                 SubItem secSubItem = subitem.MenuItem[k];
                                 if (!string.IsNullOrEmpty(secSubItem.View))
                                 {
-                                    TabItem tabItem = _multiMenuItemsDictionary[$"{secSubItem.Name}.{secSubItem.Id}"];
-                                    Control control = (tabItem.Content as Control);
-                                    if (submenus[k] != null && submenus[k].Permission == MenuPermission.ReadWrite)
+                                    if (_multiMenuItemsDictionary.ContainsKey($"{secSubItem.Name}.{secSubItem.Id}"))
                                     {
-                                        control.IsEnabled = true;
+                                        TabItem tabItem = _multiMenuItemsDictionary[$"{secSubItem.Name}.{secSubItem.Id}"];
+                                        Control control = (tabItem.Content as Control);
+                                        if (submenus[k] != null && submenus[k].Permission == MenuPermission.ReadWrite)
+                                        {
+                                            control.IsEnabled = true;
+                                        }
                                     }
                                 }
                                 if (secSubItem.MultiItem != null)
@@ -337,11 +340,14 @@ namespace CyberX8_UI.Views
                                         SubItem hideSubItem = secSubItem.MultiItem[h];
                                         if (hideSubItem.View != null)
                                         {
-                                            TabItem tabItem = _multiMenuItemsDictionary[$"{hideSubItem.ModuleName}.{hideSubItem.Id}"];
-                                            Control control = (tabItem.Content as Control);
-                                            if (secSubmenus[h] != null && secSubmenus[h].Permission == MenuPermission.ReadWrite)
+                                            if (_multiMenuItemsDictionary.ContainsKey($"{hideSubItem.ModuleName}.{hideSubItem.Id}"))
                                             {
-                                                control.IsEnabled = true;
+                                                TabItem tabItem = _multiMenuItemsDictionary[$"{hideSubItem.ModuleName}.{hideSubItem.Id}"];
+                                                Control control = (tabItem.Content as Control);
+                                                if (h < secSubmenus.Count && secSubmenus[h] != null && secSubmenus[h].Permission == MenuPermission.ReadWrite)
+                                                {
+                                                    control.IsEnabled = true;
+                                                }
                                             }
                                         }
                                     }