浏览代码

Add LotTrack in KeepWet; Revise LS Type display Bug in SequenceRecipeView;

niuyx 1 月之前
父节点
当前提交
0552a2280b

+ 14 - 1
CyberX8_MainPages/ViewModels/SequenceRecipeViewModel.cs

@@ -121,6 +121,10 @@ namespace CyberX8_MainPages.ViewModels
         /// Selected Flat Type
         /// </summary>
         private PlatType _selectedPlatType;
+        /// <summary>
+        /// Selected CrsType
+        /// </summary>
+        private string _selectedCrsType = "";
         #endregion
         #region 属性
         public ObservableCollection<RecipeNode> RecipeNodes
@@ -268,7 +272,14 @@ namespace CyberX8_MainPages.ViewModels
             get { return _selectedPlatType; }
             set { SetProperty(ref _selectedPlatType, value); }
         }
-
+        /// <summary>
+        /// SelecteCrsType
+        /// </summary>
+        public string SelectedCrsType
+        {
+            get { return _selectedCrsType; }
+            set { SetProperty(ref _selectedCrsType, value); }
+        }
         #endregion
 
         #region 指令
@@ -400,6 +411,7 @@ namespace CyberX8_MainPages.ViewModels
                         ProcessRecipes.AddRange(Recipe.Recipes);
                     }
                     SelectedPlatType = (PlatType)Recipe.PlatType;
