WaferHolderTaskDispatcher.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437
  1.  using Aitex.Core.RT.Log;
  2. using Aitex.Core.RT.SCCore;
  3. using Aitex.Core.Util;
  4. using CyberX8_Core;
  5. using CyberX8_RT.Modules;
  6. using CyberX8_RT.Modules.Dryer;
  7. using CyberX8_RT.Modules.Metal;
  8. using CyberX8_RT.Modules.Prewet;
  9. using CyberX8_RT.Modules.Transporter;
  10. using CyberX8_RT.Schedulers;
  11. using CyberX8_RT.Schedulers.Transporter;
  12. using MECF.Framework.Common.CommonData;
  13. using MECF.Framework.Common.Equipment;
  14. using MECF.Framework.Common.ToolLayout;
  15. using MECF.Framework.Common.WaferHolder;
  16. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.TMs;
  17. using SecsGem.Core.ItemModel;
  18. using System;
  19. using System.Collections.Generic;
  20. using System.Linq;
  21. using System.Text;
  22. using System.Threading.Tasks;
  23. namespace CyberX8_RT.Dispatch
  24. {
  25. public class WaferHolderTaskDispatcher : Singleton<WaferHolderTaskDispatcher>
  26. {
  27. /// <summary>
  28. /// 分析
  29. /// </summary>
  30. public void Analyse()
  31. {
  32. List <WaferHolderTask> waferHolderTasks = WaferHolderTaskManager.Instance.LoaderWaferHolderTaskList().ToList();
  33. bool exsitTransport2FromBuffer = false;
  34. List<WaferHolderTask> canceledWaferHolderTask = new List<WaferHolderTask>();
  35. foreach (var item in waferHolderTasks)
  36. {
  37. SchedulerSequence currentSequence = item.GetCurrentSchedulerSequence();
  38. if (currentSequence == null)
  39. {
  40. item.Run();
  41. continue;
  42. }
  43. //处理ProcessTransporter逻辑
  44. if (currentSequence.ModuleName == ModuleName.Transporter1)
  45. {
  46. DealProcessTransporterScheduler(currentSequence, item, waferHolderTasks);
  47. }
  48. //处理LoaderTransporter逻辑
  49. else if(currentSequence.ModuleName==ModuleName.Transporter2)
  50. {
  51. DealLoaderTransporterScheduler(currentSequence, item, waferHolderTasks,canceledWaferHolderTask,ref exsitTransport2FromBuffer);
  52. }
  53. else
  54. {
  55. item.Run();
  56. }
  57. }
  58. RemoveCanceledTask(canceledWaferHolderTask);
  59. }
  60. /// <summary>
  61. /// 处理ProcessTransporter
  62. /// </summary>
  63. /// <param name="sequence"></param>
  64. private void DealProcessTransporterScheduler(SchedulerSequence currentSequence,WaferHolderTask item,List<WaferHolderTask> waferHolderTasks)
  65. {
  66. int transporterTransferSeconds = SC.GetValue<int>("Transporter.TransporterTransferSeconds");
  67. if (currentSequence.State == RState.End)
  68. {
  69. item.Run();
  70. return;
  71. }
  72. if (currentSequence.State == RState.Running)
  73. {
  74. item.Run();
  75. return;
  76. }
  77. if (CheckOtherTransporterIsRunning(waferHolderTasks, item, ModuleName.Transporter1))
  78. {
  79. return;
  80. }
  81. if (currentSequence.State == RState.Init)
  82. {
  83. bool result = AnalyseProcessTransporterMetalSchedulerSequence(currentSequence, item, transporterTransferSeconds);
  84. if (result)
  85. {
  86. return;
  87. }
  88. //存在其他任务当前source为prewet同时prewet状态为WaitForPick
  89. //if (CheckPrewetIsWaitForPick(waferHolderTasks, item))
  90. //{
  91. // return;
  92. //}
  93. //if (SchedulerManager.Instance.IsQdrCheckConflict)
  94. //{
  95. // result = SchedulerTransporterTimeManager.Instance.CheckExsitOtherWaferHolderBefore(ModuleName.Transporter1.ToString(), currentSequence.SequenceIndex, item.WaferHolderInfo.Id);
  96. // if (result)
  97. // {
  98. // return;
  99. // }
  100. //}
  101. item.Run();
  102. }
  103. }
  104. /// <summary>
  105. /// 处理LoaderTransPorter
  106. /// </summary>
  107. /// <param name="currentSequence"></param>
  108. /// <param name="item"></param>
  109. /// <param name="waferHolderTasks"></param>
  110. private void DealLoaderTransporterScheduler(SchedulerSequence currentSequence,WaferHolderTask item, List<WaferHolderTask> waferHolderTasks,
  111. List<WaferHolderTask> canceledWaferHolderTask, ref bool exsitTransport2FromBuffer)
  112. {
  113. if (currentSequence.State == RState.End)
  114. {
  115. item.Run();
  116. return;
  117. }
  118. if (currentSequence.State == RState.Running)
  119. {
  120. item.Run();
  121. return;
  122. }
  123. if (CheckOtherTransporterIsRunning(waferHolderTasks, item, ModuleName.Transporter2))
  124. {
  125. return;
  126. }
  127. if (!(currentSequence.Parameters is TransporterAction))
  128. {
  129. return;
  130. }
  131. TransporterAction action=currentSequence.Parameters as TransporterAction;
  132. if (action.ActionMsg == TransporterMSG.Transfer)
  133. {
  134. WaferHolderMoveItem waferHolderMoveItem = action.Parameter as WaferHolderMoveItem;
  135. if (waferHolderMoveItem.SourceModuleType == ModuleType.Buffer && waferHolderMoveItem.DestModuleType == ModuleType.Prewet)
  136. {
  137. if (item.State == WaferHolderTaskState.Canceled)
  138. {
  139. canceledWaferHolderTask.Add(item);
  140. return;
  141. }
  142. if (!exsitTransport2FromBuffer)
  143. {
  144. exsitTransport2FromBuffer = true;
  145. item.Run();
  146. }
  147. }
  148. else if (waferHolderMoveItem.SourceModuleType == ModuleType.Dryer)
  149. {
  150. if (waferHolderMoveItem.DestModuleType == ModuleType.Buffer)
  151. {
  152. if (WaferHolderManager.Instance.HasWaferHolder("Loader"))
  153. {
  154. item.Run();
  155. return;
  156. }
  157. if (CheckExistWaferHolderTaskIsCreateState(waferHolderTasks, item))
  158. {
  159. item.Run();
  160. return;
  161. }
  162. if (CheckDryerWaferHolderIdle(waferHolderTasks, item))
  163. {
  164. item.Run();
  165. return;
  166. }
  167. else
  168. {
  169. item.UpdateDryerLastSchedulerComplete();
  170. }
  171. }
  172. else
  173. {
  174. item.Run();
  175. }
  176. }
  177. else
  178. {
  179. item.Run();
  180. }
  181. }
  182. else
  183. {
  184. item.Run();
  185. }
  186. }
  187. /// <summary>
  188. /// 是否存在未启动的WaferHolderTask
  189. /// </summary>
  190. /// <param name="waferHolderTasks"></param>
  191. /// <param name="waferHolderTask"></param>
  192. /// <returns></returns>
  193. private bool CheckExistWaferHolderTaskIsCreateState(List<WaferHolderTask> waferHolderTasks, WaferHolderTask waferHolderTask)
  194. {
  195. foreach(WaferHolderTask item in waferHolderTasks)
  196. {
  197. if (item.ID == waferHolderTask.ID)
  198. {
  199. continue;
  200. }
  201. if (item.State == WaferHolderTaskState.Created)
  202. {
  203. return true;
  204. }
  205. }
  206. return false;
  207. }
  208. /// <summary>
  209. /// 检验是否存在Dryer WaferHolder空闲(WaferHolder不存在WaferHolderTask中)
  210. /// </summary>
  211. /// <param name="waferHolderTasks"></param>
  212. /// <param name="module"></param>
  213. /// <returns></returns>
  214. private bool CheckDryerWaferHolderIdle(List<WaferHolderTask> waferHolderTasks,WaferHolderTask waferHolderTask)
  215. {
  216. List<string> dryerModules = DryerItemManager.Instance.InstalledModules;
  217. foreach (string item in dryerModules)
  218. {
  219. if (WaferHolderManager.Instance.HasWaferHolder(item))
  220. {
  221. DryerEntity dryerEntity = Singleton<RouteManager>.Instance.GetModule<DryerEntity>(item);
  222. if (dryerEntity == null)
  223. {
  224. continue;
  225. }
  226. if (!dryerEntity.IsIdle)
  227. {
  228. continue;
  229. }
  230. WaferHolderInfo waferHolderInfo=WaferHolderManager.Instance.GetWaferHolder(item);
  231. if(waferHolderInfo == null)
  232. {
  233. continue;
  234. }
  235. if (waferHolderInfo.Id == waferHolderTask.WaferHolderInfo.Id)
  236. {
  237. continue;
  238. }
  239. int index = waferHolderTasks.FindIndex(O => O.WaferHolderInfo.Id == waferHolderInfo.Id);
  240. if (index == -1)
  241. {
  242. return true;
  243. }
  244. else
  245. {
  246. WaferHolderTask task = waferHolderTasks[index];
  247. if (task.State == WaferHolderTaskState.Created)
  248. {
  249. return true;
  250. }
  251. }
  252. }
  253. }
  254. return false;
  255. }
  256. /// <summary>
  257. /// 移除状态为取消的WaferHolderTask
  258. /// </summary>
  259. /// <param name="waferHolderTasks"></param>
  260. private void RemoveCanceledTask(List<WaferHolderTask> waferHolderTasks)
  261. {
  262. foreach(WaferHolderTask item in waferHolderTasks)
  263. {
  264. WaferHolderTaskManager.Instance.RemoveById(item.ID);
  265. LOG.WriteLog(eEvent.EV_SCHEDULER, "System", $"remove wafer shuttle {item.WaferHolderInfo.Id} task");
  266. //List<string> mathedWaferIds = WaferTaskManager.Instance.GetWaferHolderMathWaferId(item.WaferHolderInfo.Id);
  267. //foreach(string waferId in mathedWaferIds)
  268. //{
  269. // WaferTaskManager.Instance.RemoveWaferTask(waferId);
  270. // WaferTaskManager.Instance.RemoveWaferIdMatchWaferHolderTaskDic(waferId);
  271. //}
  272. }
  273. }
  274. /// <summary>
  275. /// 检验其他任务是否也是Transporter并且正在执行
  276. /// </summary>
  277. /// <param name="waferHolderTasks"></param>
  278. /// <param name="waferHolderTask"></param>
  279. /// <returns></returns>
  280. private bool CheckOtherTransporterIsRunning(List<WaferHolderTask> waferHolderTasks,WaferHolderTask waferHolderTask,ModuleName moduleName)
  281. {
  282. foreach(WaferHolderTask item in waferHolderTasks)
  283. {
  284. if (item.ID == waferHolderTask.ID)
  285. {
  286. continue;
  287. }
  288. SchedulerSequence schedulerSequence = item.GetCurrentSchedulerSequence();
  289. if (schedulerSequence == null)
  290. {
  291. continue;
  292. }
  293. if (schedulerSequence.ModuleName == moduleName)
  294. {
  295. if(schedulerSequence.State==RState.Running)
  296. {
  297. return true;
  298. }
  299. }
  300. }
  301. return false;
  302. }
  303. /// <summary>
  304. /// 检验其他任务是否也是Transporter1并且正在执行
  305. /// </summary>
  306. /// <param name="waferHolderTasks"></param>
  307. /// <param name="waferHolderTask"></param>
  308. /// <returns></returns>
  309. private bool CheckPrewetIsWaitForPick(List<WaferHolderTask> waferHolderTasks, WaferHolderTask waferHolderTask)
  310. {
  311. foreach (WaferHolderTask item in waferHolderTasks)
  312. {
  313. if (item.ID == waferHolderTask.ID)
  314. {
  315. continue;
  316. }
  317. SchedulerSequence schedulerSequence = item.GetCurrentSchedulerSequence();
  318. if (schedulerSequence == null)
  319. {
  320. continue;
  321. }
  322. if (schedulerSequence.ModuleName != ModuleName.Transporter1)
  323. {
  324. continue;
  325. }
  326. TransporterAction action = schedulerSequence.Parameters as TransporterAction;
  327. if (action.ActionMsg == TransporterMSG.Transfer)
  328. {
  329. WaferHolderMoveItem waferHolderMoveItem = action.Parameter as WaferHolderMoveItem;
  330. if (waferHolderMoveItem != null && waferHolderMoveItem.SourceModule == ModuleName.Prewet1)
  331. {
  332. PrewetEntity prewetEntity = Singleton<RouteManager>.Instance.GetModule<PrewetEntity>(ModuleName.Prewet1.ToString());
  333. if (prewetEntity != null && (prewetEntity.State == (int)PrewetState.PreparingToPick ||
  334. prewetEntity.State == (int)PrewetState.WaitForPick))
  335. {
  336. return true;
  337. }
  338. }
  339. }
  340. }
  341. return false;
  342. }
  343. /// <summary>
  344. /// 解析Transporter1调度逻辑
  345. /// </summary>
  346. /// <param name="sequence"></param>
  347. private bool AnalyseProcessTransporterMetalSchedulerSequence(SchedulerSequence sequence, WaferHolderTask waferHolderTask, int transporterTransferSeconds)
  348. {
  349. SchedulerSequence preSequence = waferHolderTask.GetPreSchedulerSequence();
  350. if (preSequence == null)
  351. {
  352. return false;
  353. }
  354. if (preSequence.ModuleType == ModuleType.Metal)
  355. {
  356. //Metal处于Error
  357. if (preSequence.SchedulerModule.IsError)
  358. {
  359. waferHolderTask.Run();
  360. if (waferHolderTask.State == WaferHolderTaskState.Processing)
  361. {
  362. return true;
  363. }
  364. }
  365. MetalEntity metalEntity = Singleton<RouteManager>.Instance.GetModule<MetalEntity>(preSequence.ModuleName.ToString());
  366. if (metalEntity != null && metalEntity.WaferHolderInfo != null && metalEntity.IsIdle)
  367. {
  368. waferHolderTask.Run();
  369. if (waferHolderTask.State == WaferHolderTaskState.Processing)
  370. {
  371. return true;
  372. }
  373. }
  374. }
  375. if (CheckExistMetalRemainTime(transporterTransferSeconds, waferHolderTask.ID))
  376. {
  377. return true;
  378. }
  379. return false;
  380. }
  381. /// <summary>
  382. /// 是否存在当前阶段为Metal,剩余时间比Transporter搬运时间更小时
  383. /// </summary>
  384. /// <param name="transporterTransferSeconds"></param>
  385. /// <returns></returns>
  386. private bool CheckExistMetalRemainTime(int transporterTransferSeconds, string waferTaskId)
  387. {
  388. List<WaferHolderTask> waferHolderTasks = WaferHolderTaskManager.Instance.LoaderWaferHolderTaskList().ToList();
  389. foreach (var item in waferHolderTasks)
  390. {
  391. SchedulerSequence currentSequence = item.GetCurrentSchedulerSequence();
  392. if (currentSequence == null)
  393. {
  394. continue;
  395. }
  396. if (item.ID == waferTaskId)
  397. {
  398. continue;
  399. }
  400. if (currentSequence.ModuleType == ModuleType.Metal && ModuleHelper.IsMetal(currentSequence.ModuleName))
  401. {
  402. MetalEntity metalEntity = Singleton<RouteManager>.Instance.GetModule<MetalEntity>(currentSequence.ModuleName.ToString());
  403. if (metalEntity == null)
  404. {
  405. continue;
  406. }
  407. if (metalEntity.TimeToReady <= transporterTransferSeconds && metalEntity.IsBusy)
  408. {
  409. return true;
  410. }
  411. }
  412. if (currentSequence.ModuleName == ModuleName.Transporter1)
  413. {
  414. SchedulerSequence preSequence = item.GetPreSchedulerSequence();
  415. if (preSequence.ModuleType == ModuleType.Metal && WaferHolderManager.Instance.HasWaferHolder(preSequence.ModuleName.ToString()))
  416. {
  417. MetalEntity metalEntity = Singleton<RouteManager>.Instance.GetModule<MetalEntity>(preSequence.ModuleName.ToString());
  418. if (metalEntity == null)
  419. {
  420. continue;
  421. }
  422. //存在Metal已经完成recipe,同时时间不超过transporter传输的一半
  423. if (metalEntity.IsIdle && metalEntity.WaferHolderInfo != null && DateTime.Now.Subtract(metalEntity.WaferHolderInfo.LastMetalRecipeCompleteTime).TotalSeconds <= transporterTransferSeconds / 2)
  424. {
  425. return true;
  426. }
  427. }
  428. }
  429. }
  430. return false;
  431. }
  432. }
  433. }