using Aitex.Core.RT.Log; using Aitex.Core.Util; using CyberX8_Core; using CyberX8_RT.Modules; using CyberX8_RT.Modules.Loader; using CyberX8_RT.Modules.PUF; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.Schedulers; using MECF.Framework.Common.SubstrateTrackings; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace CyberX8_RT.Schedulers.EfemRobot { public class RobotMoveHelper : Singleton<RobotMoveHelper> { private enum RobotOperation { None, Pick, PickWait, CheckLoaderPrepare, Place, PlaceWait } #region 内部变量 private Queue<MoveItem> _queue=new Queue<MoveItem>(); private MoveItem _moveItem; private RState _state = RState.End; private RobotOperation _currentOperation=RobotOperation.None; private EfemEntity _efemEntity; private LoaderEntity _loaderEntity; private PUFEntity _puf1Entity; private PUFEntity _puf2Entity; private string _module; #endregion #region 属性 /// <summary> /// 是否忙碌 /// </summary> public bool IsBusy { get { return _state == RState.Running; } } /// <summary> /// 是否空闲 /// </summary> public bool IsIdle { get { return _state == RState.End; } } /// <summary> /// 是否错误 /// </summary> public bool IsError { get { return _state == RState.Failed || _state == RState.Timeout; } } /// <summary> /// 当前模块名称 /// </summary> public string Module { get { return _module; } } /// <summary> /// 是否完成 /// </summary> public bool IsPickCompleted { get { return _currentOperation >= RobotOperation.Place; } } #endregion /// <summary> /// 构造函数 /// </summary> /// <param name="queue"></param> public RobotMoveHelper() { } /// <summary> /// 启动 /// </summary> /// <param name="queue"></param> /// <returns></returns> public bool Start(MoveItem moveItem,string module) { _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()); _moveItem = moveItem; _queue.Clear(); _queue.Enqueue(moveItem); _state = RState.Running; _currentOperation = RobotOperation.Pick; _module = module; return true; } /// <summary> /// 监控状态 /// </summary> /// <returns></returns> public bool Monitor(string module) { if (_module != module) { return false; } if (_currentOperation == RobotOperation.Pick) { if (CheckOtherModuleError()) { return false; } if (_efemEntity.IsIdle) { bool result = Pick(); if (result) { _currentOperation = RobotOperation.PickWait; } } } else if (_currentOperation == RobotOperation.PickWait) { if (_efemEntity.IsIdle && WaferManager.Instance.CheckHasWafer(ModuleName.EfemRobot, 0) && WaferManager.Instance.CheckNoWafer(_moveItem.SourceModule, _moveItem.SourceSlot)) { if (_moveItem.DestinationType == ModuleType.PUF) { _currentOperation = RobotOperation.CheckLoaderPrepare; } else { _currentOperation = RobotOperation.Place; } } } else if (_currentOperation == RobotOperation.CheckLoaderPrepare) { if(_loaderEntity.State==(int)LOADERSTATE.WaitForUnload) { _currentOperation = RobotOperation.Place; } } else if (_currentOperation == RobotOperation.Place) { if (CheckOtherModuleError()) { return false; } if (_efemEntity.IsIdle) { bool result = Place(); if (result) { _currentOperation = RobotOperation.PlaceWait; } } } else if (_currentOperation == RobotOperation.PlaceWait) { if (_efemEntity.IsIdle && WaferManager.Instance.CheckNoWafer(ModuleName.EfemRobot, 0) && WaferManager.Instance.CheckHasWafer(_moveItem.DestinationModule, _moveItem.DestinationSlot)) { _state = RState.End; _currentOperation = RobotOperation.None; } } return true; } //检验其他模块是否故障 private bool CheckOtherModuleError() { return _loaderEntity.IsError||_puf1Entity.IsError||_puf2Entity.IsError; } /// <summary> /// 取片 /// </summary> /// <param name="moveItem"></param> /// <returns></returns> private bool Pick() { return _efemEntity.CheckToPostMessage<EfemEntity.STATE, EfemEntity.MSG>(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM.ToString(), (int)EfemEntity.MSG.Pick, _queue); } /// <summary> /// 放片 /// </summary> /// <param name="moveItem"></param> /// <returns></returns> private bool Place() { return _efemEntity.CheckToPostMessage<EfemEntity.STATE, EfemEntity.MSG>(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM.ToString(), (int)EfemEntity.MSG.Place, _queue); } /// <summary> /// 重置 /// </summary> public void Reset() { _state = RState.End; _queue.Clear(); } } }