using Aitex.Core.Common; using Aitex.Core.Util; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.SubstrateTrackings; using MECF.Framework.Common.ToolLayout; using MECF.Framework.Common.WaferHolder; using CyberX8_RT.Schedulers.Aligner; using CyberX8_RT.Schedulers.Dryer; using CyberX8_RT.Schedulers.EfemRobot; using CyberX8_RT.Schedulers.Loader; using CyberX8_RT.Schedulers.Puf; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using CyberX8_RT.Schedulers.Prewet; using CyberX8_RT.Schedulers.Transporter; using CyberX8_RT.Schedulers.Rinse; using CyberX8_RT.Schedulers.Metal; using CyberX8_RT.Schedulers.Srd; using CyberX8_RT.Dispatch; namespace CyberX8_RT.Schedulers { public class SchedulerManager : Singleton { #region 内部变量 /// /// 模块类型集合字典 /// private Dictionary> _scheduleModuleTypeDic = new Dictionary>(); /// /// 模块字典 /// private Dictionary _scheduleModuleDic = new Dictionary(); #endregion #region 初始化 /// /// 初始化 /// public void Initialize() { AddScheduleModule(ModuleType.EfemRobot, new SchedulerRobot(ModuleName.EfemRobot)); AddScheduleModule(ModuleType.Aligner, new SchedulerAligner(ModuleName.Aligner1)); InitializeSchedulerModules(PufItemManager.Instance.InstalledModules, ModuleType.PUF, typeof(SchedulerPuf)); InitializeSchedulerModules(LoaderItemManager.Instance.InstalledModules, ModuleType.Loader, typeof(SchedulerLoader)); if (ModuleHelper.IsInstalled(ModuleName.Transporter2)) { InitializeSchedulerModule(ModuleName.Transporter2.ToString(), ModuleType.Transporter, typeof(SchedulerLoaderTransporter)); } if(ModuleHelper.IsInstalled(ModuleName.Transporter1)) { InitializeSchedulerModule(ModuleName.Transporter1.ToString(), ModuleType.Transporter, typeof(SchedulerProcessTransporter)); } InitializeSchedulerModules(PrewetItemManager.Instance.InstalledModules, ModuleType.Prewet, typeof(SchedulerPrewet)); InitializeSchedulerModules(BufferItemManager.Instance.InstalledModules, ModuleType.Buffer, typeof(SchedulerBuffer)); InitializeSchedulerModules(RinseItemManager.Instance.InstalledModules, ModuleType.Rinse, typeof(SchedulerRinse)); InitializeSchedulerModules(DryerItemManager.Instance.InstalledModules,ModuleType.Dryer,typeof(SchedulerDryer)); InitializeSchedulerModules(SrdItemManager.Instance.InstalledModules,ModuleType.SRD,typeof(SchedulerSrd)); InitializeSchedulerModules(MetalItemManager.Instance.InstalledModules, ModuleType.Metal, typeof(SchedulerMetal)); } /// /// 重置 /// public void ResetSchedulerModule() { List moduleNames = _scheduleModuleDic.Keys.ToList(); foreach(ModuleName item in moduleNames) { _scheduleModuleDic[item].ResetTask(); } } /// /// 初始化调度Module集合 /// private void InitializeSchedulerModules(List installedModules,ModuleType moduleType,Type type) { foreach(string item in installedModules) { InitializeSchedulerModule(item, moduleType, type); } } /// /// 初始化调度Module /// /// /// /// private void InitializeSchedulerModule(string item, ModuleType moduleType, Type type) { ModuleName moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), item); SchedulerModule schedulerModule = (SchedulerModule)System.Activator.CreateInstance(type, moduleName); AddScheduleModule(moduleType, schedulerModule); } /// /// 增加调度模块 /// /// /// private void AddScheduleModule(ModuleType moduleType, SchedulerModule module) { List schedulers = new List(); if (_scheduleModuleTypeDic.ContainsKey(moduleType)) { schedulers = _scheduleModuleTypeDic[moduleType]; } else { _scheduleModuleTypeDic[moduleType] = schedulers; } schedulers.Add(module); _scheduleModuleDic[module.Module] = module; } #endregion /// /// 获取调度对象 /// /// /// public SchedulerModule GetScheduler(ModuleName moduleName) { return _scheduleModuleDic.ContainsKey(moduleName)?_scheduleModuleDic[moduleName]:null; } /// /// 根据模块类型获取调度模块集合 /// /// /// public List GetModuleTypeScheduleModules(ModuleType moduleType) { return _scheduleModuleTypeDic.ContainsKey(moduleType) ? _scheduleModuleTypeDic[moduleType]: null; } /// /// 获取可用的Buffer /// /// /// public WaferHolderInfo GetAvaibleBufferToLoaderWaferHolder(WaferSize waferSize, string crsType, List chemistries) { bool isDryer = false; var result = GetAvaibleWaferHolderInfos(waferSize,crsType,chemistries,ref isDryer); if (isDryer) { return result.avaibleWaferHolders.Count != 0 ? result.avaibleWaferHolders[0] : null; } return GetMinTotalUseWaferHolder(result.avaibleWaferHolders); } /// /// 获取可用Buffer可用WaferHolder数量 /// /// /// public bool ExistAvaibleBufferWaferHolder(WaferSize waferSize,string crsType,List chemistries) { bool isDryer = false; var result = GetAvaibleWaferHolderInfos(waferSize,crsType,chemistries, ref isDryer); return result.avaibleWaferHolders.Count>0; } /// /// 获取可用WaferHolder集合 /// /// /// private (List avaibleWaferHolders, List avaibleSchedulerModules) GetAvaibleWaferHolderInfos(WaferSize waferSize, string crsType, List chemistries,ref bool isDryer) { List avaibleWaferHolders = new List(); List avaibleSchedulerModules = new List(); List dryerModules = DryerItemManager.Instance.InstalledModules; foreach(string item in dryerModules) { WaferHolderInfo waferHolderInfo = WaferHolderManager.Instance.GetWaferHolder(item); if (waferHolderInfo == null) { continue; } if(!Enum.TryParse(item,out ModuleName dryerModuleName)) { continue; } if (WaferHolderTaskManager.Instance.CheckWaferHolderNotExist(waferHolderInfo)) { SchedulerModule schedulerModule = Instance.GetScheduler(dryerModuleName); avaibleWaferHolders.Add(waferHolderInfo); avaibleSchedulerModules.Add(schedulerModule); isDryer = true; return (avaibleWaferHolders, avaibleSchedulerModules); } } List schedulerModules = GetModuleTypeScheduleModules(ModuleType.Buffer); if (schedulerModules != null) { foreach (SchedulerModule item in schedulerModules) { WaferHolderInfo waferHolderInfo = WaferHolderManager.Instance.GetWaferHolder(item.Module.ToString()); //WaferHolder可用,大小,以及可以移动至Loader if (waferHolderInfo != null && waferHolderInfo.Enabled && waferHolderInfo.WaferSize == (int)waferSize &&waferHolderInfo.CrsType==crsType && IsWaferHolderCanGotoLoader(waferHolderInfo)&&CheckChemistry(waferHolderInfo,chemistries)) { avaibleWaferHolders.Add(waferHolderInfo); avaibleSchedulerModules.Add(item); } } } return (avaibleWaferHolders,avaibleSchedulerModules); } /// /// 检验WaferHolder化学液是否合规 /// /// /// /// private bool CheckChemistry(WaferHolderInfo waferHolderInfo,List chemistries) { if (chemistries.Count == 0) { return true; } if (chemistries.Count == 1) { string chemistry= chemistries[0]; return waferHolderInfo.Chemistry == "Any" || waferHolderInfo.Chemistry.Trim() == chemistry; } else { return waferHolderInfo.Chemistry == "Any"; } } /// /// 获取最少使用次数的Buffer /// /// /// /// private SchedulerModule GetMinTotalUseSchedulerBuffer(List avaibleWaferHolders,List modules) { int min = int.MaxValue; int index = -1; for(int i=0;i /// 获取最少使用次数的Buffer /// /// /// /// private WaferHolderInfo GetMinTotalUseWaferHolder(List avaibleWaferHolders) { int min = int.MaxValue; int index = -1; for (int i = 0; i < avaibleWaferHolders.Count; i++) { WaferHolderInfo waferHolderInfo = avaibleWaferHolders[i]; if(IsWaferHolderExsitProcessedWafer(waferHolderInfo)) { index = i; break; } if (waferHolderInfo.TotalUses < min) { min = waferHolderInfo.TotalUses; index = i; } } if (index != -1) { return avaibleWaferHolders[index]; } return null; } /// /// WaferHolder是否存在已经完成的Production Wafer /// /// /// private bool IsWaferHolderExsitProcessedWafer(WaferHolderInfo waferHolderInfo) { if(!string.IsNullOrEmpty(waferHolderInfo.WaferAId)) { WaferInfo waferInfo = WaferManager.Instance.GetWaferByWaferId(waferHolderInfo.WaferAId); if(waferInfo!=null&&waferInfo.WaferType==WaferType.Production&&waferInfo.ProcessState==EnumWaferProcessStatus.Completed) { return true; } } if (!string.IsNullOrEmpty(waferHolderInfo.WaferBId)) { WaferInfo waferInfo = WaferManager.Instance.GetWaferByWaferId(waferHolderInfo.WaferBId); if (waferInfo != null && waferInfo.WaferType == WaferType.Production && waferInfo.ProcessState == EnumWaferProcessStatus.Completed) { return true; } } return false; } /// /// WaferHolder是否可以去Loader /// /// private bool IsWaferHolderCanGotoLoader(WaferHolderInfo waferHolderInfo) { if(string.IsNullOrEmpty(waferHolderInfo.WaferAId)||string.IsNullOrEmpty(waferHolderInfo.WaferBId)) { return false; } if(waferHolderInfo.WaferAType==(int)WaferType.Assit||waferHolderInfo.WaferBType==(int)WaferType.Assit) { return true; } WaferInfo waferAInfo = WaferManager.Instance.GetWaferByWaferId(waferHolderInfo.WaferAId); if(waferAInfo == null) { return false; } WaferInfo waferBInfo = WaferManager.Instance.GetWaferByWaferId(waferHolderInfo.WaferBId); if(waferBInfo==null) { return false; } //Wafer还是裸硅片 return waferHolderInfo.IsToLoader; } /// /// 根据Wafer尺寸获取waferHolder数量 /// /// /// public int GetWaferHolderInfoCountByWaferSize(WaferSize waferSize, string crsType, List chemistries) { List waferHolders = WaferHolderManager.Instance.GetAllWaferHolders(); int count = 0; foreach (WaferHolderInfo info in waferHolders) { if (info.WaferSize == (int)waferSize && info.Enabled && info.CrsType == crsType && CheckChemistry(info,chemistries)) { count++; } } return count; } } }