浏览代码

add platingcell reclaim/rinse/dry routine

chenzk 1 周之前
父节点
当前提交
673ea4850b

+ 5 - 0
PunkHPX8_RT/Config/System.sccfg

@@ -347,6 +347,11 @@
 		<config default="1000" name="ClamShellOpenCheckDelay" nameView="ClamShellOpenCheckDelay" description="ClamShell Open Check Delay" max="100000" min="0" paramter="" tag="" unit="ms" type="Integer"></config>
 		<config default="5" name="ClamShellCloseDistanceThreshold" nameView="ClamShellCloseDistanceThreshold" description="Clam Shell Close DistanceT hreshold" max="1000" min="0" paramter="" tag="" unit="mm" type="Integer"></config>
 		<config default="55" name="ClamShellOpenDistanceThreshold" nameView="ClamShellOpenDistanceThreshold" description="Clam Shell Open DistanceT hreshold" max="1000" min="0" paramter="" tag="" unit="mm" type="Integer"></config>
+		<config default="50" name="ReclaimSpeed" nameView="ReclaimSpeed" description="Reclaim Speed" max="1000" min="0" paramter="" tag="" unit="mm/s" type="Integer"></config>
+		<config default="400" name="ReclaimAcceleration" nameView="ReclaimAcceleration" description="Reclaim Acceleration" max="10000" min="0" paramter="" tag="" unit="mm/s^2" type="Integer"></config>
+		<config default="1000" name="ReclaimJerk" nameView="ReclaimJerk" description="Reclaim Jerk" max="10000" min="0" paramter="" tag="" unit="mm/s^3" type="Integer"></config>
+		<config default="false" name="PostProcessCurrentEnable" nameView="PostProcessCurrentEnable" description="Post Process Current Enable" max="" min="" paramter="" tag="" unit="" type="Bool"/>
+		<config default="0.1" name="PostProcessCurrentSetPoint" nameView="PostProcessCurrentSetPoint" description="Post Process Current SetPoint" max="10" min="0" paramter="" tag="A" unit="" type="Double"></config>
 		<configs name="CSR" nameView="CSR">
 			<config default="true" name="CSREnable" nameView="CSREnable" description="CSR Enabled" max="" min="" paramter="" tag="" unit="" type="Bool"/>
 			<config default="80" name="RinseSpeed" nameView="RinseSpeed" description="Rinse Speed" max="1000" min="0" paramter="" tag="" unit="rpm" type="Integer"></config>

+ 0 - 6
PunkHPX8_RT/Modules/PlatingCell/PlatingCellDepositionRoutine.cs

@@ -67,10 +67,6 @@ namespace PunkHPX8_RT.Modules.PlatingCell
         /// </summary>
         private PlatingCellVerticalEntity _verticalEntity;
         /// <summary>
-        /// vertical 轴的位置数据
-        /// </summary>
-        private BeckhoffStationAxis _verticalBeckhoffStation;
-        /// <summary>
         /// 不通电
         /// </summary>
         private bool _isZeroCurrent = false;
@@ -297,8 +293,6 @@ namespace PunkHPX8_RT.Modules.PlatingCell
             //获取vertical entity
             string vertical = ModuleMatcherManager.Instance.GetPlatingVerticalByCell(Module);
             _verticalEntity = Singleton<RouteManager>.Instance.GetModule<PlatingCellVerticalEntity>(vertical);
-            //获取vertical station信息对象
-            _verticalBeckhoffStation = BeckhoffStationLocationManager.Instance.GetStationAxis($"{_verticalEntity.Module}", "Vertical");
             return Runner.Start(Module, "start intervale rinse");
         }
     }

+ 150 - 0
PunkHPX8_RT/Modules/PlatingCell/PlatingCellDryRoutine.cs

