using Aitex.Core.RT.Device; using Aitex.Core.RT.Log; using Aitex.Core.RT.Routine; using Aitex.Core.Util; using MECF.Framework.Common.Beckhoff.AxisProvider; using MECF.Framework.Common.Beckhoff.Station; using MECF.Framework.Common.RecipeCenter; using MECF.Framework.Common.Routine; using MECF.Framework.Common.ToolLayout; using MECF.Framework.Common.Utilities; using PunkHPX8_Core; using PunkHPX8_RT.Devices.AXIS; using PunkHPX8_RT.Devices.PlatingCell; using PunkHPX8_RT.Modules.Reservoir; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PunkHPX8_RT.Modules.PlatingCell { public class PlatingCellInterRinseRoutine : RoutineBase, IRoutine { private enum RunRecipeStep { VerticalGotoRinse, CheckVerticalGotoRinse, OpenRinseValve, StartRotation, WaitRotation, CloseRinseValve, End } #region 常量 /// /// ROTATION电机转速比例 /// private const int SPEED_RATIO = 1; #endregion /// /// recipe /// private DepRecipe _recipe; /// /// Rotation axis /// private JetAxisBase _rotationAxis; /// /// Platingcell device /// private PlatingCellDevice _device; /// /// rotation运动的目的地 /// private int _rotationgTargetPosition; /// /// vertical axis entity /// private PlatingCellVerticalEntity _verticalEntity; /// /// 构造函数 /// /// public PlatingCellInterRinseRoutine(string module) : base(module) { } /// /// 中止 /// public void Abort() { Runner.Stop("Manual Abort"); } /// /// 监控 /// /// public RState Monitor() { Runner.Run(RunRecipeStep.VerticalGotoRinse, () => { return StartVertical("Rinse", _recipe.IntervalRinseZoffset); }, _delay_1ms) .WaitWithStopCondition(RunRecipeStep.CheckVerticalGotoRinse, CheckVerticalEnd, CheckVerticalError) .Run(RunRecipeStep.OpenRinseValve, _device.RinseEnableAction, _delay_1ms) .Run(RunRecipeStep.StartRotation, () => { return StartRotation(_rotationgTargetPosition); }, _delay_1ms) .Delay(RunRecipeStep.WaitRotation, _recipe.IntervalRinseTime*1000) .Run(RunRecipeStep.CloseRinseValve, _device.RinseDisableAction, _delay_1ms) .End(RunRecipeStep.End, NullFun); return Runner.Status; } /// /// rotation开始旋转 /// /// /// private bool StartRotation(int targetPosition) { bool result = _rotationAxis.ProfilePosition(targetPosition, _recipe.IntervalRinseSpeed * SPEED_RATIO * 6, 0, 0); //rpm->deg/s if (!result) { NotifyError(eEvent.ERR_PLATINGCELL, "Start Rotation is failed", 0); return false; } return true; } /// /// vertical 运行 /// /// 目标位置名称 /// 偏移量 /// private bool StartVertical(string positionName, double offset) { return _verticalEntity.CheckToPostMessage(Aitex.Core.RT.Log.eEvent.INFO_PLATINGCELL, Module, (int)PlatingCellVerticalEntity.VerticalMsg.Position, positionName, offset); } /// /// 检验垂直电机是否运动完成 /// /// private bool CheckVerticalEnd() { return _verticalEntity.IsIdle; } /// /// 检验垂直是否出现错误 /// /// private bool CheckVerticalError() { return _verticalEntity.IsError; } /// /// 启动 /// /// /// public RState Start(params object[] objs) { _recipe = (DepRecipe)objs[0]; _rotationgTargetPosition = (int)objs[1]; _rotationAxis = DEVICE.GetDevice($"{Module}.Rotation"); _device = DEVICE.GetDevice(Module); //获取vertical entity string vertical = ModuleMatcherManager.Instance.GetPlatingVerticalByCell(Module); _verticalEntity = Singleton.Instance.GetModule(vertical); return Runner.Start(Module, "start intervale rinse"); } } }