using Aitex.Core.RT.Device; using Aitex.Core.RT.Routine; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.Utilities; using CyberX8_Core; using CyberX8_RT.Devices.AXIS; using CyberX8_RT.Devices.PUF; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using CyberX8_RT.Devices.Safety; using Aitex.Core.RT.Log; namespace CyberX8_RT.Modules.PUF { public class PufHomeAllRoutine : ModuleRoutineBase, IRoutine { private enum PufHomeAllStep { CheckSafety, CheckWafer, VerticalHome, CheckVerticalHome, VerticalPark, VerticalParkWait, RotationHome, CheckRotationHome, RotationPark, RotationParkWait, FlipHome, CheckFlipHome, FlipSideA, FlipSideAWait, End } #region 内部变量 private JetAxisBase _flipAxis; private JetAxisBase _rotationAxis; private JetAxisBase _verticalAxis; private PUFEntity _pufEntity; #endregion public PufHomeAllRoutine(ModuleName module,PUFEntity pufEntity) : base(module) { _flipAxis = DEVICE.GetDevice($"{module}.Flip"); _rotationAxis = DEVICE.GetDevice($"{module}.Rotation"); _verticalAxis = DEVICE.GetDevice($"{module}.Vertical"); _pufEntity = pufEntity; Name = "Home"; } public void Abort() { Runner.Stop("Manual Abort"); } public RState Monitor() { Runner.Run(PufHomeAllStep.CheckSafety,CheckSafety,_delay_1ms) .Run(PufHomeAllStep.CheckWafer, () => { return !_pufEntity.SideAWaferPresent && !_pufEntity.SideBWaferPresent; },NullFun,100) .Run(PufHomeAllStep.VerticalHome, VerticalAxisHome, _delay_1ms) .WaitWithStopCondition(PufHomeAllStep.CheckVerticalHome, CheckVerticalPositionStatus, CheckVerticalPositionRunStop) .Run(PufHomeAllStep.VerticalPark, () => { return _verticalAxis.PositionStation("Park", true); },NullFun,100) .WaitWithStopCondition(PufHomeAllStep.VerticalParkWait,CheckVerticalPositionStatus, CheckVerticalPositionRunStop) .Run(PufHomeAllStep.RotationHome, RotationAxisHome, _delay_1ms) .WaitWithStopCondition(PufHomeAllStep.CheckRotationHome, CheckRotationPositionStatus, CheckRotationPositionRunStop) .Run(PufHomeAllStep.RotationPark, () => { return _rotationAxis.PositionStation("Park",true); }, NullFun, 100) .WaitWithStopCondition(PufHomeAllStep.RotationParkWait, CheckRotationPositionStatus, CheckRotationPositionRunStop) .Run(PufHomeAllStep.FlipHome, FlipAxisHome, _delay_1ms) .WaitWithStopCondition(PufHomeAllStep.CheckFlipHome, CheckFlipPositionStatus, CheckFlipPositionRunStop) .Run(PufHomeAllStep.FlipSideA, () => { return _flipAxis.PositionStation("SideA", true); }, NullFun, 100) .WaitWithStopCondition(PufHomeAllStep.FlipSideAWait, CheckFlipPositionStatus, CheckFlipPositionRunStop) .End(PufHomeAllStep.End,NullFun); return Runner.Status; } /// /// 检验Safety /// /// private bool CheckSafety() { SafetyDevice safetyDevice = DEVICE.GetDevice("Safety"); if (safetyDevice == null) { LOG.WriteLog(eEvent.ERR_PUF, Module.ToString(), "Safety device is null"); return false; } if (safetyDevice.SafetyData.TwincatState != 8) { LOG.WriteLog(eEvent.ERR_PUF, Module.ToString(), "Twincat Status is not OP status"); return false; } if (safetyDevice.SafetyData.LoaderPufCommErr) { LOG.WriteLog(eEvent.ERR_PUF, Module.ToString(), "Twincat Puf Communication status is error"); return false; } if (safetyDevice.SafetyData.LoaderPufFunctionBlockErr) { LOG.WriteLog(eEvent.ERR_PUF, Module.ToString(), "Twincat Puf function block status is error"); return false; } return true; } /// /// Flip Home /// /// private bool FlipAxisHome() { return _flipAxis.Home(); } /// /// 检验Flip home状态 /// /// private bool CheckFlipHome() { return _flipAxis.IsHomed && _flipAxis.Status == RState.End; } /// /// 检验Flip移动状态 /// /// private bool CheckFlipPositionStatus() { return _flipAxis.Status == RState.End; } /// /// 检验Flip是否还在运动 /// /// private bool CheckFlipPositionRunStop() { return _flipAxis.Status == RState.Failed; } /// /// rotation home /// /// private bool RotationAxisHome() { return _rotationAxis.Home(); } /// /// rotation Home状态 /// /// private bool CheckRotationHome() { return _rotationAxis.IsHomed&&_rotationAxis.Status==RState.End; } /// /// 检验Rotation移动状态 /// /// private bool CheckRotationPositionStatus() { return _rotationAxis.Status == RState.End; } /// /// 检验Rotation是否还在运动 /// /// private bool CheckRotationPositionRunStop() { return _rotationAxis.Status == RState.Failed; } /// /// Vertical Home /// /// private bool VerticalAxisHome() { return _verticalAxis.Home(); } /// /// 检验Vertical Home状态 /// /// private bool CheckVerticalHome() { return _verticalAxis.IsHomed&&_verticalAxis.Status==RState.End; } /// /// 检验Vertical移动状态 /// /// private bool CheckVerticalPositionStatus() { return _verticalAxis.Status == RState.End; } /// /// 检验Vertical是否还在运动 /// /// private bool CheckVerticalPositionRunStop() { return _verticalAxis.Status==RState.Failed; } /// /// 启动 /// /// /// public RState Start(params object[] objs) { Runner.Start(Module, Name); return RState.Running; } } }