MetalSHHomePageViewModel.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512
  1. using Aitex.Core.Common;
  2. using Aitex.Core.UI.MVVM;
  3. using MECF.Framework.Common.CommonData.Metal;
  4. using MECF.Framework.Common.CommonData.PowerSupplier;
  5. using MECF.Framework.Common.DataCenter;
  6. using MECF.Framework.Common.OperationCenter;
  7. using MECF.Framework.Common.Persistent.Reservoirs;
  8. using MECF.Framework.Common.RecipeCenter;
  9. using MECF.Framework.Common.ToolLayout;
  10. using MECF.Framework.Common.Utilities;
  11. using MECF.Framework.Common.WaferHolder;
  12. using Prism.Mvvm;
  13. using System;
  14. using System.Collections.Generic;
  15. using System.Windows.Input;
  16. using System.Windows.Threading;
  17. namespace CyberX8_MainPages.ViewModels
  18. {
  19. internal class MetalSHHomePageViewModel : BindableBase
  20. {
  21. #region 常量
  22. private const string PERSISTENT_VALUE = "PersistentValue";
  23. private const string METALDATA = "MetalData";
  24. #endregion
  25. #region 内部变量
  26. #region Common
  27. /// <summary>
  28. /// 模块名称
  29. /// </summary>
  30. private string _module;
  31. /// <summary>
  32. /// 当前选择Recipe节点
  33. /// </summary>
  34. private RecipeNode _selectedRecipeNode;
  35. /// <summary>
  36. /// MetalData
  37. /// </summary>
  38. private StandardHotMetalDeviceData _metalData;
  39. /// <summary>
  40. /// Metal Persistent
  41. /// </summary>
  42. private MetalPersistentValue _metalPersistent;
  43. /// <summary>
  44. /// RinseItem
  45. /// </summary>
  46. private MetalItem _metalItem;
  47. /// <summary>
  48. /// WaferSize
  49. /// </summary>
  50. private WaferSize _selectedWaferSize = 0;
  51. /// <summary>
  52. /// Wafer Size List
  53. /// </summary>
  54. private List<int> _waferSizeList = new List<int>();
  55. /// <summary>
  56. /// 页面功能启用
  57. /// </summary>
  58. private bool _isEnabled;
  59. /// <summary>
  60. /// AutoMode页面功能启用
  61. /// </summary>
  62. private bool _isAutoEnabled;
  63. #endregion
  64. #region Wafer Holder
  65. /// <summary>
  66. /// Wafer Holder属性
  67. /// </summary>
  68. private WaferHolderInfo _waferHolderInfo;
  69. /// <summary>
  70. /// SeqRecipe
  71. /// </summary>
  72. private string _seqRecipe;
  73. #endregion
  74. #region 系统数据
  75. /// <summary>
  76. /// 定时器
  77. /// </summary>
  78. DispatcherTimer _timer;
  79. /// <summary>
  80. /// 查询后台数据集合
  81. /// </summary>
  82. private List<string> _rtDataKeys = new List<string>();
  83. /// <summary>
  84. /// rt查询key数值字典
  85. /// </summary>
  86. private Dictionary<string, object> _rtDataValueDic = new Dictionary<string, object>();
  87. #endregion
  88. #region MetalSH
  89. /// <summary>
  90. /// RecipeContent
  91. /// </summary>
  92. private string _recipeContent;
  93. /// <summary>
  94. /// TimeRemaining
  95. /// </summary>
  96. private double _timeRemaining;
  97. /// <summary>
  98. /// OfTotalTime
  99. /// </summary>
  100. private double _totalTime;
  101. /// <summary>
  102. /// OperatingMode
  103. /// </summary>
  104. private string _operatingMode;
  105. /// <summary>
  106. /// State
  107. /// </summary>
  108. private string _state;
  109. /// <summary>
  110. /// RecipeMode
  111. /// </summary>
  112. private string _recipeMode;
  113. #endregion
  114. #region Metal recipe
  115. /// <summary>
  116. /// RecipeModuleName
  117. /// </summary>
  118. private string _recipeModuleName;
  119. /// <summary>
  120. /// RecipeType
  121. /// </summary>
  122. private string _recipeType;
  123. /// <summary>
  124. /// AchievedRunRecipeCycle
  125. /// </summary>
  126. private int _achievedRunRecipeCycle;
  127. /// <summary>
  128. /// 当前Recipe
  129. /// </summary>
  130. private string _currentRecipe;
  131. #endregion
  132. #region UI Related
  133. /// <summary>
  134. /// ClampStatus
  135. /// </summary>
  136. private string _clampStatus;
  137. /// <summary>
  138. /// IsErrorState
  139. /// </summary>
  140. private bool _isErrorState;
  141. /// <summary>
  142. /// 是否存在WaferHolder
  143. /// </summary>
  144. private bool _isWaferHolder;
  145. #endregion
  146. #region PowerSupplier
  147. /// <summary>
  148. /// SidA PowerSuplier数据
  149. /// </summary>
  150. private PowerSupplierData _sideAPowerSupplierData;
  151. /// <summary>
  152. /// SidB PowerSuplier数据
  153. /// </summary>
  154. private PowerSupplierData _sideBPowerSupplierData;
  155. #endregion
  156. #endregion
  157. #region 属性
  158. #region Common
  159. /// <summary>
  160. /// MetalDeviceData
  161. /// </summary>
  162. public StandardHotMetalDeviceData MetalData
  163. {
  164. get { return _metalData; }
  165. set { SetProperty(ref _metalData, value); }
  166. }
  167. /// <summary>
  168. /// Metal Persistent
  169. /// </summary>
  170. public MetalPersistentValue MetalPersistent
  171. {
  172. get { return _metalPersistent; }
  173. set { SetProperty(ref _metalPersistent, value); }
  174. }
  175. /// <summary>
  176. /// 模块名称
  177. /// </summary>
  178. public string Module
  179. {
  180. get { return _module; }
  181. set { SetProperty(ref _module, value); }
  182. }
  183. /// <summary>
  184. /// 当前选择Recipe节点
  185. /// </summary>
  186. public RecipeNode SelectedRecipeNode
  187. {
  188. get { return _selectedRecipeNode; }
  189. set { SetProperty(ref _selectedRecipeNode, value); }
  190. }
  191. /// <summary>
  192. /// WaferSize
  193. /// </summary>
  194. public WaferSize SelectedWaferSize
  195. {
  196. get { return _selectedWaferSize; }
  197. set { SetProperty(ref _selectedWaferSize, value); }
  198. }
  199. /// <summary>
  200. /// WaferSizeList
  201. /// </summary>
  202. public List<int> WaferSizeList
  203. {
  204. get { return _waferSizeList; }
  205. set { SetProperty(ref _waferSizeList, value); }
  206. }
  207. /// <summary>
  208. /// 页面功能启用
  209. /// </summary>
  210. public bool IsEnabled
  211. {
  212. get { return _isEnabled; }
  213. set { SetProperty(ref _isEnabled, value); }
  214. }
  215. /// <summary>
  216. /// AutoMode页面功能启用
  217. /// </summary>
  218. public bool IsAutoEnabled
  219. {
  220. get { return _isAutoEnabled; }
  221. set { SetProperty(ref _isAutoEnabled, value); }
  222. }
  223. #endregion
  224. #region Wafer Holder
  225. /// <summary>
  226. /// Wafer Holder属性
  227. /// </summary>
  228. public WaferHolderInfo WaferHolderInfo { get { return _waferHolderInfo; } set { SetProperty(ref _waferHolderInfo, value); } }
  229. /// <summary>
  230. /// SeqRecipe
  231. /// </summary>
  232. public string SeqRecipe
  233. {
  234. get { return _seqRecipe; }
  235. set { SetProperty(ref _seqRecipe, value); }
  236. }
  237. #endregion
  238. #region MetalCM
  239. /// <summary>
  240. /// RecipeContent
  241. /// </summary>
  242. public string RecipeContent
  243. {
  244. get { return _recipeContent; }
  245. set { SetProperty(ref _recipeContent, value); }
  246. }
  247. /// <summary>
  248. /// TimeRemaining
  249. /// </summary>
  250. public double TimeRemaining
  251. {
  252. get { return _timeRemaining; }
  253. set { SetProperty(ref _timeRemaining, value); }
  254. }
  255. /// <summary>
  256. /// TotalTime
  257. /// </summary>
  258. public double TotalTime
  259. {
  260. get { return _totalTime; }
  261. set { SetProperty(ref _totalTime, value); }
  262. }
  263. /// <summary>
  264. /// OperatingMode
  265. /// </summary>
  266. public string OperatingMode
  267. {
  268. get { return _operatingMode; }
  269. set { SetProperty(ref _operatingMode, value); }
  270. }
  271. /// <summary>
  272. /// State
  273. /// </summary>
  274. public string State
  275. {
  276. get { return _state; }
  277. set { SetProperty(ref _state, value); }
  278. }
  279. /// <summary>
  280. /// RecipeMode
  281. /// </summary>
  282. public string RecipeMode
  283. {
  284. get { return _recipeMode; }
  285. set { SetProperty(ref _recipeMode, value); }
  286. }
  287. #endregion
  288. #region Metal recipe
  289. /// <summary>
  290. /// RecipeModuleName
  291. /// </summary>
  292. public string RecipeModuleName
  293. {
  294. get { return _recipeModuleName; }
  295. set { SetProperty(ref _recipeModuleName, value); }
  296. }
  297. /// <summary>
  298. /// RecipeType
  299. /// </summary>
  300. public string RecipeType
  301. {
  302. get { return _recipeType; }
  303. set { SetProperty(ref _recipeType, value); }
  304. }
  305. /// <summary>
  306. /// Run Recipe已经完成的次数
  307. /// </summary>
  308. public int AchievedRunRecipeCycle
  309. {
  310. get { return _achievedRunRecipeCycle; }
  311. set { SetProperty(ref _achievedRunRecipeCycle, value); }
  312. }
  313. /// <summary>
  314. /// 当前运行的Recipe
  315. /// </summary>
  316. public string CurrentRecipe
  317. {
  318. get { return _currentRecipe; }
  319. set { SetProperty(ref _currentRecipe, value); }
  320. }
  321. #endregion
  322. #region UI Related
  323. /// <summary>
  324. /// IsErrorState
  325. /// </summary>
  326. public bool IsErrorState
  327. {
  328. get { return _isErrorState; }
  329. set { SetProperty(ref _isErrorState, value); }
  330. }
  331. /// <summary>
  332. /// ClampStatus
  333. /// </summary>
  334. public string ClampStatus
  335. {
  336. get { return _clampStatus; }
  337. set { SetProperty(ref _clampStatus, value); }
  338. }
  339. /// <summary>
  340. /// 是否存在WaferHolder
  341. /// </summary>
  342. public bool IsWaferHolder
  343. {
  344. get { return _isWaferHolder; }
  345. set { SetProperty(ref _isWaferHolder, value); }
  346. }
  347. #endregion
  348. #region PowerSupplier
  349. /// <summary>
  350. /// SidA PowerSuplier数据
  351. /// </summary>
  352. public PowerSupplierData SideAPowerSupplierData
  353. {
  354. get { return _sideAPowerSupplierData; }
  355. set { SetProperty(ref _sideAPowerSupplierData, value); }
  356. }
  357. /// <summary>
  358. /// SidB PowerSuplier数据
  359. /// </summary>
  360. public PowerSupplierData SideBPowerSupplierData
  361. {
  362. get { return _sideBPowerSupplierData; }
  363. set { SetProperty(ref _sideBPowerSupplierData, value); }
  364. }
  365. #endregion
  366. #endregion
  367. #region Command指令
  368. public ICommand InitializeCommand { get; set; }
  369. #endregion
  370. /// <summary>
  371. /// 构造函数
  372. /// </summary>
  373. public MetalSHHomePageViewModel()
  374. {
  375. InitializeCommand = new DelegateCommand<object>(InitializeAction);
  376. WaferSizeList.Add((int)WaferSize.WS8);
  377. WaferSizeList.Add((int)WaferSize.WS12);
  378. }
  379. /// <summary>
  380. /// 加载数据
  381. /// </summary>
  382. public void LoadData(string systemName)
  383. {
  384. Module = systemName;
  385. RecipeModuleName = "DEP Recipe";
  386. RecipeType = "dep";
  387. _rtDataKeys.Clear();
  388. _rtDataKeys.Add($"{Module}.WaferHolder");
  389. _rtDataKeys.Add($"{Module}.SequenceRecipe");
  390. _rtDataKeys.Add($"{Module}.AchievedCycle");
  391. _rtDataKeys.Add($"{Module}.FsmState");
  392. _rtDataKeys.Add($"{Module}.{PERSISTENT_VALUE}");
  393. _rtDataKeys.Add($"{Module}.{METALDATA}");
  394. _rtDataKeys.Add($"{Module}.SideAPowerSupplierData");
  395. _rtDataKeys.Add($"{Module}.SideBPowerSupplierData");
  396. _rtDataKeys.Add($"{Module}.CurrentRecipe");
  397. _rtDataKeys.Add($"{Module}.TotalTime");
  398. _rtDataKeys.Add($"{Module}.TimeRemain");
  399. if (_timer == null)
  400. {
  401. _timer = new DispatcherTimer();
  402. _timer.Interval = TimeSpan.FromMilliseconds(200);
  403. _timer.Tick += Timer_Tick;
  404. }
  405. _timer.Start();
  406. }
  407. /// <summary>
  408. /// 定时器执行
  409. /// </summary>
  410. /// <param name="sender"></param>
  411. /// <param name="e"></param>
  412. private void Timer_Tick(object sender, EventArgs e)
  413. {
  414. if (_rtDataKeys.Count != 0)
  415. {
  416. _rtDataValueDic = QueryDataClient.Instance.Service.PollData(_rtDataKeys);
  417. if (_rtDataValueDic != null)
  418. {
  419. MetalData = CommonFunction.GetValue<StandardHotMetalDeviceData>(_rtDataValueDic, $"{Module}.{METALDATA}");
  420. MetalPersistent = CommonFunction.GetValue<MetalPersistentValue>(_rtDataValueDic, $"{Module}.{PERSISTENT_VALUE}");
  421. WaferHolderInfo = CommonFunction.GetValue<WaferHolderInfo>(_rtDataValueDic, $"{Module}.WaferHolder");
  422. if (WaferHolderInfo != null)
  423. {
  424. IsWaferHolder = true;
  425. }
  426. else
  427. {
  428. IsWaferHolder = false;
  429. }
  430. SeqRecipe = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.SequenceRecipe");
  431. AchievedRunRecipeCycle = CommonFunction.GetValue<int>(_rtDataValueDic, $"{Module}.AchievedCycle");
  432. State = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.FsmState");
  433. if ("Manual".Equals(MetalPersistent.OperatingMode))
  434. {
  435. IsEnabled = true;
  436. IsAutoEnabled = true;
  437. }
  438. else if("Auto".Equals(MetalPersistent.OperatingMode))
  439. {
  440. IsAutoEnabled = true;
  441. IsEnabled = false;
  442. }
  443. else
  444. {
  445. State = "Stopped";
  446. IsEnabled = false;
  447. IsAutoEnabled = false;
  448. }
  449. SideAPowerSupplierData = CommonFunction.GetValue<PowerSupplierData>(_rtDataValueDic, $"{Module}.SideAPowerSupplierData");
  450. SideBPowerSupplierData = CommonFunction.GetValue<PowerSupplierData>(_rtDataValueDic, $"{Module}.SideBPowerSupplierData");
  451. //Error时UI腔体变红
  452. IsErrorState = "Error".Equals(State) ? true : false;
  453. //WHClamp control
  454. if(MetalData != null)
  455. {
  456. ClampStatus = MetalData.WaferHolderClamp ? "Clamped" : "Unclamped";
  457. }
  458. CurrentRecipe = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.CurrentRecipe");
  459. TotalTime = CommonFunction.GetValue<int>(_rtDataValueDic, $"{Module}.TotalTime");
  460. TimeRemaining = CommonFunction.GetValue<int>(_rtDataValueDic, $"{Module}.TimeRemain");
  461. TimeRemaining = TimeRemaining < 0 ? 0 : TimeRemaining;
  462. if (State == "Idle")
  463. {
  464. TimeRemaining = 0;
  465. }
  466. }
  467. }
  468. }
  469. /// <summary>
  470. /// 隐藏
  471. /// </summary>
  472. public void Hide()
  473. {
  474. if (_timer != null)
  475. {
  476. _timer.Stop();
  477. }
  478. }
  479. /// <summary>
  480. /// Initialize Action
  481. /// </summary>
  482. /// <param name="param"></param>
  483. private void InitializeAction(object param)
  484. {
  485. InvokeClient.Instance.Service.DoOperation($"{Module}.InitializeAll");
  486. }
  487. }
  488. }