using Aitex.Core.RT.Device; using Aitex.Core.RT.Log; using Aitex.Core.Util; using Aitex.Sorter.Common; using Aitex.Sorter.RT.EFEMs.Servers; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.SubstrateTrackings; using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robot; namespace Aitex.Sorter.RT.EFEMs.Tasks { public class PickTask : RobotImp, ITask { Hand _arm = Hand.Blade2; public PickTask() { } public bool Execute(out string result, params string[] args) { string device = DeviceName.Robot; IServerModule entity = GetEntity(device); ModuleName target = ModuleName.System; int slot = 1; if (!ParseMoveTarget(args[0], out target, out slot)) { result = PARAM_NG; return false; } if (!ParseMoveArm(args[1], out _arm)) { result = PARAM_NG; return false; } if (!Check(device, out result)) { return false; } if (!Check(device, out result)) { return false; } if (!Check(device, out result)) { return false; } if (!Check(device, out result)) { return false; } if (!Check(device, out result)) { return false; } if (!Check(device, out result)) { return false; } if (!Check(device, out result)) { LOG.Write($"PickTask {device} Busy"); return false; } if (!Check(device, out result)) { return false; } if (!Check(device, out result)) { return false; } if (!Check(device, out result)) { return false; } //do not check loadlock if (!ModuleHelper.IsLoadLock(target) && !Singleton.Instance.CheckHasWafer(target,slot-1)) { result = "NONWAF"; return false; } if (_arm == Hand.Blade1) { if (Singleton.Instance.CheckHasWafer(ModuleName.Robot,0)) { result = "WAFER"; return false; } } else if (_arm == Hand.Blade2) { if (Singleton.Instance.CheckHasWafer(ModuleName.Robot,1)) { result = "WAFER"; return false; } } else { if (Singleton.Instance.CheckHasWafer(ModuleName.Robot,0)) { result = "WAFER"; return false; } if (Singleton.Instance.CheckHasWafer(ModuleName.Robot,1)) { result = "WAFER"; return false; } } if (!Check(device, out result)) { return false; } if (!Check(device, out result)) { return false; } if (!Check(device, out result)) { return false; } if (!Check(device, out result)) { return false; } if (!Check(device, out result)) { return false; } if (Singleton.Instance.EfemDevice.IsError) { result = "ERROR"; return false; } if (!Singleton.Instance.EfemDevice.IsIdle) { LOG.Write($"PickTask RouteManager is Busy"); result = "BUSY"; return false; } _token = Singleton.Instance.EfemDevice.Invoke("Pick", target.ToString(), slot - 1, _arm); return true; } public bool? Monitor(out string result, params string[] args) { result = string.Empty; if (Singleton.Instance.EfemDevice.CheckIsError(ModuleName.Robot)) { string param1 = ""; if (_arm == Hand.Blade1) { if (Singleton.Instance.CheckHasWafer(ModuleName.Robot, 0)) { param1 = "WAFER"; } else { param1 = "NONWAF"; } } else if (_arm == Hand.Blade2) { if (Singleton.Instance.CheckHasWafer(ModuleName.Robot, 1)) { param1 = "WAFER"; } else { param1 = "NONWAF"; } } result = $"ERROR|{param1}"; return false; } if (Singleton.Instance.EfemDevice.CheckIsIdle(ModuleName.Robot) && Singleton.Instance.EfemDevice.CheckIsIdle(ModuleName.System) && Singleton.Instance.EfemDevice.CheckAcked(_token)) return true; return null; } } }