@@ -0,0 +1,150 @@
+using Aitex.Core.RT.Device;
+using Aitex.Core.RT.Routine;
+using Aitex.Core.Util;
+using MECF.Framework.Common.RecipeCenter;
+using MECF.Framework.Common.Routine;
+using MECF.Framework.Common.Utilities;
+using PunkHPX8_Core;
+using PunkHPX8_RT.Devices.AXIS;
+using PunkHPX8_RT.Devices.PlatingCell;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace PunkHPX8_RT.Modules.PlatingCell
+{
+    public class PlatingCellDryRoutine : RoutineBase, IRoutine
+    {
+        private enum RunRecipeStep
+        {
+            VerticalGotoDry,
+            CheckVerticalGotoDry,
+            ChangeRotation,
+            RotationDelay,
+            RotationStop,
+            CheckRotationStoped,
+            End
+        }
+        #region 常量
+        #endregion
+
+        /// <summary>
+        /// recipe
+        /// </summary>
+        private DepRecipe _recipe;
+        /// <summary>
+        /// Rotation axis
+        /// </summary>
+        private JetAxisBase _rotationAxis;
+        /// <summary>
+        /// Platingcell device
+        /// </summary>
+        private PlatingCellDevice _device;
+        /// <summary>
+        /// vertical axis entity
+        /// </summary>
+        private PlatingCellVerticalEntity _verticalEntity;
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        /// <param name="module"></param>
+        public PlatingCellDryRoutine(string module) : base(module)
+        {
+
+        }
+        /// <summary>
+        /// 中止
+        /// </summary>
+        public void Abort()
+        {
+            Runner.Stop("Manual Abort");
+        }
+        /// <summary>
+        /// 监控
+        /// </summary>
+        /// <returns></returns>
+        public RState Monitor()
+        {
+            Runner.RunIf(RunRecipeStep.VerticalGotoDry, _recipe.RinseZoffset != _recipe.DryZoffset,() => StartVertical("Risne", _recipe.DryZoffset, 0, 0), _delay_1ms)
+                  .WaitWithStopConditionIf(RunRecipeStep.CheckVerticalGotoDry, _recipe.RinseZoffset != _recipe.DryZoffset, CheckVerticalEnd, CheckVerticalError)
+                  .Run(RunRecipeStep.ChangeRotation, () => ChangeRotationSpeed(_recipe.DrySpeed), _delay_1ms)
+                  .Delay(RunRecipeStep.RotationDelay, _recipe.DryTime * 1000)
+                  .Run(RunRecipeStep.RotationStop,  _rotationAxis.StopPositionOperation, _delay_1ms)
+                  .WaitWithStopCondition(RunRecipeStep.CheckRotationStoped, CheckRotationPositionStatus, CheckRotationPositionRunStop)
+                  .End(RunRecipeStep.End, NullFun);
+            return Runner.Status;
+        }
+
+        /// <summary>
+        /// rotation改变速度
+        /// </summary>
+        /// <param name="speed"></param>
+        /// <returns></returns>
+        private bool ChangeRotationSpeed(int speed)
+        {
+            double _scale = _rotationAxis.ScaleFactor;
+            speed = (int)Math.Round(_scale * BeckhoffVelocityUtil.ConvertVelocityToDegPerSecondByRPM(speed), 0);
+            return _rotationAxis.ChangeSpeed(speed);
+        }
+        /// <summary>
+        /// 检验Rotation移动状态
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckRotationPositionStatus()
+        {
+            return _rotationAxis.Status == RState.End;
+        }
+        /// <summary>
+        /// 检验Rotation是否运动失败
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckRotationPositionRunStop()
+        {
+            return _rotationAxis.Status == RState.Failed || _rotationAxis.Status == RState.Timeout;
+        }
+        /// <summary>
+        /// vertical 运行
+        /// </summary>
+        /// <param name="positionName"></param> 目标位置名称
+        /// <param name="offset"></param> 偏移量
+        /// <returns></returns>
+        private bool StartVertical(string positionName, double offset, int speed, int accelerate)
+        {
+            return _verticalEntity.CheckToPostMessage<PlatingCellVerticalState, PlatingCellVerticalEntity.VerticalMsg>(Aitex.Core.RT.Log.eEvent.INFO_PLATINGCELL,
+                    Module, (int)PlatingCellVerticalEntity.VerticalMsg.Position, positionName, offset, speed, accelerate);
+        }
+        /// <summary>
+        /// 检验垂直电机是否运动完成
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckVerticalEnd()
+        {
+            return _verticalEntity.IsIdle;
+        }
+        /// <summary>
+        /// 检验垂直是否出现错误
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckVerticalError()
+        {
+            return _verticalEntity.IsError;
+        }
+        /// <summary>
+        /// 启动
+        /// </summary>
+        /// <param name="objs"></param>
+        /// <returns></returns>
+        public RState Start(params object[] objs)
+        {
+            _recipe = (DepRecipe)objs[0];
+            _rotationAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Rotation");
+            _device = DEVICE.GetDevice<PlatingCellDevice>(Module);
+            //获取vertical entity
+            string vertical = ModuleMatcherManager.Instance.GetPlatingVerticalByCell(Module);
+            _verticalEntity = Singleton<RouteManager>.Instance.GetModule<PlatingCellVerticalEntity>(vertical);
+            return Runner.Start(Module, "start intervale rinse");
+        }
+    }
+}

