Check.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836
  1. using System;
  2. using Aitex.Core.Common;
  3. using Aitex.Core.RT.Device;
  4. using Aitex.Core.RT.Event;
  5. using Aitex.Core.Util;
  6. using EFEM.RT.Tasks;
  7. using Aitex.Sorter.Common;
  8. using MECF.Framework.Common.Equipment;
  9. using MECF.Framework.Common.SubstrateTrackings;
  10. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts;
  11. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts.LoadPortBase;
  12. namespace EFEM.RT
  13. {
  14. [Flags]
  15. public enum ErrorCheckList1
  16. {
  17. VAC = 0x0001,
  18. AIR = 0x0002,
  19. STALL = 0x0004,
  20. TIMEOUT = 0x0008,
  21. LIMIT = 0x0010,
  22. SENSOR = 0x0020,
  23. POSITION = 0x0040,
  24. EMS = 0x0080,
  25. COMM = 0x0100,
  26. COMM2 = 0x0200,
  27. VACON = 0x0400,
  28. VACOFF = 0x0800,
  29. CLAMPON = 0x1000,
  30. CLAMPOF = 0x2000,
  31. };
  32. [Flags]
  33. public enum ErrorCheckList2
  34. {
  35. RRTWAF = 0x0001,
  36. CRSWAF = 0x0002,
  37. THICKWAF = 0x0004,
  38. THINWAF = 0x0008,
  39. DBLWAF = 0x0010,
  40. BAOWAF = 0x0020,
  41. COMMAND = 0x0040,
  42. PODNG = 0x0080, //Pod abnormal load error
  43. PODMISMATCH = 0x0100, //Pod type mismatch
  44. VAC_S = 0x0200, //Chucking sensor abnormal
  45. CLAMP_S = 0x0400, //Clamp sensor abnormal
  46. SAFTY = 0x0800, //Hand/finger pinch sensor reaction
  47. LOCKNG = 0x1000, //FOUP lock disabled
  48. UNLOCKNG = 0x2000, //FOUP unlock disabled
  49. L_KEY_LK = 0x4000, //Latch key lock failure
  50. L_KEY_UL = 0x8000, //Latch key unlock failure
  51. };
  52. [Flags]
  53. public enum ErrorCheckList3
  54. {
  55. MAP_S = 0x0001, //Mapping sensor abnormal
  56. MAP_S1 = 0x0002, //Mapping sensor preparation disabled
  57. MAP_S2 = 0x0004, //Mapping sensor containing disabled
  58. WAFLOST = 0x0008, //Wafer fall Disabled
  59. ALIGNNG = 0x0010, //Alignment failure
  60. DRIVER = 0x0020, //Driver abnormal
  61. DRPOWERDOWN = 0x0040, //Drive power off
  62. HARDWARE = 0x0080, //Hardware failure
  63. INTERNAL = 0x0100, // Internal error
  64. E84_TIMEOUTx = 0x0200, //E84 timeout
  65. E84_CS_VALID = 0x0400, //E84_CS_VALID E84CS_0, CS_1, VALIDerror
  66. READFAIL = 0x0800, //Reading error
  67. PODNG = 0x1000,
  68. PODMISMATCH = 0x2000,
  69. VAC_S = 0x4000,
  70. CLAMP_S = 0x8000,
  71. };
  72. public interface IPolicy
  73. {
  74. bool Check(string device, out string reason);
  75. }
  76. public class CheckImp
  77. {
  78. protected ErrorCheckList1 flag1 = 0;
  79. protected ErrorCheckList2 flag2 = 0;
  80. protected ErrorCheckList3 flag3 = 0;
  81. protected int LoadPortQuantity = DeviceDefineManager.Instance.GetValue<int>("LoadPortQuantity") ?? 0;
  82. protected int LoadLockQuantity = DeviceDefineManager.Instance.GetValue<int>("LoadLockQuantity") ?? 0;
  83. protected int BufferQuantity = DeviceDefineManager.Instance.GetValue<int>("BufferQuantity") ?? 0;
  84. protected bool AlignerInstalled = DeviceDefineManager.Instance.GetValue<bool>("AlignerInstalled") ?? false;
  85. protected bool CoolingBufferInstalled = DeviceDefineManager.Instance.GetValue<bool>("CoolingBufferInstalled") ?? false;
  86. protected bool RobotIsSingleArm = DeviceDefineManager.Instance.GetValue<bool>("RobotIsSingleArm") ?? false;
  87. protected bool MultiWaferSize = DeviceDefineManager.Instance.GetValue<bool>("MultiWaferSize") ?? false;
  88. public const string PARAM_NG = "PARAM_NG";
  89. protected int _token;
  90. public bool HasInfoMessage { get; set; }
  91. public CheckImp()
  92. {
  93. HasInfoMessage = true;
  94. }
  95. public bool CheckError(string device, out string reason)
  96. {
  97. reason = "UNDEFINITION";
  98. #region Check flag1
  99. if (flag1.HasFlag(ErrorCheckList1.VAC))
  100. {
  101. if (!Check<ABS.VacPolicy>(device, out reason))
  102. {
  103. return false;
  104. }
  105. }
  106. if (flag1.HasFlag(ErrorCheckList1.AIR))
  107. {
  108. if (!Check<ABS.AirPolicy>(device, out reason))
  109. {
  110. return false;
  111. }
  112. }
  113. //if (flag1.HasFlag(ErrorCheckList1.STALL))
  114. //{
  115. // if (!Check<ABS.StallPolicy>(device, out reason))
  116. // {
  117. // return false;
  118. // }
  119. //}
  120. //if (flag1.HasFlag(ErrorCheckList1.LIMIT))
  121. //{
  122. // if (!Check<ABS.LIMITPolicy>(device, out reason))
  123. // {
  124. // return false;
  125. // }
  126. //}
  127. //if (flag1.HasFlag(ErrorCheckList1.SENSOR))
  128. //{
  129. // if (!Check<ABS.SENSORPolicy>(device, out reason))
  130. // {
  131. // return false;
  132. // }
  133. //}
  134. //if (flag1.HasFlag(ErrorCheckList1.POSITION))
  135. //{
  136. // if (!Check<ABS.POSITIONPolicy>(device, out reason))
  137. // {
  138. // return false;
  139. // }
  140. //}
  141. if (flag1.HasFlag(ErrorCheckList1.EMS))
  142. {
  143. if (!Check<ABS.EMSPolicy>(device, out reason))
  144. {
  145. return false;
  146. }
  147. }
  148. //if (flag1.HasFlag(ErrorCheckList1.COMM))
  149. //{
  150. // if (!Check<ABS.COMMPolicy>(device, out reason))
  151. // {
  152. // return false;
  153. // }
  154. //}
  155. //if (flag1.HasFlag(ErrorCheckList1.COMM2))
  156. //{
  157. // if (!Check<ABS.COMM2Policy>(device, out reason))
  158. // {
  159. // return false;
  160. // }
  161. //}
  162. //if (flag1.HasFlag(ErrorCheckList1.VACON))
  163. //{
  164. // if (!Check<ABS.VACONPolicy>(device, out reason))
  165. // {
  166. // return false;
  167. // }
  168. //}
  169. //if (flag1.HasFlag(ErrorCheckList1.VACOFF))
  170. //{
  171. // if (!Check<ABS.VACOFPolicy>(device, out reason))
  172. // {
  173. // return false;
  174. // }
  175. //}
  176. //if (flag1.HasFlag(ErrorCheckList1.CLAMPON))
  177. //{
  178. // if (!Check<ABS.CLAMPONPolicy>(device, out reason))
  179. // {
  180. // return false;
  181. // }
  182. //}
  183. //if (flag1.HasFlag(ErrorCheckList1.CLAMPOF))
  184. //{
  185. // if (!Check<ABS.CLAMPOFPolicy>(device, out reason))
  186. // {
  187. // return false;
  188. // }
  189. //}
  190. #endregion
  191. //#region Check flag2
  192. //if (flag2.HasFlag(ErrorCheckList2.RRTWAF))
  193. //{
  194. // if (!Check<ABS.PRTWAFPolicy>(device, out reason))
  195. // {
  196. // return false;
  197. // }
  198. //}
  199. //if (flag2.HasFlag(ErrorCheckList2.CRSWAF))
  200. //{
  201. // if (!Check<ABS.CRSWAFPolicy>(device, out reason))
  202. // {
  203. // return false;
  204. // }
  205. //}
  206. //if (flag2.HasFlag(ErrorCheckList2.THICKWAF))
  207. //{
  208. // if (!Check<ABS.THICKWAFPolicy>(device, out reason))
  209. // {
  210. // return false;
  211. // }
  212. //}
  213. //if (flag2.HasFlag(ErrorCheckList2.THINWAF))
  214. //{
  215. // if (!Check<ABS.THINWAFPolicy>(device, out reason))
  216. // {
  217. // return false;
  218. // }
  219. //}
  220. //if (flag2.HasFlag(ErrorCheckList2.DBLWAF))
  221. //{
  222. // if (!Check<ABS.DBLWAFPolicy>(device, out reason))
  223. // {
  224. // return false;
  225. // }
  226. //}
  227. //if (flag2.HasFlag(ErrorCheckList2.BAOWAF))
  228. //{
  229. // if (!Check<ABS.BOWWAFPolicy>(device, out reason))
  230. // {
  231. // return false;
  232. // }
  233. //}
  234. //if (flag2.HasFlag(ErrorCheckList2.COMMAND))
  235. //{
  236. // if (!Check<ABS.COMMANDPolicy>(device, out reason))
  237. // {
  238. // return false;
  239. // }
  240. //}
  241. //if (flag2.HasFlag(ErrorCheckList2.PODNG))
  242. //{
  243. // if (!Check<ABS.PODNGPolicy>(device, out reason))
  244. // {
  245. // return false;
  246. // }
  247. //}
  248. //if (flag2.HasFlag(ErrorCheckList2.PODMISMATCH))
  249. //{
  250. // if (!Check<ABS.PODMISMATCHPolicy>(device, out reason))
  251. // {
  252. // return false;
  253. // }
  254. //}
  255. //if (flag2.HasFlag(ErrorCheckList2.VAC_S))
  256. //{
  257. // if (!Check<ABS.VAC_SPolicy>(device, out reason))
  258. // {
  259. // return false;
  260. // }
  261. //}
  262. //if (flag2.HasFlag(ErrorCheckList2.CLAMP_S))
  263. //{
  264. // if (!Check<ABS.CLAMP_SPolicy>(device, out reason))
  265. // {
  266. // return false;
  267. // }
  268. //}
  269. //if (flag2.HasFlag(ErrorCheckList2.SAFTY))
  270. //{
  271. // if (!Check<ABS.SAFTYPolicy>(device, out reason))
  272. // {
  273. // return false;
  274. // }
  275. //}
  276. //if (flag2.HasFlag(ErrorCheckList2.LOCKNG))
  277. //{
  278. // if (!Check<ABS.LOCKNGPolicy>(device, out reason))
  279. // {
  280. // return false;
  281. // }
  282. //}
  283. //if (flag2.HasFlag(ErrorCheckList2.UNLOCKNG))
  284. //{
  285. // if (!Check<ABS.UNLOCKNGPolicy>(device, out reason))
  286. // {
  287. // return false;
  288. // }
  289. //}
  290. //if (flag2.HasFlag(ErrorCheckList2.L_KEY_LK))
  291. //{
  292. // if (!Check<ABS.L_KEY_LKPolicy>(device, out reason))
  293. // {
  294. // return false;
  295. // }
  296. //}
  297. //if (flag2.HasFlag(ErrorCheckList2.L_KEY_UL))
  298. //{
  299. // if (!Check<ABS.L_KEY_ULPolicy>(device, out reason))
  300. // {
  301. // return false;
  302. // }
  303. //}
  304. //#endregion
  305. //#region Check flag3
  306. //if (flag3.HasFlag(ErrorCheckList3.MAP_S))
  307. //{
  308. // if (!Check<ABS.MAP_SPolicy>(device, out reason))
  309. // {
  310. // return false;
  311. // }
  312. //}
  313. //if (flag3.HasFlag(ErrorCheckList3.MAP_S1))
  314. //{
  315. // if (!Check<ABS.MAP_S1Policy>(device, out reason))
  316. // {
  317. // return false;
  318. // }
  319. //}
  320. //if (flag3.HasFlag(ErrorCheckList3.MAP_S2))
  321. //{
  322. // if (!Check<ABS.MAP_S2Policy>(device, out reason))
  323. // {
  324. // return false;
  325. // }
  326. //}
  327. //if (flag3.HasFlag(ErrorCheckList3.WAFLOST))
  328. //{
  329. // if (!Check<ABS.WAFLOSTPolicy>(device, out reason))
  330. // {
  331. // return false;
  332. // }
  333. //}
  334. //if (flag3.HasFlag(ErrorCheckList3.ALIGNNG))
  335. //{
  336. // if (!Check<ABS.ALIGNNGPolicy>(device, out reason))
  337. // {
  338. // return false;
  339. // }
  340. //}
  341. //if (flag3.HasFlag(ErrorCheckList3.PODNG))
  342. //{
  343. // if (!Check<ABS.PODNGPolicy>(device, out reason))
  344. // {
  345. // return false;
  346. // }
  347. //}
  348. //if (flag3.HasFlag(ErrorCheckList3.PODMISMATCH))
  349. //{
  350. // if (!Check<ABS.PODMISMATCHPolicy>(device, out reason))
  351. // {
  352. // return false;
  353. // }
  354. //}
  355. //if (flag3.HasFlag(ErrorCheckList3.VAC_S))
  356. //{
  357. // if (!Check<ABS.VAC_SPolicy>(device, out reason))
  358. // {
  359. // return false;
  360. // }
  361. //}
  362. //if (flag3.HasFlag(ErrorCheckList3.CLAMP_S))
  363. //{
  364. // if (!Check<ABS.CLAMP_SPolicy>(device, out reason))
  365. // {
  366. // return false;
  367. // }
  368. //}
  369. //if (flag3.HasFlag(ErrorCheckList3.DRIVER))
  370. //{
  371. // if (!Check<ABS.DRIVERPolicy>(device, out reason))
  372. // {
  373. // return false;
  374. // }
  375. //}
  376. //if (flag3.HasFlag(ErrorCheckList3.DRPOWERDOWN))
  377. //{
  378. // if (!Check<ABS.DRPOWERDOWNPolicy>(device, out reason))
  379. // {
  380. // return false;
  381. // }
  382. //}
  383. //if (flag3.HasFlag(ErrorCheckList3.HARDWARE))
  384. //{
  385. // if (!Check<ABS.HARDWAREPolicy>(device, out reason))
  386. // {
  387. // return false;
  388. // }
  389. //}
  390. //if (flag3.HasFlag(ErrorCheckList3.INTERNAL))
  391. //{
  392. // if (!Check<ABS.INTERNALPolicy>(device, out reason))
  393. // {
  394. // return false;
  395. // }
  396. //}
  397. //if (flag3.HasFlag(ErrorCheckList3.E84_TIMEOUTx))
  398. //{
  399. // if (!Check<ABS.E84_TIMEOUTxPolicy>(device, out reason))
  400. // {
  401. // return false;
  402. // }
  403. //}
  404. //if (flag3.HasFlag(ErrorCheckList3.E84_CS_VALID))
  405. //{
  406. // if (!Check<ABS.E84_CS_VALIDPolicy>(device, out reason))
  407. // {
  408. // return false;
  409. // }
  410. //}
  411. //if (flag3.HasFlag(ErrorCheckList3.READFAIL))
  412. //{
  413. // if (!Check<ABS.READFAILPolicy>(device, out reason))
  414. // {
  415. // return false;
  416. // }
  417. //}
  418. //#endregion
  419. //reason = "UNDEFINITION";
  420. return true;
  421. }
  422. public bool Check<T>(string device, out string reason) where T : class, IPolicy, new()
  423. {
  424. reason = string.Empty;
  425. return Singleton<T>.Instance.Check(device, out reason);
  426. }
  427. /// <summary>
  428. /// 指令参数
  429. /// </summary>
  430. /// <param name="args"></param>
  431. /// <returns></returns>
  432. protected string Args2Unit(string args)
  433. {
  434. string unit = string.Empty;
  435. if (string.IsNullOrEmpty(args) || args.StartsWith("ALL") || args.StartsWith("SYSTEM"))
  436. {
  437. unit = DeviceName.System;
  438. }
  439. else if (args.StartsWith("ROB"))
  440. {
  441. unit = DeviceName.Robot;
  442. }
  443. else if (args.StartsWith("ALIGN"))
  444. {
  445. if (this.AlignerInstalled)
  446. unit = DeviceName.Aligner;
  447. else if (this.CoolingBufferInstalled)
  448. {
  449. //if (args.EndsWith("ALIGN1") || args.EndsWith("ALIGN"))
  450. //{
  451. // unit = DeviceName.CoolingBuffer1;
  452. //}
  453. //else if (args.EndsWith("ALIGN2"))
  454. //{
  455. // unit = DeviceName.CoolingBuffer2;
  456. //}
  457. if (args.EndsWith("ALIGN1") || args.EndsWith("ALIGN"))
  458. {
  459. unit = DeviceName.CoolingBuffer1;
  460. }
  461. else if (args.EndsWith("ALIGN2"))
  462. {
  463. unit = DeviceName.CoolingBuffer2;
  464. }
  465. else if (args.EndsWith("ALIGN3"))
  466. {
  467. unit = DeviceName.Aligner1;
  468. }
  469. else if (args.EndsWith("ALIGN4"))
  470. {
  471. unit = DeviceName.Aligner2;
  472. }
  473. }
  474. }
  475. else if (args.Equals("P1") && LoadPortQuantity > 0)
  476. {
  477. unit = DeviceName.LP1;
  478. }
  479. else if (args.Equals("P2") && LoadPortQuantity > 1)
  480. {
  481. unit = DeviceName.LP2;
  482. }
  483. else if (args.Equals("P3") && LoadPortQuantity > 2)
  484. {
  485. unit = DeviceName.LP3;
  486. }
  487. else if (args.Equals("P4") && LoadPortQuantity > 3)
  488. {
  489. unit = DeviceName.LP4;
  490. }
  491. else if (args.Equals("P5") && LoadPortQuantity > 4)
  492. {
  493. unit = DeviceName.LP5;
  494. }
  495. else if (args.Equals("P6") && LoadPortQuantity > 5)
  496. {
  497. unit = DeviceName.LP6;
  498. }
  499. else if (args.Equals("P7") && LoadPortQuantity > 6)
  500. {
  501. unit = DeviceName.LP7;
  502. }
  503. else if (args.Equals("P8") && LoadPortQuantity > 7)
  504. {
  505. unit = DeviceName.LP8;
  506. }
  507. else if (args.Equals("P9") && LoadPortQuantity > 8)
  508. {
  509. unit = DeviceName.LP9;
  510. }
  511. else if (args.Equals("P10") && LoadPortQuantity > 9)
  512. {
  513. unit = DeviceName.LP10;
  514. }
  515. else if ( (args.Equals("LLA") || args.StartsWith("LLLA")) && LoadLockQuantity >0)
  516. {
  517. unit = DeviceName.LoadlockA;
  518. }
  519. else if ((args.Equals("LLB") || args.StartsWith("LLLB")) && LoadLockQuantity > 1)
  520. {
  521. unit = DeviceName.LoadlockB;
  522. }
  523. else if (args.Equals("LLC") && LoadLockQuantity > 2)
  524. {
  525. unit = DeviceName.LoadlockC;
  526. }
  527. else if (args.Equals("LLD") && LoadLockQuantity > 3)
  528. {
  529. unit = DeviceName.LoadlockD;
  530. }
  531. else if (args.Equals("STOWER"))
  532. {
  533. unit = DeviceName.SignalTower;
  534. }
  535. else if (args.Equals("BF1"))
  536. {
  537. unit = DeviceName.Buffer1;
  538. }
  539. else if (args.Equals("BF2"))
  540. {
  541. unit = DeviceName.Buffer2;
  542. }
  543. else if (args.Equals("BUFFER"))
  544. {
  545. unit = DeviceName.Buffer;
  546. }
  547. else if (args.Equals("FLIPPER"))
  548. {
  549. unit = DeviceName.Flipper;
  550. }
  551. return unit;
  552. }
  553. protected bool ParseMoveTarget(string args, out ModuleName target, out int slot)
  554. {
  555. target = ModuleName.System;
  556. slot = 1;
  557. if (args.StartsWith("ALIGN"))
  558. {
  559. if (this.AlignerInstalled)
  560. {
  561. target = ModuleName.Aligner;
  562. slot = 1;
  563. }
  564. else if (this.CoolingBufferInstalled)
  565. {
  566. if (args.EndsWith("ALIGN1")|| args.EndsWith("ALIGN"))
  567. {
  568. target = ModuleName.CoolingBuffer1;
  569. slot = 1;
  570. }
  571. else if (args.EndsWith("ALIGN2"))
  572. {
  573. target = ModuleName.CoolingBuffer2;
  574. slot = 1;
  575. }
  576. else if (args.EndsWith("ALIGN3"))
  577. {
  578. target = ModuleName.Aligner1;
  579. slot = 1;
  580. }
  581. else if (args.EndsWith("ALIGN4"))
  582. {
  583. target = ModuleName.Aligner2;
  584. slot = 1;
  585. }
  586. }
  587. return true;
  588. }
  589. else if (args.StartsWith("P1") && LoadPortQuantity > 0)
  590. {
  591. target = ModuleName.LP1;
  592. if (int.TryParse(args.Replace("P1", ""), out slot))
  593. {
  594. return true;
  595. }
  596. }
  597. else if (args.StartsWith("P2") && LoadPortQuantity > 1)
  598. {
  599. target = ModuleName.LP2;
  600. if (int.TryParse(args.Replace("P2", ""), out slot))
  601. {
  602. return true;
  603. }
  604. }
  605. else if (args.StartsWith("P3") && LoadPortQuantity > 2)
  606. {
  607. target = ModuleName.LP3;
  608. if (int.TryParse(args.Replace("P3", ""), out slot))
  609. {
  610. return true;
  611. }
  612. }
  613. else if (args.StartsWith("P4") && LoadPortQuantity > 3)
  614. {
  615. target = ModuleName.LP4;
  616. if (int.TryParse(args.Replace("P4", ""), out slot))
  617. {
  618. return true;
  619. }
  620. }
  621. else if ((args.StartsWith("LLLA") || args.StartsWith("LLA")))
  622. {
  623. if(BufferQuantity == 0 && LoadLockQuantity > 0)
  624. target = ModuleName.LL1;
  625. if(LoadLockQuantity==0 && BufferQuantity>0)
  626. target = ModuleName.Buffer1;
  627. string temp = args.Replace("LLLA", "").Replace("LLA","");
  628. if (string.IsNullOrEmpty(temp))
  629. {
  630. slot = 1;
  631. return true;
  632. }
  633. else
  634. {
  635. if (int.TryParse(temp, out slot))
  636. return true;
  637. }
  638. }
  639. else if ((args.StartsWith("LLLB") || args.StartsWith("LLB")) )
  640. {
  641. if (BufferQuantity==0 && LoadLockQuantity > 1)
  642. target = ModuleName.LL2;
  643. if (LoadLockQuantity == 0 && BufferQuantity > 1)
  644. target = ModuleName.Buffer2;
  645. // target = ModuleName.LL2;
  646. string temp = args.Replace("LLLB", "").Replace("LLB", "");
  647. if (string.IsNullOrEmpty(temp))
  648. {
  649. slot = 1;
  650. return true;
  651. }
  652. else
  653. {
  654. if (int.TryParse(temp, out slot))
  655. return true;
  656. }
  657. }
  658. else if (args.StartsWith("BF1") && BufferQuantity > 0)
  659. {
  660. target = ModuleName.Buffer1;
  661. if (int.TryParse(args.Replace("BF1", ""), out slot))
  662. {
  663. return true;
  664. }
  665. }
  666. else if (args.StartsWith("BF2") && BufferQuantity > 1)
  667. {
  668. target = ModuleName.Buffer2;
  669. if (int.TryParse(args.Replace("BF2", ""), out slot))
  670. {
  671. return true;
  672. }
  673. }
  674. else if (args.StartsWith("BUFFER"))
  675. {
  676. target = ModuleName.Buffer;
  677. if (int.TryParse(args.Replace("BUFFER", ""), out slot))
  678. {
  679. return true;
  680. }
  681. }
  682. else if (args.StartsWith("FLIPPER"))
  683. {
  684. target = ModuleName.Flipper;
  685. slot = 1;
  686. return true;
  687. }
  688. return false;
  689. }
  690. protected bool ParseMoveArm(string args, out Hand arm)
  691. {
  692. arm = Hand.Blade2;
  693. switch (args)
  694. {
  695. case "ARM1":
  696. arm = Hand.Blade2;
  697. break;
  698. case "ARM2":
  699. arm = Hand.Blade1;
  700. break;
  701. case "ARM3":
  702. arm = Hand.Both;
  703. break;
  704. default:
  705. return false;
  706. }
  707. if (RobotIsSingleArm)
  708. {
  709. if (arm != Hand.Blade1)
  710. return false;
  711. }
  712. return true;
  713. }
  714. protected bool CheckWaferSize(string waferSize, ModuleName target, int slot)
  715. {
  716. if (!Enum.TryParse<WaferSize>(waferSize, out WaferSize ws))
  717. {
  718. EV.PostWarningLog("EFEM", $"{waferSize} is not a valid size type");
  719. return false;
  720. }
  721. if (ModuleHelper.IsLoadPort(target))
  722. {
  723. LoadPortBaseDevice lp = DEVICE.GetDevice<LoadPortBaseDevice>(target.ToString());
  724. if (lp.GetCurrentWaferSize() != ws) //lp.CassetteState == LoadportCassetteState.Normal &&
  725. {
  726. EV.PostWarningLog("EFEM", $"{lp.GetCurrentWaferSize()} is not match target {ws}");
  727. return false;
  728. }
  729. }
  730. else
  731. {
  732. if (WaferManager.Instance.CheckHasWafer(target, slot))
  733. {
  734. if (WaferManager.Instance.GetWaferSize(target, slot) != ws)
  735. {
  736. EV.PostWarningLog("EFEM", $"{WaferManager.Instance.GetWaferSize(target, slot)} is not match target {ws}");
  737. return false;
  738. }
  739. }
  740. }
  741. return true;
  742. }
  743. protected bool CheckIsPort(string device)
  744. {
  745. return device==DeviceName.LP1 || device == DeviceName.LP2 || device == DeviceName.LP3 || device == DeviceName.LP4;
  746. }
  747. protected bool CheckIsTower(string device)
  748. {
  749. return device == DeviceName.SignalTower;
  750. }
  751. protected IServerModule GetEntity(string name)
  752. {
  753. IServerModule result = Singleton<EntityFactory>.Instance.GetEntity(name);
  754. if (result.Name == DeviceName.Aligner && !AlignerInstalled)
  755. return null;
  756. return result;
  757. }
  758. }
  759. }