+                    SelectedCrsType = CrsTypeLst.FirstOrDefault(O => O.Contains(Recipe.CrsType));
                 }
                 else
                 {
@@ -546,6 +558,7 @@ namespace CyberX8_MainPages.ViewModels
                 Recipe.Recipes.AddRange(ProcessRecipes);
                 Recipe.SaveDate = DateTime.Now;
                 Recipe.PlatType = (int)SelectedPlatType;
+                Recipe.CrsType = SelectedCrsType;
                 try
                 {
                     _uiRecipeManager.SaveRecipe<SequenceRecipe>(ENGINEERING, Recipe.Ppid, "seq",Recipe);

+ 2 - 2
CyberX8_MainPages/Views/SequenceRecipeView.xaml

@@ -127,11 +127,11 @@
                     <RowDefinition/>
                 </Grid.RowDefinitions>
                 <GroupBox Header="Substrate Size" IsEnabled="{Binding Enable}">
-                    <ComboBox Height="30" Margin="0,0,20,0" ItemsSource="{Binding WaferSizeLst}" SelectedItem="{Binding Recipe.SubstrateSize}">
+                    <ComboBox Height="30" Margin="0,0,20,0" ItemsSource="{Binding WaferSizeLst}" SelectedItem="{Binding Recipe.SubstrateSize, Mode=TwoWay}">
                     </ComboBox>
                 </GroupBox>
                 <GroupBox Grid.Row="1" Header="LS Type" IsEnabled="{Binding Enable}">
-                    <ComboBox Height="30" Margin="0,0,20,0" ItemsSource="{Binding CrsTypeLst}" SelectedItem="{Binding Recipe.CrsType}">
+                    <ComboBox Height="30" Margin="0,0,20,0" ItemsSource="{Binding CrsTypeLst}" SelectedItem="{Binding SelectedCrsType, Mode=TwoWay}">
                     </ComboBox>
                 </GroupBox>
                 <GroupBox Grid.Row="2" Header="Plat Type" IsEnabled="{Binding Enable}">

+ 5 - 0
CyberX8_RT/Modules/Prewet/PrewetDelayKeepwetRoutine.cs

@@ -3,6 +3,7 @@ using Aitex.Core.RT.Routine;
 using Aitex.Core.RT.SCCore;
 using CyberX8_Core;
 using CyberX8_RT.Devices.LinMot;
+using MECF.Framework.Common.CommonData.Prewet;
 using MECF.Framework.Common.Routine;
 using MECF.Framework.Common.Utilities;
 using System;
@@ -42,6 +43,10 @@ namespace CyberX8_RT.Modules.Prewet
         private PrewetKeepWetRoutine _prewetKeepWetRoutine;
         #endregion
         /// <summary>
+        /// LotTrack数据
+        /// </summary>
+        public List<PrewetLotTrackData> PrewetLotTrackDatas { get { return _prewetKeepWetRoutine.PrewetLotTrackDatas; } }
+        /// <summary>
         /// 构造函数
         /// </summary>
         /// <param name="module"></param>

+ 6 - 0
CyberX8_RT/Modules/Prewet/PrewetEntity.cs

@@ -544,10 +544,16 @@ namespace CyberX8_RT.Modules.Prewet
             RState ret = _delayKeepwetRoutine.Monitor();
             if(ret==RState.End)
             {
+                //导出lotTrack数据
+                PrewetLotTrackUtil.ExportPrewetLotTrack(Module.ToString(), _delayKeepwetRoutine.PrewetLotTrackDatas,
+                    null, IsAuto, true);
                 return true;
             }
             else if(ret==RState.Failed||ret==RState.Timeout)
             {
+                //导出lotTrack数据
+                PrewetLotTrackUtil.ExportPrewetLotTrack(Module.ToString(), _delayKeepwetRoutine.PrewetLotTrackDatas,
+                    null, IsAuto, true);
                 PostMsg(PrewetMsg.Error);
                 return false;
             }

+ 59 - 1
CyberX8_RT/Modules/Prewet/PrewetKeepWetRoutine.cs

@@ -5,12 +5,16 @@ using CyberX8_Core;
 using CyberX8_RT.Devices.LinMot;
 using CyberX8_RT.Devices.Prewet;
 using MECF.Framework.Common.Alarm;
+using MECF.Framework.Common.CommonData.Prewet;
 using MECF.Framework.Common.Routine;
+using System;
+using System.Collections.Generic;
 
 namespace CyberX8_RT.Modules.Prewet
 {
     public class PrewetKeepWetRoutine : RoutineBase, IRoutine
     {
+        private const int LOTTRACK_TIME = 1000;
         private enum KeepwetStep
         {
             Idle_KeepwetPrepare,
@@ -29,6 +33,18 @@ namespace CyberX8_RT.Modules.Prewet
         /// linmot axis
         /// </summary>
         private LinMotAxis _linMotAxis;
+        /// <summary>
+        /// Lottrack time
+        /// </summary>
+        private DateTime _lotTackTime = DateTime.Now;
+        /// <summary>
+        /// LotTrack数据
+        /// </summary>
+        private List<PrewetLotTrackData> _datas = new List<PrewetLotTrackData>();
+        /// <summary>
+        /// LotTrack数据
+        /// </summary>
+        public List<PrewetLotTrackData> PrewetLotTrackDatas { get { return _datas; } }
         #endregion
         /// <summary>
         /// 构造函数
@@ -57,6 +73,7 @@ namespace CyberX8_RT.Modules.Prewet
         /// <returns></returns>
         public RState Monitor()
         {
+            LottrackRecord();
             Runner.Run(KeepwetStep.Idle_KeepwetPrepare, ResetLinmot, _delay_1ms)
                 .WaitWithStopCondition(KeepwetStep.Idle_KeepwetPrepareWait, CheckResetLinmotEndStatus, CheckResetLinmotStopStatus)
                 .Run(KeepwetStep.Idle_KeepWetStart, ExecuteWetScan, _delay_1s)
@@ -94,7 +111,12 @@ namespace CyberX8_RT.Modules.Prewet
         /// <returns></returns>
         private bool CheckResetLinmotStopStatus()
         {
-            return _linMotAxis.Status == RState.Failed || _linMotAxis.Status == RState.Timeout;
+            if(_linMotAxis.Status == RState.Failed || _linMotAxis.Status == RState.Timeout)
+            {
+                AddLotTrackData();
+                return true;
+            }
+            return false;
         }
         /// <summary>
         /// execute Keep Wet Scan
@@ -178,6 +200,7 @@ namespace CyberX8_RT.Modules.Prewet
             }
             else
             {
+                AddLotTrackData();
                 _prewetDevice.PumpValveClose();
                 return true;
             }
@@ -226,7 +249,42 @@ namespace CyberX8_RT.Modules.Prewet
         public RState Start(params object[] objs)
         {
             _prewetDevice = DEVICE.GetDevice<PrewetDevice>(Module);
+            _datas.Clear();
+            _lotTackTime = DateTime.Now;
             return Runner.Start(Module, "Start Keepwet");
         }
+        /// <summary>
+        /// 记录Lottrack
+        /// </summary>
+        private void LottrackRecord()
+        {
+            //记录Lottrack
+            if (DateTime.Now.Subtract(_lotTackTime).TotalMilliseconds >= LOTTRACK_TIME)
+            {
+                AddLotTrackData();
+                _lotTackTime = DateTime.Now;
+            }
+        }
+        /// <summary>
+        /// 获取Lot Track数据
+        /// </summary>
+        /// <returns></returns>
+        private void AddLotTrackData()
+        {
+            PrewetLotTrackData data = new PrewetLotTrackData();
+            data.TimeStamp = DateTime.Now;
+            data.StateMachine = Runner.CurrentStep.ToString();
+            data.Pressure = _prewetDevice.PrewetPumpData.PumpPressureData.Value;
+            data.Flow = _prewetDevice.PrewetPumpData.PumpFlowData.Value;
+            data.PumpMode = _prewetDevice.PrewetPumpData.PumpModel;
+            data.PressureTarget = _prewetDevice.PrewetPumpData.PressureTarget;
+            data.CurrentScan = _linMotAxis.ScanCount;
+            data.ScanOn = _linMotAxis.IsMotorOn;
+            data.ValveState = _prewetDevice.PrewetPumpData.PumpValve;
+            data.PumpSpeed = _prewetDevice.LastPumpSpeed;
+            data.PumpControlCurrent = _prewetDevice.PrewetPumpData.PumpCurrent;
+
+            _datas.Add(data);
+        }
     }
 }

+ 2 - 1
Framework/Common/RecipeCenter/RecipeFileManager.cs

@@ -568,8 +568,9 @@ namespace Aitex.Core.RT.RecipeCenter
                 string fullName = $"{recipeDir}{root}\\{recipeName}.{recipeType}.rcp";
                 CustomXmlSerializer.Serialize(recipe, fullName);
             }
-            catch
+            catch (Exception ex)
             {
+                LOG.Write(eEvent.ERR_EXCEPTION, "Recipe", "Saving Recipe is failed. Can't access the target recipe file");
             }
         }