+ 190 - 0
PunkHPX8_RT/Modules/PlatingCell/PlatingCellReclaimRoutine.cs

@@ -0,0 +1,190 @@
+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.RecipeCenter;
+using MECF.Framework.Common.Routine;
+using MECF.Framework.Common.Utilities;
+using PunkHPX8_Core;
+using PunkHPX8_RT.Devices.AXIS;
+using PunkHPX8_RT.Devices.PlatingCell;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace PunkHPX8_RT.Modules.PlatingCell
+{
+    public class PlatingCellReclaimRoutine : RoutineBase, IRoutine
+    {
+        private enum RunRecipeStep
+        {
+            SetCurrentProtect,
+            SetCurrentProtectWait,
+            PowerEnable,
+            VerticalGotoReclaim,
+            CheckVerticalGotoReclaim,
+            PowerDisable,
+            ChangeRotation,
+            RotationDelay,
+            End
+        }
+        #region 常量
+        #endregion
+
+        /// <summary>
+        /// recipe
+        /// </summary>
+        private DepRecipe _recipe;
+        /// <summary>
+        /// Rotation axis
+        /// </summary>
+        private JetAxisBase _rotationAxis;
+        /// <summary>
+        /// Platingcell device
+        /// </summary>
+        private PlatingCellDevice _device;
+        /// <summary>
+        /// vertical axis entity
+        /// </summary>
+        private PlatingCellVerticalEntity _verticalEntity;
+        /// <summary>
+        /// 片子是否电镀
+        /// </summary>
+        private bool _isZeroCurrent = false;
+        /// <summary>
+        /// reclaim过程是否启用电流保护
+        /// </summary>
+        private bool _isCurrentProtectEnable = false;
+        /// <summary>
+        ///reclaim过程vertical运动速度
+        /// </summary>
+        private int _verticalReclaimSpeed = 0;
+        /// <summary>
+        /// reclaim过程vertical加速度
+        /// </summary>
+        private int _verticalReclaimAcceleration = 0;
+        /// <summary>
+        /// reclaim过程电流保护的电流数值
+        /// </summary>
+        private double _reclaimCurrentSetPoint = 0;
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        /// <param name="module"></param>
+        public PlatingCellReclaimRoutine(string module) : base(module)
+        {
+
+        }
+        /// <summary>
+        /// 中止
+        /// </summary>
+        public void Abort()
+        {
+            Runner.Stop("Manual Abort");
+        }
+        /// <summary>
+        /// 监控
+        /// </summary>
+        /// <returns></returns>
+        public RState Monitor()
+        {
+            Runner.RunIf(RunRecipeStep.SetCurrentProtect, !_isZeroCurrent && _isCurrentProtectEnable , SetCurrent, _delay_1ms)
+                  .DelayIf(RunRecipeStep.SetCurrentProtectWait, !_isZeroCurrent && _isCurrentProtectEnable,500)
+                  .RunIf(RunRecipeStep.PowerEnable, !_isZeroCurrent && _isCurrentProtectEnable,EnablePower, _delay_1ms)
+                  .Run(RunRecipeStep.VerticalGotoReclaim, () => StartVertical("Reclaim",_recipe.ReclaimZoffset, _verticalReclaimSpeed, _verticalReclaimAcceleration), _delay_1ms)
+                  .WaitWithStopCondition(RunRecipeStep.CheckVerticalGotoReclaim, CheckVerticalEnd, CheckVerticalError)
+                  .RunIf(RunRecipeStep.PowerDisable, !_isZeroCurrent && _isCurrentProtectEnable, DisablePower, _delay_1ms)
+                  .Run(RunRecipeStep.PowerDisable, () => ChangeRotationSpeed(_recipe.ReclaimSpeed), _delay_1ms)
+                  .Delay(RunRecipeStep.RotationDelay, _recipe.ReclaimTime*1000)
+                  .End(RunRecipeStep.End, NullFun);
+            return Runner.Status;
+        }
+        /// <summary>
+        /// 设置电流
+        /// </summary>
+        /// <returns></returns>
+        private bool SetCurrent()
+        {
+            return _device.PowerSupplier.SetCurrent(_reclaimCurrentSetPoint);
+        }
+        /// <summary>
+        /// 启动电源输出
+        /// </summary>
+        /// <returns></returns>
+        private bool EnablePower()
+        {
+            return _device.PowerSupplier.EnableOperation("", null);
+        }
+        /// <summary>
+        /// 停止电源输出
+        /// </summary>
+        /// <returns></returns>
+        private bool DisablePower()
+        {
+            return _device.PowerSupplier.DisableOperation("", null);
+        }
+        /// <summary>
+        /// rotation改变速度
+        /// </summary>
+        /// <param name="speed"></param>
+        /// <returns></returns>
+        private bool ChangeRotationSpeed(int speed)
+        {
+            double _scale = _rotationAxis.ScaleFactor;
+            speed = (int)Math.Round(_scale * BeckhoffVelocityUtil.ConvertVelocityToDegPerSecondByRPM(speed), 0);
+            return _rotationAxis.ChangeSpeed(speed);
+        }
+        /// <summary>
+        /// vertical 运行
+        /// </summary>
+        /// <param name="positionName"></param> 目标位置名称
+        /// <param name="offset"></param> 偏移量
+        /// <returns></returns>
+        private bool StartVertical(string positionName, double offset,int speed,int accelerate)
+        {
+            return _verticalEntity.CheckToPostMessage<PlatingCellVerticalState, PlatingCellVerticalEntity.VerticalMsg>(Aitex.Core.RT.Log.eEvent.INFO_PLATINGCELL,
+                    Module, (int)PlatingCellVerticalEntity.VerticalMsg.Position, positionName, offset, speed, accelerate);
+        }
+        /// <summary>
+        /// 检验垂直电机是否运动完成
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckVerticalEnd()
+        {
+            return _verticalEntity.IsIdle;
+        }
+        /// <summary>
+        /// 检验垂直是否出现错误
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckVerticalError()
+        {
+            return _verticalEntity.IsError;
+        }
+        /// <summary>
+        /// 启动
+        /// </summary>
+        /// <param name="objs"></param>
+        /// <returns></returns>
+        public RState Start(params object[] objs)
+        {
+            _recipe = (DepRecipe)objs[0];
+            _isZeroCurrent = (bool)objs[1];
+            
+            _isCurrentProtectEnable = SC.GetValue<bool>("PlatingCell.PostProcessCurrentEnable");
+            _verticalReclaimSpeed = SC.GetValue<int>("PlatingCell.ReclaimSpeed");
+            _verticalReclaimAcceleration = SC.GetValue<int>("PlatingCell.ReclaimAcceleration");
+            _reclaimCurrentSetPoint = SC.GetValue<double>("PlatingCell.PostProcessCurrentSetPoint");
+            
+            _rotationAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Rotation");
+            _device = DEVICE.GetDevice<PlatingCellDevice>(Module);
+            //获取vertical entity
+            string vertical = ModuleMatcherManager.Instance.GetPlatingVerticalByCell(Module);
+            _verticalEntity = Singleton<RouteManager>.Instance.GetModule<PlatingCellVerticalEntity>(vertical);
+            return Runner.Start(Module, "start intervale rinse");
+        }
+    }
+}

