VenusSeOperationOverViewModel.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604
  1. using MECF.Framework.Common.CommonData;
  2. using MECF.Framework.Common.DataCenter;
  3. using MECF.Framework.Common.Equipment;
  4. using MECF.Framework.Common.OperationCenter;
  5. using OpenSEMI.ClientBase;
  6. using Prism.Commands;
  7. using Prism.Mvvm;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. using Venus_Core;
  14. using Venus_Themes.CustomControls;
  15. using System.Windows.Threading;
  16. using Venus_MainPages.Unity;
  17. using Microsoft.VisualBasic;
  18. using ExcelLibrary.BinaryFileFormat;
  19. using MECF.Framework.Common.Schedulers;
  20. using Venus_MainPages.Views;
  21. using System.Windows;
  22. namespace Venus_MainPages.ViewModels
  23. {
  24. public class VenusSeOperationOverViewModel : BindableBase
  25. {
  26. #region 私有字段
  27. private ModuleInfo m_VCE1ModuleInfo;
  28. private ModuleInfo m_PMAModuleInfo;
  29. private ModuleInfo m_PMBModuleInfo;
  30. private ModuleInfo m_PMCModuleInfo;
  31. private ModuleInfo m_VPAModuleInfo;
  32. private ModuleInfo m_TMModuleInfo;
  33. public WaferInfo m_PMAWafer;
  34. public WaferInfo m_PMBWafer;
  35. public WaferInfo m_PMCWafer;
  36. public WaferInfo m_RobotUpperWafer;
  37. public WaferInfo m_RobotLowerWafer;
  38. public WaferInfo m_PAWafer;
  39. private int m_VCE1WaferCount;
  40. private bool m_PMAIsInstalled;
  41. private bool m_PMBIsInstalled;
  42. private bool m_PMCIsInstalled;
  43. private bool m_VCEIsInstalled;
  44. private bool m_VCEDoorIsOpen;
  45. private bool m_PMADoorIsOpen;
  46. private bool m_PMBDoorIsOpen;
  47. private bool m_PMCDoorIsOpen;
  48. private bool m_VCEOutDoorIsOpen;
  49. private Dictionary<string, object> m_RtDataValues = new Dictionary<string, object>();
  50. private List<string> m_RtDataKeys = new List<string>();
  51. private int m_PickNum;
  52. private WaferAssociationInfo m_VCEwaferAssociation;
  53. private bool loadflag;
  54. #endregion
  55. #region 属性
  56. public int PickNum
  57. {
  58. get { return m_PickNum; }
  59. set { SetProperty(ref m_PickNum, value); }
  60. }
  61. public WaferInfo PMAWafer
  62. {
  63. get { return m_PMAWafer; }
  64. set { SetProperty(ref m_PMAWafer, value); }
  65. }
  66. public WaferInfo PMBWafer
  67. {
  68. get { return m_PMBWafer; }
  69. set { SetProperty(ref m_PMBWafer, value); }
  70. }
  71. public WaferInfo PMCWafer
  72. {
  73. get { return m_PMCWafer; }
  74. set { SetProperty(ref m_PMCWafer, value); }
  75. }
  76. public WaferInfo RobotUpperWafer
  77. {
  78. get { return m_RobotUpperWafer; }
  79. set { SetProperty(ref m_RobotUpperWafer, value); }
  80. }
  81. public WaferInfo RobotLowerWafer
  82. {
  83. get { return m_RobotLowerWafer; }
  84. set { SetProperty(ref m_RobotLowerWafer, value); }
  85. }
  86. public WaferInfo PAWafer
  87. {
  88. get { return m_PAWafer; }
  89. set { SetProperty(ref m_PAWafer, value); }
  90. }
  91. public ModuleInfo VCE1ModuleInfo
  92. {
  93. get { return m_VCE1ModuleInfo; }
  94. set
  95. {
  96. SetProperty(ref m_VCE1ModuleInfo, value);
  97. }
  98. }
  99. public ModuleInfo PMAModuleInfo
  100. {
  101. get { return m_PMAModuleInfo; }
  102. set
  103. {
  104. SetProperty(ref m_PMAModuleInfo, value);
  105. }
  106. }
  107. public ModuleInfo PMBModuleInfo
  108. {
  109. get { return m_PMBModuleInfo; }
  110. set
  111. {
  112. SetProperty(ref m_PMBModuleInfo, value);
  113. }
  114. }
  115. public ModuleInfo PMCModuleInfo
  116. {
  117. get { return m_PMCModuleInfo; }
  118. set
  119. {
  120. SetProperty(ref m_PMCModuleInfo, value);
  121. }
  122. }
  123. public ModuleInfo VPAModuleInfo
  124. {
  125. get { return m_VPAModuleInfo; }
  126. set
  127. {
  128. SetProperty(ref m_VPAModuleInfo, value);
  129. }
  130. }
  131. public ModuleInfo TMModuleInfo
  132. {
  133. get { return m_TMModuleInfo; }
  134. set
  135. {
  136. SetProperty(ref m_TMModuleInfo, value);
  137. }
  138. }
  139. public bool PMAIsInstalled
  140. {
  141. get { return m_PMAIsInstalled; }
  142. set
  143. {
  144. SetProperty(ref m_PMAIsInstalled, value);
  145. }
  146. }
  147. public bool PMBIsInstalled
  148. {
  149. get { return m_PMBIsInstalled; }
  150. set
  151. {
  152. SetProperty(ref m_PMBIsInstalled, value);
  153. }
  154. }
  155. public bool PMCIsInstalled
  156. {
  157. get { return m_PMCIsInstalled; }
  158. set
  159. {
  160. SetProperty(ref m_PMCIsInstalled, value);
  161. }
  162. }
  163. public bool VCEIsInstalled
  164. {
  165. get { return m_VCEIsInstalled; }
  166. set
  167. {
  168. SetProperty(ref m_VCEIsInstalled, value);
  169. }
  170. }
  171. public bool VCEDoorIsOpen { get => m_VCEDoorIsOpen; set => SetProperty(ref m_VCEDoorIsOpen, value); }
  172. public bool PMADoorIsOpen { get => m_PMADoorIsOpen; set => SetProperty(ref m_PMADoorIsOpen, value); }
  173. public bool PMBDoorIsOpen { get => m_PMBDoorIsOpen; set => SetProperty(ref m_PMBDoorIsOpen, value); }
  174. public bool PMCDoorIsOpen { get => m_PMCDoorIsOpen; set => SetProperty(ref m_PMCDoorIsOpen, value); }
  175. public bool VCEOutDoorIsOpen { get => m_VCEOutDoorIsOpen; set => SetProperty(ref m_VCEOutDoorIsOpen, value); }
  176. public int VCE1WaferCount
  177. {
  178. get { return m_VCE1WaferCount; }
  179. set
  180. {
  181. SetProperty(ref m_VCE1WaferCount, value);
  182. }
  183. }
  184. public Dictionary<string, object> RtDataValues
  185. {
  186. get { return m_RtDataValues; }
  187. set { SetProperty(ref m_RtDataValues, value); }
  188. }
  189. public WaferAssociationInfo VCEwaferAssociation
  190. {
  191. get { return m_VCEwaferAssociation; }
  192. set { SetProperty(ref m_VCEwaferAssociation, value); }
  193. }
  194. #endregion
  195. #region 命令
  196. private DelegateCommand _HomeAll;
  197. public DelegateCommand HomeAll => _HomeAll ?? (_HomeAll = new DelegateCommand(onHomeAll));
  198. private DelegateCommand _SetAutoMode;
  199. public DelegateCommand SetAutoMode => _SetAutoMode ?? (_SetAutoMode = new DelegateCommand(onSetAutoMode));
  200. private DelegateCommand _SetManualMode;
  201. public DelegateCommand SetManualMode => _SetManualMode ?? (_SetManualMode = new DelegateCommand(onSetManualMode));
  202. private DelegateCommand _StartSETMCycle;
  203. public DelegateCommand StartSETMCycle => _StartSETMCycle ?? (_StartSETMCycle = new DelegateCommand(onStartSETMCycle));
  204. private DelegateCommand<object> _StartCommand;
  205. public DelegateCommand<object> StartCommand =>
  206. _StartCommand ?? (_StartCommand = new DelegateCommand<object>(OnStart));
  207. private DelegateCommand _StopCycle;
  208. public DelegateCommand StopCycle => _StopCycle ?? (_StopCycle = new DelegateCommand(onStopCycle));
  209. private DelegateCommand _VCEHome;
  210. public DelegateCommand VCEHome => _VCEHome ?? (_VCEHome = new DelegateCommand(vceHome));
  211. private DelegateCommand _VCEReadMap;
  212. public DelegateCommand VCEReadMap => _VCEReadMap ?? (_VCEReadMap = new DelegateCommand(vceReadMap));
  213. private DelegateCommand _VCELoadPrepare;
  214. public DelegateCommand VCELoadPrepare =>
  215. _VCELoadPrepare ?? (_VCELoadPrepare = new DelegateCommand(vceLoadPrepare));
  216. private DelegateCommand __VCELoad;
  217. public DelegateCommand VCELoad =>
  218. __VCELoad ?? (__VCELoad = new DelegateCommand(vceLoad));
  219. private DelegateCommand _VCEUnLoad;
  220. public DelegateCommand VCEUnLoad =>
  221. _VCEUnLoad ?? (_VCEUnLoad = new DelegateCommand(vceUnLoad));
  222. private DelegateCommand _SMIFLoad;
  223. public DelegateCommand SMIFLoad =>
  224. _SMIFLoad ?? (_SMIFLoad = new DelegateCommand(smifLoad));
  225. private DelegateCommand _SMIFULoad;
  226. public DelegateCommand SMIFULoad =>
  227. _SMIFULoad ?? (_SMIFULoad = new DelegateCommand(smifUnLoad));
  228. private DelegateCommand _tmhome;
  229. public DelegateCommand TmHome =>
  230. _tmhome ?? (_tmhome = new DelegateCommand(tmhome));
  231. private DelegateCommand _tmPick;
  232. public DelegateCommand TmPick =>
  233. _tmPick ?? (_tmPick = new DelegateCommand(tmpick));
  234. private DelegateCommand _tmPlace;
  235. public DelegateCommand TMPlace =>
  236. _tmPlace ?? (_tmPlace = new DelegateCommand(tmplace));
  237. private DelegateCommand _tmSave;
  238. private DelegateCommand _LoadCommand;
  239. public DelegateCommand LoadCommand =>
  240. _LoadCommand ?? (_LoadCommand = new DelegateCommand(OnLoad));
  241. private DelegateCommand _PauseAllJobCommand;
  242. public DelegateCommand PauseAllJobCommand =>
  243. _PauseAllJobCommand ?? (_PauseAllJobCommand = new DelegateCommand(OnPauseAllJob));
  244. private DelegateCommand _AbortAllCommand;
  245. public DelegateCommand AbortAllCommand =>
  246. _AbortAllCommand ?? (_AbortAllCommand = new DelegateCommand(OnAbortAll));
  247. private DelegateCommand<object> _SetSequenceCommand;
  248. public DelegateCommand<object> SetSequenceCommand =>
  249. _SetSequenceCommand ?? (_SetSequenceCommand = new DelegateCommand<object>(OnSetSequence));
  250. private DelegateCommand<object> _CreateJobCommand;
  251. public DelegateCommand<object> CreateJobCommand =>
  252. _CreateJobCommand ?? (_CreateJobCommand = new DelegateCommand<object>(OnCreateJob));
  253. private DelegateCommand<object> _SelectAllCommand;
  254. public DelegateCommand<object> SelectAllCommand =>
  255. _SelectAllCommand ?? (_SelectAllCommand = new DelegateCommand<object>(OnSelectAll));
  256. private DelegateCommand<object> _ReturnAllWafer;
  257. public DelegateCommand<object> ReturnAllWafer =>
  258. _ReturnAllWafer ?? (_ReturnAllWafer = new DelegateCommand<object>(OnReturnAllWafer));
  259. #endregion
  260. #region 构造函数
  261. public VenusSeOperationOverViewModel()
  262. {
  263. //页面不刷错的方法 页面中的PM做成List的形式 通过itemsource显示 同时提供各个位置的pm点位 旋转角度
  264. VCE1WaferCount = 25;
  265. addDataKeys();
  266. string[] allModules = QueryDataClient.Instance.Service.GetConfig($"System.InstalledModules").ToString().Split(',');
  267. PMAIsInstalled = allModules.Contains("PMA");
  268. PMBIsInstalled = allModules.Contains("PMB");
  269. PMCIsInstalled = allModules.Contains("PMC");
  270. VCEIsInstalled = allModules.Contains("VCE1");
  271. RtDataValues = QueryDataClient.Instance.Service.PollData(m_RtDataKeys);
  272. VCEDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.VCESlitDoorClosed");
  273. PMADoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.PMASlitDoorClosed");
  274. PMBDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.PMBSlitDoorClosed");
  275. PMCDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.PMCSlitDoorClosed");
  276. VCEOutDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "VCE1.VCEOutDoorClosed");
  277. loadflag = false;
  278. DispatcherTimer timer = new DispatcherTimer();
  279. timer.Interval = TimeSpan.FromSeconds(0.1);
  280. timer.Tick += Timer_Tick;
  281. timer.Start();
  282. }
  283. #endregion
  284. #region 命令实现
  285. private void OnLoad()
  286. {
  287. if (VCEIsInstalled && !loadflag)
  288. {
  289. VCEwaferAssociation = new WaferAssociationInfo
  290. {
  291. ModuleData = ModuleManager.ModuleInfos["VCE1"]
  292. };
  293. loadflag = true;
  294. }
  295. }
  296. private void OnSelectAll(object obj)
  297. {
  298. var info = obj as WaferAssociationInfo;
  299. info.SlotFrom = 1;
  300. info.SlotTo = 25;
  301. AssociateSequence(info, true);
  302. }
  303. private void OnReturnAllWafer(object obj)
  304. {
  305. WaferDialogView dialog = new WaferDialogView()
  306. {
  307. Owner = Application.Current.MainWindow,
  308. };
  309. dialog.Height = 300;
  310. dialog.Width = 400;
  311. double angel = 0;
  312. double coolingtime = 0;
  313. string message = "Please Confirm Return Wafer";
  314. WaferDialogViewModel vm = new WaferDialogViewModel();
  315. vm.ConfirmText = message;
  316. dialog.DataContext = vm;
  317. if (dialog.ShowDialog() == true)
  318. {
  319. if ((bool)dialog.AlignFlag == true && !string.IsNullOrEmpty(dialog.Angle))
  320. {
  321. angel = Convert.ToDouble(dialog.Angle);
  322. }
  323. if ((bool)dialog.CoolingFlag == true && !string.IsNullOrEmpty(dialog.CoolingTime))
  324. {
  325. coolingtime = Convert.ToDouble(dialog.CoolingTime);
  326. }
  327. InvokeClient.Instance.Service.DoOperation("System.ReturnAllSEWafer", dialog.CoolingFlag, coolingtime, dialog.AlignFlag, angel);
  328. }
  329. }
  330. private void OnCreateJob(object obj)
  331. {
  332. var info = obj as WaferAssociationInfo;
  333. List<string> slotSequence = new List<string>();
  334. info.ModuleData.WaferManager.Wafers.ForEach(key => { slotSequence.Insert(0, key.SequenceName); });
  335. string jobId = info.LotId.Trim();
  336. if (string.IsNullOrEmpty(jobId))
  337. jobId = "CJ_Local_" + info.ModuleData.ModuleID;
  338. info.LotId = jobId;
  339. info.JobID = jobId;
  340. info.JobStatus = "WaitingForStart";
  341. info.LotIdSaved = true;
  342. Dictionary<string, object> param = new Dictionary<string, object>()
  343. {
  344. {"JobId", jobId},
  345. {"Module", info.ModuleData.ModuleID},
  346. {"SlotSequence", slotSequence.ToArray()},
  347. {"AutoStart", true},
  348. };
  349. InvokeClient.Instance.Service.DoOperation("System.CreateSEJob", param);
  350. }
  351. private void OnSetSequence(object obj)
  352. {
  353. var info = obj as WaferInfo;
  354. bool flag = info.SequenceName != "" ? false : true;
  355. if (info.ModuleID == "VCE1")
  356. {
  357. AssociateSequence(VCEwaferAssociation, flag, info.SlotID);
  358. }
  359. }
  360. private void OnPauseAllJob()
  361. {
  362. InvokeClient.Instance.Service.DoOperation("System.PauseJob", VCEwaferAssociation.JobID);
  363. }
  364. private void OnAbortAll()
  365. {
  366. InvokeClient.Instance.Service.DoOperation("System.Abort");
  367. }
  368. private void AssociateSequence(WaferAssociationInfo info, bool flag, int slot = -1)
  369. {
  370. List<WaferInfo> wafers = info.ModuleData.WaferManager.Wafers;
  371. if (slot >= 0) //by wafer
  372. {
  373. int index = wafers.Count - slot - 1;
  374. if (index < wafers.Count)
  375. {
  376. //has wafer
  377. if (flag && !(wafers[index].WaferStatus == 0))
  378. wafers[index].SequenceName = info.SequenceName;
  379. else
  380. wafers[index].SequenceName = string.Empty;
  381. }
  382. }
  383. else //by from-to
  384. {
  385. for (int i = info.SlotFrom - 1; i < info.SlotTo; i++)
  386. {
  387. int index = wafers.Count - i - 1;
  388. if (index < wafers.Count)
  389. {
  390. if (flag && !(wafers[index].WaferStatus == 0))
  391. wafers[index].SequenceName = info.SequenceName;
  392. else
  393. wafers[index].SequenceName = string.Empty;
  394. }
  395. }
  396. }
  397. if (VCEIsInstalled)
  398. {
  399. VCEwaferAssociation = info;
  400. }
  401. }
  402. private void addDataKeys()
  403. {
  404. m_RtDataKeys.Add($"SETM.VCESlitDoorClosed");
  405. m_RtDataKeys.Add($"SETM.PMASlitDoorClosed");
  406. m_RtDataKeys.Add($"SETM.PMBSlitDoorClosed");
  407. m_RtDataKeys.Add($"SETM.PMCSlitDoorClosed");
  408. m_RtDataKeys.Add($"VCE1.VCEOutDoorClosed");
  409. m_RtDataKeys.Add($"SEScheduler.CycledWafer");
  410. m_RtDataKeys.Add($"SEScheduler.CycleSetPoint");
  411. m_RtDataKeys.Add($"SEScheduler.CycleCount");
  412. m_RtDataKeys.Add($"SEScheduler.ThroughPut");
  413. }
  414. private void onHomeAll()
  415. {
  416. InvokeClient.Instance.Service.DoOperation("System.HomeAll");
  417. }
  418. private void onSetAutoMode()
  419. {
  420. InvokeClient.Instance.Service.DoOperation("System.SetAutoMode");
  421. }
  422. private void onSetManualMode()
  423. {
  424. InvokeClient.Instance.Service.DoOperation("System.SetManualMode");
  425. }
  426. private void onStopCycle()
  427. {
  428. InvokeClient.Instance.Service.DoOperation("System.StopSECycle");
  429. }
  430. private void onStartSETMCycle()
  431. {
  432. List<string> stations = new List<string>();
  433. stations.Add("VCE1");
  434. stations.Add("VPA");
  435. if (PMAIsInstalled)
  436. {
  437. stations.Add("PMA");
  438. }
  439. if (PMBIsInstalled)
  440. {
  441. stations.Add("PMB");
  442. }
  443. if (PMCIsInstalled)
  444. {
  445. stations.Add("PMC");
  446. }
  447. stations.Add("VCE1");
  448. InvokeClient.Instance.Service.DoOperation("System.SETMCycle", stations.ToArray(), 1);
  449. }
  450. private void OnStart(object obj)
  451. {
  452. var info = obj as WaferAssociationInfo;
  453. InvokeClient.Instance.Service.DoOperation("System.StartSEJob", info.LotId);
  454. }
  455. private void vceHome()
  456. {
  457. InvokeClient.Instance.Service.DoOperation("VCE1.HOME");
  458. }
  459. private void vceReadMap()
  460. {
  461. InvokeClient.Instance.Service.DoOperation("VCE1.ReadMap");
  462. }
  463. private void vceLoadPrepare()
  464. {
  465. InvokeClient.Instance.Service.DoOperation("VCE1.LoadPrepare");
  466. }
  467. private void vceLoad()
  468. {
  469. InvokeClient.Instance.Service.DoOperation("VCE1.SafeLoad");
  470. }
  471. private void vceUnLoad()
  472. {
  473. InvokeClient.Instance.Service.DoOperation("VCE1.SafeUnload");
  474. }
  475. private void smifLoad() { }
  476. private void smifUnLoad() { }
  477. private void tmhome()
  478. {
  479. InvokeClient.Instance.Service.DoOperation("SETM.Home");
  480. }
  481. private void tmpick()
  482. {
  483. ModuleName target = ModuleName.VCE1;
  484. int slot = PickNum;
  485. MoveItem moveItem = new MoveItem(target, slot - 1, ModuleName.TMRobot, 0, 0);
  486. Queue<MoveItem> que = new Queue<MoveItem>();
  487. que.Enqueue(moveItem);
  488. InvokeClient.Instance.Service.DoOperation("SETM.Pick", que);
  489. }
  490. private void tmplace()
  491. {
  492. ModuleName target = ModuleName.VCE1;
  493. int slot = PickNum;
  494. MoveItem moveItem = new MoveItem( ModuleName.TMRobot, 0, target, slot - 1, 0);
  495. Queue<MoveItem> que = new Queue<MoveItem>();
  496. que.Enqueue(moveItem);
  497. InvokeClient.Instance.Service.DoOperation("SETM.Place", que);
  498. }
  499. #endregion
  500. #region 私有方法
  501. private void Timer_Tick(object sender, EventArgs e)
  502. {
  503. try
  504. {
  505. RtDataValues = QueryDataClient.Instance.Service.PollData(m_RtDataKeys);
  506. VCEDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.VCESlitDoorClosed");
  507. PMADoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.PMASlitDoorClosed");
  508. PMBDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.PMBSlitDoorClosed");
  509. PMCDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.PMCSlitDoorClosed");
  510. VCEOutDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "VCE1.VCEOutDoorClosed");
  511. if (PMAIsInstalled == true)
  512. {
  513. PMAModuleInfo = ModuleManager.ModuleInfos["PMA"];
  514. PMAWafer = PMAModuleInfo.WaferManager.Wafers[0];
  515. }
  516. if (PMBIsInstalled == true)
  517. {
  518. PMBModuleInfo = ModuleManager.ModuleInfos["PMB"];
  519. PMBWafer = PMBModuleInfo.WaferManager.Wafers[0];
  520. }
  521. if (PMCIsInstalled == true)
  522. {
  523. PMCModuleInfo = ModuleManager.ModuleInfos["PMC"];
  524. PMCWafer = PMCModuleInfo.WaferManager.Wafers[0];
  525. }
  526. if (VCEIsInstalled == true)
  527. {
  528. VCE1ModuleInfo = ModuleManager.ModuleInfos["VCE1"];
  529. }
  530. TMModuleInfo = ModuleManager.ModuleInfos["TMRobot"];
  531. RobotUpperWafer = TMModuleInfo.WaferManager.Wafers[0];
  532. RobotLowerWafer = TMModuleInfo.WaferManager.Wafers[1];
  533. PAWafer = ModuleManager.ModuleInfos["VPA"].WaferManager.Wafers[0];
  534. }
  535. catch (Exception ex)
  536. {
  537. }
  538. }
  539. #endregion
  540. }
  541. }