EfemViewModel.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
  1. using Aitex.Sorter.Common;
  2. using ExcelLibrary.BinaryFileFormat;
  3. using MECF.Framework.Common.CommonData;
  4. using MECF.Framework.Common.DataCenter;
  5. using MECF.Framework.Common.Equipment;
  6. using MECF.Framework.Common.OperationCenter;
  7. using MECF.Framework.Common.Schedulers;
  8. using OpenSEMI.ClientBase;
  9. using Prism.Commands;
  10. using Prism.Mvvm;
  11. using System;
  12. using System.Collections.Generic;
  13. using System.Collections.ObjectModel;
  14. using System.Linq;
  15. using System.Windows.Threading;
  16. using Venus_Core;
  17. using Venus_MainPages.Unity;
  18. namespace Venus_MainPages.ViewModels
  19. {
  20. public enum EFEMModule
  21. {
  22. LLA, LLB,LP1,LP2,LP3,Aligner1
  23. }
  24. public enum EFEMBlade
  25. {
  26. Blade1, Blade2
  27. }
  28. internal class EfemViewModel:BindableBase
  29. {
  30. #region 私有字段
  31. private bool m_LLAIsInstalled;
  32. private bool m_LLBIsInstalled;
  33. private ModuleInfo m_LLAModuleInfo;
  34. private ModuleInfo m_LLBModuleInfo;
  35. private ModuleInfo m_LP1ModuleInfo;
  36. private ModuleInfo m_LP2ModuleInfo;
  37. private ModuleInfo m_LP3ModuleInfo;
  38. private List<EFEMModule> m_EFEMModules = new List<EFEMModule>();
  39. private EFEMBlade m_PickSelectedBlade;
  40. private EFEMBlade m_PlaceSelectedBlade;
  41. private EFEMBlade m_ExtendSelectedBlade;
  42. private EFEMBlade m_RetractSelectedBlade;
  43. private ObservableCollection<int> m_PlaceSoltItemsSource = new ObservableCollection<int>();
  44. private ObservableCollection<int> m_PickSoltItemsSource = new ObservableCollection<int>();
  45. private ObservableCollection<int> m_ExtendSoltItemsSource = new ObservableCollection<int>();
  46. private ObservableCollection<int> m_RetractSoltItemsSource = new ObservableCollection<int>();
  47. private int m_PickSoltSelectedIndex;
  48. private int m_PlaceSoltSelectedIndex;
  49. private int m_ExtendSoltSelectedIndex;
  50. private int m_RetractSoltSelectedIndex;
  51. private EFEMModule m_PickSelectedModule;
  52. private EFEMModule m_PlaceSelectedModule;
  53. private EFEMModule m_ExtendSelectedModule;
  54. private EFEMModule m_RetractSelectedModule;
  55. private WaferInfo m_BladeAWafer;
  56. private WaferInfo m_BladeBWafer;
  57. private WaferInfo m_LLAWafer;
  58. private WaferInfo m_LLBWafer;
  59. private WaferInfo m_Aligner1Wafer;
  60. #endregion
  61. #region 属性
  62. public bool LLAIsInstalled
  63. {
  64. get { return m_LLAIsInstalled; }
  65. set { SetProperty(ref m_LLAIsInstalled, value); }
  66. }
  67. public bool LLBIsInstalled
  68. {
  69. get { return m_LLBIsInstalled; }
  70. set { SetProperty(ref m_LLBIsInstalled, value); }
  71. }
  72. public ModuleInfo LLAModuleInfo
  73. {
  74. get { return m_LLAModuleInfo; }
  75. set { SetProperty(ref m_LLAModuleInfo, value); }
  76. }
  77. public ModuleInfo LLBModuleInfo
  78. {
  79. get { return m_LLBModuleInfo; }
  80. set { SetProperty(ref m_LLBModuleInfo, value); }
  81. }
  82. public ModuleInfo LP1ModuleInfo
  83. {
  84. get { return m_LP1ModuleInfo; }
  85. set { SetProperty(ref m_LP1ModuleInfo, value); }
  86. }
  87. public ModuleInfo LP2ModuleInfo
  88. {
  89. get { return m_LP2ModuleInfo; }
  90. set { SetProperty(ref m_LP2ModuleInfo, value); }
  91. }
  92. public ModuleInfo LP3ModuleInfo
  93. {
  94. get { return m_LP3ModuleInfo; }
  95. set { SetProperty(ref m_LP3ModuleInfo, value); }
  96. }
  97. public List<EFEMModule> EFEMModules
  98. {
  99. get { return m_EFEMModules; }
  100. set { SetProperty(ref m_EFEMModules, value); }
  101. }
  102. public EFEMBlade PickSelectedBlade
  103. {
  104. get { return m_PickSelectedBlade; }
  105. set { SetProperty(ref m_PickSelectedBlade, value); }
  106. }
  107. public EFEMBlade PlaceSelectedBlade
  108. {
  109. get { return m_PlaceSelectedBlade; }
  110. set { SetProperty(ref m_PlaceSelectedBlade, value); }
  111. }
  112. public EFEMBlade ExtendSelectedBlade
  113. {
  114. get { return m_ExtendSelectedBlade; }
  115. set { SetProperty(ref m_ExtendSelectedBlade, value); }
  116. }
  117. public EFEMBlade RetractSelectedBlade
  118. {
  119. get { return m_RetractSelectedBlade; }
  120. set { SetProperty(ref m_RetractSelectedBlade, value); }
  121. }
  122. public ObservableCollection<int> PickSoltItemsSource
  123. {
  124. get { return m_PickSoltItemsSource; }
  125. set { SetProperty(ref m_PickSoltItemsSource, value); }
  126. }
  127. public ObservableCollection<int> PlaceSoltItemsSource
  128. {
  129. get { return m_PlaceSoltItemsSource; }
  130. set { SetProperty(ref m_PlaceSoltItemsSource, value); }
  131. }
  132. public ObservableCollection<int> ExtendSoltItemsSource
  133. {
  134. get { return m_ExtendSoltItemsSource; }
  135. set { SetProperty(ref m_ExtendSoltItemsSource, value); }
  136. }
  137. public ObservableCollection<int> RetractSoltItemsSource
  138. {
  139. get { return m_RetractSoltItemsSource; }
  140. set { SetProperty(ref m_RetractSoltItemsSource, value); }
  141. }
  142. public int PickSoltSelectedIndex
  143. {
  144. get { return m_PickSoltSelectedIndex; }
  145. set { SetProperty(ref m_PickSoltSelectedIndex, value); }
  146. }
  147. public int PlaceSoltSelectedIndex
  148. {
  149. get { return m_PlaceSoltSelectedIndex; }
  150. set { SetProperty(ref m_PlaceSoltSelectedIndex, value); }
  151. }
  152. public int ExtendSoltSelectedIndex
  153. {
  154. get { return m_ExtendSoltSelectedIndex; }
  155. set { SetProperty(ref m_ExtendSoltSelectedIndex, value); }
  156. }
  157. public int RetractSoltSelectedIndex
  158. {
  159. get { return m_RetractSoltSelectedIndex; }
  160. set { SetProperty(ref m_RetractSoltSelectedIndex, value); }
  161. }
  162. public EFEMModule PickSelectedModule
  163. {
  164. get { return m_PickSelectedModule; }
  165. set { SetProperty(ref m_PickSelectedModule, value); }
  166. }
  167. public EFEMModule PlaceSelectedModule
  168. {
  169. get { return m_PlaceSelectedModule; }
  170. set { SetProperty(ref m_PlaceSelectedModule, value); }
  171. }
  172. public EFEMModule ExtendSelectedModule
  173. {
  174. get { return m_ExtendSelectedModule; }
  175. set { SetProperty(ref m_ExtendSelectedModule, value); }
  176. }
  177. public EFEMModule RetractSelectedModule
  178. {
  179. get { return m_RetractSelectedModule; }
  180. set { SetProperty(ref m_RetractSelectedModule, value); }
  181. }
  182. public WaferInfo BladeAWafer
  183. {
  184. get { return m_BladeAWafer; }
  185. set { SetProperty(ref m_BladeAWafer, value); }
  186. }
  187. public WaferInfo BladeBWafer
  188. {
  189. get { return m_BladeBWafer; }
  190. set { SetProperty(ref m_BladeBWafer, value); }
  191. }
  192. public WaferInfo Aligner1Wafer
  193. {
  194. get { return m_Aligner1Wafer; }
  195. set { SetProperty(ref m_Aligner1Wafer, value); }
  196. }
  197. public WaferInfo LLAWafer
  198. {
  199. get { return m_LLAWafer; }
  200. set { SetProperty(ref m_LLAWafer, value); }
  201. }
  202. public WaferInfo LLBWafer
  203. {
  204. get { return m_LLBWafer; }
  205. set { SetProperty(ref m_LLBWafer, value); }
  206. }
  207. #endregion
  208. #region 命令
  209. private DelegateCommand _ExtendCommand;
  210. public DelegateCommand ExtendCommand =>
  211. _ExtendCommand ?? (_ExtendCommand = new DelegateCommand(OnExtend));
  212. private DelegateCommand _RetractCommand;
  213. public DelegateCommand RetractCommand =>
  214. _RetractCommand ?? (_RetractCommand = new DelegateCommand(OnRetract));
  215. private DelegateCommand<object> _ModuleChangeCommand;
  216. public DelegateCommand<object> ModuleChangeCommand =>
  217. _ModuleChangeCommand ?? (_ModuleChangeCommand = new DelegateCommand<object>(OnModuleChange));
  218. private DelegateCommand _PickCommand;
  219. public DelegateCommand PickCommand =>
  220. _PickCommand ?? (_PickCommand = new DelegateCommand(OnPick));
  221. private DelegateCommand _PlaceCommand;
  222. public DelegateCommand PlaceCommand =>
  223. _PlaceCommand ?? (_PlaceCommand = new DelegateCommand(OnPlace));
  224. private DelegateCommand _HomeAllCommand;
  225. public DelegateCommand HomeAllCommand =>
  226. _HomeAllCommand ?? (_HomeAllCommand = new DelegateCommand(OnHomeAll));
  227. private DelegateCommand _ClearErrorCommand;
  228. public DelegateCommand ClearErrorCommand =>
  229. _ClearErrorCommand ?? (_ClearErrorCommand = new DelegateCommand(OnClearError));
  230. private DelegateCommand _AbortCommand;
  231. public DelegateCommand AbortCommand =>
  232. _AbortCommand ?? (_AbortCommand = new DelegateCommand(OnAbort));
  233. private DelegateCommand _Align1HomeCommand;
  234. public DelegateCommand Align1HomeCommand =>
  235. _Align1HomeCommand ?? (_Align1HomeCommand = new DelegateCommand(OnAlign1Home));
  236. private DelegateCommand _Align1UpCommand;
  237. public DelegateCommand Align1UpCommand =>
  238. _Align1UpCommand ?? (_Align1UpCommand = new DelegateCommand(OnAlign1Up));
  239. private DelegateCommand _Align1DownCommand;
  240. public DelegateCommand Align1DownCommand =>
  241. _Align1DownCommand ?? (_Align1DownCommand = new DelegateCommand(OnAlign1Down));
  242. private DelegateCommand _Align1AlignCommand;
  243. public DelegateCommand Align1AlignCommand =>
  244. _Align1AlignCommand ?? (_Align1AlignCommand = new DelegateCommand(OnAlign1Align));
  245. private DelegateCommand _RobotHomeCommand;
  246. public DelegateCommand RobotHomeCommand =>
  247. _RobotHomeCommand ?? (_RobotHomeCommand = new DelegateCommand(OnRobotHome));
  248. #endregion
  249. #region 构造函数
  250. public EfemViewModel()
  251. {
  252. string[] allModules = QueryDataClient.Instance.Service.GetConfig($"System.InstalledModules").ToString().Split(',');
  253. LLAIsInstalled = allModules.Contains("LLA");
  254. LLBIsInstalled = allModules.Contains("LLB");
  255. DispatcherTimer timer = new DispatcherTimer();
  256. timer.Interval = TimeSpan.FromSeconds(0.1);
  257. timer.Tick += Timer_Tick;
  258. timer.Start();
  259. EFEMModules.Add(EFEMModule.LLA);
  260. EFEMModules.Add(EFEMModule.LLB);
  261. EFEMModules.Add(EFEMModule.LP1);
  262. EFEMModules.Add(EFEMModule.LP2);
  263. EFEMModules.Add(EFEMModule.Aligner1);
  264. OnModuleChange("Pick");
  265. OnModuleChange("Place");
  266. //OnModuleChange("Extend");
  267. //OnModuleChange("Retract");
  268. }
  269. #endregion
  270. #region 命令方法
  271. private void OnModuleChange(object obj)
  272. {
  273. var value = obj.ToString();
  274. switch (value)
  275. {
  276. case "Pick":
  277. PickSoltItemsSource.Clear();
  278. switch (PickSelectedModule)
  279. {
  280. case EFEMModule.LLA:
  281. case EFEMModule.LLB:
  282. PickSoltItemsSource.Add(1);
  283. PickSoltItemsSource.Add(2);
  284. break;
  285. case EFEMModule.LP1:
  286. case EFEMModule.LP2:
  287. case EFEMModule.LP3:
  288. for (int i = 1; i < 26; i++)
  289. {
  290. PickSoltItemsSource.Add(i);
  291. }
  292. break;
  293. default:
  294. PickSoltItemsSource.Add(1);
  295. break;
  296. }
  297. PickSoltSelectedIndex = 0;
  298. break;
  299. case "Place":
  300. PlaceSoltItemsSource.Clear();
  301. switch (PlaceSelectedModule)
  302. {
  303. case EFEMModule.LLA:
  304. case EFEMModule.LLB:
  305. PlaceSoltItemsSource.Add(1);
  306. PlaceSoltItemsSource.Add(2);
  307. break;
  308. case EFEMModule.LP1:
  309. case EFEMModule.LP2:
  310. case EFEMModule.LP3:
  311. for (int i = 1; i < 26; i++)
  312. {
  313. PlaceSoltItemsSource.Add(i);
  314. }
  315. break;
  316. default:
  317. PlaceSoltItemsSource.Add(1);
  318. break;
  319. }
  320. PlaceSoltSelectedIndex = 0;
  321. break;
  322. //case "Extend":
  323. // ExtendSoltItemsSource.Clear();
  324. // switch (ExtendSelectedModule)
  325. // {
  326. // case EFEMModule.LLA:
  327. // case EFEMModule.LLB:
  328. // ExtendSoltItemsSource.Add(1);
  329. // ExtendSoltItemsSource.Add(2);
  330. // break;
  331. // case EFEMModule.LP1:
  332. // case EFEMModule.LP2:
  333. // case EFEMModule.LP3:
  334. // for (int i = 1; i < 26; i++)
  335. // {
  336. // ExtendSoltItemsSource.Add(i);
  337. // }
  338. // break;
  339. // default:
  340. // ExtendSoltItemsSource.Add(1);
  341. // break;
  342. // }
  343. // ExtendSoltSelectedIndex = 0;
  344. // break;
  345. //case "Retract":
  346. // RetractSoltItemsSource.Clear();
  347. // switch (RetractSelectedModule)
  348. // {
  349. // case EFEMModule.LLA:
  350. // case EFEMModule.LLB:
  351. // RetractSoltItemsSource.Add(1);
  352. // RetractSoltItemsSource.Add(2);
  353. // break;
  354. // case EFEMModule.LP1:
  355. // case EFEMModule.LP2:
  356. // case EFEMModule.LP3:
  357. // for (int i = 1; i < 26; i++)
  358. // {
  359. // RetractSoltItemsSource.Add(i);
  360. // }
  361. // break;
  362. // default:
  363. // RetractSoltItemsSource.Add(1);
  364. // break;
  365. // }
  366. // RetractSoltSelectedIndex = 0;
  367. // break;
  368. }
  369. }
  370. private void OnExtend()
  371. {
  372. var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), PlaceSelectedModule.ToString(), true);
  373. var selectedHand = (Hand)Enum.Parse(typeof(Hand), PlaceSelectedBlade.ToString(), true);
  374. InvokeClient.Instance.Service.DoOperation($"EFEM.{RtOperation.Extend}", moduleName, 0, selectedHand);
  375. }
  376. private void OnRetract()
  377. {
  378. var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), PlaceSelectedModule.ToString(), true);
  379. var selectedHand = (Hand)Enum.Parse(typeof(Hand), PlaceSelectedBlade.ToString(), true);
  380. InvokeClient.Instance.Service.DoOperation($"EFEM.{RtOperation.Retract}", moduleName, 0, selectedHand);
  381. }
  382. private void OnPick()
  383. {
  384. Queue<MoveItem> moveItems = new Queue<MoveItem>();
  385. var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), PickSelectedModule.ToString(), true);
  386. var selectedHand = (Hand)Enum.Parse(typeof(Hand), PickSelectedBlade.ToString(), true);
  387. MoveItem moveItem = new MoveItem(moduleName, PickSoltItemsSource[PickSoltSelectedIndex]-1, ModuleName.EfemRobot, 0, selectedHand);
  388. moveItems.Enqueue(moveItem);
  389. if (PickSelectedModule == EFEMModule.LLA || PickSelectedModule == EFEMModule.LLB)
  390. {
  391. InvokeClient.Instance.Service.DoOperation($"{ModuleName.EfemRobot}.{EfemOperation.Swap}", moveItems);
  392. }
  393. else
  394. {
  395. InvokeClient.Instance.Service.DoOperation($"{ModuleName.EfemRobot}.{EfemOperation.Pick}", moveItems);
  396. }
  397. //if ((int)PickSelectedModule > 3)
  398. //{
  399. // InvokeClient.Instance.Service.DoOperation($"EFEM.{RtOperation.LLPick}", moveItems);
  400. //}
  401. //else
  402. //{
  403. // InvokeClient.Instance.Service.DoOperation($"EFEM.{RtOperation.PMPick}", moveItems);
  404. //}
  405. }
  406. private void OnPlace()
  407. {
  408. Queue<MoveItem> moveItems = new Queue<MoveItem>();
  409. var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), PlaceSelectedModule.ToString(), true);
  410. var selectedHand = (Hand)Enum.Parse(typeof(Hand), PlaceSelectedBlade.ToString(), true);
  411. MoveItem moveItem = new MoveItem(ModuleName.EfemRobot, 0, moduleName, PlaceSoltItemsSource[PlaceSoltSelectedIndex]-1, selectedHand);
  412. moveItems.Enqueue(moveItem);
  413. //if ((int)PlaceSelectedModule > 3)
  414. //{
  415. // InvokeClient.Instance.Service.DoOperation($"TM.{RtOperation.LLPlace}", moveItems);
  416. //}
  417. //else
  418. //{
  419. // InvokeClient.Instance.Service.DoOperation($"TM.{RtOperation.PMPlace}", moveItems);
  420. //}
  421. if (PlaceSelectedModule == EFEMModule.LLA || PlaceSelectedModule == EFEMModule.LLB)
  422. {
  423. InvokeClient.Instance.Service.DoOperation($"{ModuleName.EfemRobot}.{EfemOperation.Swap}", moveItems);
  424. }
  425. else
  426. {
  427. InvokeClient.Instance.Service.DoOperation($"{ModuleName.EfemRobot}.{EfemOperation.Place}", moveItems);
  428. }
  429. }
  430. private void OnHomeAll()
  431. {
  432. InvokeClient.Instance.Service.DoOperation($"EFEM.{EfemOperation.Home}");
  433. }
  434. private void OnClearError()
  435. {
  436. InvokeClient.Instance.Service.DoOperation($"EFEM.{EfemOperation.ClearError}");
  437. }
  438. private void OnAbort()
  439. {
  440. InvokeClient.Instance.Service.DoOperation($"{ModuleName.EfemRobot}.{EfemOperation.Abort}");
  441. }
  442. private void OnAlign1Home()
  443. {
  444. InvokeClient.Instance.Service.DoOperation($"{ModuleName.Aligner1}.{EfemOperation.Home}");
  445. }
  446. private void OnAlign1Up()
  447. {
  448. InvokeClient.Instance.Service.DoOperation($"{ModuleName.Aligner1}.{EfemOperation.Lift}", true);
  449. }
  450. private void OnAlign1Down()
  451. {
  452. InvokeClient.Instance.Service.DoOperation($"{ModuleName.Aligner1}.{EfemOperation.Lift}", false);
  453. }
  454. private void OnAlign1Align()
  455. {
  456. InvokeClient.Instance.Service.DoOperation($"{ModuleName.Aligner1}.{EfemOperation.Align}");
  457. }
  458. private void OnRobotHome()
  459. {
  460. InvokeClient.Instance.Service.DoOperation($"{ModuleName.EfemRobot}.{EfemOperation.Home}");
  461. }
  462. #endregion
  463. #region 私有方法
  464. private void Timer_Tick(object sender, EventArgs e)
  465. {
  466. if (LLAIsInstalled == true)
  467. {
  468. LLAWafer = ModuleManager.ModuleInfos["LLA"].WaferManager.Wafers.FirstOrDefault(x => x.WaferStatus != 0);
  469. LLAModuleInfo = ModuleManager.ModuleInfos["LLA"];
  470. }
  471. if (LLBIsInstalled == true)
  472. {
  473. LLBWafer = ModuleManager.ModuleInfos["LLB"].WaferManager.Wafers.FirstOrDefault(x => x.WaferStatus != 0);
  474. LLBModuleInfo = ModuleManager.ModuleInfos["LLB"];
  475. }
  476. LP1ModuleInfo = ModuleManager.ModuleInfos["LP1"];
  477. LP2ModuleInfo = ModuleManager.ModuleInfos["LP2"];
  478. LP3ModuleInfo = ModuleManager.ModuleInfos["LP3"];
  479. BladeAWafer = ModuleManager.ModuleInfos["EfemRobot"].WaferManager.Wafers[0];
  480. BladeBWafer = ModuleManager.ModuleInfos["EfemRobot"].WaferManager.Wafers[1];
  481. Aligner1Wafer= ModuleManager.ModuleInfos["Aligner1"].WaferManager.Wafers[0];
  482. }
  483. #endregion
  484. }
  485. }