Browse Source

update cell vertical position

chenkui 1 week ago
parent
commit
dd048ffe7c

+ 3 - 2
PunkHPX8_RT/Devices/AXIS/JetAxisBase.cs

@@ -1099,7 +1099,7 @@ namespace PunkHPX8_RT.Devices.AXIS
         /// </summary>
         /// <param name="targetStation"></param>
         /// <returns></returns>
-        public bool PositionStation(string targetStation,bool isHome=false,int velocity=0,int acceleration=0,int deceleration=0, bool judgeTorqueLimit = true)
+        public bool PositionStation(string targetStation,double offset=0,bool isHome=false,int velocity=0,int acceleration=0,int deceleration=0, bool judgeTorqueLimit = true)
         {
             if (!CheckPositionIsInStation(MotionData.MotorPosition,targetStation))
             {
@@ -1112,7 +1112,7 @@ namespace PunkHPX8_RT.Devices.AXIS
                 if(result.success)
                 {
                     _targetPosition = result.position;
-                    int targetPosition = (int)Math.Round(result.position*_scaleFactor, 0);
+                    int targetPosition = (int)Math.Round((result.position+offset)*_scaleFactor, 0);
                     bool positionResult = false;
                     if (velocity != 0)
                     {
@@ -1137,6 +1137,7 @@ namespace PunkHPX8_RT.Devices.AXIS
             }
             return true;
         }
+
         /// <summary>
         /// 开始运动
         /// </summary>

+ 11 - 0
PunkHPX8_RT/Modules/EFEM/EfemPlaceRoutine.cs

@@ -17,6 +17,7 @@ using Aitex.Core.RT.Device;
 using MECF.Framework.Common.Utilities;
 using System;
 using PunkHPX8_RT.Modules.LPs;
+using PunkHPX8_RT.Modules.VpwMain;
 
 namespace PunkHPX8_RT.Modules.EFEM
 {
@@ -129,6 +130,16 @@ namespace PunkHPX8_RT.Modules.EFEM
                     return false;
                 }
             }
+            if (ModuleHelper.IsVPWCell(_targetModule) && ModuleHelper.IsInstalled(_targetModule))
+            {
+                VpwMainEntity vpwMainEntity = Singleton<RouteManager>.Instance.GetModule<VpwMainEntity>(ModuleName.VPWMain1.ToString());
+                
+                if (vpwMainEntity.IsChamberClosed)
+                {
+                    NotifyError(eEvent.ERR_EFEM_ROBOT, $"{_targetModule} door closed, can not place", -1);
+                    return false;
+                }
+            }
             if (WaferManager.Instance.CheckNoWafer(ModuleName.EfemRobot, (int)_hand))
             {
                 NotifyError(eEvent.ERR_EFEM_ROBOT, $"Efem robot arm{_hand} already has no wafer, cannot do the place action",-1);

+ 152 - 138
PunkHPX8_RT/Modules/PlatingCell/PlatingCellVerticalPositionRoutine.cs

@@ -1,42 +1,38 @@
-using Aitex.Core.RT.Device;
-using Aitex.Core.RT.Log;
-using Aitex.Core.RT.Routine;
-using Aitex.Core.RT.SCCore;
-using Aitex.Core.Util;
-using MECF.Framework.Common.Equipment;
-using MECF.Framework.Common.Persistent.Reservoirs;
-using MECF.Framework.Common.RecipeCenter;
-using MECF.Framework.Common.Routine;
-using MECF.Framework.Common.SubstrateTrackings;
-using MECF.Framework.Common.ToolLayout;
-using PunkHPX8_Core;
-using PunkHPX8_RT.Devices.AXIS;
-using PunkHPX8_RT.Devices.PlatingCell;
-using PunkHPX8_RT.Devices.Reservoir;
-using System;
-using System.Collections.Generic;
-using System.Diagnostics.Eventing.Reader;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.Windows.Media.Imaging;
-
-namespace PunkHPX8_RT.Modules.PlatingCell
-{
-    public class PlatingCellVerticalPositionRoutine : RoutineBase, IRoutine
-    {
-        private enum PositionStep
-        {
-            WaitMatcher,
-            GotoPosition,
-            GoToPositionCheck,
-            End
-        }
-
-        #region 内部变量
-        /// <summary>
-        /// vertical axis
-        /// </summary>
+using Aitex.Core.Common;
+using Aitex.Core.RT.Device;
+using Aitex.Core.RT.Log;
+using Aitex.Core.RT.Routine;
+using Aitex.Core.RT.SCCore;
+using Aitex.Core.Util;
+using MECF.Framework.Common.Equipment;
+using MECF.Framework.Common.Routine;
+using MECF.Framework.Common.SubstrateTrackings;
+using PunkHPX8_Core;
+using PunkHPX8_RT.Devices.AXIS;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics.Eventing.Reader;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media.Imaging;
+
+namespace PunkHPX8_RT.Modules.PlatingCell
+{
+    public class PlatingCellVerticalPositionRoutine : RoutineBase, IRoutine
+    {
+        private enum PositionStep
+        {
+            WaitMatcher,
+            GotoPosition,
+            GoToPositionCheck,
+            End
+        }
+
+        #region 内部变量
+        /// <summary>
+        /// vertical axis
+        /// </summary>
         private JetAxisBase _verticalAxis;
         /// <summary>
         ///  matcher集合
@@ -49,42 +45,44 @@ namespace PunkHPX8_RT.Modules.PlatingCell
         /// <summary>
         /// 位置 
         /// </summary>
-        private double _position;
-
-        private string state;
-        #endregion
-
-        /// <summary>
-        /// 构造函数
-        /// </summary>
-        /// <param name="module"></param>
-        public PlatingCellVerticalPositionRoutine(string module) : base(module)
-        {
-        }
-
-        /// <summary>
-        /// 中止
-        /// </summary>
-        public void Abort()
-        {
-            Runner.Stop("Manual Abort");
-        }
-        /// <summary>
-        /// 监控
-        /// </summary>
-        /// <returns></returns>
-        public RState Monitor()
-        {
-            Runner.Wait(PositionStep.WaitMatcher,CheckMatcher,_delay_2s)
-                .Run(PositionStep.GotoPosition, VerticalGotoPosition, 100)
-                .WaitWithStopCondition(PositionStep.GoToPositionCheck, CheckVerticalPositionStatus, CheckVerticalPositionRunStop)
-                .End(PositionStep.End, NullFun, _delay_1ms);
-            return Runner.Status;
-        }
+        private string _station;
+        /// <summary>
+        /// 偏移量
+        /// </summary>
+        private double _offset;
+        #endregion
+
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        /// <param name="module"></param>
+        public PlatingCellVerticalPositionRoutine(string module) : base(module)
+        {
+        }
+
+        /// <summary>
+        /// 中止
+        /// </summary>
+        public void Abort()
+        {
+            Runner.Stop("Manual Abort");
+        }
+        /// <summary>
+        /// 监控
+        /// </summary>
+        /// <returns></returns>
+        public RState Monitor()
+        {
+            Runner.Wait(PositionStep.WaitMatcher,CheckMatcher,_delay_2s)
+                .Run(PositionStep.GotoPosition, VerticalGotoPosition, 100)
+                .WaitWithStopCondition(PositionStep.GoToPositionCheck, CheckVerticalPositionStatus, CheckVerticalPositionRunStop)
+                .End(PositionStep.End, NullFun, _delay_1ms);
+            return Runner.Status;
+        }
         /// <summary>
         /// 检验匹配
         /// </summary>
-        /// <returns></returns>
+        /// <returns></returns>
         private bool CheckMatcher()
         {
             if (_cellEntities.Count<=1)
@@ -99,69 +97,85 @@ namespace PunkHPX8_RT.Modules.PlatingCell
                 }
             }
 
-            string firstCurrentStep = _cellEntities[0].CurrentStepState;
-            foreach (var item in _cellEntities)
+            WaferInfo firstWafer = WaferManager.Instance.GetWafer(_cellEntities[0].Module, 0);
+            WaferInfo secondWafer = WaferManager.Instance.GetWafer(_cellEntities[1].Module, 0);
+            if (firstWafer == null || secondWafer == null || firstWafer.IsEmpty || secondWafer.IsEmpty)
+            {
+                return false;
+            }
+
+            bool hasDoubleProductionWafer = firstWafer.WaferType == secondWafer.WaferType;
+            if (hasDoubleProductionWafer)
             {
-                if (item.CurrentStepState != firstCurrentStep)
+                string firstCurrentStep = _cellEntities[0].CurrentStepState;
+                foreach (var item in _cellEntities)
                 {
-                    return false;
+                    if (item.CurrentStepState != firstCurrentStep)
+                    {
+                        return false;
+                    }
                 }
-            }                 
+            }
+            else
+            {
+
+            }
             return true;
-        }
-        /// <summary>
-        /// vertical 运动到位置
-        /// </summary>
-        /// <returns></returns>
-        private bool VerticalGotoPosition()
-        {
-            if(_verticalAxis != null )
-            {
-                if (!_verticalAxis.IsSwitchOn)
-                {
-                    LOG.WriteLog(eEvent.ERR_PLATINGCELL, Module, "Vertical is not Power On");
-                    return false;
-                }
-                else if (!_verticalAxis.IsHomed)
-                {
-                    LOG.WriteLog(eEvent.ERR_PLATINGCELL, Module, "Vertical is not Home,Home vertical first");
-                    return false;
-                }
-                return _verticalAxis.ProfilePositionOperation(_position);
-
-            }
-            else
-            {
-                LOG.WriteLog(eEvent.ERR_PLATINGCELL, Module, "vertical axis is null");
-                return false;
-            }   
-        }
-        /// <summary>
-        /// 检验Vertical移动状态
-        /// </summary>
-        /// <returns></returns>
-        private bool CheckVerticalPositionStatus()
-        {
-            return _verticalAxis.Status == RState.End;
-        }
-        /// <summary>
-        /// 检验Vertical是否还在运动
-        /// </summary>
-        /// <returns></returns>
-        private bool CheckVerticalPositionRunStop()
-        {
-            return _verticalAxis.Status == RState.Failed;
-        }
-        /// <summary>
-        /// 启动
-        /// </summary>
-        /// <param name="objs"></param>
-        /// <returns></returns>
-        public RState Start(params object[] objs)
-        {
-            _position=(double)objs[0];
-            _matcher = ModuleMatcherManager.Instance.GetMatcherListByVertical(Module); //获取电机所在的platingcell 列表
-            _cellEntities.Clear();
+        }
+        /// <summary>
+        /// vertical 运动到位置
+        /// </summary>
+        /// <returns></returns>
+        private bool VerticalGotoPosition()
+        {
+            if(_verticalAxis != null )
+            {
+                if (!_verticalAxis.IsSwitchOn)
+                {
+                    LOG.WriteLog(eEvent.ERR_PLATINGCELL, Module, "Vertical is not Power On");
+                    return false;
+                }
+                else if (!_verticalAxis.IsHomed)
+                {
+                    LOG.WriteLog(eEvent.ERR_PLATINGCELL, Module, "Vertical is not Home,Home vertical first");
+                    return false;
+                }
+                return _verticalAxis.PositionStation(_station,_offset);
+
+            }
+            else
+            {
+                LOG.WriteLog(eEvent.ERR_PLATINGCELL, Module, "vertical axis is null");
+                return false;
+            }   
+        }
+        /// <summary>
+        /// 检验Vertical移动状态
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckVerticalPositionStatus()
+        {
+            return _verticalAxis.Status == RState.End;
+        }
+        /// <summary>
+        /// 检验Vertical是否还在运动
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckVerticalPositionRunStop()
+        {
+            return _verticalAxis.Status == RState.Failed;
+        }
+        /// <summary>
+        /// 启动
+        /// </summary>
+        /// <param name="objs"></param>
+        /// <returns></returns>
+        public RState Start(params object[] objs)
+        {
+            _station=objs[0].ToString();
+            _offset = (double)objs[1];
+            _matcher = ModuleMatcherManager.Instance.GetMatcherListByVertical(Module); //获取电机所在的platingcell 列表
+            _cellEntities.Clear();
             foreach (string str in _matcher) 
             {
                 if(!Enum.TryParse(str, out ModuleName moduleName))
@@ -184,10 +198,10 @@ namespace PunkHPX8_RT.Modules.PlatingCell
                 if (cellEntity.IsAuto)
                 {
                     _cellEntities.Add(cellEntity);
-                }
-            }
-            _verticalAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Vertical");
-            return Runner.Start(Module, "Start PlatingCell Vertical Initialize");
-        }
-    }
-}
+                }
+            }
+            _verticalAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Vertical");
+            return Runner.Start(Module, "Start PlatingCell Vertical Initialize");
+        }
+    }
+}

+ 1 - 1
PunkHPX8_RT/Schedulers/SchedulerSequenceRecipeManager.cs

@@ -72,7 +72,7 @@ namespace PunkHPX8_RT.Schedulers
                 {
                     DepRecipe depRecipe=(DepRecipe)recipe;
                     List<PlatingCellEntity> cells = SchedulerSequenceManager.Instance.GetAvaiblePlatingCellList(depRecipe.Chemistry, sequenceRecipe.SequenceType,sequenceRecipe.SubstrateSize, false);
-                    if (cells.Count == 0)
+                    if (cells.Count != 0&&cells.Count%2!=0)
                     {
                         if (showError)
                         {