| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 | using Aitex.Core.RT.Log;using Aitex.Core.Util;using Aitex.Sorter.Common;using MECF.Framework.Common.Equipment;using MECF.Framework.Common.SubstrateTrackings;using FurnaceRT.Equipments.Systems;using FurnaceRT.Equipments.WaferRobots;using FurnaceRT.Equipments.FIMSs;namespace FurnaceRT.Equipments.Schedulers{    public class SchedulerWaferRobot : SchedulerModule    {        public override bool IsAvailable        {            get { return _waferRobot.IsReady && _waferRobot.IsOnline && CheckTaskDone(); }        }         public override bool IsOnline        {            get { return _waferRobot.IsOnline; }        }        public override bool IsError        {            get { return _waferRobot.IsError; }        }        private WaferRobotModuleBase _waferRobot = null;        private Hand _hand;        private Hand _taskSwapPickHand;        private Hand _taskSwapPlaceHand;        private int _taskSwapPickSlot;        private int _taskSwapPlaceSlot;        public ModuleName PreviousTarget { get; set; }        public SchedulerWaferRobot() : base(ModuleName.WaferRobot.ToString())        {            _waferRobot = Singleton<EquipmentManager>.Instance.Modules[ModuleName.WaferRobot] as WaferRobotModuleBase;            PreviousTarget = ModuleName.System;        }        public override void ResetTask()        {            base.ResetTask();            PreviousTarget = ModuleName.System;        }        public bool IsReadyForPick(Hand blade)        {            if(blade == Hand.Blade1)            {                return WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 0);            }            else if (blade == Hand.Blade2)            {                return WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 1) &&                    WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 2) &&                    WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 3) &&                    WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 4);            }            else            {                return WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 0) &&                    WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 1) &&                    WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 2) &&                    WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 3) &&                    WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 4);            }        }        public bool IsReadyForPlace(Hand blade)        {            if (blade == Hand.Blade1)            {                return WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 0);            }            else if (blade == Hand.Blade2)            {                return WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 1) &&                    WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 2) &&                    WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 3) &&                    WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 4);            }            else            {                return WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 0) &&                    WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 1) &&                    WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 2) &&                    WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 3) &&                    WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 4);            }        }        public bool Pick(ModuleName source, int slot, Hand hand)        {            _task = TaskType.Pick;            _hand = hand;            if (!_waferRobot.Pick(source, hand, slot, out string reason))            {                LOG.Write(reason);            }            PreviousTarget = source;            LogTaskStart(_task, $"{source}.{slot + 1}=>{Module}.{hand}");            return true;        }        public bool Place(ModuleName destination, int slot, Hand hand)        {            _task = TaskType.Place;            _hand = hand;            if (!_waferRobot.Place(destination, hand, slot, out string reason))            {                LOG.Write(reason);            }            PreviousTarget = destination;            LogTaskStart(_task, $"{Module}.{hand}=>{destination}.{slot + 1}");            return true;        }        public bool Map(ModuleName destination, int slotNumber, string slotMap, bool isCompareWithSlotMap, bool isCreateWafer, Hand hand)        {            _task = TaskType.Map;            _hand = hand;            if (!_waferRobot.Map(destination, hand, slotNumber, slotMap, isCompareWithSlotMap, isCreateWafer, out string reason))            {                LOG.Write(reason);            }            if (destination == ModuleName.FIMS1 || destination == ModuleName.FIMS2)                (Singleton<EquipmentManager>.Instance.Modules[destination] as FIMSModule).IsMapping = true;            PreviousTarget = destination;            LogTaskStart(_task, $"{Module}.{hand}=> slot number = {slotNumber}");            return true;        }        public bool Goto(ModuleName target, int slot,   Hand hand )        {            PreviousTarget = target;            _task = TaskType.Goto;            //if (!_waferRobot.Goto(target, hand, slot, out string reason))            //{            //    LOG.Write(reason);            //}             LogTaskStart(_task, $"robot {hand} goto {target}, slot {slot+1}");            return true;        }        public bool CheckTaskDone()        {            bool ret = false;            switch (_task)            {                case TaskType.None:                    ret = true;                    break;                case TaskType.Pick:                    if (_hand == Hand.Both)                    {                        ret = WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 0)                            && WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 1)                            && WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 2)                            && WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 3)                            && WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 4);                    }                    else if(_hand == Hand.Blade1)                    {                        ret = WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 2);                    }                    else                    {                        ret = WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 1)                            && WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 2)                            && WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 3)                            && WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 4);                    }                    break;                case TaskType.Place:                    if (_hand == Hand.Both)                    {                        ret = WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 0)                            && WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 1)                            && WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 2)                            && WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 3)                            && WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 4);                    }                    else if (_hand == Hand.Blade1)                    {                        ret = WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 2);                    }                    else                    {                        ret = WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 1)                            && WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 2)                            && WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 3)                            && WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 4);                    }                    break;                case TaskType.Goto:                    ret = _waferRobot.IsReady;                    break;                case TaskType.PickAndPlace:                    ret = WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, (int)_taskSwapPickHand)                          && WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, (int)_taskSwapPlaceHand);                    break;                case TaskType.Map:                    var carrier = CarrierManager.Instance.GetCarrier(PreviousTarget, 0);                    if (carrier != null)                        ret = carrier.IsMapped;                    else                        ret = _waferRobot.IsReady;                    break;            }            if (ret && _task != TaskType.None)            {                LogTaskDone(_task, "");                _task = TaskType.None;            }            return ret;        }    }}
 |