SchedulerManager.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. using Aitex.Core.Common;
  2. using Aitex.Core.Util;
  3. using MECF.Framework.Common.Equipment;
  4. using MECF.Framework.Common.SubstrateTrackings;
  5. using MECF.Framework.Common.ToolLayout;
  6. using MECF.Framework.Common.WaferHolder;
  7. using CyberX8_RT.Schedulers.Aligner;
  8. using CyberX8_RT.Schedulers.Dryer;
  9. using CyberX8_RT.Schedulers.EfemRobot;
  10. using CyberX8_RT.Schedulers.Loader;
  11. using CyberX8_RT.Schedulers.Puf;
  12. using System;
  13. using System.Collections.Generic;
  14. using System.Linq;
  15. using System.Text;
  16. using System.Threading.Tasks;
  17. using CyberX8_RT.Schedulers.Prewet;
  18. using CyberX8_RT.Schedulers.Transporter;
  19. using CyberX8_RT.Schedulers.Rinse;
  20. using CyberX8_RT.Schedulers.Metal;
  21. using CyberX8_RT.Schedulers.Srd;
  22. using CyberX8_RT.Dispatch;
  23. namespace CyberX8_RT.Schedulers
  24. {
  25. public class SchedulerManager : Singleton<SchedulerManager>
  26. {
  27. #region 内部变量
  28. /// <summary>
  29. /// 模块类型集合字典
  30. /// </summary>
  31. private Dictionary<ModuleType, List<SchedulerModule>> _scheduleModuleTypeDic = new Dictionary<ModuleType, List<SchedulerModule>>();
  32. /// <summary>
  33. /// 模块字典
  34. /// </summary>
  35. private Dictionary<ModuleName, SchedulerModule> _scheduleModuleDic = new Dictionary<ModuleName, SchedulerModule>();
  36. #endregion
  37. #region 初始化
  38. /// <summary>
  39. /// 初始化
  40. /// </summary>
  41. public void Initialize()
  42. {
  43. AddScheduleModule(ModuleType.EfemRobot, new SchedulerRobot(ModuleName.EfemRobot));
  44. AddScheduleModule(ModuleType.Aligner, new SchedulerAligner(ModuleName.Aligner1));
  45. InitializeSchedulerModules(PufItemManager.Instance.InstalledModules, ModuleType.PUF, typeof(SchedulerPuf));
  46. InitializeSchedulerModules(LoaderItemManager.Instance.InstalledModules, ModuleType.Loader, typeof(SchedulerLoader));
  47. if (ModuleHelper.IsInstalled(ModuleName.Transporter2))
  48. {
  49. InitializeSchedulerModule(ModuleName.Transporter2.ToString(), ModuleType.Transporter, typeof(SchedulerLoaderTransporter));
  50. }
  51. if(ModuleHelper.IsInstalled(ModuleName.Transporter1))
  52. {
  53. InitializeSchedulerModule(ModuleName.Transporter1.ToString(), ModuleType.Transporter, typeof(SchedulerProcessTransporter));
  54. }
  55. InitializeSchedulerModules(PrewetItemManager.Instance.InstalledModules, ModuleType.Prewet, typeof(SchedulerPrewet));
  56. InitializeSchedulerModules(BufferItemManager.Instance.InstalledModules, ModuleType.Buffer, typeof(SchedulerBuffer));
  57. InitializeSchedulerModules(RinseItemManager.Instance.InstalledModules, ModuleType.Rinse, typeof(SchedulerRinse));
  58. InitializeSchedulerModules(DryerItemManager.Instance.InstalledModules,ModuleType.Dryer,typeof(SchedulerDryer));
  59. InitializeSchedulerModules(SrdItemManager.Instance.InstalledModules,ModuleType.SRD,typeof(SchedulerSrd));
  60. InitializeSchedulerModules(MetalItemManager.Instance.InstalledModules, ModuleType.Metal, typeof(SchedulerMetal));
  61. }
  62. /// <summary>
  63. /// 重置
  64. /// </summary>
  65. public void ResetSchedulerModule()
  66. {
  67. List<ModuleName> moduleNames = _scheduleModuleDic.Keys.ToList();
  68. foreach(ModuleName item in moduleNames)
  69. {
  70. _scheduleModuleDic[item].ResetTask();
  71. }
  72. }
  73. /// <summary>
  74. /// 初始化调度Module集合
  75. /// </summary>
  76. private void InitializeSchedulerModules(List<string> installedModules,ModuleType moduleType,Type type)
  77. {
  78. foreach(string item in installedModules)
  79. {
  80. InitializeSchedulerModule(item, moduleType, type);
  81. }
  82. }
  83. /// <summary>
  84. /// 初始化调度Module
  85. /// </summary>
  86. /// <param name="item"></param>
  87. /// <param name="moduleType"></param>
  88. /// <param name="type"></param>
  89. private void InitializeSchedulerModule(string item, ModuleType moduleType, Type type)
  90. {
  91. ModuleName moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), item);
  92. SchedulerModule schedulerModule = (SchedulerModule)System.Activator.CreateInstance(type, moduleName);
  93. AddScheduleModule(moduleType, schedulerModule);
  94. }
  95. /// <summary>
  96. /// 增加调度模块
  97. /// </summary>
  98. /// <param name="moduleType"></param>
  99. /// <param name="module"></param>
  100. private void AddScheduleModule(ModuleType moduleType, SchedulerModule module)
  101. {
  102. List<SchedulerModule> schedulers = new List<SchedulerModule>();
  103. if (_scheduleModuleTypeDic.ContainsKey(moduleType))
  104. {
  105. schedulers = _scheduleModuleTypeDic[moduleType];
  106. }
  107. else
  108. {
  109. _scheduleModuleTypeDic[moduleType] = schedulers;
  110. }
  111. schedulers.Add(module);
  112. _scheduleModuleDic[module.Module] = module;
  113. }
  114. #endregion
  115. /// <summary>
  116. /// 获取调度对象
  117. /// </summary>
  118. /// <param name="moduleName"></param>
  119. /// <returns></returns>
  120. public SchedulerModule GetScheduler(ModuleName moduleName)
  121. {
  122. return _scheduleModuleDic.ContainsKey(moduleName)?_scheduleModuleDic[moduleName]:null;
  123. }
  124. /// <summary>
  125. /// 根据模块类型获取调度模块集合
  126. /// </summary>
  127. /// <param name="moduleType"></param>
  128. /// <returns></returns>
  129. public List<SchedulerModule> GetModuleTypeScheduleModules(ModuleType moduleType)
  130. {
  131. return _scheduleModuleTypeDic.ContainsKey(moduleType) ? _scheduleModuleTypeDic[moduleType]: null;
  132. }
  133. /// <summary>
  134. /// 获取可用的Buffer
  135. /// </summary>
  136. /// <param name="waferSize"></param>
  137. /// <returns></returns>
  138. public WaferHolderInfo GetAvaibleBufferToLoaderWaferHolder(WaferSize waferSize, string crsType, List<string> chemistries)
  139. {
  140. bool isDryer = false;
  141. var result = GetAvaibleWaferHolderInfos(waferSize,crsType,chemistries,ref isDryer);
  142. if (isDryer)
  143. {
  144. return result.avaibleWaferHolders.Count != 0 ? result.avaibleWaferHolders[0] : null;
  145. }
  146. return GetMinTotalUseWaferHolder(result.avaibleWaferHolders);
  147. }
  148. /// <summary>
  149. /// 获取可用Buffer可用WaferHolder数量
  150. /// </summary>
  151. /// <param name="waferSize"></param>
  152. /// <returns></returns>
  153. public bool ExistAvaibleBufferWaferHolder(WaferSize waferSize,string crsType,List<string> chemistries)
  154. {
  155. bool isDryer = false;
  156. var result = GetAvaibleWaferHolderInfos(waferSize,crsType,chemistries, ref isDryer);
  157. return result.avaibleWaferHolders.Count>0;
  158. }
  159. /// <summary>
  160. /// 获取可用WaferHolder集合
  161. /// </summary>
  162. /// <param name="waferSize"></param>
  163. /// <returns></returns>
  164. private (List<WaferHolderInfo> avaibleWaferHolders, List<SchedulerModule> avaibleSchedulerModules)
  165. GetAvaibleWaferHolderInfos(WaferSize waferSize, string crsType, List<string> chemistries,ref bool isDryer)
  166. {
  167. List<WaferHolderInfo> avaibleWaferHolders = new List<WaferHolderInfo>();
  168. List<SchedulerModule> avaibleSchedulerModules = new List<SchedulerModule>();
  169. List<string> dryerModules = DryerItemManager.Instance.InstalledModules;
  170. foreach(string item in dryerModules)
  171. {
  172. WaferHolderInfo waferHolderInfo = WaferHolderManager.Instance.GetWaferHolder(item);
  173. if (waferHolderInfo == null)
  174. {
  175. continue;
  176. }
  177. if(!Enum.TryParse(item,out ModuleName dryerModuleName))
  178. {
  179. continue;
  180. }
  181. if (WaferHolderTaskManager.Instance.CheckWaferHolderNotExist(waferHolderInfo))
  182. {
  183. SchedulerModule schedulerModule = Instance.GetScheduler(dryerModuleName);
  184. avaibleWaferHolders.Add(waferHolderInfo);
  185. avaibleSchedulerModules.Add(schedulerModule);
  186. isDryer = true;
  187. return (avaibleWaferHolders, avaibleSchedulerModules);
  188. }
  189. }
  190. List<SchedulerModule> schedulerModules = GetModuleTypeScheduleModules(ModuleType.Buffer);
  191. if (schedulerModules != null)
  192. {
  193. foreach (SchedulerModule item in schedulerModules)
  194. {
  195. WaferHolderInfo waferHolderInfo = WaferHolderManager.Instance.GetWaferHolder(item.Module.ToString());
  196. //WaferHolder可用,大小,以及可以移动至Loader
  197. if (waferHolderInfo != null && waferHolderInfo.Enabled && waferHolderInfo.WaferSize == (int)waferSize &&waferHolderInfo.CrsType==crsType &&
  198. IsWaferHolderCanGotoLoader(waferHolderInfo)&&CheckChemistry(waferHolderInfo,chemistries))
  199. {
  200. avaibleWaferHolders.Add(waferHolderInfo);
  201. avaibleSchedulerModules.Add(item);
  202. }
  203. }
  204. }
  205. return (avaibleWaferHolders,avaibleSchedulerModules);
  206. }
  207. /// <summary>
  208. /// 检验WaferHolder化学液是否合规
  209. /// </summary>
  210. /// <param name="waferHolderInfo"></param>
  211. /// <param name="chemistries"></param>
  212. /// <returns></returns>
  213. private bool CheckChemistry(WaferHolderInfo waferHolderInfo,List<string> chemistries)
  214. {
  215. if (chemistries.Count == 0)
  216. {
  217. return true;
  218. }
  219. if (chemistries.Count == 1)
  220. {
  221. string chemistry= chemistries[0];
  222. return waferHolderInfo.Chemistry == "Any" || waferHolderInfo.Chemistry.Trim() == chemistry;
  223. }
  224. else
  225. {
  226. return waferHolderInfo.Chemistry == "Any";
  227. }
  228. }
  229. /// <summary>
  230. /// 获取最少使用次数的Buffer
  231. /// </summary>
  232. /// <param name="avaibleWaferHolders"></param>
  233. /// <param name="modules"></param>
  234. /// <returns></returns>
  235. private SchedulerModule GetMinTotalUseSchedulerBuffer(List<WaferHolderInfo> avaibleWaferHolders,List<SchedulerModule> modules)
  236. {
  237. int min = int.MaxValue;
  238. int index = -1;
  239. for(int i=0;i<avaibleWaferHolders.Count;i++)
  240. {
  241. WaferHolderInfo waferHolderInfo=avaibleWaferHolders[i];
  242. if(waferHolderInfo.TotalUses<min)
  243. {
  244. min = waferHolderInfo.TotalUses;
  245. index = i;
  246. }
  247. }
  248. if(index!=-1)
  249. {
  250. return modules[index];
  251. }
  252. return null;
  253. }
  254. /// <summary>
  255. /// 获取最少使用次数的Buffer
  256. /// </summary>
  257. /// <param name="avaibleWaferHolders"></param>
  258. /// <param name="modules"></param>
  259. /// <returns></returns>
  260. private WaferHolderInfo GetMinTotalUseWaferHolder(List<WaferHolderInfo> avaibleWaferHolders)
  261. {
  262. int min = int.MaxValue;
  263. int index = -1;
  264. for (int i = 0; i < avaibleWaferHolders.Count; i++)
  265. {
  266. WaferHolderInfo waferHolderInfo = avaibleWaferHolders[i];
  267. if(IsWaferHolderExsitProcessedWafer(waferHolderInfo))
  268. {
  269. index = i;
  270. break;
  271. }
  272. if (waferHolderInfo.TotalUses < min)
  273. {
  274. min = waferHolderInfo.TotalUses;
  275. index = i;
  276. }
  277. }
  278. if (index != -1)
  279. {
  280. return avaibleWaferHolders[index];
  281. }
  282. return null;
  283. }
  284. /// <summary>
  285. /// WaferHolder是否存在已经完成的Production Wafer
  286. /// </summary>
  287. /// <param name="waferHolderInfo"></param>
  288. /// <returns></returns>
  289. private bool IsWaferHolderExsitProcessedWafer(WaferHolderInfo waferHolderInfo)
  290. {
  291. if(!string.IsNullOrEmpty(waferHolderInfo.WaferAId))
  292. {
  293. WaferInfo waferInfo = WaferManager.Instance.GetWaferByWaferId(waferHolderInfo.WaferAId);
  294. if(waferInfo!=null&&waferInfo.WaferType==WaferType.Production&&waferInfo.ProcessState==EnumWaferProcessStatus.Completed)
  295. {
  296. return true;
  297. }
  298. }
  299. if (!string.IsNullOrEmpty(waferHolderInfo.WaferBId))
  300. {
  301. WaferInfo waferInfo = WaferManager.Instance.GetWaferByWaferId(waferHolderInfo.WaferBId);
  302. if (waferInfo != null && waferInfo.WaferType == WaferType.Production && waferInfo.ProcessState == EnumWaferProcessStatus.Completed)
  303. {
  304. return true;
  305. }
  306. }
  307. return false;
  308. }
  309. /// <summary>
  310. /// WaferHolder是否可以去Loader
  311. /// </summary>
  312. /// <returns></returns>
  313. private bool IsWaferHolderCanGotoLoader(WaferHolderInfo waferHolderInfo)
  314. {
  315. if(string.IsNullOrEmpty(waferHolderInfo.WaferAId)||string.IsNullOrEmpty(waferHolderInfo.WaferBId))
  316. {
  317. return false;
  318. }
  319. if(waferHolderInfo.WaferAType==(int)WaferType.Assit||waferHolderInfo.WaferBType==(int)WaferType.Assit)
  320. {
  321. return true;
  322. }
  323. WaferInfo waferAInfo = WaferManager.Instance.GetWaferByWaferId(waferHolderInfo.WaferAId);
  324. if(waferAInfo == null)
  325. {
  326. return false;
  327. }
  328. WaferInfo waferBInfo = WaferManager.Instance.GetWaferByWaferId(waferHolderInfo.WaferBId);
  329. if(waferBInfo==null)
  330. {
  331. return false;
  332. }
  333. //Wafer还是裸硅片
  334. return waferHolderInfo.IsToLoader;
  335. }
  336. /// <summary>
  337. /// 根据Wafer尺寸获取waferHolder数量
  338. /// </summary>
  339. /// <param name="waferSize"></param>
  340. /// <returns></returns>
  341. public int GetWaferHolderInfoCountByWaferSize(WaferSize waferSize, string crsType, List<string> chemistries)
  342. {
  343. List<WaferHolderInfo> waferHolders = WaferHolderManager.Instance.GetAllWaferHolders();
  344. int count = 0;
  345. foreach (WaferHolderInfo info in waferHolders)
  346. {
  347. if (info.WaferSize == (int)waferSize && info.Enabled && info.CrsType == crsType && CheckChemistry(info,chemistries))
  348. {
  349. count++;
  350. }
  351. }
  352. return count;
  353. }
  354. }
  355. }