+ 137 - 0
PunkHPX8_RT/Modules/PlatingCell/PlatingCellRinseRoutine.cs

@@ -0,0 +1,137 @@
+using Aitex.Core.RT.Device;
+using Aitex.Core.RT.Routine;
+using Aitex.Core.RT.SCCore;
+using Aitex.Core.Util;
+using MECF.Framework.Common.RecipeCenter;
+using MECF.Framework.Common.Routine;
+using MECF.Framework.Common.Utilities;
+using PunkHPX8_Core;
+using PunkHPX8_RT.Devices.AXIS;
+using PunkHPX8_RT.Devices.PlatingCell;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace PunkHPX8_RT.Modules.PlatingCell
+{
+    public class PlatingCellRinseRoutine : RoutineBase, IRoutine
+    {
+        private enum RunRecipeStep
+        {
+            VerticalGotoRinse,
+            CheckVerticalGotoRinse,
+            OpenRinseValve,
+            ChangeRotation,
+            RotationDelay,
+            CloseRinseValve,
+            End
+        }
+        #region 常量
+        #endregion
+
+        /// <summary>
+        /// recipe
+        /// </summary>
+        private DepRecipe _recipe;
+        /// <summary>
+        /// Rotation axis
+        /// </summary>
+        private JetAxisBase _rotationAxis;
+        /// <summary>
+        /// Platingcell device
+        /// </summary>
+        private PlatingCellDevice _device;
+        /// <summary>
+        /// vertical axis entity
+        /// </summary>
+        private PlatingCellVerticalEntity _verticalEntity;
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        /// <param name="module"></param>
+        public PlatingCellRinseRoutine(string module) : base(module)
+        {
+
+        }
+        /// <summary>
+        /// 中止
+        /// </summary>
+        public void Abort()
+        {
+            Runner.Stop("Manual Abort");
+        }
+        /// <summary>
+        /// 监控
+        /// </summary>
+        /// <returns></returns>
+        public RState Monitor()
+        {
+            Runner.Run(RunRecipeStep.VerticalGotoRinse, () => StartVertical("Risne", _recipe.RinseZoffset, 0, 0), _delay_1ms)
+                  .WaitWithStopCondition(RunRecipeStep.CheckVerticalGotoRinse, CheckVerticalEnd, CheckVerticalError)
+                  .Run(RunRecipeStep.OpenRinseValve, () => _device.RinseEnableAction(),_delay_1ms)
+                  .Run(RunRecipeStep.ChangeRotation, () => ChangeRotationSpeed(_recipe.RinseSpeed), _delay_1ms)
+                  .Delay(RunRecipeStep.RotationDelay,  _recipe.RinseTime*1000)
+                  .Run(RunRecipeStep.CloseRinseValve, () => _device.RinseDisableAction(),_delay_1ms)
+                  .End(RunRecipeStep.End, NullFun);
+            return Runner.Status;
+        }
+        
+        /// <summary>
+        /// rotation改变速度
+        /// </summary>
+        /// <param name="speed"></param>
+        /// <returns></returns>
+        private bool ChangeRotationSpeed(int speed)
+        {
+            double _scale = _rotationAxis.ScaleFactor;
+            speed = (int)Math.Round(_scale * BeckhoffVelocityUtil.ConvertVelocityToDegPerSecondByRPM(speed), 0);
+            return _rotationAxis.ChangeSpeed(speed);
+        }
+        /// <summary>
+        /// vertical 运行
+        /// </summary>
+        /// <param name="positionName"></param> 目标位置名称
+        /// <param name="offset"></param> 偏移量
+        /// <returns></returns>
+        private bool StartVertical(string positionName, double offset, int speed, int accelerate)
+        {
+            return _verticalEntity.CheckToPostMessage<PlatingCellVerticalState, PlatingCellVerticalEntity.VerticalMsg>(Aitex.Core.RT.Log.eEvent.INFO_PLATINGCELL,
+                    Module, (int)PlatingCellVerticalEntity.VerticalMsg.Position, positionName, offset, speed, accelerate);
+        }
+        /// <summary>
+        /// 检验垂直电机是否运动完成
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckVerticalEnd()
+        {
+            return _verticalEntity.IsIdle;
+        }
+        /// <summary>
+        /// 检验垂直是否出现错误
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckVerticalError()
+        {
+            return _verticalEntity.IsError;
+        }
+        /// <summary>
+        /// 启动
+        /// </summary>
+        /// <param name="objs"></param>
+        /// <returns></returns>
+        public RState Start(params object[] objs)
+        {
+            _recipe = (DepRecipe)objs[0];
+            
+            _rotationAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Rotation");
+            _device = DEVICE.GetDevice<PlatingCellDevice>(Module);
+            //获取vertical entity
+            string vertical = ModuleMatcherManager.Instance.GetPlatingVerticalByCell(Module);
+            _verticalEntity = Singleton<RouteManager>.Instance.GetModule<PlatingCellVerticalEntity>(vertical);
+            return Runner.Start(Module, "start intervale rinse");
+        }
+    }
+}

