Check.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824
  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 false;
  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. return unit;
  548. }
  549. protected bool ParseMoveTarget(string args, out ModuleName target, out int slot)
  550. {
  551. target = ModuleName.System;
  552. slot = 1;
  553. if (args.StartsWith("ALIGN"))
  554. {
  555. if (this.AlignerInstalled)
  556. {
  557. target = ModuleName.Aligner;
  558. slot = 1;
  559. }
  560. else if (this.CoolingBufferInstalled)
  561. {
  562. if (args.EndsWith("ALIGN1")|| args.EndsWith("ALIGN"))
  563. {
  564. target = ModuleName.CoolingBuffer1;
  565. slot = 1;
  566. }
  567. else if (args.EndsWith("ALIGN2"))
  568. {
  569. target = ModuleName.CoolingBuffer2;
  570. slot = 1;
  571. }
  572. else if (args.EndsWith("ALIGN3"))
  573. {
  574. target = ModuleName.Aligner1;
  575. slot = 1;
  576. }
  577. else if (args.EndsWith("ALIGN4"))
  578. {
  579. target = ModuleName.Aligner2;
  580. slot = 1;
  581. }
  582. }
  583. return true;
  584. }
  585. else if (args.StartsWith("P1") && LoadPortQuantity > 0)
  586. {
  587. target = ModuleName.LP1;
  588. if (int.TryParse(args.Replace("P1", ""), out slot))
  589. {
  590. return true;
  591. }
  592. }
  593. else if (args.StartsWith("P2") && LoadPortQuantity > 1)
  594. {
  595. target = ModuleName.LP2;
  596. if (int.TryParse(args.Replace("P2", ""), out slot))
  597. {
  598. return true;
  599. }
  600. }
  601. else if (args.StartsWith("P3") && LoadPortQuantity > 2)
  602. {
  603. target = ModuleName.LP3;
  604. if (int.TryParse(args.Replace("P3", ""), out slot))
  605. {
  606. return true;
  607. }
  608. }
  609. else if (args.StartsWith("P4") && LoadPortQuantity > 3)
  610. {
  611. target = ModuleName.LP4;
  612. if (int.TryParse(args.Replace("P4", ""), out slot))
  613. {
  614. return true;
  615. }
  616. }
  617. else if ((args.StartsWith("LLLA") || args.StartsWith("LLA")))
  618. {
  619. if(BufferQuantity == 0 && LoadLockQuantity > 0)
  620. target = ModuleName.LL1;
  621. if(LoadLockQuantity==0 && BufferQuantity>0)
  622. target = ModuleName.Buffer1;
  623. string temp = args.Replace("LLLA", "").Replace("LLA","");
  624. if (string.IsNullOrEmpty(temp))
  625. {
  626. slot = 1;
  627. return true;
  628. }
  629. else
  630. {
  631. if (int.TryParse(temp, out slot))
  632. return true;
  633. }
  634. }
  635. else if ((args.StartsWith("LLLB") || args.StartsWith("LLB")) )
  636. {
  637. if (BufferQuantity==0 && LoadLockQuantity > 1)
  638. target = ModuleName.LL2;
  639. if (LoadLockQuantity == 0 && BufferQuantity > 1)
  640. target = ModuleName.Buffer2;
  641. // target = ModuleName.LL2;
  642. string temp = args.Replace("LLLB", "").Replace("LLB", "");
  643. if (string.IsNullOrEmpty(temp))
  644. {
  645. slot = 1;
  646. return true;
  647. }
  648. else
  649. {
  650. if (int.TryParse(temp, out slot))
  651. return true;
  652. }
  653. }
  654. else if (args.StartsWith("BF1") && BufferQuantity > 0)
  655. {
  656. target = ModuleName.Buffer1;
  657. if (int.TryParse(args.Replace("BF1", ""), out slot))
  658. {
  659. return true;
  660. }
  661. }
  662. else if (args.StartsWith("BF2") && BufferQuantity > 1)
  663. {
  664. target = ModuleName.Buffer2;
  665. if (int.TryParse(args.Replace("BF2", ""), out slot))
  666. {
  667. return true;
  668. }
  669. }
  670. else if (args.StartsWith("BUFFER"))
  671. {
  672. target = ModuleName.Buffer;
  673. if (int.TryParse(args.Replace("BUFFER", ""), out slot))
  674. {
  675. return true;
  676. }
  677. }
  678. return false;
  679. }
  680. protected bool ParseMoveArm(string args, out Hand arm)
  681. {
  682. arm = Hand.Blade2;
  683. switch (args)
  684. {
  685. case "ARM1":
  686. arm = Hand.Blade2;
  687. break;
  688. case "ARM2":
  689. arm = Hand.Blade1;
  690. break;
  691. case "ARM3":
  692. arm = Hand.Both;
  693. break;
  694. default:
  695. return false;
  696. }
  697. if (RobotIsSingleArm)
  698. {
  699. if (arm != Hand.Blade1)
  700. return false;
  701. }
  702. return true;
  703. }
  704. protected bool CheckWaferSize(string waferSize, ModuleName target, int slot)
  705. {
  706. if (!Enum.TryParse<WaferSize>(waferSize, out WaferSize ws))
  707. {
  708. EV.PostWarningLog("EFEM", $"{waferSize} is not a valid size type");
  709. return false;
  710. }
  711. if (ModuleHelper.IsLoadPort(target))
  712. {
  713. LoadPortBaseDevice lp = DEVICE.GetDevice<LoadPortBaseDevice>(target.ToString());
  714. if (lp.GetCurrentWaferSize() != ws) //lp.CassetteState == LoadportCassetteState.Normal &&
  715. {
  716. EV.PostWarningLog("EFEM", $"{lp.GetCurrentWaferSize()} is not match target {ws}");
  717. return false;
  718. }
  719. }
  720. else
  721. {
  722. if (WaferManager.Instance.CheckHasWafer(target, slot))
  723. {
  724. if (WaferManager.Instance.GetWaferSize(target, slot) != ws)
  725. {
  726. EV.PostWarningLog("EFEM", $"{WaferManager.Instance.GetWaferSize(target, slot)} is not match target {ws}");
  727. return false;
  728. }
  729. }
  730. }
  731. return true;
  732. }
  733. protected bool CheckIsPort(string device)
  734. {
  735. return device==DeviceName.LP1 || device == DeviceName.LP2 || device == DeviceName.LP3 || device == DeviceName.LP4;
  736. }
  737. protected bool CheckIsTower(string device)
  738. {
  739. return device == DeviceName.SignalTower;
  740. }
  741. protected IServerModule GetEntity(string name)
  742. {
  743. IServerModule result = Singleton<EntityFactory>.Instance.GetEntity(name);
  744. if (result.Name == DeviceName.Aligner && !AlignerInstalled)
  745. return null;
  746. return result;
  747. }
  748. }
  749. }