using Aitex.Core.RT.Device; using Aitex.Core.RT.Routine; using Aitex.Core.RT.SCCore; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.Routine; 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; namespace CyberX8_RT.Modules.PUF { public class PufWaferPickRoutine : RoutineBase, IRoutine { private enum PufPickStep { VacuumLevelCheck, SideConditionRoutine, SideConditionRoutineWait, RotationLoaderPickup, RotationLoaderPickupWait, VerticalFlip, VerticalFlipWait, VerticalLoaderPickup, VerticalLoaderPickupWait, VacuumOn, StickDistance, StickDistanceWait, StickDistanceCheck, ReVerticalFlip, ReVerticalFlipWait, VerticalPark, VerticalParkWait, RotationPark, RotationParkWait, End } #region 常量 private const string SideA = "SideA"; private const string SideB = "SideB"; private const string WAFER_PRESENT = "WaferPresent"; #endregion #region 内部变量 private JetAxisBase _flipAxis; private JetAxisBase _rotationAxis; private JetAxisBase _verticalAxis; private PufDistanceSensor _distanceSensor; private PufVacuum _vacuum; private string _side; private PufWaferPickSubRoutine _pufWaferPickSubRoutine; private bool _enableCheckStickDistanceStatus = false; #endregion public PufWaferPickRoutine(string module) : base(module) { } public void Abort() { Runner.Stop("Manual Abort"); } public RState Monitor() { Runner.Run(PufPickStep.VacuumLevelCheck, CheckVacuumLevel, 100) .RunConditionSubRoutine(PufPickStep.SideConditionRoutine,SideConditionIndex,new IRoutine[] {_pufWaferPickSubRoutine},new object[] { _side }) .WaitConditionSubRoutine(PufPickStep.SideConditionRoutineWait) .Run(PufPickStep.RotationLoaderPickup,()=> { return _rotationAxis.PositionStation("LoaderPickup"); },NullFun,100) .WaitWithStopCondition(PufPickStep.RotationLoaderPickupWait, () => { return _rotationAxis.Status == RState.End; }, () => { return _rotationAxis.Status == RState.Failed; }) .Run(PufPickStep.VerticalFlip, () => { return _verticalAxis.PositionStation("Flip"); },NullFun,100) .WaitWithStopCondition(PufPickStep.VerticalFlipWait, () => { return _verticalAxis.Status == RState.End; }, () => { return _verticalAxis.Status == RState.Failed; }) .Run(PufPickStep.VerticalLoaderPickup, () => { return _verticalAxis.PositionStation("LoaderPickup"); }, NullFun, 100) .WaitWithStopCondition(PufPickStep.VerticalLoaderPickupWait, () => { return _verticalAxis.Status == RState.End; }, () => { return _verticalAxis.Status == RState.Failed; }) .Run(PufPickStep.VacuumOn,VacuumOn,CheckWaferPresent,5000) .Run(PufPickStep.StickDistance,StickDistance,100) .WaitWithStopCondition(PufPickStep.StickDistanceWait, () => { return _verticalAxis.Status == RState.End; }, () => { return _verticalAxis.Status == RState.Failed; }) .Wait(PufPickStep.StickDistanceCheck,CheckStickDistanceStatus,1000) .Run(PufPickStep.ReVerticalFlip, () => { return _verticalAxis.PositionStation("Flip"); }, NullFun, 100) .WaitWithStopCondition(PufPickStep.ReVerticalFlipWait, () => { return _verticalAxis.Status == RState.End; }, () => { return _verticalAxis.Status == RState.Failed; }) .Run(PufPickStep.VerticalPark, () => { return _verticalAxis.PositionStation("Park"); }, NullFun, 100) .WaitWithStopCondition(PufPickStep.VerticalParkWait, () => { return _verticalAxis.Status == RState.End; }, () => { return _verticalAxis.Status == RState.Failed; }) .Run(PufPickStep.RotationPark, () => { return _rotationAxis.PositionStation("Park"); }, NullFun, 100) .WaitWithStopCondition(PufPickStep.RotationParkWait, () => { return _rotationAxis.Status == RState.End; }, () => { return _rotationAxis.Status == RState.Failed; }) .End(PufPickStep.End, NullFun); return Runner.Status; } /// /// Side条件获取SubRoutine索引 /// /// private int SideConditionIndex() { if (_flipAxis.CheckPositionIsInStation(_flipAxis.MotionData.MotorPosition, _side)) { return 1; } else { return 0; } } /// /// 检验VacuumLevel /// /// private bool CheckVacuumLevel() { if (_side == SideA) { return _vacuum.ChuckBVacuumStatus == WAFER_PRESENT; } else if (_side == SideB) { return _vacuum.ChuckAVacuumStatus == WAFER_PRESENT; } else { return false; } } /// /// 检验存在Wafer /// /// private bool CheckWaferPresent() { if (_side == SideA) { return _vacuum.ChuckAVacuumStatus==WAFER_PRESENT; } else if (_side == SideB) { return _vacuum.ChuckBVacuumStatus==WAFER_PRESENT; } else { return false; } } /// /// 打开Vacuum /// /// private bool VacuumOn() { if(_side==SideA) { _vacuum.VacuumAOn(); return true; } else if(_side==SideB) { _vacuum.VacuumBOn(); return true; } return false; } /// /// Stick Distance /// /// private bool StickDistance() { _distanceSensor.GotoStickDistance(); return true; } /// /// Stick Distance检验结果 /// /// private bool CheckStickDistanceStatus() { if (_enableCheckStickDistanceStatus) { return _distanceSensor.CheckStickDistanceStatus(); } else { return true; } } /// /// 启动 /// /// /// public RState Start(params object[] objs) { _side = objs[0].ToString(); _flipAxis = DEVICE.GetDevice($"{Module}.Flip"); _rotationAxis = DEVICE.GetDevice($"{Module}.Rotation"); _verticalAxis = DEVICE.GetDevice($"{Module}.Vertical"); _vacuum = DEVICE.GetDevice($"{Module}.Vacuum"); _distanceSensor = DEVICE.GetDevice($"{Module}.DistanceSensor"); _pufWaferPickSubRoutine = new PufWaferPickSubRoutine(Module); _enableCheckStickDistanceStatus = SC.GetValue($"{Module}.EnableCheckStickDistanceStatus"); Runner.Start(Module, "WaferPick"); return RState.Running; } } }