EFEMViewModel.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771
  1. using System;
  2. using System.Collections.Generic;
  3. using Aitex.Core.Common.DeviceData;
  4. using Aitex.Core.Util;
  5. using Aitex.Sorter.Common;
  6. using Bolt.Toolkit.Wpf.Data;
  7. using Bolt.Toolkit.Wpf.Data.Enum;
  8. using Caliburn.Micro.Core;
  9. using MECF.Framework.Common.DataCenter;
  10. using MECF.Framework.Common.Equipment;
  11. using MECF.Framework.Common.OperationCenter;
  12. using VirgoCommon;
  13. using VirgoUI.Client.Models.Sys;
  14. namespace VirgoUI.Client.Models.Platform.EFEM
  15. {
  16. public class EFEMViewModel : UiViewModelBase
  17. {
  18. #region Properties
  19. [Subscription("LP1.Status")]
  20. public string LP1Status { get; set; }
  21. public string LP1StatusBackground
  22. {
  23. get { return GetUnitStatusBackground(LP1Status); }
  24. }
  25. [Subscription("LP1.IsMapped")]
  26. public bool IsLP1Mapped { get; set; }
  27. [Subscription("LP2.Status")]
  28. public string LP2Status { get; set; }
  29. public string LP2StatusBackground
  30. {
  31. get { return GetUnitStatusBackground(LP2Status); }
  32. }
  33. [Subscription("LP2.IsMapped")]
  34. public bool IsLP2Mapped { get; set; }
  35. [Subscription("EFEM.FsmState")]
  36. public string EfemStatus { get; set; }
  37. public string EfemStatusBackground
  38. {
  39. get { return GetUnitStatusBackground(EfemStatus); }
  40. }
  41. [Subscription("PMA.IsAutoMode")]
  42. public bool PMAIsAutoMode { get; set; }
  43. [Subscription("PMB.IsAutoMode")]
  44. public bool PMBIsAutoMode { get; set; }
  45. [Subscription("PMA.IsOnline")]
  46. public bool PMAIsOnline { get; set; }
  47. [Subscription("PMB.IsOnline")]
  48. public bool PMBIsOnline { get; set; }
  49. public string PMAState
  50. {
  51. get
  52. {
  53. return "PMA/" + (PMAIsAutoMode ? "Auto/" : "Manual/") + (PMAIsOnline ? "Online" : "Offline");
  54. }
  55. }
  56. public string PMBState
  57. {
  58. get
  59. {
  60. return "PMB/" + (PMBIsAutoMode ? "Auto/" : "Manual/") + (PMBIsOnline ? "Online" : "Offline");
  61. }
  62. }
  63. private string _SelectedModule;
  64. public string SelectedModule
  65. {
  66. get
  67. {
  68. return _SelectedModule;
  69. }
  70. set
  71. {
  72. _SelectedModule = value;
  73. Slots = GetSlotsByModule(_SelectedModule);
  74. SelectedSlot = 1;
  75. NotifyOfPropertyChange("SelectedModule");
  76. }
  77. }
  78. private string _PickSelectedModule;
  79. public string PickSelectedModule
  80. {
  81. get
  82. {
  83. return _PickSelectedModule;
  84. }
  85. set
  86. {
  87. _PickSelectedModule = value;
  88. PickSlots = GetSlotsByModule(_PickSelectedModule);
  89. PickSelectedSlot = 1;
  90. NotifyOfPropertyChange("PickSelectedModule");
  91. }
  92. }
  93. private string _PlaceSelectedModule;
  94. public string PlaceSelectedModule
  95. {
  96. get
  97. {
  98. return _PlaceSelectedModule;
  99. }
  100. set
  101. {
  102. _PlaceSelectedModule = value;
  103. PlaceSlots = GetSlotsByModule(_PlaceSelectedModule);
  104. PlaceSelectedSlot = 1;
  105. NotifyOfPropertyChange("PlaceSelectedModule");
  106. }
  107. }
  108. private string _ExtendSelectedModule;
  109. public string ExtendSelectedModule
  110. {
  111. get
  112. {
  113. return _ExtendSelectedModule;
  114. }
  115. set
  116. {
  117. _ExtendSelectedModule = value;
  118. ExtendSlots = GetExtendPos();
  119. NotifyOfPropertyChange("ExtendSelectedModule");
  120. }
  121. }
  122. private List<string> GetExtendPos()
  123. {
  124. //return new List<string> { "G1", "GB", "G4", "P1", "PB", "P4" };
  125. return new List<string> { "GoIntoGet", "GoBackGet", "GoIntoPut", "GoBackPut" };
  126. }
  127. private static Dictionary<string, string> ExtendParam = new Dictionary<string, string>()
  128. {
  129. {"GoIntoGet","GB" },
  130. {"GoBackGet","G4" },
  131. {"GoIntoPut","PB" },
  132. {"GoBackPut","P4" }
  133. };
  134. private string _RetractSelectedModule;
  135. public string RetractSelectedModule
  136. {
  137. get
  138. {
  139. return _RetractSelectedModule;
  140. }
  141. set
  142. {
  143. _RetractSelectedModule = value;
  144. RetractSlots = GetExtendPos();
  145. NotifyOfPropertyChange("RetractSelectedModule");
  146. }
  147. }
  148. private string _MapSelectedModule;
  149. public string MapSelectedModule
  150. {
  151. get
  152. {
  153. return _MapSelectedModule;
  154. }
  155. set
  156. {
  157. _MapSelectedModule = value;
  158. //MapSlots = GetSlotsByModule(_MapSelectedModule);
  159. MapSelectedSlot = 1;
  160. NotifyOfPropertyChange("MapSelectedModule");
  161. }
  162. }
  163. [Subscription("EfemRobot.RobotMoveAction")]
  164. public string EfemRobotMoveAction
  165. {
  166. get;
  167. set;
  168. }
  169. //[Subscription("EFEM.CassetteDoor")]
  170. //public AITSensorData CassetteDoorStatus
  171. //{
  172. // get;
  173. // set;
  174. //}
  175. [Subscription("EFEM.CassetteDoor")]
  176. public LidState CassetteDoorStatus
  177. {
  178. get;
  179. set;
  180. }
  181. public bool IsLP1PresentFeedback
  182. {
  183. get { return LP1CassetteState == LoadportCassetteState.Normal; }
  184. }
  185. public bool IsLP2PresentFeedback
  186. {
  187. get { return LP2CassetteState == LoadportCassetteState.Normal; }
  188. }
  189. [Subscription("LP1.CassetteState")]
  190. public LoadportCassetteState LP1CassetteState { get; set; }
  191. [Subscription("LP2.CassetteState")]
  192. public LoadportCassetteState LP2CassetteState { get; set; }
  193. public bool Foup1Present
  194. {
  195. get { return LP1CassetteState == LoadportCassetteState.Normal; }
  196. }
  197. public bool Foup2Present
  198. {
  199. get { return LP2CassetteState == LoadportCassetteState.Normal; }
  200. }
  201. public RobotMoveInfo EfemRobotMoveInfo
  202. {
  203. get
  204. {
  205. RobotMoveInfo _moveInfo = new RobotMoveInfo() { BladeTarget = "System" };
  206. if (!string.IsNullOrEmpty(EfemRobotMoveAction))
  207. {
  208. var action = EfemRobotMoveAction.Split('.');
  209. _moveInfo.BladeTarget = action[0];
  210. _moveInfo.Action = (RobotAction)Enum.Parse(typeof(RobotAction), action[1]);
  211. }
  212. return _moveInfo;
  213. }
  214. }
  215. private int _SelectedSlot;
  216. public int SelectedSlot
  217. {
  218. get { return _SelectedSlot; }
  219. set { _SelectedSlot = value; NotifyOfPropertyChange("SelectedSlot"); }
  220. }
  221. private int _PickSelectedSlot;
  222. public int PickSelectedSlot
  223. {
  224. get { return _PickSelectedSlot; }
  225. set { _PickSelectedSlot = value; NotifyOfPropertyChange("PickSelectedSlot"); }
  226. }
  227. private int _PlaceSelectedSlot;
  228. public int PlaceSelectedSlot
  229. {
  230. get { return _PlaceSelectedSlot; }
  231. set { _PlaceSelectedSlot = value; NotifyOfPropertyChange("PlaceSelectedSlot"); }
  232. }
  233. private string _ExtendSelectedSlot;
  234. public string ExtendSelectedSlot
  235. {
  236. get { return _ExtendSelectedSlot; }
  237. set { _ExtendSelectedSlot = value; NotifyOfPropertyChange("ExtendSelectedSlot"); }
  238. }
  239. private int _RetractSelectedSlot;
  240. public int RetractSelectedSlot
  241. {
  242. get { return _RetractSelectedSlot; }
  243. set { _RetractSelectedSlot = value; NotifyOfPropertyChange("RetractSelectedSlot"); }
  244. }
  245. private int _MapSelectedSlot;
  246. public int MapSelectedSlot
  247. {
  248. get { return _MapSelectedSlot; }
  249. set { _MapSelectedSlot = value; NotifyOfPropertyChange("MapSelectedSlot"); }
  250. }
  251. private List<string> _pickModules;
  252. public List<string> PickPlaceModules
  253. {
  254. get { return _pickModules; }
  255. set { _pickModules = value; NotifyOfPropertyChange("PickPlaceModules"); }
  256. }
  257. private List<string> _mapModules;
  258. public List<string> MapModules
  259. {
  260. get { return _mapModules; }
  261. set { _mapModules = value; NotifyOfPropertyChange("MapModules"); }
  262. }
  263. private List<string> _extendModules;
  264. public List<string> ExtendRetractModules
  265. {
  266. get { return _extendModules; }
  267. set { _extendModules = value; NotifyOfPropertyChange("ExtendRetractModules"); }
  268. }
  269. private List<int> _slots;
  270. public List<int> Slots
  271. {
  272. get { return _slots; }
  273. set { _slots = value; NotifyOfPropertyChange("Slots"); }
  274. }
  275. private List<int> _Pickslots;
  276. public List<int> PickSlots
  277. {
  278. get { return _Pickslots; }
  279. set { _Pickslots = value; NotifyOfPropertyChange("PickSlots"); }
  280. }
  281. private List<int> _Placeslots;
  282. public List<int> PlaceSlots
  283. {
  284. get { return _Placeslots; }
  285. set { _Placeslots = value; NotifyOfPropertyChange("PlaceSlots"); }
  286. }
  287. private List<string> _Extendslots;
  288. public List<string> ExtendSlots
  289. {
  290. get { return _Extendslots; }
  291. set { _Extendslots = value; NotifyOfPropertyChange("ExtendSlots"); }
  292. }
  293. private List<string> _Retractslots;
  294. public List<string> RetractSlots
  295. {
  296. get { return _Retractslots; }
  297. set { _Retractslots = value; NotifyOfPropertyChange("RetractSlots"); }
  298. }
  299. [Subscription("LP1.WaferSize")]
  300. public string LP1WaferSize { get; set; }
  301. public string WaferSizeLP1
  302. {
  303. get { return LP1CassetteState == LoadportCassetteState.Normal ? GetWaferSize(LP1WaferSize) : "--"; }
  304. }
  305. [Subscription("LP2.WaferSize")]
  306. public string LP2WaferSize { get; set; }
  307. public string WaferSizeLP2
  308. {
  309. get { return LP2CassetteState == LoadportCassetteState.Normal ? GetWaferSize(LP2WaferSize) : "--"; }
  310. }
  311. [Subscription("Aligner1.WaferSize")]
  312. public string Aligner1WaferSize { get; set; }
  313. public string WaferSizeAligner1
  314. {
  315. get { return GetWaferSize(Aligner1WaferSize); }
  316. }
  317. [Subscription("Aligner2.WaferSize")]
  318. public string Aligner2WaferSize { get; set; }
  319. public string WaferSizeAligner2
  320. {
  321. get { return GetWaferSize(Aligner2WaferSize); }
  322. }
  323. [Subscription("Cooling1.WaferSize")]
  324. public string Cooling1WaferSize { get; set; }
  325. public string WaferSizeCooling1
  326. {
  327. get { return GetWaferSize(Cooling1WaferSize); }
  328. }
  329. [Subscription("Cooling2.WaferSize")]
  330. public string Cooling2WaferSize { get; set; }
  331. public string WaferSizeCooling2
  332. {
  333. get { return GetWaferSize(Cooling2WaferSize); }
  334. }
  335. [Subscription("EfemRobot.WaferSize")]
  336. public string EfemRobotWaferSize { get; set; }
  337. public string WaferSizeEfemRobot
  338. {
  339. get { return GetWaferSize(EfemRobotWaferSize); }
  340. }
  341. [Subscription("PMA.WaferSize")]
  342. public string PMAWaferSize { get; set; }
  343. public string WaferSizePMA
  344. {
  345. get { return GetWaferSize(PMAWaferSize); }
  346. }
  347. [Subscription("PMB.WaferSize")]
  348. public string PMBWaferSize { get; set; }
  349. public string WaferSizePMB
  350. {
  351. get { return GetWaferSize(PMBWaferSize); }
  352. }
  353. [Subscription("EFEM.SmallWafer")]
  354. public int SmallWafer { get; set; }
  355. [Subscription("EFEM.MidWafer")]
  356. public int MidWafer { get; set; }
  357. [Subscription("EFEM.BigWafer")]
  358. public int BigWafer { get; set; }
  359. #region
  360. public bool WaferSizePMA_3
  361. {
  362. set { }
  363. get { return PMAWaferSize == "WS3"; }
  364. }
  365. public bool WaferSizePMA_4
  366. {
  367. set { }
  368. get { return PMAWaferSize == "WS4"; }
  369. }
  370. public bool WaferSizePMA_6
  371. {
  372. set { }
  373. get { return PMAWaferSize == "WS6"; }
  374. }
  375. public bool WaferSizePMB_3
  376. {
  377. set { }
  378. get { return PMBWaferSize == "WS3"; }
  379. }
  380. public bool WaferSizePMB_4
  381. {
  382. set { }
  383. get { return PMBWaferSize == "WS4"; }
  384. }
  385. public bool WaferSizePMB_6
  386. {
  387. set { }
  388. get { return PMBWaferSize == "WS6"; }
  389. }
  390. public bool WaferSizeCooling2_3
  391. {
  392. set { }
  393. get { return Cooling2WaferSize == "WS3"; }
  394. }
  395. public bool WaferSizeCooling2_4
  396. {
  397. set { }
  398. get { return Cooling2WaferSize == "WS4"; }
  399. }
  400. public bool WaferSizeCooling2_6
  401. {
  402. set { }
  403. get { return Cooling2WaferSize == "WS6"; }
  404. }
  405. public bool WaferSizeCooling1_3
  406. {
  407. set { }
  408. get { return Cooling1WaferSize == "WS3"; }
  409. }
  410. public bool WaferSizeCooling1_4
  411. {
  412. set { }
  413. get { return Cooling1WaferSize == "WS4"; }
  414. }
  415. public bool WaferSizeCooling1_6
  416. {
  417. set { }
  418. get { return Cooling1WaferSize == "WS6"; }
  419. }
  420. public bool WaferSizeAligner2_3
  421. {
  422. set { }
  423. get { return Aligner2WaferSize == "WS3"; }
  424. }
  425. public bool WaferSizeAligner2_4
  426. {
  427. set { }
  428. get { return Aligner2WaferSize == "WS4"; }
  429. }
  430. public bool WaferSizeAligner2_6
  431. {
  432. set { }
  433. get { return Aligner2WaferSize == "WS6"; }
  434. }
  435. public bool WaferSizeAligner1_3
  436. {
  437. set { }
  438. get { return Aligner1WaferSize == "WS3"; }
  439. }
  440. public bool WaferSizeAligner1_4
  441. {
  442. set { }
  443. get { return Aligner1WaferSize == "WS4"; }
  444. }
  445. public bool WaferSizeAligner1_6
  446. {
  447. set { }
  448. get { return Aligner1WaferSize == "WS6"; }
  449. }
  450. public bool WaferSizeEfemRobot_3
  451. {
  452. set { }
  453. get { return EfemRobotWaferSize == "WS3"; }
  454. }
  455. public bool WaferSizeEfemRobot_4
  456. {
  457. set { }
  458. get { return EfemRobotWaferSize == "WS4"; }
  459. }
  460. public bool WaferSizeEfemRobot_6
  461. {
  462. set { }
  463. get { return EfemRobotWaferSize == "WS6"; }
  464. }
  465. #endregion
  466. public bool PMASlitValveIsOpen
  467. {
  468. get { return SlitDoorDataA != null && SlitDoorDataA.OpenFeedback && !SlitDoorDataA.CloseFeedback; }
  469. }
  470. [Subscription("PMA.SlitDoor.DeviceData")]
  471. public AITCylinderData SlitDoorDataA
  472. {
  473. get;
  474. set;
  475. }
  476. public bool PMBSlitValveIsOpen
  477. {
  478. get { return SlitDoorDataB != null && SlitDoorDataB.OpenFeedback && !SlitDoorDataB.CloseFeedback; }
  479. }
  480. [Subscription("PMB.SlitDoor.DeviceData")]
  481. public AITCylinderData SlitDoorDataB
  482. {
  483. get;
  484. set;
  485. }
  486. public Dictionary<string, string> _waferSizeMap = new Dictionary<string, string>()
  487. {
  488. {"WS3", "3'"},{"WS4", "4'"},{"WS6", "6'"}
  489. };
  490. private string GetWaferSize(string size)
  491. {
  492. if (size != null && _waferSizeMap.ContainsKey(size))
  493. switch (size)
  494. {
  495. case "WS3": return SmallWafer.ToString();
  496. case "WS4": return MidWafer.ToString();
  497. case "WS6": return BigWafer.ToString();
  498. default: return "";
  499. }
  500. //return _waferSizeMap[size];
  501. return "";
  502. }
  503. public Aitex.Core.Common.WaferSize SmallPinWaferSize { get; set; }
  504. public Aitex.Core.Common.WaferSize MediumPinWaferSize { get; set; }
  505. public Aitex.Core.Common.WaferSize BigPinWaferSize { get; set; }
  506. #endregion Properties
  507. public EFEMViewModel()
  508. {
  509. this.DisplayName = "EFEM";
  510. _pickModules = new List<string>() { "LP1", "LP2", "Aligner1", "Aligner2", "Cooling1", "Cooling2" };
  511. _mapModules = new List<string>() { "LP1", "LP2" };
  512. _extendModules = new List<string>() { "PMA", "PMB" };
  513. PickSelectedModule = "LP1";
  514. PlaceSelectedModule = "LP1";
  515. ExtendSelectedModule = "PMA";
  516. RetractSelectedModule = "PMA";
  517. MapSelectedModule = "LP1";
  518. }
  519. protected override void OnActivate()
  520. {
  521. SmallPinWaferSize = MapWaferSize((int)QueryDataClient.Instance.Service.GetConfig($"System.SmallWafer"));
  522. MediumPinWaferSize = MapWaferSize((int)QueryDataClient.Instance.Service.GetConfig($"System.MidWafer"));
  523. BigPinWaferSize = MapWaferSize((int)QueryDataClient.Instance.Service.GetConfig($"System.BigWafer"));
  524. NotifyOfPropertyChange(nameof(SmallPinWaferSize));
  525. NotifyOfPropertyChange(nameof(MediumPinWaferSize));
  526. NotifyOfPropertyChange(nameof(BigPinWaferSize));
  527. base.OnActivate();
  528. }
  529. private Aitex.Core.Common.WaferSize MapWaferSize(int value)
  530. {
  531. switch (value)
  532. {
  533. case 3: return Aitex.Core.Common.WaferSize.WS3;
  534. case 4: return Aitex.Core.Common.WaferSize.WS4;
  535. case 6: return Aitex.Core.Common.WaferSize.WS6;
  536. case 8: return Aitex.Core.Common.WaferSize.WS8;
  537. }
  538. return Aitex.Core.Common.WaferSize.WS0;
  539. }
  540. private List<int> GetSlotsByModule(string module)
  541. {
  542. List<int> slots = new List<int>();
  543. int num = 0;
  544. switch (module)
  545. {
  546. case "LP1":
  547. case "LP2":
  548. num = 25;
  549. break;
  550. case "Aligner1":
  551. case "Aligner2":
  552. case "Cooling1":
  553. case "Cooling2":
  554. case "PMA":
  555. case "PMB":
  556. num = 1;
  557. break;
  558. }
  559. int j = 0;
  560. while (j < num)
  561. {
  562. slots.Add(j + 1);
  563. j++;
  564. }
  565. return slots;
  566. }
  567. protected override void OnInitialize()
  568. {
  569. base.OnInitialize();
  570. base.InitModules();
  571. }
  572. #region Operation
  573. public void SetWaferSize(string module, string size)
  574. {
  575. InvokeClient.Instance.Service.DoOperation("System.SetWaferSize", module, size);
  576. }
  577. public void HomeAligner(string module)
  578. {
  579. InvokeClient.Instance.Service.DoOperation($"{module}.{EfemOperation.Home}");
  580. }
  581. public void AlignAligner(string module)
  582. {
  583. string size = Aligner1WaferSize;
  584. if (module == ModuleName.Aligner2.ToString())
  585. size = Aligner2WaferSize;
  586. if (module == ModuleName.Cooling1.ToString())
  587. size = Cooling1WaferSize;
  588. if (module == ModuleName.Cooling2.ToString())
  589. size = Cooling2WaferSize;
  590. InvokeClient.Instance.Service.DoOperation($"{module}.{EfemOperation.Align}", size);
  591. }
  592. public void LiftAligner(string module)
  593. {
  594. InvokeClient.Instance.Service.DoOperation($"{module}.{EfemOperation.Lift}");
  595. }
  596. public void HomeEfem()
  597. {
  598. InvokeClient.Instance.Service.DoOperation($"{ModuleName.EFEM}.{EfemOperation.Home}");
  599. }
  600. public void ResetEfem()
  601. {
  602. InvokeClient.Instance.Service.DoOperation($"{ModuleName.EFEM}.Reset");
  603. }
  604. public void ClearError()
  605. {
  606. InvokeClient.Instance.Service.DoOperation($"{ModuleName.EFEM}.{EfemOperation.ClearError}");
  607. }
  608. public void HomeRobot()
  609. {
  610. InvokeClient.Instance.Service.DoOperation($"{ModuleName.EfemRobot}.{EfemOperation.Home}");
  611. }
  612. public void AbortRobot()
  613. {
  614. InvokeClient.Instance.Service.DoOperation($"{ModuleName.EfemRobot}.{EfemOperation.Abort}");
  615. }
  616. public void RobotPick()
  617. {
  618. string ws = PickSelectedModule == ModuleName.LP1.ToString() ? LP1WaferSize :
  619. PickSelectedModule == ModuleName.LP2.ToString() ? LP2WaferSize :
  620. PickSelectedModule == ModuleName.Aligner1.ToString() ? Aligner1WaferSize :
  621. PickSelectedModule == ModuleName.Aligner2.ToString() ? Aligner2WaferSize :
  622. PickSelectedModule == ModuleName.Cooling2.ToString() ? Cooling2WaferSize :
  623. PickSelectedModule == ModuleName.Cooling1.ToString() ? Cooling1WaferSize : throw new ArgumentOutOfRangeException();
  624. InvokeClient.Instance.Service.DoOperation($"{ModuleName.EfemRobot}.{EfemOperation.Pick}",
  625. PickSelectedModule, PickSelectedSlot - 1, ws);
  626. }
  627. public void RobotPlace()
  628. {
  629. string ws = PlaceSelectedModule == ModuleName.LP1.ToString() ? LP1WaferSize :
  630. PlaceSelectedModule == ModuleName.LP2.ToString() ? LP2WaferSize :
  631. PlaceSelectedModule == ModuleName.Aligner1.ToString() ? Aligner1WaferSize :
  632. PlaceSelectedModule == ModuleName.Aligner2.ToString() ? Aligner2WaferSize :
  633. PlaceSelectedModule == ModuleName.Cooling1.ToString() ? Cooling1WaferSize :
  634. PlaceSelectedModule == ModuleName.Cooling2.ToString() ? Cooling2WaferSize : throw new ArgumentOutOfRangeException();
  635. InvokeClient.Instance.Service.DoOperation($"{ModuleName.EfemRobot}.{EfemOperation.Place}",
  636. PlaceSelectedModule, PlaceSelectedSlot - 1, ws);
  637. }
  638. public void RobotExtend()
  639. {
  640. InvokeClient.Instance.Service.DoOperation($"{ModuleName.EfemRobot}.{EfemOperation.Extend}", ExtendSelectedModule, ExtendParam[ExtendSelectedSlot]);
  641. }
  642. public void RobotRetract()
  643. {
  644. InvokeClient.Instance.Service.DoOperation($"{ModuleName.EfemRobot}.{EfemOperation.Retract}", RetractSelectedModule, RetractSlots[RetractSelectedSlot]);
  645. }
  646. public void RobotMap()
  647. {
  648. InvokeClient.Instance.Service.DoOperation($"{MapSelectedModule}.{EfemOperation.Map}");
  649. }
  650. #endregion Operation
  651. }
  652. }