123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360 |
- 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<SchedulerManager>
- {
- #region 内部变量
- /// <summary>
- /// 模块类型集合字典
- /// </summary>
- private Dictionary<ModuleType, List<SchedulerModule>> _scheduleModuleTypeDic = new Dictionary<ModuleType, List<SchedulerModule>>();
- /// <summary>
- /// 模块字典
- /// </summary>
- private Dictionary<ModuleName, SchedulerModule> _scheduleModuleDic = new Dictionary<ModuleName, SchedulerModule>();
- #endregion
- #region 初始化
- /// <summary>
- /// 初始化
- /// </summary>
- 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));
- }
- /// <summary>
- /// 重置
- /// </summary>
- public void ResetSchedulerModule()
- {
- List<ModuleName> moduleNames = _scheduleModuleDic.Keys.ToList();
- foreach(ModuleName item in moduleNames)
- {
- _scheduleModuleDic[item].ResetTask();
- }
- }
- /// <summary>
- /// 初始化调度Module集合
- /// </summary>
- private void InitializeSchedulerModules(List<string> installedModules,ModuleType moduleType,Type type)
- {
- foreach(string item in installedModules)
- {
- InitializeSchedulerModule(item, moduleType, type);
- }
- }
- /// <summary>
- /// 初始化调度Module
- /// </summary>
- /// <param name="item"></param>
- /// <param name="moduleType"></param>
- /// <param name="type"></param>
- 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);
- }
- /// <summary>
- /// 增加调度模块
- /// </summary>
- /// <param name="moduleType"></param>
- /// <param name="module"></param>
- private void AddScheduleModule(ModuleType moduleType, SchedulerModule module)
- {
- List<SchedulerModule> schedulers = new List<SchedulerModule>();
- if (_scheduleModuleTypeDic.ContainsKey(moduleType))
- {
- schedulers = _scheduleModuleTypeDic[moduleType];
- }
- else
- {
- _scheduleModuleTypeDic[moduleType] = schedulers;
- }
- schedulers.Add(module);
- _scheduleModuleDic[module.Module] = module;
- }
- #endregion
- /// <summary>
- /// 获取调度对象
- /// </summary>
- /// <param name="moduleName"></param>
- /// <returns></returns>
- public SchedulerModule GetScheduler(ModuleName moduleName)
- {
- return _scheduleModuleDic.ContainsKey(moduleName)?_scheduleModuleDic[moduleName]:null;
- }
- /// <summary>
- /// 根据模块类型获取调度模块集合
- /// </summary>
- /// <param name="moduleType"></param>
- /// <returns></returns>
- public List<SchedulerModule> GetModuleTypeScheduleModules(ModuleType moduleType)
- {
- return _scheduleModuleTypeDic.ContainsKey(moduleType) ? _scheduleModuleTypeDic[moduleType]: null;
- }
- /// <summary>
- /// 获取可用的Buffer
- /// </summary>
- /// <param name="waferSize"></param>
- /// <returns></returns>
- public WaferHolderInfo GetAvaibleBufferToLoaderWaferHolder(WaferSize waferSize, string crsType, List<string> 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);
- }
- /// <summary>
- /// 获取可用Buffer可用WaferHolder数量
- /// </summary>
- /// <param name="waferSize"></param>
- /// <returns></returns>
- public bool ExistAvaibleBufferWaferHolder(WaferSize waferSize,string crsType,List<string> chemistries)
- {
- bool isDryer = false;
- var result = GetAvaibleWaferHolderInfos(waferSize,crsType,chemistries, ref isDryer);
- return result.avaibleWaferHolders.Count>0;
- }
- /// <summary>
- /// 获取可用WaferHolder集合
- /// </summary>
- /// <param name="waferSize"></param>
- /// <returns></returns>
- private (List<WaferHolderInfo> avaibleWaferHolders, List<SchedulerModule> avaibleSchedulerModules)
- GetAvaibleWaferHolderInfos(WaferSize waferSize, string crsType, List<string> chemistries,ref bool isDryer)
- {
- List<WaferHolderInfo> avaibleWaferHolders = new List<WaferHolderInfo>();
- List<SchedulerModule> avaibleSchedulerModules = new List<SchedulerModule>();
- List<string> 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<SchedulerModule> 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);
- }
- /// <summary>
- /// 检验WaferHolder化学液是否合规
- /// </summary>
- /// <param name="waferHolderInfo"></param>
- /// <param name="chemistries"></param>
- /// <returns></returns>
- private bool CheckChemistry(WaferHolderInfo waferHolderInfo,List<string> 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";
- }
- }
- /// <summary>
- /// 获取最少使用次数的Buffer
- /// </summary>
- /// <param name="avaibleWaferHolders"></param>
- /// <param name="modules"></param>
- /// <returns></returns>
- private SchedulerModule GetMinTotalUseSchedulerBuffer(List<WaferHolderInfo> avaibleWaferHolders,List<SchedulerModule> modules)
- {
- int min = int.MaxValue;
- int index = -1;
- for(int i=0;i<avaibleWaferHolders.Count;i++)
- {
- WaferHolderInfo waferHolderInfo=avaibleWaferHolders[i];
- if(waferHolderInfo.TotalUses<min)
- {
- min = waferHolderInfo.TotalUses;
- index = i;
- }
- }
- if(index!=-1)
- {
- return modules[index];
- }
- return null;
- }
- /// <summary>
- /// 获取最少使用次数的Buffer
- /// </summary>
- /// <param name="avaibleWaferHolders"></param>
- /// <param name="modules"></param>
- /// <returns></returns>
- private WaferHolderInfo GetMinTotalUseWaferHolder(List<WaferHolderInfo> 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;
- }
- /// <summary>
- /// WaferHolder是否存在已经完成的Production Wafer
- /// </summary>
- /// <param name="waferHolderInfo"></param>
- /// <returns></returns>
- 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;
- }
- /// <summary>
- /// WaferHolder是否可以去Loader
- /// </summary>
- /// <returns></returns>
- 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;
- }
- /// <summary>
- /// 根据Wafer尺寸获取waferHolder数量
- /// </summary>
- /// <param name="waferSize"></param>
- /// <returns></returns>
- public int GetWaferHolderInfoCountByWaferSize(WaferSize waferSize, string crsType, List<string> chemistries)
- {
- List<WaferHolderInfo> 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;
- }
- }
- }
|