+ 38 - 1
PunkHPX8_RT/Modules/PlatingCell/PlatingCellRunRecipeRoutine.cs

@@ -37,6 +37,12 @@ namespace PunkHPX8_RT.Modules.PlatingCell
             CheckEntry,
             Deposition,
             CheckDeposition,
+            Reclaim,
+            CheckReclaim,
+            Rinse,
+            CheckRinse,
+            Dry,
+            CheckDry,
             End
         }
         #region 常量 
@@ -136,6 +142,18 @@ namespace PunkHPX8_RT.Modules.PlatingCell
         /// entry routien
         /// </summary>
         private PlatingCellDepositionRoutine _depositionRoutine;
+        /// <summary>
+        /// reclaim routien
+        /// </summary>
+        private PlatingCellReclaimRoutine _reclaimRoutine;
+        /// <summary>
+        /// Rinse routien
+        /// </summary>
+        private PlatingCellRinseRoutine _rinseRoutine;
+        /// <summary>
+        /// Dry routien
+        /// </summary>
+        private PlatingCellDryRoutine _dryRoutine;
         #endregion
 
         #region 属性
@@ -151,6 +169,9 @@ namespace PunkHPX8_RT.Modules.PlatingCell
             _interRinseRoutine = new PlatingCellInterRinseRoutine(module);
             _entryRoutine = new PlatingCellEntryRoutine(module);
             _depositionRoutine = new PlatingCellDepositionRoutine(module);
