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;
}
}
}