OperationViewModel2LPAB.cs 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022
  1. using Aitex.Core.Common;
  2. using Aitex.Core.UI.MVVM;
  3. using Aitex.Core.Util;
  4. using Aitex.Core.Utilities;
  5. using Aitex.Sorter.Common;
  6. using Aitex.Sorter.UI.Controls;
  7. using Aitex.Sorter.UI.Controls.Common;
  8. using EfemUI.Views.CarrierList;
  9. using MECF.Framework.Common.DataCenter;
  10. using MECF.Framework.Common.Equipment;
  11. using MECF.Framework.Common.OperationCenter;
  12. using System;
  13. using System.Collections.Generic;
  14. using System.Collections.ObjectModel;
  15. using System.Linq;
  16. using System.Windows;
  17. using System.Windows.Controls;
  18. using System.Windows.Input;
  19. namespace Aitex.Sorter.UI.ViewModel
  20. {
  21. class OperationViewModel2LPAB : OperationMultiLPViewModel
  22. {
  23. #region CMD
  24. public ICommand StartCycleCommand { get; set; }
  25. public ICommand StopCycleCommand { get; set; }
  26. public ICommand SetWaferSize3 { get; set; }
  27. public ICommand SetWaferSize4 { get; set; }
  28. public ICommand SetWaferSize6 { get; set; }
  29. public ICommand SetWaferSize8 { get; set; }
  30. public ICommand SetWaferThick { get; set; }
  31. public ICommand SetWaferThin { get; set; }
  32. public ICommand SetLPSlot13 { get; set; }
  33. public ICommand SetLPSlot25 { get; set; }
  34. public ICommand SetFFUCommand { get; set; }
  35. public ICommand SetTransCarrierTypeCommand { get; set; }
  36. public ICommand MapCommand { get; set; }
  37. public ICommand LoadCommand { get; set; }
  38. public ICommand UnloadCommand { get; set; }
  39. public ICommand ReadLPIDCommand { get; set; }
  40. public ICommand FlipperHomeCommand { get; set; }
  41. public ICommand FlipperResetCommand { get; set; }
  42. public ICommand FlipperAbortCommand { get; set; }
  43. public ICommand FlipperTurnOverCommand { get; set; }
  44. public ICommand FlipperGripCommand { get; set; }
  45. public ICommand FlipperUnGripCommand { get; set; }
  46. public ICommand FlipperTurnOverJogPCommand { get; set; }
  47. public ICommand FlipperTurnOverJogPStopCommand { get; set; }
  48. public ICommand FlipperTurnOverJogNCommand { get; set; }
  49. public ICommand FlipperTurnOverJogNStopCommand { get; set; }
  50. #endregion
  51. public ObservableCollection<FoupListItem> BufferList { get; set; }
  52. public bool EnablePageControl
  53. {
  54. get { return !IsOnlineMode; }
  55. }
  56. [Subscription("System.Robot.CurrentReadSpeedData")]
  57. public int CurrentReadSpeedData { get; set; }
  58. [Subscription("FFU.FFU1Speed")]
  59. public int FFU1Speed { get; set; }
  60. [Subscription("System.IsOnlineMode")]
  61. public bool IsOnlineMode
  62. {
  63. get;
  64. set;
  65. }
  66. [Subscription("LP1.WaferSizeInfo")]
  67. public string WaferSize1 { get; set; }
  68. [Subscription("LP2.WaferSizeInfo")]
  69. public string WaferSize2 { get; set; }
  70. [Subscription("Aligner1.Aligner1.WaferSizeByWafer")]
  71. public string WaferSizeAligner1 { get; set; }
  72. [Subscription("Aligner2.Aligner2.WaferSizeByWafer")]
  73. public string WaferSizeAligner2 { get; set; }
  74. [Subscription("CoolingBuffer1.CoolingBuffer1.WaferSizeByWafer")]
  75. public string WaferSizeCoolingBuffer1 { get; set; }
  76. [Subscription("CoolingBuffer2.CoolingBuffer2.WaferSizeByWafer")]
  77. public string WaferSizeCoolingBuffer2 { get; set; }
  78. [Subscription("Buffer1.WaferSizeByWafer")]
  79. public string WaferSizeBuffer1 { get; set; }
  80. [Subscription("Buffer2.WaferSizeByWafer")]
  81. public string WaferSizeBuffer2 { get; set; }
  82. [Subscription("LL1.WaferSize")]
  83. public string WaferSizeLL1 { get; set; }
  84. [Subscription("LL2.WaferSize")]
  85. public string WaferSizeLL2 { get; set; }
  86. //[Subscription("Buffer1.WaferSize")]
  87. //public string WaferSizeBuffer1 { get; set; }
  88. //[Subscription("Buffer2.WaferSize")]
  89. //public string WaferSizeBuffer2 { get; set; }
  90. [Subscription("Robot.Blade1WaferSize")]
  91. public string WaferSizeRobot1 { get; set; }
  92. [Subscription("Robot.Blade2WaferSize")]
  93. public string WaferSizeRobot2 { get; set; }
  94. [Subscription("Robot.WaferSize")]
  95. public string WaferSizeRobot { get; set; }
  96. [Subscription("LP1.WaferThickness")]
  97. public string LP1WaferThickness { get; set; }
  98. [Subscription("LP2.WaferThickness")]
  99. public string LP2WaferThickness { get; set; }
  100. [Subscription("Cooling1.WaferThickness")]
  101. public string Cooling1WaferThickness { get; set; }
  102. [Subscription("Cooling2.WaferThickness")]
  103. public string Cooling2WaferThickness { get; set; }
  104. [Subscription("LL1.WaferThickness")]
  105. public string PMAWaferThickness { get; set; }
  106. [Subscription("LL2.WaferThickness")]
  107. public string PMBWaferThickness { get; set; }
  108. [Subscription("Buffer1.WaferThickness")]
  109. public string Buffer1WaferThickness { get; set; }
  110. [Subscription("Buffer2.WaferThickness")]
  111. public string Buffer2WaferThickness { get; set; }
  112. [Subscription("Aligner1.WaferThickness")]
  113. public string Aligner1WaferThickness { get; set; }
  114. [Subscription("Aligner2.WaferThickness")]
  115. public string Aligner2WaferThickness { get; set; }
  116. [Subscription("Upper.WaferThickness")]
  117. public string UpperWaferThickness { get; set; }
  118. [Subscription("Lower.WaferThickness")]
  119. public string LowerWaferThickness { get; set; }
  120. [Subscription("LP1.ValidSlotsNumber")]
  121. public int LP1ValidSlotsNumber { get; set; }
  122. [Subscription("LP2.ValidSlotsNumber")]
  123. public int LP2ValidSlotsNumber { get; set; }
  124. [Subscription("System.IsEnableBufferMap")]
  125. public bool IsBufferMapEnable { get; set; }
  126. [Subscription("System.IsEnableIdentifyThickness")]
  127. public bool IsEnableIdentifyThickness { get; set; }
  128. [Subscription("System.IsEnableMultiWaferSize")]
  129. public bool IsEnableMultiWaferSize { get; set; }
  130. [Subscription("System.IsEnableMultiWaferSizeShow")]
  131. public bool IsEnableMultiWaferSizeShow { get; set; }
  132. [Subscription("System.IsSlotShowOpposite")]
  133. public bool IsSlotShowOpposite { get; set; }
  134. public Visibility SlotShow2 => IsSlotShowOpposite ? Visibility.Hidden : Visibility.Visible;
  135. public Visibility SlotShow1 => !IsSlotShowOpposite ? Visibility.Hidden : Visibility.Visible;
  136. public Visibility EnableIdentifyThickness
  137. {
  138. get
  139. {
  140. if (IsEnableIdentifyThickness)
  141. return Visibility.Visible;
  142. return Visibility.Hidden;
  143. }
  144. }
  145. public Visibility EnableMultiWaferSize
  146. {
  147. get
  148. {
  149. if (IsEnableMultiWaferSize && IsEnableMultiWaferSizeShow)
  150. return Visibility.Visible;
  151. return Visibility.Hidden;
  152. }
  153. }
  154. [Subscription(ParamName.ModuleWaferList, DeviceName.CoolingBuffer1)]
  155. public WaferInfo[] CoolingBuffer1Wafers
  156. {
  157. get;
  158. set;
  159. }
  160. public WaferInfo CoolingBuffer1Wafer
  161. {
  162. get => CoolingBuffer1Wafers != null ? CoolingBuffer1Wafers[0] : null;
  163. }
  164. [Subscription(ParamName.ModuleWaferList, DeviceName.CoolingBuffer2)]
  165. public WaferInfo[] CoolingBuffer2Wafers
  166. {
  167. get;
  168. set;
  169. }
  170. public WaferInfo CoolingBuffer2Wafer
  171. {
  172. get => CoolingBuffer2Wafers != null ? CoolingBuffer2Wafers[0] : null;
  173. }
  174. [Subscription(ParamName.ModuleWaferList, DeviceName.Aligner1)]
  175. public WaferInfo[] Aligner1Wafers
  176. {
  177. get;
  178. set;
  179. }
  180. public WaferInfo Aligner1Wafer
  181. {
  182. get => Aligner1Wafers != null ? Aligner1Wafers[0] : null;
  183. }
  184. [Subscription(ParamName.ModuleWaferList, DeviceName.Aligner2)]
  185. public WaferInfo[] Aligner2Wafers
  186. {
  187. get;
  188. set;
  189. }
  190. public WaferInfo Aligner2Wafer
  191. {
  192. get => Aligner2Wafers != null ? Aligner2Wafers[0] : null;
  193. }
  194. [Subscription(ParamName.ModuleWaferList, DeviceName.Buffer)]
  195. public WaferInfo[] LlbWaferInfo
  196. {
  197. get
  198. {
  199. return BufferList.Count >= 1 ? BufferList[0].WaferInfos : null;
  200. }
  201. set => UpdateBufferWafers(value, 0);
  202. }
  203. [Subscription(ParamName.ModuleWaferList, DeviceName.Buffer1)]
  204. public WaferInfo[] LlbWaferInfo1
  205. {
  206. get
  207. {
  208. return BufferList.Count >= 2 ? BufferList[1].WaferInfos : null;
  209. }
  210. set => UpdateBufferWafers(value, 1);
  211. }
  212. [Subscription(ParamName.ModuleWaferList, DeviceName.Buffer2)]
  213. public WaferInfo[] LlbWaferInfo2
  214. {
  215. get
  216. {
  217. return BufferList.Count >= 3 ? BufferList[2].WaferInfos : null;
  218. }
  219. set => UpdateBufferWafers(value, 2);
  220. }
  221. [Subscription(ParamName.ModuleWaferList, DeviceName.Flipper)]
  222. public WaferInfo[] FlipperWafers
  223. {
  224. get;
  225. set;
  226. }
  227. public WaferInfo FlipperWafer
  228. {
  229. get => FlipperWafers != null ? FlipperWafers[0] : null;
  230. }
  231. [Subscription("ValidSlotsNumber", DeviceName.Buffer)]
  232. public int ValidSlotsNum
  233. {
  234. get
  235. {
  236. return BufferList.Count >= 1 ? BufferList[0].SlotCount : 0;
  237. }
  238. set
  239. {
  240. if (BufferList.Count >= 1) BufferList[0].SlotCount = value;
  241. }
  242. }
  243. [Subscription("ValidSlotsNumber", DeviceName.Buffer1)]
  244. public int ValidSlotsNum1
  245. {
  246. get
  247. {
  248. return BufferList.Count >= 2 ? BufferList[1].SlotCount : 0;
  249. }
  250. set
  251. {
  252. if (BufferList.Count >= 2) BufferList[1].SlotCount = value;
  253. }
  254. }
  255. [Subscription("ValidSlotsNumber", DeviceName.Buffer2)]
  256. public int ValidSlotsNum2
  257. {
  258. get
  259. {
  260. return BufferList.Count >= 3 ? BufferList[2].SlotCount : 0;
  261. }
  262. set
  263. {
  264. if (BufferList.Count >= 3) BufferList[2].SlotCount = value;
  265. }
  266. }
  267. /// <summary>
  268. /// Update Buffer WaferInfos
  269. /// </summary>
  270. /// <param name="sourceWaferInfos"></param>
  271. /// <param name="index"></param>
  272. private void UpdateBufferWafers(WaferInfo[] sourceWaferInfos, int index)
  273. {
  274. WaferInfo[] wafers;
  275. if (IsSlotShowOpposite)
  276. {
  277. wafers = UpdateWaferInfo(sourceWaferInfos.ToArray());
  278. }
  279. else
  280. {
  281. wafers = UpdateWaferInfo(sourceWaferInfos.Reverse().ToArray());
  282. }
  283. if (BufferList.Count < index + 1) return;
  284. if (index == 0)
  285. {
  286. BufferList[index].IsShow = BufferEnable;
  287. }
  288. else if (index == 1)
  289. {
  290. BufferList[index].IsShow = Buffer1Enable;
  291. }
  292. else if (index == 2)
  293. {
  294. BufferList[index].IsShow = Buffer2Enable;
  295. }
  296. if (BufferList[index].WaferInfos == null)
  297. {
  298. BufferList[index].WaferInfos = wafers;
  299. }
  300. else
  301. {
  302. for (int i = 0; i < BufferList[index].WaferInfos.Length; i++)
  303. {
  304. BufferList[index].WaferInfos[i].Update(wafers[i]);
  305. }
  306. }
  307. }
  308. #region Cycle
  309. private string _cycleFrom;
  310. public string CycleFrom
  311. {
  312. get { return _cycleFrom; }
  313. set { _cycleFrom = value; }
  314. }
  315. private string _cycleTo;
  316. public string CycleTo
  317. {
  318. get { return _cycleTo; }
  319. set { _cycleTo = value; }
  320. }
  321. [IgnorePropertyChange]
  322. public bool Ll1IsChecked { get; set; }
  323. [IgnorePropertyChange]
  324. public bool Ll2IsChecked { get; set; }
  325. [IgnorePropertyChange]
  326. public bool Ll3IsChecked { get; set; }
  327. [IgnorePropertyChange]
  328. public bool Ll4IsChecked { get; set; }
  329. [IgnorePropertyChange]
  330. public bool Ll5IsChecked { get; set; }
  331. [IgnorePropertyChange]
  332. public bool Ll6IsChecked { get; set; }
  333. [IgnorePropertyChange]
  334. public bool Ll7IsChecked { get; set; }
  335. [IgnorePropertyChange]
  336. public bool Ll8IsChecked { get; set; }
  337. [IgnorePropertyChange]
  338. public bool CoolingBuffer1IsChecked { get; set; }
  339. [IgnorePropertyChange]
  340. public bool CoolingBuffer2IsChecked { get; set; }
  341. [IgnorePropertyChange]
  342. public bool Aligner1IsChecked { get; set; }
  343. [IgnorePropertyChange]
  344. public bool Aligner2IsChecked { get; set; }
  345. [IgnorePropertyChange]
  346. public bool BufferIsChecked { get; set; }
  347. [IgnorePropertyChange]
  348. public bool Buffer1IsChecked { get; set; }
  349. [IgnorePropertyChange]
  350. public bool Buffer2IsChecked { get; set; }
  351. [IgnorePropertyChange]
  352. public bool FlipperIsChecked { get; set; }
  353. #endregion
  354. #region Moudle Enable Flag
  355. [Subscription("LP1.IsEnable")]
  356. public bool LP1Enable { get; set; }
  357. [Subscription("LP2.IsEnable")]
  358. public bool LP2Enable { get; set; }
  359. [Subscription("Aligner1.IsEnable")]
  360. public bool Aligner1Enable { get; set; }
  361. [Subscription("Aligner2.IsEnable")]
  362. public bool Aligner2Enable { get; set; }
  363. [Subscription("Buffer.IsEnable")]
  364. public bool BufferEnable { get; set; }
  365. [Subscription("Buffer1.IsEnable")]
  366. public bool Buffer1Enable { get; set; }
  367. [Subscription("Buffer2.IsEnable")]
  368. public bool Buffer2Enable { get; set; }
  369. [Subscription("PMA.IsEnable")]
  370. public bool PMAEnable { get; set; }
  371. [Subscription("PMB.IsEnable")]
  372. public bool PMBEnable { get; set; }
  373. [Subscription("CoolingBuffer1.IsEnable")]
  374. public bool CoolingBuffer1Enable { get; set; }
  375. [Subscription("CoolingBuffer2.IsEnable")]
  376. public bool CoolingBuffer2Enable { get; set; }
  377. [Subscription("Flipper.IsEnable")]
  378. public bool FlipperEnable { get; set; }
  379. #endregion
  380. public Visibility ServerVisibility { get; set; }
  381. [Subscription("System.Robot.IsLeftArmPressureSensorON")]
  382. public bool IsLeftArmPressureSensorON
  383. {
  384. get; set;
  385. }
  386. [Subscription("System.Robot.IsRightArmPressureSensorON")]
  387. public bool IsRightArmPressureSensorON
  388. {
  389. get; set;
  390. }
  391. [Subscription("LP1.InfoPadCarrierTypeInformation")]
  392. public string LP1CarrierType
  393. {
  394. get => _lp1CarrierType;
  395. set => _lp1CarrierType = value;
  396. }
  397. private string _lp1CarrierType;
  398. [Subscription("LP2.InfoPadCarrierTypeInformation")]
  399. public string LP2CarrierType
  400. {
  401. get => _lp2CarrierType;
  402. set => _lp2CarrierType = value;
  403. }
  404. private string _lp2CarrierType;
  405. [Subscription("LP3.InfoPadCarrierTypeInformation")]
  406. public string LP3CarrierType
  407. {
  408. get => _lp3CarrierType;
  409. set => _lp3CarrierType = value;
  410. }
  411. private string _lp3CarrierType;
  412. [Subscription("LP1.IsAutoDetectCarrierType")]
  413. public bool LP1IsAutoDetectCarrierType { get; set; }
  414. [Subscription("LP2.IsAutoDetectCarrierType")]
  415. public bool LP2IsAutoDetectCarrierType { get; set; }
  416. [Subscription("LP3.IsAutoDetectCarrierType")]
  417. public bool LP3IsAutoDetectCarrierType { get; set; }
  418. [Subscription("LP1.ValidCarrierTypeList")]
  419. public Tuple<int, string>[] LP1ValidCarrierTypeList { get; set; }
  420. [Subscription("LP2.ValidCarrierTypeList")]
  421. public Tuple<int, string>[] LP2ValidCarrierTypeList { get; set; }
  422. [Subscription("LP3.ValidCarrierTypeList")]
  423. public Tuple<int, string>[] LP3ValidCarrierTypeList { get; set; }
  424. [Subscription("System.IsNoRunning")]
  425. public bool IsNoRunning { get; set; }
  426. [Subscription("Flipper.IsFlipperOrigin")]
  427. public bool IsOver0Degree { get; set; }
  428. [Subscription("Flipper.IsFlipperHorizontal")]
  429. public bool IsOver180Degree { get; set; }
  430. [Subscription("Flipper.ClampOpen")]
  431. public bool ClampOpen { get; set; }
  432. [Subscription("Flipper.ClampClose")]
  433. public bool ClampClose { get; set; }
  434. public bool IsShowLP1CarrierType
  435. {
  436. get
  437. { return !LP1IsAutoDetectCarrierType; }
  438. }
  439. public bool IsShowLP2CarrierType
  440. {
  441. get
  442. { return !LP2IsAutoDetectCarrierType; }
  443. }
  444. public bool IsShowLP3CarrierType
  445. {
  446. get
  447. { return !LP3IsAutoDetectCarrierType; }
  448. }
  449. public Thickness _PMThickness = new Thickness(0, 0, 0, 0);
  450. public Thickness PMThickness
  451. {
  452. get
  453. {
  454. if (!IsEnableIdentifyThickness && !IsEnableMultiWaferSize)
  455. {
  456. _PMThickness.Left = 0;
  457. _PMThickness.Top = -100;
  458. _PMThickness.Right = 0;
  459. _PMThickness.Bottom = 0;
  460. }
  461. else if (!IsEnableIdentifyThickness && IsEnableMultiWaferSize && !IsEnableMultiWaferSizeShow)
  462. {
  463. _PMThickness.Left = 0;
  464. _PMThickness.Top = -100;
  465. _PMThickness.Right = 0;
  466. _PMThickness.Bottom = 0;
  467. }
  468. else
  469. {
  470. _PMThickness.Left = 680;
  471. _PMThickness.Top = 645;
  472. _PMThickness.Right = 0;
  473. _PMThickness.Bottom = 50;
  474. }
  475. return _PMThickness;
  476. }
  477. }
  478. public Thickness _RobotThickness = new Thickness(0, 0, 0, 0);
  479. public Thickness RobotThickness
  480. {
  481. get
  482. {
  483. if (!IsEnableIdentifyThickness && !IsEnableMultiWaferSize)
  484. {
  485. _RobotThickness.Left = 0;
  486. _RobotThickness.Top = 300;
  487. _RobotThickness.Right = 0;
  488. _RobotThickness.Bottom = 0;
  489. }
  490. else if (!IsEnableIdentifyThickness && IsEnableMultiWaferSize && !IsEnableMultiWaferSizeShow)
  491. {
  492. _RobotThickness.Left = 0;
  493. _RobotThickness.Top = 300;
  494. _RobotThickness.Right = 0;
  495. _RobotThickness.Bottom = 0;
  496. }
  497. else
  498. {
  499. _RobotThickness.Left = 10;
  500. _RobotThickness.Top = 633;
  501. _RobotThickness.Right = 0;
  502. _RobotThickness.Bottom = 10;
  503. }
  504. return _RobotThickness;
  505. }
  506. }
  507. /// <summary>
  508. /// Update LoadPort WaferInfo
  509. /// </summary>
  510. /// <param name="sourceWaferInfos"></param>
  511. /// <param name="index"></param>
  512. public override void UpdateWafers(WaferInfo[] sourceWaferInfos, int index)
  513. {
  514. if (IsSlotShowOpposite)
  515. {
  516. var wafers = UpdateWaferInfo(sourceWaferInfos);
  517. if (sourceWaferInfos == null) return;
  518. if (index == 0 && FoupList[index] != null)
  519. {
  520. FoupList[index].IsShow = LP1Enable;
  521. }
  522. if (FoupList[index].WaferInfos == null)
  523. {
  524. FoupList[index].WaferInfos = wafers;
  525. }
  526. else
  527. {
  528. for (int i = 0; i < FoupList[index].WaferInfos.Length; i++)
  529. {
  530. FoupList[index].WaferInfos[i].Update(wafers[i]);
  531. }
  532. }
  533. }
  534. else
  535. {
  536. var wafers = UpdateWaferInfo(sourceWaferInfos.Reverse().ToArray());
  537. if (sourceWaferInfos == null) return;
  538. if (index == 0 && FoupList[index] != null)
  539. {
  540. FoupList[index].IsShow = LP1Enable;
  541. }
  542. if (FoupList[index].WaferInfos == null)
  543. {
  544. FoupList[index].WaferInfos = wafers;
  545. }
  546. else
  547. {
  548. for (int i = 0; i < FoupList[index].WaferInfos.Length; i++)
  549. {
  550. FoupList[index].WaferInfos[i].Update(wafers[i]);
  551. }
  552. }
  553. }
  554. }
  555. private ObservableCollection<string> _cycleItemsSource = new ObservableCollection<string>();
  556. /// <summary>
  557. /// Cycle Items Source
  558. /// </summary>
  559. public ObservableCollection<string> CycleItemsSource
  560. {
  561. get { return _cycleItemsSource; }
  562. set { _cycleItemsSource = value; }
  563. }
  564. public OperationViewModel2LPAB(int lpNum) : base(lpNum)
  565. {
  566. WaferTransferOptionCommand = new DelegateCommand<WaferTransferOption>(BeforeTransfer);
  567. SetWaferSize3 = new DelegateCommand<string>(PerformSetWaferSize3);
  568. SetWaferSize4 = new DelegateCommand<string>(PerformSetWaferSize4);
  569. SetWaferSize6 = new DelegateCommand<string>(PerformSetWaferSize6);
  570. SetWaferSize8 = new DelegateCommand<string>(PerformSetWaferSize8);
  571. SetWaferThick = new DelegateCommand<string>(PerformSetWaferThick);
  572. SetWaferThin = new DelegateCommand<string>(PerformSetWaferThin);
  573. SetLPSlot13 = new DelegateCommand<string>(PerformSetSlot13);
  574. SetLPSlot25 = new DelegateCommand<string>(PerformSetSlot25);
  575. StartCycleCommand = new DelegateCommand<object>(StartCycle);
  576. StopCycleCommand = new DelegateCommand<object>(StopCycle);
  577. SetFFUCommand = new DelegateCommand<string>(SetFFUSpeed);
  578. MapCommand = new DelegateCommand<DependencyObject>(DoMap);
  579. LoadCommand = new DelegateCommand<DependencyObject>(DoLoad);
  580. UnloadCommand = new DelegateCommand<DependencyObject>(DoUnload);
  581. SetTransCarrierTypeCommand = new DelegateCommand<string>(SetTransCarrierType);
  582. FlipperHomeCommand = new DelegateCommand<object>(FlipperHome);
  583. FlipperResetCommand = new DelegateCommand<object>(FlipperReset);
  584. FlipperAbortCommand = new DelegateCommand<object>(FlipperAbort);
  585. FlipperTurnOverCommand = new DelegateCommand<object>(FlipperTurnOver);
  586. FlipperGripCommand = new DelegateCommand<object>(FlipperGrip);
  587. FlipperUnGripCommand = new DelegateCommand<object>(FlipperUnGrip);
  588. FlipperTurnOverJogNCommand = new DelegateCommand<object>(FlipperTurnOverJogN);
  589. FlipperTurnOverJogPCommand = new DelegateCommand<object>(FlipperTurnOverJogP);
  590. FlipperTurnOverJogPStopCommand = new DelegateCommand<object>(FlipperTurnOverJogPStop);
  591. FlipperTurnOverJogNStopCommand = new DelegateCommand<object>(FlipperTurnOverJogNStop);
  592. }
  593. protected void DoMap(DependencyObject sender)
  594. {
  595. var command = CommandHelper.GetCommandItem(sender);
  596. InvokeClient.Instance.Service.DoOperation(command.CommandName, command.Target);
  597. }
  598. protected void DoLoad(DependencyObject sender)
  599. {
  600. var command = CommandHelper.GetCommandItem(sender);
  601. InvokeClient.Instance.Service.DoOperation(command.CommandName, command.Target);
  602. }
  603. protected void DoUnload(DependencyObject sender)
  604. {
  605. var command = CommandHelper.GetCommandItem(sender);
  606. InvokeClient.Instance.Service.DoOperation(command.CommandName, command.Target);
  607. }
  608. private void SetTransCarrierType(string obj)
  609. {
  610. var LPName = obj;
  611. Tuple<int, string>[] input = null;
  612. switch (LPName)
  613. {
  614. case "LP1":
  615. input = LP1ValidCarrierTypeList;
  616. break;
  617. case "LP2":
  618. input = LP2ValidCarrierTypeList;
  619. break;
  620. case "LP3":
  621. input = LP3ValidCarrierTypeList;
  622. break;
  623. default:
  624. break;
  625. }
  626. // Tuple<int, string>[] tempTuple = new Tuple<int, string>[] { Tuple.Create(0, "CarrierType0"), Tuple.Create(1, "CarrierType1") };
  627. if (input == null)
  628. {
  629. MessageBox.Show($"{LPName}ValidCarrierTypeList is null", "Value Null");
  630. }
  631. else
  632. {
  633. var SelectCarrierTypeDialog = new SelectCarrierTypeDialog(input);
  634. if ((bool)SelectCarrierTypeDialog.ShowDialog())
  635. {
  636. InvokeClient.Instance.Service.DoOperation($"{LPName}.SetInfoPadIndex", SelectCarrierTypeDialog.SelectIndex);
  637. }
  638. }
  639. }
  640. private void SetFFUSpeed(string obj)
  641. {
  642. InvokeClient.Instance.Service.DoOperation($"FFU.SetSpeed", new object[] { obj });
  643. }
  644. private void PerformSetSlot13(string obj)
  645. {
  646. InvokeClient.Instance.Service.DoOperation("System.SetSlot13", obj);
  647. }
  648. private void PerformSetSlot25(string obj)
  649. {
  650. InvokeClient.Instance.Service.DoOperation("System.SetSlot25", obj);
  651. }
  652. private void PerformSetWaferSize8(string obj)
  653. {
  654. InvokeClient.Instance.Service.DoOperation("System.SetWaferSize8", obj);
  655. }
  656. private void PerformSetWaferSize6(string obj)
  657. {
  658. InvokeClient.Instance.Service.DoOperation("System.SetWaferSize6", obj);
  659. }
  660. private void PerformSetWaferSize4(string obj)
  661. {
  662. InvokeClient.Instance.Service.DoOperation("System.SetWaferSize4", obj);
  663. }
  664. private void PerformSetWaferSize3(string obj)
  665. {
  666. InvokeClient.Instance.Service.DoOperation("System.SetWaferSize3", obj);
  667. }
  668. private void PerformSetWaferThick(string obj)
  669. {
  670. InvokeClient.Instance.Service.DoOperation("System.SetWaferThick", obj);
  671. }
  672. private void PerformSetWaferThin(string obj)
  673. {
  674. InvokeClient.Instance.Service.DoOperation("System.SetWaferThin", obj);
  675. }
  676. private void StartCycle(object obj)
  677. {
  678. if (CycleFrom == null || CycleTo == null)
  679. return;
  680. List<string> _lstPassThrough = new List<string>()
  681. {
  682. };
  683. if (Aligner1IsChecked)
  684. _lstPassThrough.Add("Aligner1");
  685. if (Aligner2IsChecked)
  686. _lstPassThrough.Add("Aligner2");
  687. if (Ll1IsChecked)
  688. _lstPassThrough.Add("LL1");
  689. if (Ll2IsChecked)
  690. _lstPassThrough.Add("LL2");
  691. if (BufferIsChecked)
  692. _lstPassThrough.Add("Buffer");
  693. if (Buffer1IsChecked)
  694. _lstPassThrough.Add("Buffer1");
  695. if (Buffer2IsChecked)
  696. _lstPassThrough.Add("Buffer2");
  697. if (CoolingBuffer1IsChecked)
  698. _lstPassThrough.Add("CoolingBuffer1");
  699. if (CoolingBuffer2IsChecked)
  700. _lstPassThrough.Add("CoolingBuffer2");
  701. if (FlipperIsChecked)
  702. _lstPassThrough.Add("Flipper");
  703. if (obj.ToString() == "Cycle")
  704. {
  705. InvokeClient.Instance.Service.DoOperation("System.StartCycle", new object[] {(string)CycleFrom,
  706. (string)CycleTo, _lstPassThrough.ToArray()
  707. });
  708. }
  709. //else if (obj.ToString() == "Benchmark")
  710. //{
  711. // InvokeClient.Instance.Service.DoOperation("Benchmark", paramsArgs);
  712. //}
  713. }
  714. /// <summary>
  715. /// 停止Cycle
  716. /// </summary>
  717. /// <param name="obj"></param>
  718. private void StopCycle(object obj)
  719. {
  720. InvokeClient.Instance.Service.DoOperation("System.StopCycle");
  721. }
  722. public ICommand WaferTransferOptionCommand
  723. {
  724. get; set;
  725. }
  726. protected virtual void BeforeTransfer(WaferTransferOption option)
  727. {
  728. option.Setting.ShowAlign = false;
  729. option.Setting.ShowLaserMarker = false;
  730. option.Setting.ShowT7Code = false;
  731. //option.Setting.ShowBlade = false;
  732. }
  733. protected override void InitFoupList()
  734. {
  735. base.InitFoupList();
  736. if (FoupList.Count >= 1)
  737. {
  738. switch ((int)QueryDataClient.Instance.Service.GetConfig("LoadPort.LP1.CstType"))
  739. {
  740. case 0:
  741. FoupList[0].FoupType = Controls.FoupType.Loadport;
  742. break;
  743. case 1:
  744. FoupList[0].FoupType = Controls.FoupType.OpenCassette;
  745. break;
  746. case 2:
  747. FoupList[0].FoupType = Controls.FoupType.Loadport;
  748. break;
  749. default:
  750. FoupList[0].FoupType = Controls.FoupType.Loadport;
  751. break;
  752. }
  753. }
  754. if (FoupList.Count >= 2)
  755. {
  756. switch ((int)QueryDataClient.Instance.Service.GetConfig("LoadPort.LP2.CstType"))
  757. {
  758. case 0:
  759. FoupList[1].FoupType = Controls.FoupType.Loadport;
  760. break;
  761. case 1:
  762. FoupList[1].FoupType = Controls.FoupType.OpenCassette;
  763. break;
  764. case 2:
  765. FoupList[1].FoupType = Controls.FoupType.Loadport;
  766. break;
  767. default:
  768. FoupList[1].FoupType = Controls.FoupType.Loadport;
  769. break;
  770. }
  771. }
  772. InitBufferList(1);
  773. BufferList[0].FoupType = Controls.FoupType.NoButton;
  774. }
  775. protected readonly ModuleName[] bufferSet = new ModuleName[]
  776. {
  777. ModuleName.Buffer,
  778. ModuleName.Buffer1,
  779. ModuleName.Buffer2,
  780. };
  781. public void InitBufferList(int bufferCount)
  782. {
  783. BufferList = new ObservableCollection<FoupListItem>();
  784. for (var i = 0; i < bufferCount; i++)
  785. {
  786. var foupListItem = new FoupListItem
  787. {
  788. DeviceName = bufferSet[i].ToString(),
  789. CarrierName = bufferSet[i].ToString(),
  790. CarrierMode = LoadPortCarrierMode.Loader,
  791. Station = bufferSet[i],
  792. IsShow = true
  793. };
  794. BufferList.Add(foupListItem);
  795. }
  796. }
  797. protected override void InvokeBeforeUpdateProperty(Dictionary<string, object> data)
  798. {
  799. //ServerVisibility = ((bool)QueryDataClient.Instance.Service.GetConfig("System.EfemServerEnable")) ? Visibility.Visible : Visibility.Hidden;
  800. //data[UIKey(UnitName.LoadportA.ToString(), ParamName.FoupDoorState)] = FoupDoorState.Close;
  801. base.InvokeBeforeUpdateProperty(data);
  802. }
  803. public void UpdateOnLoaded()
  804. {
  805. CycleItemsSource.Clear();
  806. if (!(bool)QueryDataClient.Instance.Service.GetConfig("LoadPort.LP1.Disable")) CycleItemsSource.Add("LP1");
  807. if (!(bool)QueryDataClient.Instance.Service.GetConfig("LoadPort.LP2.Disable")) CycleItemsSource.Add("LP2");
  808. }
  809. #region Flipper Operaion
  810. /// <summary>
  811. /// Flipper Home
  812. /// </summary>
  813. private void FlipperHome(object obj)
  814. {
  815. InvokeClient.Instance.Service.DoOperation("Flipper.Home");
  816. }
  817. /// <summary>
  818. /// Flipper Reset
  819. /// </summary>
  820. private void FlipperReset(object obj)
  821. {
  822. InvokeClient.Instance.Service.DoOperation("Flipper.Reset");
  823. }
  824. /// <summary>
  825. /// Flipper Abort
  826. /// </summary>
  827. private void FlipperAbort(object obj)
  828. {
  829. InvokeClient.Instance.Service.DoOperation("Flipper.Abort");
  830. }
  831. /// <summary>
  832. /// Flipper TurnOver
  833. /// </summary>
  834. private void FlipperTurnOver(object obj)
  835. {
  836. InvokeClient.Instance.Service.DoOperation("Flipper.TurnOver");
  837. }
  838. /// <summary>
  839. /// Flipper Clamp
  840. /// </summary>
  841. private void FlipperGrip(object obj)
  842. {
  843. InvokeClient.Instance.Service.DoOperation("Flipper.Clamp");
  844. }
  845. /// <summary>
  846. /// Flipper UnClamp
  847. /// </summary>
  848. private void FlipperUnGrip(object obj)
  849. {
  850. InvokeClient.Instance.Service.DoOperation("Flipper.UnClamp");
  851. }
  852. /// <summary>
  853. /// Flipper TurnOverJog+
  854. /// </summary>
  855. private void FlipperTurnOverJogP(object obj)
  856. {
  857. InvokeClient.Instance.Service.DoOperation("Flipper.manualTurn", "P");
  858. }
  859. /// <summary>
  860. /// Flipper TurnOverJog+ Stop
  861. /// </summary>
  862. private void FlipperTurnOverJogPStop(object obj)
  863. {
  864. InvokeClient.Instance.Service.DoOperation("Flipper.manualTurnStop", "P");
  865. }
  866. /// <summary>
  867. /// Flipper TurnOverJog-
  868. /// </summary>
  869. private void FlipperTurnOverJogN(object obj)
  870. {
  871. InvokeClient.Instance.Service.DoOperation("Flipper.manualTurn", "N");
  872. }
  873. /// <summary>
  874. /// Flipper TurnOverJog- Stop
  875. /// </summary>
  876. private void FlipperTurnOverJogNStop(object obj)
  877. {
  878. InvokeClient.Instance.Service.DoOperation("Flipper.manualTurnStop", "N");
  879. }
  880. #endregion
  881. }
  882. }