using Aitex.Core.Common; using Aitex.Core.RT.Log; using Aitex.Core.RT.Routine; using Aitex.Sorter.Common; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.Schedulers; using MECF.Framework.Common.SubstrateTrackings; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using Venus_Core; using Venus_RT.Devices.EFEM; namespace Venus_RT.Modules.EFEM { public class EFEMAlignRoutine : ModuleRoutineBase, IRoutine { private enum AlignStep { WaitIdle, Rotate, End } private int _moveTimeout = 20 * 1000; EfemBase _efem; private double angle = 25; private WaferSize ws = WaferSize.WS12; public EFEMAlignRoutine(EfemBase efem) : base(ModuleName.Aligner1) { _efem = efem; } public RState Start(params object[] objs) { if (!_efem.IsHomed) { LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, Module, $"EFEM is not homed, please home it first"); return RState.Failed; } if (objs.Length >= 3) { try { angle = Convert.ToDouble(objs[2]); } catch (Exception ex) { LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, Module, $"ALIAN PARAMETER IS ILLEGAL "); } } if (!WaferManager.Instance.CheckHasWafer(ModuleName.Aligner1, 0)) { LOG.Write(eEvent.ERR_EFEM_ROBOT, Module, $"Efem PreAligner not have wafer, cannot do the align action"); return RState.Failed; } else { Trace.WriteLine("开始Align"); return Runner.Start(Module,$"PreAligner Start align"); } } public RState Monitor() { Runner.Wait((int)AlignStep.WaitIdle, WaitEFEMIdle, 0) .Run((int)AlignStep.Rotate, fnalign ,CheckAlignDone, _moveTimeout) .End((int)AlignStep.End, ActionDone, 0); return Runner.Status; } private bool fnalign() { return _efem.Align(Module,angle,0,ws); } private bool CheckAlignDone() { if (_efem.Status == RState.End) { return true; } else if (_efem.Status != RState.Running) { LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, Module, $"Efem PreAligner align failed: {_efem.Status}"); return true; } return false; } private bool ActionDone() { return true; } private bool WaitEFEMIdle() { return _efem.Status == RState.End; } public void Abort() { throw new NotImplementedException(); } } }