| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 | using Aitex.Core.RT.Fsm;using Aitex.Core.RT.Log;using Aitex.Core.RT.Routine;using Aitex.Core.Util;using MECF.Framework.Common.Equipment;using MECF.Framework.Common.Schedulers;using CyberX8_Core;using CyberX8_RT.Modules;using CyberX8_RT.Modules.PUF;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using MECF.Framework.Common.SubstrateTrackings;using CyberX8_RT.Modules.Loader;using CyberX8_RT.Modules.SRD;namespace CyberX8_RT.Schedulers.EfemRobot{    public class SchedulerRobot : SchedulerModule    {        private enum SchedulerRobotOperation        {            None,            Pick,            PickWait,            Place,            PlaceWait        }        #region 内部变量        private EfemEntity _efemEntity;        private LoaderEntity _loaderEntity;        private PUFEntity _puf1Entity;        private PUFEntity _puf2Entity;        #endregion        #region 属性        /// <summary>        /// 是否空闲        /// </summary>        public override bool IsIdle        {            get { return _state == RState.End; }        }        /// <summary>        /// 是否错误        /// </summary>        public override bool IsError        {            get { return _state == RState.Failed || _state == RState.Timeout; }        }        #endregion        /// <summary>        /// 构造函数        /// </summary>        /// <param name="module"></param>        public SchedulerRobot(ModuleName module) : base(module.ToString())        {            _efemEntity = Singleton<RouteManager>.Instance.EFEM;            _loaderEntity = Singleton<RouteManager>.Instance.GetModule<LoaderEntity>(ModuleName.Loader1.ToString());            _puf1Entity = Singleton<RouteManager>.Instance.GetModule<PUFEntity>(ModuleName.PUF1.ToString());            _puf2Entity = Singleton<RouteManager>.Instance.GetModule<PUFEntity>(ModuleName.PUF2.ToString());        }        /// <summary>        /// 执行        /// </summary>        /// <param name="parameter"></param>        /// <returns></returns>        public override bool RunProcess(object recipe, object parameter, List<SchedulerSyncModuleMessage> syncMessages)        {            if (_efemEntity.IsBusy)            {                return false;            }            MoveItem moveItem = (MoveItem)parameter;            if (moveItem.SourceModule != ModuleName.Unknown&&moveItem.DestinationModule!=ModuleName.Unknown)            {                                _state = RState.Running;                if (RobotMoveHelper.Instance.IsIdle)                {                    RobotMoveHelper.Instance.Start(moveItem, Module.ToString());                    return true;                }            }            return false;        }        /// <summary>        /// 监控执行        /// </summary>        /// <returns></returns>        public override bool MonitorProcess(SchedulerSequence schedulerSequence, bool hasMatchWafer)        {            RobotMoveHelper.Instance.Monitor(Module.ToString());            if (RobotMoveHelper.Instance.IsIdle)            {                _state = RState.End;            }            return true;        }                /// <summary>        /// 检验前置条件        /// </summary>        /// <param name="sequenceIndex"></param>        /// <param name="parameter"></param>        /// <returns></returns>        public override bool CheckPrecondition(List<SchedulerSequence> schedulerSequences, int sequenceIndex, object parameter,string materialId, ref string reason)        {            if (parameter == null)            {                reason = "parameter is null";                return true;            }            if (_state == RState.Running)            {                reason = "scheduler module is already running";                return false;            }            if(_efemEntity.IsBusy)            {                reason = "efem is busy";                return false;            }            if(_efemEntity.IsError)            {                reason = "efem is error";                return false;            }            if(_loaderEntity.IsError||_puf1Entity.IsError)            {                reason = "loader or puf is error";                return false;            }            MoveItem moveItem = (MoveItem)parameter;            if(WaferManager.Instance.CheckHasWafer(ModuleName.EfemRobot,(int)moveItem.RobotHand))            {                reason = "robot has wafer";                return false;            }            if (moveItem.SourceModule == ModuleName.Unknown)            {                UpdateUnkownSourceModule(schedulerSequences, moveItem, sequenceIndex);            }            if (moveItem.DestinationModule == ModuleName.Unknown)            {                bool result= UpdateUnkownTargetModule(schedulerSequences, moveItem, sequenceIndex);                if (!result)                {                    reason = "efem robot confirm target module failed";                    return false;                }            }            if (ModuleHelper.IsPUF(moveItem.DestinationModule))            {                PUFEntity pufEntity = Singleton<RouteManager>.Instance.GetModule<PUFEntity>(moveItem.DestinationModule.ToString());                if (pufEntity != null)                {                    if (pufEntity.State == (int)PUFSTATE.WaitForRobotPlace)                    {                        return true;                    }                    else                    {                        if (pufEntity.IsIdle)                        {                            pufEntity.CheckToPostMessage<PUFSTATE, PUFMSG>(eEvent.ERR_PUF, Module.ToString(),                                (int)PUFMSG.ReadyForRobotPlace);                        }                        reason = $"{pufEntity.Module} state is not WaitForRobotPlace";                        return false;                    }                }                else                {                    reason = $"{moveItem.DestinationModule} puf is null";                }            }            else if (ModuleHelper.IsPUF(moveItem.SourceModule))            {                PUFEntity pufEntity = Singleton<RouteManager>.Instance.GetModule<PUFEntity>(moveItem.SourceModule.ToString());                if (pufEntity != null)                {                    if (pufEntity.State == (int)PUFSTATE.WaitForRobotPick)                    {                        return true;                    }                    else                    {                        if (pufEntity.IsIdle)                        {                            pufEntity.CheckToPostMessage<PUFSTATE, PUFMSG>(eEvent.ERR_PUF, pufEntity.Module.ToString(),                                (int)PUFMSG.ReadyForRobotPick);                        }                        reason = $"{pufEntity.Module} state is not WaitForRobotPick";                        return false;                    }                }                else                {                    reason = $"{moveItem.SourceModule} puf is null";                    return false;                }            }            return true;        }        /// <summary>        /// 更新未知源模块        /// </summary>        private void UpdateUnkownSourceModule(List<SchedulerSequence> schedulerSequences, MoveItem moveItem, int sequenceIndex)        {            if (moveItem.SourceModule == ModuleName.Unknown)            {                if (sequenceIndex >= 1 && sequenceIndex - 1 < schedulerSequences.Count)                {                    SchedulerSequence preSchedulerSequence = schedulerSequences[sequenceIndex - 1];                    if (preSchedulerSequence != null && preSchedulerSequence.SchedulerModule != null)                    {                        moveItem.SourceModule = preSchedulerSequence.SchedulerModule.Module;                    }                }            }        }        /// <summary>        /// 更新未知目标模块        /// </summary>        private bool UpdateUnkownTargetModule(List<SchedulerSequence> schedulerSequences, MoveItem moveItem, int sequenceIndex)        {            SchedulerSequence currentSchedulerSequence= schedulerSequences[sequenceIndex];            ModuleName moduleName = ModuleName.Unknown;            if (moveItem.DestinationType == ModuleType.SRD)            {                SRDEntity srd1Entity = Singleton<RouteManager>.Instance.GetModule<SRDEntity>(ModuleName.SRD1.ToString());                if (srd1Entity != null&&srd1Entity.IsIdle&&srd1Entity.IsAuto&&WaferManager.Instance.CheckNoWafer(ModuleName.SRD1.ToString(),0))                {                    moduleName = ModuleName.SRD1;                }                else                {                    SRDEntity srd2Entity= Singleton<RouteManager>.Instance.GetModule<SRDEntity>(ModuleName.SRD2.ToString());                    if (srd2Entity != null && srd2Entity.IsIdle&&srd2Entity.IsAuto && WaferManager.Instance.CheckNoWafer(ModuleName.SRD2.ToString(), 0))                    {                        moduleName=ModuleName.SRD2;                    }                }            }            else            {                return false;            }                         if (moduleName == ModuleName.Unknown)            {                return false;            }            else            {                if(WaferManager.Instance.CheckHasWafer(moduleName,0))                {                    return false;                }                IModuleEntity moduleEntity = Singleton<RouteManager>.Instance.GetModule<IModuleEntity>(moduleName.ToString());                if (moduleEntity==null)                {                    return false;                }                if (moduleEntity.IsBusy)                {                    return false;                }                moveItem.DestinationModule = moduleName;                if (sequenceIndex + 1 < schedulerSequences.Count)                {                    SchedulerSequence sequence = schedulerSequences[sequenceIndex + 1];                    if (sequence.SchedulerModule == null)                    {                        sequence.SchedulerModule = SchedulerManager.Instance.GetScheduler(moduleName);                        sequence.ModuleName = moduleName;                    }                }            }            return true;        }        public override void ResetTask()        {            base.ResetTask();            RobotMoveHelper.Instance.Reset();        }    }}
 |