PrewetHomePageViewModel.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Windows.Data;
  7. using System.Windows.Input;
  8. using System.Windows.Threading;
  9. using MECF.Framework.Common.OperationCenter;
  10. using Prism.Mvvm;
  11. using Prism.Commands;
  12. using Aitex.Core.RT.DataCenter;
  13. using MECF.Framework.Common.CommonData.PUF;
  14. using MECF.Framework.Common.DataCenter;
  15. using MECF.Framework.Common.Utilities;
  16. using MECF.Framework.Common.RecipeCenter;
  17. using System.Collections.ObjectModel;
  18. using PunkHPX8_MainPages.PMs;
  19. using Aitex.Core.Utilities;
  20. using PunkHPX8_Core;
  21. using System.Windows.Documents;
  22. using System.Windows;
  23. using MECF.Framework.Common.CommonData.Prewet;
  24. using MECF.Framework.Common.Persistent.Prewet;
  25. using MECF.Framework.Common.Device.LinMot;
  26. using Aitex.Core.RT.RecipeCenter;
  27. using MECF.Framework.Common.Device.ResistivityProbe;
  28. using MECF.Framework.Common.Equipment;
  29. namespace PunkHPX8_MainPages.ViewModels
  30. {
  31. internal class PrewetHomePageViewModel : BindableBase
  32. {
  33. #region 常量
  34. private const string PUMP_DATA = "PumpData";
  35. private const string PWT = "pwt";
  36. private const string PERSISTENT_VALUE = "PersistentValue";
  37. #endregion
  38. #region 内部变量
  39. #region Common
  40. /// <summary>
  41. /// 模块名称
  42. /// </summary>
  43. private string _module;
  44. /// <summary>
  45. /// StateMachine
  46. /// </summary>
  47. private string _stateMachine;
  48. /// <summary>
  49. /// Status
  50. /// </summary>
  51. private string _status;
  52. /// <summary>
  53. /// 数据
  54. /// </summary>
  55. private PrewetPumpData _prewetPumpData;
  56. /// <summary>
  57. /// Threshold
  58. /// </summary>
  59. private PrewetPersistentValue _prewetPersistent;
  60. /// <summary>
  61. /// KepWetLimitTime
  62. /// </summary>
  63. private int _keepWetLimitTime;
  64. /// <summary>
  65. /// 当前选择Recipe节点
  66. /// </summary>
  67. private RecipeNode _selectedRecipeNode;
  68. /// <summary>
  69. /// 选中的Recipe文件的Linmot扫描次数
  70. /// </summary>
  71. private int _numberOfRecipeScans;
  72. /// <summary>
  73. /// Linmot RunRecipeTotalScanComplete
  74. /// </summary>
  75. private int _scanComplete;
  76. /// <summary>
  77. /// 是否是Manual模式
  78. /// </summary>
  79. private bool _isManualOperationMode;
  80. #endregion
  81. #region Motion
  82. /// <summary>
  83. /// 当前位置
  84. /// </summary>
  85. private double _linmotCurrentPosition;
  86. /// <summary>
  87. /// Linmot ScanCount
  88. /// </summary>
  89. private int _scanCount;
  90. /// <summary>
  91. /// Linmot StatusWord
  92. /// </summary>
  93. private short _statusWord;
  94. /// <summary>
  95. /// UpMaxSpeed
  96. /// </summary>
  97. private double _upMaxSpeed;
  98. /// <summary>
  99. /// LinmotDeviceData
  100. /// </summary>
  101. private LinMotDeviceData _linMotDeviceData;
  102. /// <summary>
  103. /// LinmotName
  104. /// </summary>
  105. private string _linmotName;
  106. #endregion
  107. #region UI
  108. /// <summary>
  109. /// Linmot UI Y轴位置
  110. /// </summary>
  111. private double _uiLinmotYPosition = 60.0;
  112. /// <summary>
  113. /// IsErrorState 用于腔体变红
  114. /// </summary>
  115. private bool _isErrorState;
  116. /// <summary>
  117. /// 页面功能启用
  118. /// </summary>
  119. private bool _isEnabled;
  120. /// <summary>
  121. /// AutoMode页面功能启用
  122. /// </summary>
  123. private bool _isAutoEnabled;
  124. /// <summary>
  125. /// 是否存在WaferHolder
  126. /// </summary>
  127. private bool _isWaferHolder;
  128. #endregion
  129. #region Wafer Holder
  130. /// <summary>
  131. /// SeqRecipe
  132. /// </summary>
  133. private string _seqRecipe;
  134. #endregion
  135. #region 系统数据
  136. /// <summary>
  137. /// 定时器
  138. /// </summary>
  139. DispatcherTimer _timer;
  140. /// <summary>
  141. /// 查询后台数据集合
  142. /// </summary>
  143. private List<string> _rtDataKeys = new List<string>();
  144. /// <summary>
  145. /// rt查询key数值字典
  146. /// </summary>
  147. private Dictionary<string, object> _rtDataValueDic = new Dictionary<string, object>();
  148. #endregion
  149. #region PreWet1
  150. /// <summary>
  151. /// RecipeContent
  152. /// </summary>
  153. private string _recipeContent;
  154. /// <summary>
  155. /// TimeRemaining
  156. /// </summary>
  157. private int _timeRemaining;
  158. /// <summary>
  159. /// OfTotalTime
  160. /// </summary>
  161. private int _totalTime;
  162. /// <summary>
  163. /// OperatingMode
  164. /// </summary>
  165. private string _operatingMode;
  166. /// <summary>
  167. /// State Machine
  168. /// </summary>
  169. private string _state;
  170. /// <summary>
  171. /// RecipeMode
  172. /// </summary>
  173. private string _recipeMode;
  174. #endregion
  175. #region PWT recipe
  176. /// <summary>
  177. /// RecipeModuleName
  178. /// </summary>
  179. private string _recipeModuleName;
  180. /// <summary>
  181. /// RecipeType
  182. /// </summary>
  183. private string _recipeType;
  184. /// <summary>
  185. /// AchievedRunRecipeCycle
  186. /// </summary>
  187. private int _achievedRunRecipeCycle;
  188. /// <summary>
  189. /// 当前Recipe
  190. /// </summary>
  191. private string _currentRecipe;
  192. #endregion
  193. #endregion
  194. #region 属性
  195. #region Common
  196. /// <summary>
  197. /// 模块名称
  198. /// </summary>
  199. public string Module { get { return _module; } set { SetProperty(ref _module, value); } }
  200. /// <summary>
  201. /// StateMachine
  202. /// </summary>
  203. public string StateMachine { get { return _stateMachine; } set { SetProperty(ref _stateMachine, value); } }
  204. /// <summary>
  205. /// Status
  206. /// </summary>
  207. public string Status { get { return _status; } set { SetProperty(ref _status, value); } }
  208. /// <summary>
  209. /// Commondata
  210. /// </summary>
  211. public PrewetPumpData PrewetPumpData
  212. {
  213. get { return _prewetPumpData; }
  214. set { SetProperty(ref _prewetPumpData, value); }
  215. }
  216. /// <summary>
  217. /// KeepWetLimitTime
  218. /// </summary>
  219. public int KeepWetLimitTime { get { return _keepWetLimitTime; } set { SetProperty(ref _keepWetLimitTime, value); } }
  220. /// <summary>
  221. /// 选中的Recipe文件的Linmot扫描次数
  222. /// </summary>
  223. public int NumberOfRecipeScans { get { return _numberOfRecipeScans; } set { SetProperty(ref _numberOfRecipeScans, value); } }
  224. /// <summary>
  225. /// Linmot RunRecipeTotalScanComplete
  226. /// </summary>
  227. public int ScanComplete { get { return _scanComplete; } set { SetProperty(ref _scanComplete, value); } }
  228. /// <summary>
  229. /// Threshold
  230. /// </summary>
  231. public PrewetPersistentValue PrewetPersistent
  232. {
  233. get { return _prewetPersistent; }
  234. set { SetProperty(ref _prewetPersistent, value); }
  235. }
  236. public RecipeNode SelectedRecipeNode
  237. {
  238. get { return _selectedRecipeNode; }
  239. set { SetProperty(ref _selectedRecipeNode, value); }
  240. }
  241. /// <summary>
  242. /// 是否是Manual模式
  243. /// </summary>
  244. public bool IsManualOperationMode { get { return _isManualOperationMode; } set { SetProperty(ref _isManualOperationMode, value); } }
  245. #endregion
  246. #region Motion
  247. /// <summary>
  248. /// 当前位置
  249. /// </summary>
  250. public double LinmotCurrentPosition { get { return _linmotCurrentPosition; } set { SetProperty(ref _linmotCurrentPosition, value); } }
  251. /// <summary>
  252. /// Linmot Scan次数
  253. /// </summary>
  254. public int ScanCount { get { return _scanCount; } set { SetProperty(ref _scanCount, value); } }
  255. /// <summary>
  256. /// Linmot StatusWord
  257. /// </summary>
  258. public short StatusWord { get { return _statusWord; } set { SetProperty(ref _statusWord, value); } }
  259. /// <summary>
  260. /// LinMotDeviceData
  261. /// </summary>
  262. public LinMotDeviceData LinmotDeviceCommonData { get { return _linMotDeviceData; } set { SetProperty(ref _linMotDeviceData, value); } }
  263. /// <summary>
  264. /// UpMaxSpeed
  265. /// </summary>
  266. public double UpMaxSpeed { get { return _upMaxSpeed; } set { SetProperty(ref _upMaxSpeed, value); } }
  267. /// <summary>
  268. /// LinmotName
  269. /// </summary>
  270. public string LinmotName { get { return _linmotName; } set { SetProperty(ref _linmotName, value); } }
  271. #endregion
  272. #region UI
  273. /// <summary>
  274. /// Linmot UI Y轴位置
  275. /// </summary>
  276. public double UILinmotYPosition { get { return _uiLinmotYPosition; } set { SetProperty(ref _uiLinmotYPosition, value); } }
  277. /// <summary>
  278. /// IsErrorState
  279. /// </summary>
  280. public bool IsErrorState { get { return _isErrorState; } set { SetProperty(ref _isErrorState, value); } }
  281. /// <summary>
  282. /// 页面功能启用
  283. /// </summary>
  284. public bool IsEnabled
  285. {
  286. get { return _isEnabled; }
  287. set { SetProperty(ref _isEnabled, value); }
  288. }
  289. /// <summary>
  290. /// AutoMode页面功能启用
  291. /// </summary>
  292. public bool IsAutoEnabled
  293. {
  294. get { return _isAutoEnabled; }
  295. set { SetProperty(ref _isAutoEnabled, value); }
  296. }
  297. /// <summary>
  298. /// 是否存在WaferHolder
  299. /// </summary>
  300. public bool IsWaferHolder { get { return _isWaferHolder; } set { SetProperty(ref _isWaferHolder, value); } }
  301. #endregion
  302. #region Prewet1
  303. /// <summary>
  304. /// RecipeContent
  305. /// </summary>
  306. public string RecipeContent
  307. {
  308. get { return _recipeContent; }
  309. set { SetProperty(ref _recipeContent, value); }
  310. }
  311. /// <summary>
  312. /// TimeRemaining
  313. /// </summary>
  314. public int TimeRemaining
  315. {
  316. get { return _timeRemaining; }
  317. set { SetProperty(ref _timeRemaining, value); }
  318. }
  319. /// <summary>
  320. /// TotalTime
  321. /// </summary>
  322. public int TotalTime
  323. {
  324. get { return _totalTime; }
  325. set { SetProperty(ref _totalTime, value); }
  326. }
  327. /// <summary>
  328. /// OperatingMode
  329. /// </summary>
  330. public string OperatingMode
  331. {
  332. get { return _operatingMode; }
  333. set { SetProperty(ref _operatingMode, value); }
  334. }
  335. /// <summary>
  336. /// State
  337. /// </summary>
  338. public string State
  339. {
  340. get { return _state; }
  341. set { SetProperty(ref _state, value); }
  342. }
  343. /// <summary>
  344. /// RecipeMode
  345. /// </summary>
  346. public string RecipeMode
  347. {
  348. get { return _recipeMode; }
  349. set { SetProperty(ref _recipeMode, value); }
  350. }
  351. #endregion
  352. #region PWT recipe
  353. /// <summary>
  354. /// RecipeModuleName
  355. /// </summary>
  356. public string RecipeModuleName
  357. {
  358. get { return _recipeModuleName; }
  359. set { SetProperty(ref _recipeModuleName, value); }
  360. }
  361. /// <summary>
  362. /// RecipeType
  363. /// </summary>
  364. public string RecipeType
  365. {
  366. get { return _recipeType; }
  367. set { SetProperty(ref _recipeType, value); }
  368. }
  369. public int AchievedRunRecipeCycle
  370. {
  371. get { return _achievedRunRecipeCycle; }
  372. set { SetProperty(ref _achievedRunRecipeCycle, value); }
  373. }
  374. /// <summary>
  375. /// 当前运行的Recipe
  376. /// </summary>
  377. public string CurrentRecipe
  378. {
  379. get { return _currentRecipe; }
  380. set { SetProperty(ref _currentRecipe, value); }
  381. }
  382. #endregion
  383. #region Wafer Holder
  384. /// <summary>
  385. /// SeqRecipe
  386. /// </summary>
  387. public string SeqRecipe
  388. {
  389. get { return _seqRecipe; }
  390. set { SetProperty(ref _seqRecipe, value); }
  391. }
  392. #endregion
  393. #endregion
  394. #region Command指令
  395. public ICommand InitializeCommand { get; set; }
  396. #endregion
  397. /// <summary>
  398. /// 构造函数
  399. /// </summary>
  400. public PrewetHomePageViewModel()
  401. {
  402. InitializeCommand = new DelegateCommand<object>(InitializeAction);
  403. }
  404. /// <summary>
  405. /// 加载数据
  406. /// </summary>
  407. public void LoadData(string systemName)
  408. {
  409. Module = systemName;
  410. RecipeModuleName = "PWT Recipe";
  411. RecipeType = "pwt";
  412. _rtDataKeys.Clear();
  413. List<string> lst = new List<string>();
  414. lst.Add($"{Module}.LinmotName");
  415. _rtDataValueDic = QueryDataClient.Instance.Service.PollData(lst);
  416. if (_rtDataValueDic != null)
  417. {
  418. LinmotName = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.LinmotName");
  419. if (!string.IsNullOrEmpty(LinmotName))
  420. {
  421. _rtDataKeys.Add($"{LinmotName}.ScanCount");
  422. _rtDataKeys.Add($"{LinmotName}.StatusWord");
  423. _rtDataKeys.Add($"{LinmotName}.Position");
  424. _rtDataKeys.Add($"{LinmotName}.CurrentPrewetUIPostion");
  425. }
  426. }
  427. _rtDataKeys.Add($"{Module}.WaferHolder");
  428. _rtDataKeys.Add($"{Module}.SequenceRecipe");
  429. _rtDataKeys.Add($"{Module}.AchievedCycle");
  430. _rtDataKeys.Add($"{Module}.GetKeepWetLimit");
  431. _rtDataKeys.Add($"{Module}.{PERSISTENT_VALUE}");
  432. _rtDataKeys.Add($"{Module}.{PUMP_DATA}");
  433. _rtDataKeys.Add($"{Module}.FsmState");
  434. _rtDataKeys.Add($"{Module}.TotalTime");
  435. _rtDataKeys.Add($"{Module}.TimeRemain");
  436. _rtDataKeys.Add($"{Module}.LinmotDeviceData");
  437. _rtDataKeys.Add($"{Module}.CurrentStateMachine");
  438. _rtDataKeys.Add($"{Module}.CurrentStatus");
  439. _rtDataKeys.Add($"{Module}.CurrentRecipe");
  440. if (_timer == null)
  441. {
  442. _timer = new DispatcherTimer();
  443. _timer.Interval = TimeSpan.FromMilliseconds(200);
  444. _timer.Tick += Timer_Tick;
  445. }
  446. _timer.Start();
  447. }
  448. /// <summary>
  449. /// 定时器执行
  450. /// </summary>
  451. /// <param name="sender"></param>
  452. /// <param name="e"></param>
  453. private void Timer_Tick(object sender, EventArgs e)
  454. {
  455. //if (_rtDataKeys.Count != 0)
  456. //{
  457. // _rtDataValueDic = QueryDataClient.Instance.Service.PollData(_rtDataKeys);
  458. // if (_rtDataValueDic != null)
  459. // {
  460. // PrewetPumpData = CommonFunction.GetValue<PrewetPumpData>(_rtDataValueDic, $"{Module}.{PUMP_DATA}");
  461. // SeqRecipe = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.SequenceRecipe");
  462. // AchievedRunRecipeCycle = CommonFunction.GetValue<int>(_rtDataValueDic, $"{Module}.AchievedCycle");
  463. // //获取的是配置文件中keepwet开始的等待时间,后续倒计时实现在后端实现
  464. // KeepWetLimitTime = CommonFunction.GetValue<int>(_rtDataValueDic, $"{Module}.GetKeepWetLimit");
  465. // PrewetPersistent = CommonFunction.GetValue<PrewetPersistentValue>(_rtDataValueDic, $"{Module}.{PERSISTENT_VALUE}");
  466. // State = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.FsmState");
  467. // if ("Manual".Equals(PrewetPersistent.OperatingMode))
  468. // {
  469. // IsEnabled = true;
  470. // IsAutoEnabled = true;
  471. // }
  472. // else if ("Auto".Equals(PrewetPersistent.OperatingMode))
  473. // {
  474. // IsAutoEnabled = true;
  475. // IsEnabled = false;
  476. // }
  477. // else
  478. // {
  479. // State = "Stopped";
  480. // IsEnabled = false;
  481. // IsAutoEnabled = false;
  482. // }
  483. // StateMachine = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.CurrentStateMachine");
  484. // Status = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.CurrentStatus");
  485. // LinmotDeviceCommonData = CommonFunction.GetValue<LinMotDeviceData>(_rtDataValueDic, $"{Module}.LinmotDeviceData");
  486. // UpMaxSpeed = LinmotDeviceCommonData.UpMaxSpeed / 1000;
  487. // if(!string.IsNullOrEmpty(LinmotName))
  488. // {
  489. // ScanCount = CommonFunction.GetValue<int>(_rtDataValueDic, $"{LinmotName}.ScanCount");
  490. // StatusWord = CommonFunction.GetValue<short>(_rtDataValueDic, $"{LinmotName}.StatusWord");
  491. // LinmotCurrentPosition = CommonFunction.GetValue<double>(_rtDataValueDic, $"{LinmotName}.Position");
  492. // UILinmotYPosition = CommonFunction.GetValue<double>(_rtDataValueDic, $"{LinmotName}.CurrentPrewetUIPostion");
  493. // }
  494. // //Error时UI腔体变红
  495. // IsErrorState = "Error".Equals(State) ? true : false;
  496. // //Recipe Running时Linmot完成完整Scan的计数
  497. // ScanComplete = AchievedRunRecipeCycle * NumberOfRecipeScans + ScanCount;
  498. // if ((StatusWord & 0b010000000000000) >> 13 != 1)
  499. // {
  500. // ScanComplete -= ScanCount;
  501. // }
  502. // CurrentRecipe = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.CurrentRecipe");
  503. // TotalTime = CommonFunction.GetValue<int>(_rtDataValueDic, $"{Module}.TotalTime");
  504. // TimeRemaining = CommonFunction.GetValue<int>(_rtDataValueDic, $"{Module}.TimeRemain");
  505. // TimeRemaining = TimeRemaining < 0 ? 0 : TimeRemaining;
  506. // if (State == "Idle")
  507. // {
  508. // TimeRemaining = 0;
  509. // }
  510. // }
  511. //}
  512. }
  513. /// <summary>
  514. /// 隐藏
  515. /// </summary>
  516. public void Hide()
  517. {
  518. if (_timer != null)
  519. {
  520. _timer.Stop();
  521. }
  522. }
  523. #region 指令Action
  524. /// <summary>
  525. /// Initialize Action
  526. /// </summary>
  527. /// <param name="param"></param>
  528. private void InitializeAction(object param)
  529. {
  530. InvokeClient.Instance.Service.DoOperation($"{Module}.InitializeAll");
  531. }
  532. #endregion
  533. }
  534. }