| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 | using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Aitex.Core.Common;using Aitex.Core.RT.Event;using Aitex.Core.RT.Routine;using Aitex.Sorter.Common;using MECF.Framework.Common.Equipment;using MECF.Framework.Common.SubstrateTrackings;using Aitex.Core.RT.SCCore;namespace VirgoRT.Modules{    public class ReturnAllWafer : TransferModule    {        private Queue<IRoutine> _moveTaskQueue = new Queue<IRoutine>();        private IRoutine _activeTask;        private bool _cooling;        private int _coolingTime;        private bool _aligning;        private int _alignAngle;        private int _flipOption = 0;        public Result Start(object[] objs)        {            _moveTaskQueue.Clear();            _activeTask = null;            if (objs.Length >= 4)            {                _aligning = (bool)objs[2];                _alignAngle = (int)objs[3];            }            if (objs.Length >= 2)            {                _cooling = (bool)objs[0];                _coolingTime = (int)objs[1];            }            else            {                _cooling = false;                _aligning = false;            }            _flipOption = SC.GetValue<int>("EFEM.FlipReturnWaferOption");            return Result.RUN;        }        public Result Monitor(object[] objs)        {            if (_activeTask == null )            {                return StartNewReturnTask();            }            Result ret = _activeTask.Monitor();            if (ret == Result.FAIL)                return ret;            if (ret == Result.DONE)            {                if (_moveTaskQueue.Count > 0)                {                    _activeTask = _moveTaskQueue.Dequeue();                    return _activeTask.Start();                }                else                {                    _activeTask = null;                }            }            return Result.RUN;        }        public void Clear()        {            _moveTaskQueue.Clear();            _activeTask = null;        }        private Result StartNewReturnTask()        {            ModuleName[] modules = new[]                {ModuleName.EfemRobot, ModuleName.Aligner1, ModuleName.Aligner2, ModuleName.Cooling1, ModuleName.Cooling2, ModuleName.PMA, ModuleName.PMB, ModuleName.Flipper};            ModuleName source = ModuleName.System;            WaferInfo wafer = null;            Hand hand = SelectFreeArm();            int sourceSlot = 0;            foreach (var moduleName in modules)            {                if (ModuleHelper.IsInstalled(moduleName) && WaferManager.Instance.CheckHasWafer(moduleName, 0))                {                    source = moduleName;                    wafer = WaferManager.Instance.GetWafer(source, 0);                    break;                }            }            if (wafer == null)            {                if (WaferManager.Instance.CheckHasWafer(ModuleName.EfemRobot, 1))                {                    source = ModuleName.EfemRobot;                    wafer = WaferManager.Instance.GetWafer(source, 1);                    hand = Hand.Blade2;                    sourceSlot = 1;                }            }            if (wafer == null && ModuleHelper.IsInstalled(ModuleName.Buffer))            {                for (int i = 0; i < SC.GetValue<int>("EFEM.Buffer.SlotNumber"); i++)                {                    if (WaferManager.Instance.CheckHasWafer(ModuleName.Buffer, i))                    {                        source = ModuleName.Buffer;                        wafer = WaferManager.Instance.GetWafer(source, i);                        sourceSlot = i;                        break;                    }                }            }            if (source == ModuleName.System || wafer==null || wafer.IsEmpty)            {                EV.PostInfoLog("Scheduler", "All wafers returned.");                return Result.DONE;            }            ModuleName transferModule = source;            int transferSlot = sourceSlot;            if ((_flipOption == 1 && wafer.IsReversed) ||                (_flipOption == 2 && !wafer.IsReversed) ||                (_flipOption == 3) ||                (source == ModuleName.EfemRobot && _flipOption != 0))            {                string flipOrient = _flipOption == 1 ? "FaceUp" : (_flipOption == 2 ? "FaceDown" : "AlwaysReverse");                if (_aligning && WaferManager.Instance.CheckHasWafer(ModuleName.Aligner1, 0))                {                    if (WaferManager.Instance.CheckHasWafer(ModuleName.Flipper, 0))                    {                        EV.PostWarningLog("System", "Cannot auto Flip and Align wafer while return wafers as both modules have wafer");                        return Result.FAIL;                    }                    hand = SelectFreeArm();                    if (hand == Hand.Both)                    {                        EV.PostWarningLog("System", "No free arm  while return wafer");                        return Result.FAIL;                    }                                        // handle the aligner wafer first while return wafer need both flip and aligning                    wafer = WaferManager.Instance.GetWafer(ModuleName.Aligner1, 0);                    _moveTaskQueue.Enqueue(new AlignRoutine(ModuleName.Aligner1.ToString()));                    _moveTaskQueue.Enqueue(new EfemRobotMover(new MoveItemEx(ModuleName.Aligner1, 0, ModuleName.Flipper, 0, 0, hand)));                    _moveTaskQueue.Enqueue(new FlipRoutine(ModuleName.Flipper.ToString(), flipOrient));                    _moveTaskQueue.Enqueue(new EfemRobotMover(new MoveItemEx(ModuleName.Flipper, 0, (ModuleName)wafer.OriginStation, wafer.OriginSlot, 0, hand)));                    _activeTask = _moveTaskQueue.Dequeue();                    return _activeTask.Start();                }                if (WaferManager.Instance.CheckNoWafer(ModuleName.Flipper, 0))                {                    _moveTaskQueue.Enqueue(new EfemRobotMover(new MoveItemEx(source, sourceSlot, ModuleName.Flipper, 0, 0, hand)));                }                else                {                    hand = SelectFreeArm();                    if (hand == Hand.Both)                    {                        EV.PostWarningLog("System", "No free arm while return wafer");                        return Result.FAIL;                    }                    wafer = WaferManager.Instance.GetWafer(ModuleName.Flipper, 0);                }                                    _moveTaskQueue.Enqueue(new FlipRoutine(ModuleName.Flipper.ToString(), flipOrient));                transferModule = ModuleName.Flipper;                transferSlot = 0;            }            else if (ModuleHelper.IsFlipper(source))            {                _moveTaskQueue.Enqueue(new FlipRoutine(source.ToString(), _flipOption == 2 ? "FaceDown" : "FaceUp"));            }            if (_cooling && !ModuleHelper.IsCooling(transferModule) && !ModuleHelper.IsAligner(transferModule))            {                ModuleName cooling = ModuleName.System;                if (ModuleHelper.IsInstalled(ModuleName.Cooling1) && WaferManager.Instance.CheckNoWafer(ModuleName.Cooling1, 0))                    cooling = ModuleName.Cooling1;                else if (ModuleHelper.IsInstalled(ModuleName.Cooling2) && WaferManager.Instance.CheckNoWafer(ModuleName.Cooling2, 0))                    cooling = ModuleName.Cooling2;                else                {                    EV.PostWarningLog("System", "No valid cooling station for auto cooling");                    return Result.FAIL;                }                _moveTaskQueue.Enqueue(new EfemRobotMover(new MoveItemEx(transferModule, transferSlot, cooling, 0, _coolingTime, hand)));                _moveTaskQueue.Enqueue(new EfemRobotMover(new MoveItemEx(cooling, 0, (ModuleName)wafer.OriginStation, wafer.OriginSlot, 0, hand)));            }            else if (_aligning)            {                ModuleName aligner = transferModule;                bool needMoveToAligner = true;                 if (!ModuleHelper.IsAligner(transferModule))                {                    if (ModuleHelper.IsInstalled(ModuleName.Aligner1) && WaferManager.Instance.CheckNoWafer(ModuleName.Aligner1, 0))                        aligner = ModuleName.Aligner1;                    else if (ModuleHelper.IsInstalled(ModuleName.Aligner2) && WaferManager.Instance.CheckNoWafer(ModuleName.Aligner2, 0))                        aligner = ModuleName.Aligner2;                    else if (transferModule == ModuleName.EfemRobot && WaferManager.Instance.CheckNoWafer(ModuleName.EfemRobot, 1 - transferSlot))                    {                        if (ModuleHelper.IsInstalled(ModuleName.Aligner1) && WaferManager.Instance.CheckHasWafer(ModuleName.Aligner1, 0))                            aligner = ModuleName.Aligner1;                        else if (ModuleHelper.IsInstalled(ModuleName.Aligner2) && WaferManager.Instance.CheckHasWafer(ModuleName.Aligner2, 0))                            aligner = ModuleName.Aligner2;                        else                        {                            EV.PostWarningLog("System", "No aligner station installed");                            return Result.FAIL;                        }                        // return aligner wafer first                        hand = (Hand)(1 - transferSlot);                        needMoveToAligner = false;                        wafer = WaferManager.Instance.GetWafer(aligner, 0);                    }                    else                    {                        EV.PostWarningLog("System", "No valid aligner station for auto aligning");                        return Result.FAIL;                    }                    if(needMoveToAligner)                        _moveTaskQueue.Enqueue(new EfemRobotMover(new MoveItemEx(transferModule, transferSlot, aligner, 0, _coolingTime, hand)));                }                _moveTaskQueue.Enqueue(new AlignRoutine(aligner.ToString()));                _moveTaskQueue.Enqueue(new EfemRobotMover(new MoveItemEx(aligner, 0, (ModuleName)wafer.OriginStation, wafer.OriginSlot, 0, hand)));            }            else            {                _moveTaskQueue.Enqueue(new EfemRobotMover(new MoveItemEx(transferModule, transferSlot, (ModuleName)wafer.OriginStation, wafer.OriginSlot, 0, hand)));            }            _activeTask = _moveTaskQueue.Dequeue();            return _activeTask.Start() ;         }        private Hand SelectFreeArm()        {            if (WaferManager.Instance.CheckNoWafer(ModuleName.EfemRobot, 0) && SC.GetValue<bool>("EFEM.EfemRobot.LowerBladeEnable"))                return Hand.Blade1;            else if (WaferManager.Instance.CheckNoWafer(ModuleName.EfemRobot, 1) && SC.GetValue<bool>("EFEM.EfemRobot.UpperBladeEnable"))                return Hand.Blade2;            else                return Hand.Both;        }    }}
 |