+            _reclaimRoutine = new PlatingCellReclaimRoutine(module);
+            _rinseRoutine = new PlatingCellRinseRoutine(module);
+            _dryRoutine = new PlatingCellDryRoutine(module);
         }
         /// <summary>
         /// 中止
@@ -164,7 +185,8 @@ namespace PunkHPX8_RT.Modules.PlatingCell
         /// </summary>
         /// <returns></returns>
         public RState Monitor()
-        {         //interval rinse
+        {         
+                //interval rinse
             Runner.RunIf(RunRecipeStep.InterRinse, _recipe.RinseBeforeEntryEnable, () => { return _interRinseRoutine.Start(_recipe, _targetPositionList[0]) == RState.Running; })
                 .WaitWithStopConditionIf(RunRecipeStep.CheckInterRinse, _recipe.RinseBeforeEntryEnable, CheckInterRinseEndStatus,
                         () => CommonFunction.CheckRoutineStopState(_interRinseRoutine))
@@ -178,6 +200,21 @@ namespace PunkHPX8_RT.Modules.PlatingCell
                 .WaitWithStopCondition(RunRecipeStep.CheckDeposition, CheckInterRinseEndStatus,
                         () => CommonFunction.CheckRoutineStopState(_depositionRoutine))
 
+                 //Relaim
+                .Run(RunRecipeStep.Reclaim, () => { return _reclaimRoutine.Start(_recipe, _isZeroCurrent) == RState.Running; })
+                .WaitWithStopCondition(RunRecipeStep.CheckReclaim, CheckInterRinseEndStatus,
+                        () => CommonFunction.CheckRoutineStopState(_reclaimRoutine))
+
+                //Rinse
+                .Run(RunRecipeStep.Rinse, () => { return _rinseRoutine.Start(_recipe) == RState.Running; })
+                .WaitWithStopCondition(RunRecipeStep.CheckRinse, CheckInterRinseEndStatus,
+                        () => CommonFunction.CheckRoutineStopState(_rinseRoutine))
+
+                //Dry
+                .Run(RunRecipeStep.Dry, () => { return _dryRoutine.Start(_recipe) == RState.Running; })
+                .WaitWithStopCondition(RunRecipeStep.CheckDry, CheckInterRinseEndStatus,
+                        () => CommonFunction.CheckRoutineStopState(_dryRoutine))
+
                 .End(RunRecipeStep.End, NullFun);
             return Runner.Status;
         }

+ 17 - 1
PunkHPX8_RT/Modules/PlatingCell/PlatingCellVerticalPositionRoutine.cs

@@ -50,6 +50,14 @@ namespace PunkHPX8_RT.Modules.PlatingCell
         /// 偏移量
         /// </summary>
         private double _offset;
+        /// <summary>
+        /// 移动速度
+        /// </summary>
+        private int _speed;
+        /// <summary>
+        /// 加速度
+        /// </summary>
+        private int _accelerate;
         #endregion
 
         /// <summary>
@@ -142,7 +150,7 @@ namespace PunkHPX8_RT.Modules.PlatingCell
                     LOG.WriteLog(eEvent.ERR_PLATINGCELL, Module, "Vertical is not Home,Home vertical first");
                     return false;
                 }
-                return _verticalAxis.PositionStation(_station,_offset);
+                return _verticalAxis.PositionStation(_station,_offset,false,_speed,_accelerate);
 
             }
             else
@@ -176,6 +184,14 @@ namespace PunkHPX8_RT.Modules.PlatingCell
         {
             _station=objs[0].ToString();
             _offset = (double)objs[1];
+            if(objs.Length > 2)
+            {
+                _speed = (int)objs[2];
+            }
+            if (objs.Length > 3)
+            {
+                _accelerate = (int)objs[3];
+            }
             _matcher = ModuleMatcherManager.Instance.GetMatcherListByVertical(Module); //获取电机所在的platingcell 列表
             _cellEntities.Clear();
             foreach (string str in _matcher)