using System; using Aitex.Core.Common; using Aitex.Core.RT.Device; using Aitex.Core.RT.Event; using Aitex.Core.RT.Routine; using Aitex.Core.RT.SCCore; using Aitex.Sorter.Common; using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robot; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.SubstrateTrackings; using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts; using Aitex.Sorter.RT.SorterCommonFrame.Modules; using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.RobotBase; using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Aligners.AlignersBase; using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots; using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts.LoadPortBase; using System.Threading; using Aitex.Core.RT.Log; using Aitex.Core.Util; using Aitex.Sorter.RT.SorterCommonFrame.SorterJobControl; namespace Aitex.Sorter.RT.SorterCommonFrame.Routines { public class GotoRoutine : CommonRoutineSorter, IRoutine { enum GotoStepEnum { Step1, Step2 } private int _timeout = 0; public GotoRoutine(string module, string name) { Module = module; Name =name; } public bool Initalize() { Reset(); IsRoutineActive = false; return true; } public ModuleName Source { get; set; } public int Slot { get; set; } public Hand Blade { get; set; } public RobotPostionEnum PositionCategory { get; set; } public ModuleName RobotModulename { get; set; } = ModuleName.Robot; public Result Start(params object[] objs) { Reset(); Robot = DEVICE.GetDevice(RobotModulename.ToString()); _timeout = Robot.RobotCommandTimeout; EV.PostInfoLog("System",$"Start picking wafer from station:{Source} slot:{Slot+1} with blade {Blade}"); IsRoutineActive = true; return Monitor(); } public Result Monitor() { if (!IsRoutineActive) return Result.DONE; var ret = MonitorRoutine(); if (ret == Result.FAIL) { IsRoutineActive = false; } if (ret == Result.DONE) { IsRoutineActive = false; } return ret; } private Result MonitorRoutine() { try { RtRobotArmGotoPosition((int)GotoStepEnum.Step1, Source,Slot, Blade, PositionCategory, _timeout, Notify, Stop); if (ExecuteResult.Item1) { if (ExecuteResult.Item2 == Result.RUN) return Result.RUN; if (ExecuteResult.Item2 == Result.FAIL) return Result.FAIL; if (ExecuteResult.Item2 == Result.TIMEOUT) return Result.FAIL; if (ExecuteResult.Item2 == Result.DONE) return Result.DONE; } EV.PostInfoLog("System", $"Complete picking wafer from station:{Source} slot:{Slot + 1} with blade {Blade}."); IsRoutineActive = false; return Result.DONE; } catch (Exception ex) { EV.PostAlarmLog("System", $"Failed to pick wafer from station:{Source} slot:{Slot + 1} with blade {Blade}."); LOG.Write(ex); IsRoutineActive = false; return Result.FAIL; } } } }