ReturnAllWafer.cs 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377
  1. using Aitex.Common.Util;
  2. using Aitex.Core.Common;
  3. using Aitex.Core.RT.Device;
  4. using Aitex.Core.RT.Event;
  5. using Aitex.Core.RT.Log;
  6. using Aitex.Core.RT.Routine;
  7. using Aitex.Core.RT.SCCore;
  8. using Aitex.Core.Util;
  9. using Aitex.Sorter.Common;
  10. using FurnaceRT.Devices;
  11. using FurnaceRT.Equipments.Boats;
  12. using FurnaceRT.Equipments.CarrierRobots;
  13. using FurnaceRT.Equipments.FIMSs;
  14. using FurnaceRT.Equipments.PMs;
  15. using FurnaceRT.Equipments.Schedulers;
  16. using FurnaceRT.Equipments.Systems;
  17. using FurnaceRT.Equipments.WaferRobots;
  18. using MECF.Framework.Common.Equipment;
  19. using MECF.Framework.Common.Schedulers;
  20. using MECF.Framework.Common.SubstrateTrackings;
  21. using System;
  22. using System.Collections.Generic;
  23. namespace FurnaceRT.Equipments.Jobs
  24. {
  25. public class ReturnAllWafer : SchedulerModuleFactory, IRoutine
  26. {
  27. private const string LogSource = "System";
  28. private Dictionary<int, WaferType> _boatSlotWafers = new Dictionary<int, WaferType>();
  29. private List<int> _sideDummySlots = new List<int>();
  30. private List<int> _extraDummySlots = new List<int>();
  31. private List<int> _productSlots = new List<int>();
  32. private List<int> _monitor1Slots = new List<int>();
  33. private List<int> _monitor2Slots = new List<int>();
  34. private PMModule _pmModule;
  35. public ReturnAllWafer()
  36. {
  37. InitModule();
  38. }
  39. public Result Start(params object[] objs)
  40. {
  41. Clear();
  42. //if (!(Singleton<EquipmentManager>.Instance.Modules[ModuleName.CarrierRobot] as CarrierRobotModule).CheckCassetteRobotRetractPosition())
  43. //{
  44. // Singleton<EquipmentManager>.Instance.ReturnAllWaferJobStartFailedWarning.Description = "Cassette Robot not at home position";
  45. // Singleton<EquipmentManager>.Instance.ReturnAllWaferJobStartFailedWarning.Set();
  46. // return Result.FAIL;
  47. //}
  48. //if (!(Singleton<EquipmentManager>.Instance.Modules[ModuleName.WaferRobot] as WaferRobotModule).WaferRobotDevice.IsRetract)
  49. //{
  50. // Singleton<EquipmentManager>.Instance.ReturnAllWaferJobStartFailedWarning.Description = "Wafer Robot not at home position";
  51. // Singleton<EquipmentManager>.Instance.ReturnAllWaferJobStartFailedWarning.Set();
  52. // return Result.FAIL;
  53. //}
  54. if (!(Singleton<EquipmentManager>.Instance.Modules[ModuleName.Boat] as BoatModule).IsBoatElevatorAtHomePosition)
  55. {
  56. Singleton<EquipmentManager>.Instance.ReturnAllWaferJobStartFailedWarning.Set("Boat Z Axis not at home position");
  57. return Result.FAIL;
  58. }
  59. if (!(Singleton<EquipmentManager>.Instance.Modules[ModuleName.Boat] as BoatModule).IsBoatRotationAtHomePosition)
  60. {
  61. Singleton<EquipmentManager>.Instance.ReturnAllWaferJobStartFailedWarning.Set("Boat R Axis not at home position");
  62. return Result.FAIL;
  63. }
  64. var waferRobotWafers = WaferManager.Instance.GetWafers(_waferRobot.Module);
  65. foreach (var wafer in waferRobotWafers)
  66. {
  67. if (wafer == null || wafer.IsEmpty)
  68. continue;
  69. //wafer robot上的wafer必须全部能够return
  70. if (!CheckWaferCouldBeReturn(wafer))
  71. {
  72. Singleton<EquipmentManager>.Instance.ReturnAllWaferJobStartFailedWarning.Set($"Wafer {(ModuleName)wafer.Station}.{wafer.Slot + 1} can not return, origin {(ModuleName)wafer.OriginStation}.{wafer.OriginSlot + 1} is not available");
  73. return Result.FAIL;
  74. }
  75. }
  76. var pmWafers = WaferManager.Instance.GetWafers(_pm1.Module);
  77. foreach (var wafer in pmWafers)
  78. {
  79. if (wafer == null || wafer.IsEmpty)
  80. continue;
  81. //boat上的wafer可以有不能return
  82. if (!CheckWaferCouldBeReturn(wafer))
  83. {
  84. Singleton<EquipmentManager>.Instance.ReturnAllWaferJobStartFailedWarning.Set($"Wafer {(ModuleName)wafer.Station}.{wafer.Slot + 1} can not return, origin {(ModuleName)wafer.OriginStation}.{wafer.OriginSlot + 1} is not available");
  85. }
  86. }
  87. Init();
  88. return Result.RUN;
  89. }
  90. public void ResetTask(ModuleName module)
  91. {
  92. if (module == _waferRobot.Module)
  93. _waferRobot.ResetTask();
  94. if (module == _carrierRobot.Module)
  95. _carrierRobot.ResetTask();
  96. }
  97. private void Clear()
  98. {
  99. _carrierRobot.ResetTask();
  100. _waferRobot.ResetTask();
  101. }
  102. private void Init()
  103. {
  104. _boatSlotWafers.Clear();
  105. _sideDummySlots.Clear();
  106. _extraDummySlots.Clear();
  107. _productSlots.Clear();
  108. _monitor1Slots.Clear();
  109. _monitor2Slots.Clear();
  110. //M-->P-->ED-->SD
  111. for (int i = 0; i < SC.GetValue<int>($"Boat.SlotCount"); i++)
  112. {
  113. if (!WaferManager.Instance.CheckHasWafer(_pm1.Module, i))
  114. continue;
  115. var wafer = WaferManager.Instance.GetWafer(_pm1.Module, i);
  116. if (wafer == null || wafer.IsEmpty)
  117. continue;
  118. if (!CheckWaferCouldBeReturn(wafer))
  119. continue;
  120. switch (wafer.WaferType)
  121. {
  122. case WaferType.SD:
  123. _sideDummySlots.Add(i);
  124. break;
  125. case WaferType.ED:
  126. _extraDummySlots.Add(i);
  127. break;
  128. case WaferType.P:
  129. _productSlots.Add(i);
  130. break;
  131. case WaferType.M1:
  132. _monitor1Slots.Add(i);
  133. break;
  134. case WaferType.M2:
  135. _monitor2Slots.Add(i);
  136. break;
  137. }
  138. }
  139. if (SC.GetStringValue("System.ChargingOrderToBoat") == "FromTopToBottom")
  140. {
  141. //升序,return wafer和charge顺序相反
  142. }
  143. else
  144. {
  145. _productSlots.Sort((x, y) => -x.CompareTo(y));//降序
  146. _monitor1Slots.Sort((x, y) => -x.CompareTo(y));//降序
  147. _monitor2Slots.Sort((x, y) => -x.CompareTo(y));//降序
  148. _extraDummySlots.Sort((x, y) => -x.CompareTo(y));//降序
  149. _sideDummySlots.Sort((x, y) => -x.CompareTo(y));//降序
  150. }
  151. }
  152. public Result Monitor()
  153. {
  154. MonitorCassetteRobotTask();
  155. MonitorWaferRobotTask();
  156. MonitorFIMSTask();
  157. if (MonitorTaskDone())
  158. {
  159. return Result.DONE;
  160. }
  161. return Result.RUN;
  162. }
  163. public bool MonitorTaskDone()
  164. {
  165. if (!_carrierRobot.IsAvailable)
  166. return false;
  167. if (!_waferRobot.IsAvailable)
  168. return false;
  169. if (CarrierManager.Instance.CheckHasCarrier(_carrierRobot.Module, 0))
  170. {
  171. return false;
  172. }
  173. var waferRobotWafers = WaferManager.Instance.GetWafers(_waferRobot.Module);
  174. foreach (var wafer in waferRobotWafers)
  175. {
  176. if (!wafer.IsEmpty)
  177. return false;
  178. }
  179. var pmWafers = WaferManager.Instance.GetWafers(_pm1.Module);
  180. foreach (var wafer in pmWafers)
  181. {
  182. if (!wafer.IsEmpty)
  183. {
  184. if (CheckWaferCouldBeReturn(wafer))
  185. {
  186. return false;
  187. }
  188. }
  189. }
  190. foreach (var st in _lstFIMSs)
  191. {
  192. if (!st.IsOnline)
  193. continue;
  194. if (CarrierManager.Instance.CheckHasCarrier(st.Module, 0))
  195. {
  196. return false;
  197. }
  198. }
  199. return true;
  200. }
  201. private bool CheckWaferCouldBeReturn(WaferInfo wafer)
  202. {
  203. if (wafer != null && !wafer.IsEmpty)
  204. {
  205. return ModuleHelper.IsStocker((ModuleName)wafer.OriginStation)
  206. && SC.ContainsItem($"System.SetUp.Is{(ModuleName)wafer.OriginStation}Installed")
  207. && SC.GetValue<bool>($"System.SetUp.Is{(ModuleName)wafer.OriginStation}Installed")
  208. && WaferManager.Instance.CheckNoWafer((ModuleName)wafer.OriginStation, wafer.OriginSlot);
  209. }
  210. return false;
  211. }
  212. private void MonitorFIMSTask()
  213. {
  214. //load
  215. bool haveLoadingFims = false;
  216. foreach (var st in _lstFIMSs)
  217. {
  218. if ((Singleton<EquipmentManager>.Instance.Modules[st.Module] as FIMSModule).IsLoading)
  219. {
  220. haveLoadingFims = true;
  221. break;
  222. }
  223. }
  224. //load
  225. foreach (var st in _lstFIMSs)
  226. {
  227. if (!st.IsAvailable || haveLoadingFims || !CarrierManager.Instance.CheckHasCarrier(st.Module, 0))
  228. continue;
  229. var fimsDevice = DEVICE.GetDevice<IoFIMS>($"PM1.{st.Module}");
  230. var carrier = CarrierManager.Instance.GetCarrier(st.Module, 0);
  231. if (carrier != null)
  232. {
  233. if (!CheckCarrierCanPickFromFIMSInDischarge(carrier.InternalModuleName) && !fimsDevice.IsLoadCompleted && st.Load())
  234. {
  235. return;
  236. }
  237. }
  238. }
  239. //unload
  240. //先判断满片的情况,满片的先unload
  241. foreach (var st in _lstFIMSs)
  242. {
  243. if (!st.IsAvailable || !CarrierManager.Instance.CheckHasCarrier(st.Module, 0))
  244. continue;
  245. var fimsDevice = DEVICE.GetDevice<IoFIMS>($"PM1.{st.Module}");
  246. var carrier = CarrierManager.Instance.GetCarrier(st.Module, 0);
  247. if (carrier != null)
  248. {
  249. if (!CheckCarrierHasEmptySlot(st.Module) && !fimsDevice.IsUnloadCompleted && st.Unload())
  250. {
  251. return;
  252. }
  253. }
  254. }
  255. if (!_waferRobot.IsAvailable)
  256. return;
  257. foreach (var st in _lstFIMSs)
  258. {
  259. if (!st.IsAvailable || !CarrierManager.Instance.CheckHasCarrier(st.Module, 0))
  260. continue;
  261. var fimsDevice = DEVICE.GetDevice<IoFIMS>($"PM1.{st.Module}");
  262. var carrier = CarrierManager.Instance.GetCarrier(st.Module, 0);
  263. if (carrier != null)
  264. {
  265. if (CheckCarrierCanPickFromFIMSInDischarge(carrier.InternalModuleName) && !fimsDevice.IsUnloadCompleted && st.Unload())
  266. {
  267. return;
  268. }
  269. }
  270. }
  271. }
  272. private void MonitorCassetteRobotTask()
  273. {
  274. if (!_carrierRobot.IsAvailable)
  275. return;
  276. //cassette robot is idle, release all the target
  277. foreach (var stocker in _lstTotlaStockers)
  278. {
  279. if (stocker.IsWaitTransfer(ModuleName.CarrierRobot))
  280. {
  281. stocker.StopWaitTransfer(ModuleName.CarrierRobot);
  282. }
  283. }
  284. foreach (var stage in _lstFIMSs)
  285. {
  286. if (stage.IsWaitTransfer(ModuleName.CarrierRobot))
  287. {
  288. stage.StopWaitTransfer(ModuleName.CarrierRobot);
  289. }
  290. }
  291. DischargingOrderBySort(SC.GetStringValue("System.ChargingOrderBySort"));
  292. if (!_carrierRobot.IsAvailable)
  293. return;
  294. MonitorCassetteRobotStageTask();
  295. }
  296. private void DischargingOrderBySort(string order)
  297. {
  298. switch (order)
  299. {
  300. case "ED,P,M":
  301. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.M1, _monitor1Slots);
  302. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.M2, _monitor2Slots);
  303. if (!_carrierRobot.IsAvailable)
  304. return;
  305. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.P, _productSlots);
  306. if (!_carrierRobot.IsAvailable)
  307. return;
  308. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.ED, _extraDummySlots);
  309. break;
  310. case "ED,M,P":
  311. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.P, _productSlots);
  312. if (!_carrierRobot.IsAvailable)
  313. return;
  314. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.M1, _monitor1Slots);
  315. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.M2, _monitor2Slots);
  316. if (!_carrierRobot.IsAvailable)
  317. return;
  318. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.ED, _extraDummySlots);
  319. break;
  320. case "P,ED,M":
  321. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.M1, _monitor1Slots);
  322. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.M2, _monitor2Slots);
  323. if (!_carrierRobot.IsAvailable)
  324. return;
  325. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.ED, _extraDummySlots);
  326. if (!_carrierRobot.IsAvailable)
  327. return;
  328. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.P, _productSlots);
  329. break;
  330. case "P,M,ED":
  331. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.ED, _extraDummySlots);
  332. if (!_carrierRobot.IsAvailable)
  333. return;
  334. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.M1, _monitor1Slots);
  335. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.M2, _monitor2Slots);
  336. if (!_carrierRobot.IsAvailable)
  337. return;
  338. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.P, _productSlots);
  339. break;
  340. case "M,P,ED":
  341. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.ED, _extraDummySlots);
  342. if (!_carrierRobot.IsAvailable)
  343. return;
  344. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.P, _productSlots);
  345. if (!_carrierRobot.IsAvailable)
  346. return;
  347. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.M1, _monitor1Slots);
  348. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.M2, _monitor2Slots);
  349. break;
  350. case "M,ED,P":
  351. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.P, _productSlots);
  352. if (!_carrierRobot.IsAvailable)
  353. return;
  354. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.ED, _extraDummySlots);
  355. if (!_carrierRobot.IsAvailable)
  356. return;
  357. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.M1, _monitor1Slots);
  358. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.M2, _monitor2Slots);
  359. break;
  360. default:
  361. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.M1, _monitor1Slots);
  362. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.M2, _monitor2Slots);
  363. if (!_carrierRobot.IsAvailable)
  364. return;
  365. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.P, _productSlots);
  366. if (!_carrierRobot.IsAvailable)
  367. return;
  368. MonitorCassetteRobotStockerTaskInDischarge(_lstTotlaStockers, WaferType.ED, _extraDummySlots);
  369. break;
  370. }
  371. if (!_carrierRobot.IsAvailable)
  372. return;
  373. MonitorCassetteRobotStockerTaskInDischarge(_lstSideDummyStocker, WaferType.SD, _sideDummySlots);
  374. }
  375. private void MonitorCassetteRobotStockerTaskInDischarge(List<SchedulerStocker> targetStockers, WaferType targetWaferType, List<int> waferSlots)
  376. {
  377. if (!_carrierRobot.IsAvailable)
  378. return;
  379. var targetCarrierType = (CarrierType)(Enum.Parse(typeof(CarrierType), targetWaferType.ToString()));
  380. //pick
  381. if (CarrierManager.Instance.CheckNoCarrier(ModuleName.CarrierRobot, 0) && waferSlots.Count > 0)
  382. {
  383. bool needPickSdCassette = false;
  384. int sdWaferCount = GetWaferCountRelatedToWaferRobot(targetWaferType, true);
  385. needPickSdCassette = sdWaferCount > 0;
  386. var sdStockerModule = GetModuleNameForNextWafer(targetWaferType);
  387. if (needPickSdCassette && sdStockerModule != ModuleName.System)
  388. {
  389. SchedulerStocker sdStocker = null;
  390. foreach (var sd in targetStockers)
  391. {
  392. if (!CarrierManager.Instance.CheckHasCarrier(sd.Module, 0) ||
  393. CarrierManager.Instance.GetCarrier(sd.Module, 0).CarrierType != targetCarrierType)
  394. continue;
  395. if (sd.Module == sdStockerModule &&
  396. CheckCarrierHasEmptySlot(sd.Module))
  397. {
  398. sdStocker = sd;
  399. break;
  400. }
  401. }
  402. SchedulerFIMS fims = null;
  403. foreach (var st in _lstFIMSs)
  404. {
  405. if (!st.IsAvailable)
  406. continue;
  407. if (CarrierManager.Instance.CheckNoCarrier(st.Module, 0))
  408. {
  409. fims = st;
  410. break;
  411. }
  412. }
  413. if (sdStocker != null && fims != null)
  414. {
  415. if (_carrierRobot.Pick(sdStocker.Module, 0, Hand.Blade1))
  416. {
  417. sdStocker.WaitTransfer(ModuleName.CarrierRobot);
  418. return;
  419. }
  420. }
  421. }
  422. }
  423. if (!_carrierRobot.IsAvailable)
  424. return;
  425. if (!_waferRobot.IsAvailable)
  426. return;
  427. //place
  428. var carrier = CarrierManager.Instance.GetCarrier(ModuleName.CarrierRobot, 0);
  429. if (carrier != null && !carrier.IsEmpty && carrier.CarrierType == targetCarrierType)
  430. {
  431. if (!CheckModuleHasWaferInWaferRobotAndPM(carrier.InternalModuleName) || !CheckCarrierHasEmptySlot(ModuleName.CarrierRobot))
  432. {
  433. SchedulerStocker sdStocker = null;
  434. foreach (var sd in targetStockers)
  435. {
  436. if (CarrierManager.Instance.CheckNoCarrier(sd.Module, 0) && sd.Module == carrier.InternalModuleName)
  437. {
  438. sdStocker = sd;
  439. break;
  440. }
  441. }
  442. if (sdStocker != null)
  443. {
  444. if (_carrierRobot.Place(sdStocker.Module, 0, Hand.Blade1))
  445. {
  446. sdStocker.WaitTransfer(ModuleName.CarrierRobot);
  447. return;
  448. }
  449. }
  450. }
  451. }
  452. }
  453. private ModuleName GetModuleNameForNextWafer(WaferType waferType)
  454. {
  455. ModuleName module = ModuleName.System;
  456. bool hasEmptyFims = false;
  457. foreach (var fims in _lstFIMSs)
  458. {
  459. if (CarrierManager.Instance.CheckNoCarrier(fims.Module, 0))
  460. {
  461. hasEmptyFims = true;
  462. break;
  463. }
  464. }
  465. if (!hasEmptyFims)
  466. return module;
  467. if (WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 0))
  468. {
  469. module = (ModuleName)WaferManager.Instance.GetWafer(ModuleName.WaferRobot, 0).OriginStation;
  470. }
  471. else if (WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 1))
  472. {
  473. module = (ModuleName)WaferManager.Instance.GetWafer(ModuleName.WaferRobot, 1).OriginStation;
  474. }
  475. else if (WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 2))
  476. {
  477. module = (ModuleName)WaferManager.Instance.GetWafer(ModuleName.WaferRobot, 2).OriginStation;
  478. }
  479. else if (WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 3))
  480. {
  481. module = (ModuleName)WaferManager.Instance.GetWafer(ModuleName.WaferRobot, 3).OriginStation;
  482. }
  483. else if (WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 4))
  484. {
  485. module = (ModuleName)WaferManager.Instance.GetWafer(ModuleName.WaferRobot, 4).OriginStation;
  486. }
  487. else
  488. {
  489. if (SC.GetStringValue("System.ChargingOrderToBoat") == "FromTopToBottom")
  490. {
  491. for (int i = 0; i < SC.GetValue<int>($"Boat.SlotCount"); i++)
  492. {
  493. if (!WaferManager.Instance.CheckHasWafer(_pm1.Module, i))
  494. continue;
  495. var wafer = WaferManager.Instance.GetWafer(_pm1.Module, i);
  496. if (wafer == null || wafer.IsEmpty)
  497. continue;
  498. if (wafer.WaferType == waferType)
  499. {
  500. module = (ModuleName)WaferManager.Instance.GetWafer(_pm1.Module, i).OriginStation;
  501. break;
  502. }
  503. }
  504. }
  505. else
  506. {
  507. for (int i = SC.GetValue<int>($"Boat.SlotCount") - 1; i >= 0; i--)
  508. {
  509. if (!WaferManager.Instance.CheckHasWafer(_pm1.Module, i))
  510. continue;
  511. var wafer = WaferManager.Instance.GetWafer(_pm1.Module, i);
  512. if (wafer == null || wafer.IsEmpty)
  513. continue;
  514. if (wafer.WaferType == waferType)
  515. {
  516. module = (ModuleName)WaferManager.Instance.GetWafer(_pm1.Module, i).OriginStation;
  517. break;
  518. }
  519. }
  520. }
  521. }
  522. //下一片要放回的cassette已经在fims上
  523. bool isCarrierAlreadyPicked = false;
  524. foreach (var fims in _lstFIMSs)
  525. {
  526. if (!CarrierManager.Instance.CheckHasCarrier(fims.Module, 0))
  527. continue;
  528. var carrier = CarrierManager.Instance.GetCarrier(fims.Module);
  529. if (carrier != null && carrier.InternalModuleName == module)
  530. {
  531. isCarrierAlreadyPicked = true;
  532. }
  533. }
  534. if (CarrierManager.Instance.CheckHasCarrier(ModuleName.CarrierRobot, 0))
  535. {
  536. var carrier = CarrierManager.Instance.GetCarrier(ModuleName.CarrierRobot);
  537. if (carrier != null && carrier.InternalModuleName == module)
  538. {
  539. isCarrierAlreadyPicked = true;
  540. }
  541. }
  542. if (isCarrierAlreadyPicked)
  543. {
  544. if (SC.GetStringValue("System.ChargingOrderToBoat") == "FromTopToBottom")
  545. {
  546. for (int i = 0; i < SC.GetValue<int>($"Boat.SlotCount"); i++)
  547. {
  548. if (!WaferManager.Instance.CheckHasWafer(_pm1.Module, i))
  549. continue;
  550. var wafer = WaferManager.Instance.GetWafer(_pm1.Module, i);
  551. if (wafer == null || wafer.IsEmpty)
  552. continue;
  553. if (wafer.WaferType == waferType && (ModuleName)WaferManager.Instance.GetWafer(_pm1.Module, i).OriginStation != module)
  554. {
  555. module = (ModuleName)WaferManager.Instance.GetWafer(_pm1.Module, i).OriginStation;
  556. break;
  557. }
  558. }
  559. }
  560. else
  561. {
  562. for (int i = SC.GetValue<int>($"Boat.SlotCount") - 1; i >= 0; i--)
  563. {
  564. if (!WaferManager.Instance.CheckHasWafer(_pm1.Module, i))
  565. continue;
  566. var wafer = WaferManager.Instance.GetWafer(_pm1.Module, i);
  567. if (wafer == null || wafer.IsEmpty)
  568. continue;
  569. if (wafer.WaferType == waferType && (ModuleName)WaferManager.Instance.GetWafer(_pm1.Module, i).OriginStation != module)
  570. {
  571. module = (ModuleName)WaferManager.Instance.GetWafer(_pm1.Module, i).OriginStation;
  572. break;
  573. }
  574. }
  575. }
  576. }
  577. return module;
  578. }
  579. private void MonitorCassetteRobotStockerTask()
  580. {
  581. if (!_carrierRobot.IsAvailable)
  582. return;
  583. //pick
  584. if (CarrierManager.Instance.CheckNoCarrier(ModuleName.CarrierRobot, 0) && WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 2))
  585. {
  586. var stockerModule = (ModuleName)WaferManager.Instance.GetWafer(ModuleName.WaferRobot, 2).OriginStation;
  587. if (stockerModule != ModuleName.System)
  588. {
  589. SchedulerStocker mStocker = null;
  590. foreach (var m in _lstTotlaStockers)
  591. {
  592. bool hasCarrier = CarrierManager.Instance.CheckHasCarrier(m.Module, 0);
  593. bool hasEmptySlot = CheckCarrierHasEmptySlot(m.Module);
  594. //if (CarrierManager.Instance.CheckHasCarrier(m.Module, 0) && m.Module == stockerModule && CheckCarrierHasEmptySlot(m.Module))
  595. if (hasCarrier && m.Module == stockerModule && hasEmptySlot)
  596. {
  597. mStocker = m;
  598. break;
  599. }
  600. }
  601. SchedulerFIMS stage = null;
  602. foreach (var st in _lstFIMSs)
  603. {
  604. if (!st.IsAvailable)
  605. continue;
  606. if (CarrierManager.Instance.CheckNoCarrier(st.Module, 0))
  607. {
  608. stage = st;
  609. break;
  610. }
  611. }
  612. if (mStocker != null && stage != null)
  613. {
  614. if (_carrierRobot.Pick(mStocker.Module, 0, Hand.Blade1))
  615. {
  616. mStocker.WaitTransfer(ModuleName.CarrierRobot);
  617. }
  618. }
  619. }
  620. }
  621. if (!_carrierRobot.IsAvailable)
  622. return;
  623. //place
  624. var carrier = CarrierManager.Instance.GetCarrier(ModuleName.CarrierRobot, 0);
  625. if (carrier != null && !carrier.IsEmpty)
  626. {
  627. if (!CheckModuleHasWaferInWaferRobotAndPM(carrier.InternalModuleName) || !CheckCarrierHasEmptySlot(ModuleName.CarrierRobot))
  628. {
  629. SchedulerStocker stocker = null;
  630. foreach (var m in _lstTotlaStockers)
  631. {
  632. if (CarrierManager.Instance.CheckNoCarrier(m.Module, 0) && m.Module == carrier.InternalModuleName)
  633. {
  634. stocker = m;
  635. break;
  636. }
  637. }
  638. if (stocker != null)
  639. {
  640. if (_carrierRobot.Place(stocker.Module, 0, Hand.Blade1))
  641. {
  642. stocker.WaitTransfer(ModuleName.CarrierRobot);
  643. }
  644. }
  645. }
  646. }
  647. }
  648. private void MonitorCassetteRobotStageTask()
  649. {
  650. if (!_carrierRobot.IsAvailable)
  651. return;
  652. //pick
  653. var carrier = CarrierManager.Instance.GetCarrier(ModuleName.CarrierRobot, 0);
  654. if (carrier != null && carrier.IsEmpty)
  655. {
  656. SchedulerFIMS stage = null;
  657. foreach (var st in _lstFIMSs)
  658. {
  659. if (!st.IsAvailable)
  660. continue;
  661. if (!_waferRobot.IsAvailable)
  662. continue;
  663. if (CarrierManager.Instance.CheckHasCarrier(st.Module, 0))
  664. {
  665. carrier = CarrierManager.Instance.GetCarrier(st.Module, 0);
  666. if (carrier != null)
  667. {
  668. if (!CheckCarrierHasEmptySlot(st.Module))
  669. {
  670. stage = st;
  671. break;
  672. }
  673. //GetWaferSlotsAndWaferType(carrier, out List<int> slots, out WaferType waferType);
  674. //if (slots != null && !CheckModuleHasWaferInWaferRobotAndPM(carrier.InternalModuleName))
  675. if (!CheckModuleHasWaferInWaferRobotAndPM(carrier.InternalModuleName))
  676. {
  677. stage = st;
  678. break;
  679. }
  680. }
  681. }
  682. }
  683. if (stage != null)
  684. {
  685. if (_carrierRobot.Pick(stage.Module, 0, Hand.Blade1))
  686. {
  687. stage.WaitTransfer(ModuleName.CarrierRobot);
  688. }
  689. }
  690. }
  691. if (!_carrierRobot.IsAvailable)
  692. return;
  693. //place
  694. carrier = CarrierManager.Instance.GetCarrier(ModuleName.CarrierRobot, 0);
  695. if (carrier != null && !carrier.IsEmpty)
  696. {
  697. SchedulerFIMS stage = null;
  698. foreach (var st in _lstFIMSs)
  699. {
  700. if (!st.IsAvailable)
  701. continue;
  702. if (CarrierManager.Instance.CheckNoCarrier(st.Module, 0))
  703. {
  704. GetWaferSlotsAndWaferType(carrier, out List<int> slots, out WaferType waferType);
  705. if (slots != null && GetWaferCountRelatedToWaferRobot(waferType, false) > 0 && CheckModuleHasWaferInWaferRobotAndPM(carrier.InternalModuleName))
  706. {
  707. stage = st;
  708. break;
  709. }
  710. }
  711. }
  712. if (stage != null)
  713. {
  714. if (_carrierRobot.Place(stage.Module, 0, Hand.Blade1))
  715. {
  716. stage.WaitTransfer(ModuleName.CarrierRobot);
  717. }
  718. }
  719. }
  720. }
  721. private void MonitorWaferRobotTask()
  722. {
  723. if (!_waferRobot.IsAvailable)
  724. return;
  725. foreach (var stage in _lstFIMSs)
  726. {
  727. if (stage.IsWaitTransfer(ModuleName.WaferRobot))
  728. {
  729. stage.StopWaitTransfer(ModuleName.WaferRobot);
  730. }
  731. }
  732. if (_pm1.IsWaitTransfer(ModuleName.WaferRobot))
  733. {
  734. _pm1.StopWaitTransfer(ModuleName.WaferRobot);
  735. }
  736. MonitorWaferRobotFIMSTask();
  737. if (!_waferRobot.IsAvailable)
  738. return;
  739. MonitorWaferRobotPMTask();
  740. }
  741. private void MonitorWaferRobotFIMSTask()
  742. {
  743. if (!_waferRobot.IsAvailable)
  744. return;
  745. //place
  746. if (WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 2))
  747. {
  748. SchedulerFIMS stage = null;
  749. var waferInRobot = WaferManager.Instance.GetWafer(ModuleName.WaferRobot, 2);
  750. foreach (var st in _lstFIMSs)
  751. {
  752. if (!st.IsAvailable)
  753. continue;
  754. if (!CarrierManager.Instance.CheckHasCarrier(st.Module, 0))
  755. continue;
  756. var carrier = CarrierManager.Instance.GetCarrier(st.Module, 0);
  757. if (carrier == null || carrier.IsEmpty)
  758. continue;
  759. if ((ModuleName)waferInRobot.OriginStation != carrier.InternalModuleName)
  760. continue;
  761. // check FIMS
  762. var fimsDevice = DEVICE.GetDevice<IoFIMS>($"PM1.{st.Module}");
  763. if (!fimsDevice.IsLoadCompleted)
  764. continue;
  765. bool hasEmptySlot = false;
  766. var wafers = WaferManager.Instance.GetWafers(st.Module);
  767. if (wafers != null)
  768. {
  769. foreach (var wafer in wafers)
  770. {
  771. if (wafer == null)
  772. continue;
  773. if (wafer.IsEmpty)
  774. {
  775. hasEmptySlot = true;
  776. break;
  777. }
  778. }
  779. }
  780. if (hasEmptySlot)
  781. {
  782. stage = st;
  783. break;
  784. }
  785. }
  786. if (stage != null)
  787. {
  788. Hand placeBlade = Hand.Blade1;
  789. int placeSlot = waferInRobot.OriginSlot;
  790. if (WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 0) &&
  791. WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 1) &&
  792. WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 3) &&
  793. WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 4) &&
  794. WaferManager.Instance.GetWafer(ModuleName.WaferRobot, 0).OriginStation == WaferManager.Instance.GetWafer(ModuleName.WaferRobot, 1).OriginStation &&
  795. WaferManager.Instance.GetWafer(ModuleName.WaferRobot, 1).OriginStation == WaferManager.Instance.GetWafer(ModuleName.WaferRobot, 2).OriginStation &&
  796. WaferManager.Instance.GetWafer(ModuleName.WaferRobot, 2).OriginStation == WaferManager.Instance.GetWafer(ModuleName.WaferRobot, 3).OriginStation &&
  797. WaferManager.Instance.GetWafer(ModuleName.WaferRobot, 3).OriginStation == WaferManager.Instance.GetWafer(ModuleName.WaferRobot, 4).OriginStation)
  798. {
  799. var tempPlaceSlot = WaferManager.Instance.GetWafer(ModuleName.WaferRobot, 0).OriginSlot;
  800. if (tempPlaceSlot + 4 < SC.GetValue<int>("System.CassetteSlotCount"))
  801. {
  802. if (WaferManager.Instance.CheckNoWafer(stage.Module, tempPlaceSlot + 1) &&
  803. WaferManager.Instance.CheckNoWafer(stage.Module, tempPlaceSlot + 2) &&
  804. WaferManager.Instance.CheckNoWafer(stage.Module, tempPlaceSlot + 3) &&
  805. WaferManager.Instance.CheckNoWafer(stage.Module, tempPlaceSlot + 4))
  806. {
  807. placeBlade = Hand.Both;
  808. placeSlot = tempPlaceSlot;
  809. }
  810. }
  811. }
  812. if (placeSlot != -1 && _waferRobot.Place(stage.Module, placeSlot, placeBlade))
  813. {
  814. stage.WaitTransfer(ModuleName.WaferRobot);
  815. }
  816. }
  817. }
  818. }
  819. private void MonitorWaferRobotPMTask()
  820. {
  821. if (!_waferRobot.IsAvailable)
  822. return;
  823. var pmModule = Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule;
  824. if (pmModule == null)
  825. return;
  826. var stageStockerModeleName = ModuleName.System;
  827. foreach (var st in _lstFIMSs)
  828. {
  829. if (!st.IsAvailable)
  830. continue;
  831. if (!CarrierManager.Instance.CheckHasCarrier(st.Module, 0))
  832. continue;
  833. var carrier = CarrierManager.Instance.GetCarrier(st.Module, 0);
  834. if (carrier == null || carrier.IsEmpty)
  835. continue;
  836. bool hasEmptySlot = false;
  837. var wafers = WaferManager.Instance.GetWafers(st.Module);
  838. if (wafers != null)
  839. {
  840. foreach (var item in wafers)
  841. {
  842. if (item == null)
  843. continue;
  844. if (item.IsEmpty)
  845. {
  846. hasEmptySlot = true;
  847. break;
  848. }
  849. }
  850. }
  851. if (hasEmptySlot)
  852. {
  853. stageStockerModeleName = carrier.InternalModuleName;
  854. break;
  855. }
  856. }
  857. //pick
  858. var wafer = WaferManager.Instance.GetWafer(ModuleName.WaferRobot, 2);
  859. List<int> targetWaferSlots = GetWaferSlots();
  860. if (wafer != null && wafer.IsEmpty && targetWaferSlots != null)
  861. {
  862. Hand pickBlade = Hand.Blade1;
  863. int pickSlot = -1;
  864. for (int i = 0; i < targetWaferSlots.Count; i++)
  865. {
  866. var targetWafer = WaferManager.Instance.GetWafer(_pm1.Module, targetWaferSlots[i]);
  867. if (targetWafer == null || targetWafer.IsEmpty || !CheckWaferCouldBeReturn(targetWafer))
  868. continue;
  869. //先取stage上有空slot的carrier对应的wafer
  870. if (stageStockerModeleName != ModuleName.System && (ModuleName)targetWafer.OriginStation != stageStockerModeleName)
  871. continue;
  872. pickSlot = targetWaferSlots[i];
  873. if (i + 4 < targetWaferSlots.Count && Math.Abs(targetWaferSlots[i] - targetWaferSlots[i + 4]) == 4)
  874. {
  875. if (WaferManager.Instance.CheckHasWafer(_pm1.Module, targetWaferSlots[i + 1]) &&
  876. WaferManager.Instance.CheckHasWafer(_pm1.Module, targetWaferSlots[i + 2]) &&
  877. WaferManager.Instance.CheckHasWafer(_pm1.Module, targetWaferSlots[i + 3]) &&
  878. WaferManager.Instance.CheckHasWafer(_pm1.Module, targetWaferSlots[i + 4]) &&
  879. SC.GetValue<bool>($"{_waferRobot.Module}.IsSupport5Wafer"))
  880. {
  881. bool isFromTopToBottom = SC.GetStringValue("System.ChargingOrderToBoat") == "FromTopToBottom";
  882. var wafer0 = WaferManager.Instance.GetWafer(_pm1.Module, targetWaferSlots[i + (isFromTopToBottom ? 4 : 0)]);
  883. var wafer1 = WaferManager.Instance.GetWafer(_pm1.Module, targetWaferSlots[i + (isFromTopToBottom ? 3 : 1)]);
  884. var wafer2 = WaferManager.Instance.GetWafer(_pm1.Module, targetWaferSlots[i + 2]);
  885. var wafer3 = WaferManager.Instance.GetWafer(_pm1.Module, targetWaferSlots[i + (isFromTopToBottom ? 1 : 3)]);
  886. var wafer4 = WaferManager.Instance.GetWafer(_pm1.Module, targetWaferSlots[i + (isFromTopToBottom ? 0 : 4)]);
  887. if (WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 0) &&
  888. WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 1) &&
  889. WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 3) &&
  890. WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 4) &&
  891. wafer0.OriginStation == wafer1.OriginStation &&
  892. wafer0.OriginStation == wafer2.OriginStation &&
  893. wafer0.OriginStation == wafer3.OriginStation &&
  894. wafer0.OriginStation == wafer4.OriginStation &&
  895. Math.Abs(wafer1.OriginSlot - wafer2.OriginSlot) == 1 &&
  896. Math.Abs(wafer2.OriginSlot - wafer3.OriginSlot) == 1 &&
  897. Math.Abs(wafer0.OriginSlot - wafer4.OriginSlot) == 4 &&
  898. Math.Abs(wafer0.OriginSlot - wafer3.OriginSlot) == 3 &&
  899. Math.Abs(wafer0.OriginSlot - wafer2.OriginSlot) == 2 &&
  900. Math.Abs(wafer0.OriginSlot - wafer1.OriginSlot) == 1)
  901. {
  902. pickBlade = Hand.Both;
  903. pickSlot = wafer4.Slot;
  904. }
  905. }
  906. }
  907. break;
  908. }
  909. if (pmModule.CheckReadyForTransfer(_waferRobot.Module, pickBlade, pickSlot, EnumTransferType.Pick, out string reason) &&
  910. pickSlot != -1 && _waferRobot.Pick(_pm1.Module, pickSlot, pickBlade))
  911. {
  912. _pm1.WaitTransfer(ModuleName.WaferRobot);
  913. }
  914. }
  915. }
  916. private List<int> GetWaferSlots()
  917. {
  918. List<int> slots = null;
  919. switch (SC.GetStringValue("System.ChargingOrderBySort"))
  920. {
  921. case "ED,P,M":
  922. if (CheckWaferSlotsHasWafer(_monitor1Slots))
  923. return _monitor1Slots;
  924. if (CheckWaferSlotsHasWafer(_monitor2Slots))
  925. return _monitor2Slots;
  926. if (CheckWaferSlotsHasWafer(_productSlots))
  927. return _productSlots;
  928. if (CheckWaferSlotsHasWafer(_extraDummySlots))
  929. return _extraDummySlots;
  930. break;
  931. case "ED,M,P":
  932. if (CheckWaferSlotsHasWafer(_productSlots))
  933. return _productSlots;
  934. if (CheckWaferSlotsHasWafer(_monitor1Slots))
  935. return _monitor1Slots;
  936. if (CheckWaferSlotsHasWafer(_monitor2Slots))
  937. return _monitor2Slots;
  938. if (CheckWaferSlotsHasWafer(_extraDummySlots))
  939. return _extraDummySlots;
  940. break;
  941. case "P,ED,M":
  942. if (CheckWaferSlotsHasWafer(_monitor1Slots))
  943. return _monitor1Slots;
  944. if (CheckWaferSlotsHasWafer(_monitor2Slots))
  945. return _monitor2Slots;
  946. if (CheckWaferSlotsHasWafer(_extraDummySlots))
  947. return _extraDummySlots;
  948. if (CheckWaferSlotsHasWafer(_productSlots))
  949. return _productSlots;
  950. break;
  951. case "P,M,ED":
  952. if (CheckWaferSlotsHasWafer(_extraDummySlots))
  953. return _extraDummySlots;
  954. if (CheckWaferSlotsHasWafer(_monitor1Slots))
  955. return _monitor1Slots;
  956. if (CheckWaferSlotsHasWafer(_monitor2Slots))
  957. return _monitor2Slots;
  958. if (CheckWaferSlotsHasWafer(_productSlots))
  959. return _productSlots;
  960. break;
  961. case "M,P,ED":
  962. if (CheckWaferSlotsHasWafer(_extraDummySlots))
  963. return _extraDummySlots;
  964. if (CheckWaferSlotsHasWafer(_productSlots))
  965. return _productSlots;
  966. if (CheckWaferSlotsHasWafer(_monitor1Slots))
  967. return _monitor1Slots;
  968. if (CheckWaferSlotsHasWafer(_monitor2Slots))
  969. return _monitor2Slots;
  970. break;
  971. case "M,ED,P":
  972. if (CheckWaferSlotsHasWafer(_productSlots))
  973. return _productSlots;
  974. if (CheckWaferSlotsHasWafer(_extraDummySlots))
  975. return _extraDummySlots;
  976. if (CheckWaferSlotsHasWafer(_monitor1Slots))
  977. return _monitor1Slots;
  978. if (CheckWaferSlotsHasWafer(_monitor2Slots))
  979. return _monitor2Slots;
  980. break;
  981. default:
  982. if (CheckWaferSlotsHasWafer(_monitor1Slots))
  983. return _monitor1Slots;
  984. if (CheckWaferSlotsHasWafer(_monitor2Slots))
  985. return _monitor2Slots;
  986. if (CheckWaferSlotsHasWafer(_productSlots))
  987. return _productSlots;
  988. if (CheckWaferSlotsHasWafer(_extraDummySlots))
  989. return _extraDummySlots;
  990. break;
  991. }
  992. foreach (var slot in _sideDummySlots)
  993. {
  994. if (WaferManager.Instance.CheckHasWafer(_pm1.Module, slot))
  995. {
  996. return _sideDummySlots;
  997. }
  998. }
  999. return slots;
  1000. }
  1001. private void GetWaferSlotsAndWaferType(CarrierInfo carrier, out List<int> slots, out WaferType waferType)
  1002. {
  1003. slots = null;
  1004. waferType = WaferType.None;
  1005. if (carrier != null && !carrier.IsEmpty)
  1006. {
  1007. switch (carrier.CarrierType)
  1008. {
  1009. case CarrierType.SD:
  1010. slots = _sideDummySlots;
  1011. waferType = WaferType.SD;
  1012. break;
  1013. case CarrierType.ED:
  1014. slots = _extraDummySlots;
  1015. waferType = WaferType.ED;
  1016. break;
  1017. case CarrierType.M1:
  1018. slots = _monitor1Slots;
  1019. waferType = WaferType.M1;
  1020. break;
  1021. case CarrierType.M2:
  1022. slots = _monitor2Slots;
  1023. waferType = WaferType.M2;
  1024. break;
  1025. case CarrierType.P:
  1026. slots = _productSlots;
  1027. waferType = WaferType.P;
  1028. break;
  1029. }
  1030. }
  1031. }
  1032. private bool CheckWaferSlotsHasWafer(List<int> slots)
  1033. {
  1034. foreach (var slot in slots)
  1035. {
  1036. if (WaferManager.Instance.CheckHasWafer(_pm1.Module, slot))
  1037. {
  1038. return true;
  1039. }
  1040. }
  1041. return false;
  1042. }
  1043. private bool CheckModuleHasWaferInWaferRobotAndPM(ModuleName module)
  1044. {
  1045. bool isHaveWafer = false;
  1046. for (int i = 0; i < SC.GetValue<int>($"Boat.SlotCount"); i++)
  1047. {
  1048. if (!WaferManager.Instance.CheckHasWafer(_pm1.Module, i))
  1049. continue;
  1050. var wafer = WaferManager.Instance.GetWafer(_pm1.Module, i);
  1051. if (wafer == null || wafer.IsEmpty)
  1052. continue;
  1053. if (wafer.OriginStation == (int)module)
  1054. {
  1055. isHaveWafer = true;
  1056. break;
  1057. }
  1058. }
  1059. for (int i = 0; i < SC.GetValue<int>("WaferRobot.SlotCount"); i++)
  1060. {
  1061. if (!WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, i))
  1062. continue;
  1063. var wafer = WaferManager.Instance.GetWafer(ModuleName.WaferRobot, i);
  1064. if (wafer == null || wafer.IsEmpty)
  1065. continue;
  1066. if (wafer.OriginStation == (int)module)
  1067. {
  1068. isHaveWafer = true;
  1069. break;
  1070. }
  1071. }
  1072. return isHaveWafer;
  1073. }
  1074. private int GetWaferCountRelatedToWaferRobot(WaferType waferType, bool subtractionStage = true)
  1075. {
  1076. int count = 0;
  1077. for (int i = 0; i < 5; i++)
  1078. {
  1079. var wafer = WaferManager.Instance.GetWafer(ModuleName.WaferRobot, i);
  1080. if (!wafer.IsEmpty && wafer.WaferType == waferType)
  1081. count++;
  1082. }
  1083. for (int i = 0; i < SC.GetValue<int>($"Boat.SlotCount"); i++)
  1084. {
  1085. var wafer = WaferManager.Instance.GetWafer(_pm1.Module, i);
  1086. if (!wafer.IsEmpty && wafer.WaferType == waferType)
  1087. count++;
  1088. }
  1089. if (subtractionStage)
  1090. {
  1091. foreach (var stage in _lstFIMSs)
  1092. {
  1093. if (CarrierManager.Instance.CheckNoCarrier(stage.Module, 0))
  1094. continue;
  1095. var wafers = WaferManager.Instance.GetWafers(stage.Module);
  1096. foreach (var wafer in wafers)
  1097. {
  1098. if (!wafer.IsEmpty && wafer.WaferType == waferType)
  1099. count--;
  1100. }
  1101. }
  1102. }
  1103. return count < 0 ? 0 : count;
  1104. }
  1105. private bool CheckCarrierHasEmptySlot(ModuleName module)
  1106. {
  1107. bool hasEmpty = false;
  1108. var wafers = WaferManager.Instance.GetWafers(module);
  1109. if (wafers != null)
  1110. {
  1111. foreach (var wafer in wafers)
  1112. {
  1113. if (wafer.IsEmpty)
  1114. {
  1115. hasEmpty = true;
  1116. break;
  1117. }
  1118. }
  1119. }
  1120. return hasEmpty;
  1121. }
  1122. private bool CheckCarrierHasWaferInPM(ModuleName module)
  1123. {
  1124. bool isHaveWafer = false;
  1125. for (int i = 0; i < SC.GetValue<int>($"Boat.SlotCount"); i++)
  1126. {
  1127. if (!WaferManager.Instance.CheckHasWafer(_pm1.Module, i))
  1128. continue;
  1129. var wafer = WaferManager.Instance.GetWafer(_pm1.Module, i);
  1130. if (wafer == null || wafer.IsEmpty)
  1131. continue;
  1132. if (wafer.OriginStation == (int)module)
  1133. {
  1134. isHaveWafer = true;
  1135. break;
  1136. }
  1137. }
  1138. return isHaveWafer;
  1139. }
  1140. private bool CheckCarrierHasWaferInWaferRobot(ModuleName module)
  1141. {
  1142. bool isHaveWafer = false;
  1143. for (int i = 0; i < 5; i++)
  1144. {
  1145. var wafer = WaferManager.Instance.GetWafer(ModuleName.WaferRobot, i);
  1146. if (wafer.OriginStation == (int)module)
  1147. {
  1148. isHaveWafer = true;
  1149. break;
  1150. };
  1151. }
  1152. return isHaveWafer;
  1153. }
  1154. private bool CheckCarrierNoHasEmptySlot(ModuleName module)
  1155. {
  1156. bool noHasEmpty = true;
  1157. var wafers = WaferManager.Instance.GetWafers(module);
  1158. if (wafers != null)
  1159. {
  1160. foreach (var wafer in wafers)
  1161. {
  1162. if (!wafer.IsEmpty)
  1163. {
  1164. noHasEmpty = false;
  1165. break;
  1166. }
  1167. }
  1168. }
  1169. return noHasEmpty;
  1170. }
  1171. private bool CheckCarrierCanPickFromFIMSInDischarge(ModuleName fimsCarrierModule)
  1172. {
  1173. List<ModuleName> robotModules = new List<ModuleName>();
  1174. for (int i = 0; i < WaferManager.Instance.GetWafers(ModuleName.WaferRobot).Length; i++)
  1175. {
  1176. var wafer = WaferManager.Instance.GetWafer(ModuleName.WaferRobot, i);
  1177. if (wafer == null || wafer.IsEmpty)
  1178. continue;
  1179. if (!robotModules.Contains((ModuleName)wafer.OriginStation))
  1180. robotModules.Add((ModuleName)wafer.OriginStation);
  1181. }
  1182. if (robotModules.Contains(fimsCarrierModule))
  1183. return false;
  1184. List<ModuleName> pmModules = new List<ModuleName>();
  1185. for (int i = 0; i < WaferManager.Instance.GetWafers(_pm1.Module).Length; i++)
  1186. {
  1187. var wafer = WaferManager.Instance.GetWafer(_pm1.Module, i);
  1188. if (wafer == null || wafer.IsEmpty)
  1189. continue;
  1190. if (!pmModules.Contains((ModuleName)wafer.OriginStation))
  1191. pmModules.Add((ModuleName)wafer.OriginStation);
  1192. if (pmModules.Count == _lstFIMSs.Count)
  1193. break;
  1194. }
  1195. if (pmModules.Contains(fimsCarrierModule))
  1196. return false;
  1197. return true;
  1198. }
  1199. public void Abort()
  1200. {
  1201. }
  1202. }
  1203. }