using Aitex.Core.RT.Device; using Aitex.Core.RT.Routine; using Aitex.Core.RT.SCCore; using MECF.Framework.Common.Routine; 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 PufPlaceVacuumCheckRoutine : RoutineBase, IRoutine { private enum PlaceVacuumStep { VerticalGotoLoaderPlaceDown, VerticalGotoLoaderPlaceDownWait, VacuumOff, StickDistance, StickDistanceWait, VacuumOn, Delay, VacuumCheck, End } #region 常量 private const string SideA = "SideA"; private const string SideB = "SideB"; private const string WAFER_ABSENT = "WaferAbsent"; #endregion #region 内部变量 private JetAxisBase _verticalAxis; private PufDistanceSensor _distanceSensor; private PufVacuum _vacuum; private string _side = "SideA"; /// /// 是否显示Routine错误 /// private bool _showError = true; /// /// 第几次 /// private int _times=1; /// /// 延迟时间 /// private int _chuckValveSwitchingTimeDelayInMilliSeconds = 100; /// /// 是否处于模拟器 /// private bool _isSimulator = false; #endregion /// /// 构造函数 /// /// public PufPlaceVacuumCheckRoutine(string module) : base(module) { _isSimulator = SC.GetValue("System.IsSimulatorMode"); } /// /// 中止 /// public void Abort() { Runner.Stop("Manual abort"); } /// /// 监控 /// /// public RState Monitor() { Runner.Run(PlaceVacuumStep.VerticalGotoLoaderPlaceDown, () => _verticalAxis.PositionStation("LoaderPutDown"), _delay_1ms) .WaitWithStopCondition(PlaceVacuumStep.VerticalGotoLoaderPlaceDownWait, CheckVerticalPositionStatus, CheckVerticalPositionRunStop) .Run(PlaceVacuumStep.VacuumOff, VacuumOff, _delay_1ms) .Run(PlaceVacuumStep.StickDistance, StickDistance, 100) .WaitWithStopCondition(PlaceVacuumStep.StickDistanceWait, CheckVerticalPositionStatus, CheckVerticalPositionRunStop) .Run(PlaceVacuumStep.VacuumOn, VacuumOn, _delay_1ms) .Delay(PlaceVacuumStep.Delay, _chuckValveSwitchingTimeDelayInMilliSeconds) .Run(PlaceVacuumStep.VacuumCheck, CheckWaferPresent,NullFun, _delay_1ms,_showError) .End(PlaceVacuumStep.End, NullFun, _delay_1ms); return Runner.Status; } /// /// Stick Distance /// /// private bool StickDistance() { return _distanceSensor.GotoStickDistance(); } /// /// 检验Vertical移动状态 /// /// private bool CheckVerticalPositionStatus() { return _verticalAxis.Status == RState.End; } /// /// 检验Vertical是否还在运动 /// /// private bool CheckVerticalPositionRunStop() { return _verticalAxis.Status == RState.Failed; } /// /// 关闭Vacuum /// /// private bool VacuumOff() { if (_side == SideA) { return _vacuum.VacuumAOff(); } else if (_side == SideB) { return _vacuum.VacuumBOff(); } return false; } /// /// 打开Vacuum /// /// private bool VacuumOn() { if (_side == SideA) { return _vacuum.VacuumAOn(); } else if (_side == SideB) { return _vacuum.VacuumBOn(); } return false; } /// /// 检验存在Wafer /// /// private bool CheckWaferPresent() { if(_isSimulator) { return true; } if (_side == SideA) { return _vacuum.ChuckAVacuumStatus == WAFER_ABSENT; } else if (_side == SideB) { return _vacuum.ChuckBVacuumStatus == WAFER_ABSENT; } else { return false; } } /// /// 启动 /// /// /// public RState Start(params object[] objs) { _side = objs[0].ToString(); _showError = objs.Length > 1 ? (bool)objs[1] : true; _times = objs.Length > 2 ? (int)objs[2] : 1; _verticalAxis = DEVICE.GetDevice($"{Module}.Vertical"); _vacuum = DEVICE.GetDevice($"{Module}.Vacuum"); _distanceSensor = DEVICE.GetDevice($"{Module}.DistanceSensor"); _chuckValveSwitchingTimeDelayInMilliSeconds = SC.GetValue($"{Module}.ChuckValveSwitchingTimeDelayInMilliSeconds"); return Runner.Start(Module, $"Start {_times} Place Vacuum Check"); } } }