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 { CheckWafer, ChuckIn, WaitChuck, RotationHome, CheckRotationHome, RotationHomeStation, RotationHomeStationWait, FlipHome, CheckFlipHome, FlipSideA, FlipSideAWait, End } #region 内部变量 private JetAxisBase _flipAxis; private JetAxisBase _rotationAxis; private PUFEntity _pufEntity; private PufChuckRoutine _chuckRoutine; #endregion public PufHomeAllRoutine(ModuleName module,PUFEntity pufEntity) : base(module) { _flipAxis = DEVICE.GetDevice($"{module}.Flip"); _rotationAxis = DEVICE.GetDevice($"{module}.Rotation"); _chuckRoutine = new PufChuckRoutine(module.ToString()); _pufEntity = pufEntity; Name = "Home"; } public void Abort() { Runner.Stop("Manual Abort"); } public RState Monitor() { Runner.Run(PufHomeAllStep.CheckWafer, () => { return !_pufEntity.SideAWaferPresent && !_pufEntity.SideBWaferPresent; },NullFun,100) .Run(PufHomeAllStep.ChuckIn, () => _chuckRoutine.Start(false) == RState.Running, _delay_1ms) .WaitWithStopCondition(PufHomeAllStep.WaitChuck, () => CommonFunction.CheckRoutineEndState(_chuckRoutine), CheckChuckStopStatus) .Run(PufHomeAllStep.RotationHome, RotationAxisHome, _delay_1ms) .WaitWithStopCondition(PufHomeAllStep.CheckRotationHome, CheckRotationPositionStatus, CheckRotationPositionRunStop) .Run(PufHomeAllStep.RotationHomeStation, () => { return _rotationAxis.PositionStation("Home",true); }, NullFun, 100) .WaitWithStopCondition(PufHomeAllStep.RotationHomeStationWait, 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; } /// /// 检验chuck routine停止状态 /// /// private bool CheckChuckStopStatus() { bool result = CommonFunction.CheckRoutineStopState(_chuckRoutine); if (result) { LOG.WriteLog(eEvent.ERR_PUF,Module.ToString(), _chuckRoutine.ErrorMsg); } return result; } /// /// 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; } /// /// 启动 /// /// /// public RState Start(params object[] objs) { Runner.Start(Module, Name); return RState.Running; } } }