using Aitex.Core.RT.Log; using Aitex.Core.RT.Routine; using Aitex.Core.RT.SCCore; using Aitex.Sorter.Common; using CyberX8_Core; using CyberX8_RT.Devices.EFEM; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.Routine; using MECF.Framework.Common.SubstrateTrackings; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; namespace CyberX8_RT.Modules.EFEM { public class EfemRobotMapRoutine : RoutineBase, IRoutine { enum RoutineStep { GotoMapWaitIdle, GotoMap, WaitEFEMIdle, Map, RequestMapWaitIdle, RequestMap, BackWaitIdle, Back, End, } /// /// 构造函数 /// /// public EfemRobotMapRoutine(EfemBase efem):base(ModuleName.EfemRobot.ToString()) { _efem = efem; } #region 内部变量 private int _timeout = 0; private ModuleName _module = ModuleName.EfemRobot; private EfemBase _efem; #endregion /// /// 启动 /// /// /// public RState Start(params object[] objs) { Reset(); _module=(ModuleName)objs[0]; _timeout = SC.GetValue("EFEM.LoadPort.MotionTimeout"); return Runner.Start(Module, $"Start Map {_module}"); } public RState Monitor() { Runner.Wait(RoutineStep.GotoMapWaitIdle, WaitModuleReady) .Run(RoutineStep.GotoMap, GotoMap, CheckStepDone, _timeout * 1000) .Wait(RoutineStep.WaitEFEMIdle, WaitModuleReady) .Run(RoutineStep.Map, Map, CheckStepDone, _timeout * 1000) .Wait(RoutineStep.RequestMapWaitIdle, WaitModuleReady) .Run(RoutineStep.RequestMap, RequestMap, CheckStepDone, _timeout * 1000) .Wait(RoutineStep.BackWaitIdle, WaitModuleReady) .Run(RoutineStep.Back, Back, CheckStepDone, _timeout * 1000) .End(RoutineStep.End, NullFun, _delay_1s); return Runner.Status; } private bool GotoMap() { return _efem.GotoMap(_module, Hand.Blade1); } private bool Map() { return _efem.Map(_module); } private bool Back() { return _efem.GotoMap(_module, Hand.Blade1, "RE"); } private bool RequestMap() { return _efem.RequestMapResult(_module); } private bool WaitModuleReady() { return _efem.Status == RState.End; } private bool CheckStepDone() { if (_efem.Status == RState.End) { return true; } else if (_efem.Status == RState.Failed) { NotifyError(eEvent.ERR_EFEM_ROBOT, $"Efem robot picking failed: {_efem.Status}", -1); return true; } return false; } public void Abort() { Runner.Stop("Manual Abort"); } } }