PlatformViewModel.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  1. //using Aitex.Core.Common;
  2. using Aitex.Core.Common.DeviceData;
  3. using MECF.Framework.Common.DataCenter;
  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 System.Windows;
  14. using System.Windows.Threading;
  15. using Venus_Core;
  16. using Venus_MainPages.Unity;
  17. using Venus_Themes.CustomControls;
  18. using WPF.Themes.UserControls;
  19. namespace Venus_MainPages.ViewModels
  20. {
  21. public class PlatformViewModel : BindableBase
  22. {
  23. #region 私有字段
  24. private bool m_LoadLockDoorIsOpen;
  25. private bool m_LoadLockPumpValveIsOpen;
  26. private bool m_LoadLockVentValveIsOpen;
  27. private bool m_IsATM;
  28. private string ModuleName="PMA";
  29. private List<string> m_RtDataKeys=new List<string> ();
  30. private Dictionary<string, object> m_RtDataValues=new Dictionary<string, object> ();
  31. private bool m_PumpIsOpen;
  32. private int m_PurgeCounter;
  33. private Visibility m_PMAWaferIsVisibility;
  34. private Visibility m_LLAWaferIsVisibility;
  35. private PMState m_PMCurrentState;
  36. private WaferInfo m_LLAWafer;
  37. private WaferInfo m_PMAWafer;
  38. private bool m_WaferInPosSensor;
  39. private bool m_SoftPumpValveIsOpen;
  40. private bool m_FastPumpValveIsOpen;
  41. private bool m_PVHe1ValveIsOpen;
  42. private bool m_PVHe2ValveIsOpen;
  43. private bool m_TurboPumpPumpingValveIsOpen;
  44. private bool m_TurboPumpPurgeValveIsOpen;
  45. private bool m_GuageValveIsOpen;
  46. private bool m_PendulumValveIsOpen;
  47. private bool m_TurboIsOpen;
  48. private int m_PositionValue;
  49. private float m_PendulumValvePosition;
  50. private float m_ProcessHighPressure;
  51. private float m_ProcessLowPressure;
  52. private float m_ForelinePressurePressure;
  53. private int m_TurboPumpRotationalSpeed;
  54. private AITMfcData m_MFCN2Data;
  55. #endregion
  56. #region 属性
  57. public bool WaferInPosSensor
  58. {
  59. get { return m_WaferInPosSensor; }
  60. set
  61. {
  62. if (m_WaferInPosSensor != value)
  63. {
  64. if (value == true && PMCurrentState!=PMState.LLPicking && PMCurrentState != PMState.LLPlacing)
  65. {
  66. InvokeClient.Instance.Service.DoOperation("CreateWafer", "LLA", 1);
  67. }
  68. else if (value == false && PMCurrentState != PMState.LLPicking && PMCurrentState != PMState.LLPlacing)
  69. {
  70. InvokeClient.Instance.Service.DoOperation("DeleteWafer", "LLA", 1);
  71. }
  72. }
  73. SetProperty(ref m_WaferInPosSensor, value);
  74. }
  75. }
  76. public WaferInfo LLAWafer
  77. {
  78. get { return m_LLAWafer; }
  79. set { SetProperty(ref m_LLAWafer, value); }
  80. }
  81. public WaferInfo PMAWafer
  82. {
  83. get { return m_PMAWafer; }
  84. set { SetProperty(ref m_PMAWafer, value); }
  85. }
  86. public bool LoadLockDoorIsOpen
  87. {
  88. get { return m_LoadLockDoorIsOpen; }
  89. set { SetProperty(ref m_LoadLockDoorIsOpen, value); }
  90. }
  91. public bool LoadLockPumpValveIsOpen
  92. {
  93. get { return m_LoadLockPumpValveIsOpen; }
  94. set { SetProperty(ref m_LoadLockPumpValveIsOpen, value); }
  95. }
  96. public bool LoadLockVentValveIsOpen
  97. {
  98. get { return m_LoadLockVentValveIsOpen; }
  99. set { SetProperty(ref m_LoadLockVentValveIsOpen, value); }
  100. }
  101. public bool IsATM
  102. {
  103. get { return m_IsATM; }
  104. set { SetProperty(ref m_IsATM, value); }
  105. }
  106. public Dictionary<string, object> RtDataValues
  107. {
  108. get { return m_RtDataValues; }
  109. set { SetProperty(ref m_RtDataValues, value); }
  110. }
  111. public bool PumpIsOpen
  112. {
  113. get { return m_PumpIsOpen; }
  114. set { SetProperty(ref m_PumpIsOpen, value); }
  115. }
  116. public int PurgeCounter
  117. {
  118. get { return m_PurgeCounter; }
  119. set { SetProperty(ref m_PurgeCounter, value); }
  120. }
  121. public Visibility PMAWaferIsVisibility
  122. {
  123. get { return m_PMAWaferIsVisibility; }
  124. set { SetProperty(ref m_PMAWaferIsVisibility, value); }
  125. }
  126. public Visibility LLAWaferIsVisibility
  127. {
  128. get { return m_LLAWaferIsVisibility; }
  129. set { SetProperty(ref m_LLAWaferIsVisibility, value); }
  130. }
  131. public PMState PMCurrentState
  132. {
  133. get { return m_PMCurrentState; }
  134. set { SetProperty(ref m_PMCurrentState, value); }
  135. }
  136. public bool TurboPumpPumpingValveIsOpen
  137. {
  138. get { return m_TurboPumpPumpingValveIsOpen; }
  139. set { SetProperty(ref m_TurboPumpPumpingValveIsOpen, value); }
  140. }
  141. public bool TurboPumpPurgeValveIsOpen
  142. {
  143. get { return m_TurboPumpPurgeValveIsOpen; }
  144. set { SetProperty(ref m_TurboPumpPurgeValveIsOpen, value); }
  145. }
  146. public bool SoftPumpValveIsOpen
  147. {
  148. get { return m_SoftPumpValveIsOpen; }
  149. set { SetProperty(ref m_SoftPumpValveIsOpen, value); }
  150. }
  151. public bool FastPumpValveIsOpen
  152. {
  153. get { return m_FastPumpValveIsOpen; }
  154. set { SetProperty(ref m_FastPumpValveIsOpen, value); }
  155. }
  156. public bool GuageValveIsOpen
  157. {
  158. get { return m_GuageValveIsOpen; }
  159. set { SetProperty(ref m_GuageValveIsOpen, value); }
  160. }
  161. public bool PendulumValveIsOpen
  162. {
  163. get { return m_PendulumValveIsOpen; }
  164. set { SetProperty(ref m_PendulumValveIsOpen, value); }
  165. }
  166. public bool TurboIsOpen
  167. {
  168. get { return m_TurboIsOpen; }
  169. set { SetProperty(ref m_TurboIsOpen, value); }
  170. }
  171. public bool PVHe1ValveIsOpen
  172. {
  173. get { return m_PVHe1ValveIsOpen; }
  174. set { SetProperty(ref m_PVHe1ValveIsOpen, value); }
  175. }
  176. public bool PVHe2ValveIsOpen
  177. {
  178. get { return m_PVHe2ValveIsOpen; }
  179. set { SetProperty(ref m_PVHe2ValveIsOpen, value); }
  180. }
  181. public int PositionValue
  182. {
  183. get { return m_PositionValue; }
  184. set { SetProperty(ref m_PositionValue, value); }
  185. }
  186. public float PendulumValvePosition
  187. {
  188. get { return m_PendulumValvePosition; }
  189. set { SetProperty(ref m_PendulumValvePosition, value); }
  190. }
  191. public float ProcessHighPressure
  192. {
  193. get { return m_ProcessHighPressure; }
  194. set
  195. {
  196. SetProperty(ref m_ProcessHighPressure, value);
  197. }
  198. }
  199. public float ProcessLowPressure
  200. {
  201. get { return m_ProcessLowPressure; }
  202. set
  203. {
  204. SetProperty(ref m_ProcessLowPressure, value);
  205. }
  206. }
  207. public float ForelinePressure
  208. {
  209. get { return m_ForelinePressurePressure; }
  210. set
  211. {
  212. SetProperty(ref m_ForelinePressurePressure, value);
  213. }
  214. }
  215. public int TurboPumpRotationalSpeed
  216. {
  217. get { return m_TurboPumpRotationalSpeed; }
  218. set
  219. {
  220. SetProperty(ref m_TurboPumpRotationalSpeed, value);
  221. }
  222. }
  223. public AITMfcData MFCN2Data
  224. {
  225. get { return m_MFCN2Data; }
  226. set { SetProperty(ref m_MFCN2Data, value); }
  227. }
  228. #endregion
  229. #region 命令
  230. private DelegateCommand _PurgeCommand;
  231. public DelegateCommand PurgeCommand =>
  232. _PurgeCommand ?? (_PurgeCommand = new DelegateCommand(OnPurge));
  233. private DelegateCommand _VentCommand;
  234. public DelegateCommand VentCommand =>
  235. _VentCommand ?? (_VentCommand = new DelegateCommand(OnVent));
  236. private DelegateCommand _PumpCommand;
  237. public DelegateCommand PumpCommand =>
  238. _PumpCommand ?? (_PumpCommand = new DelegateCommand(OnPump));
  239. private DelegateCommand _OpenPumpCommand;
  240. public DelegateCommand OpenPumpCommand =>
  241. _OpenPumpCommand ?? (_OpenPumpCommand = new DelegateCommand(OnOpenPump));
  242. private DelegateCommand _ClosePumpCommand;
  243. public DelegateCommand ClosePumpCommand =>
  244. _ClosePumpCommand ?? (_ClosePumpCommand = new DelegateCommand(OnClosePump));
  245. private DelegateCommand _OpenDoorCommand;
  246. public DelegateCommand OpenDoorCommand =>
  247. _OpenDoorCommand ?? (_OpenDoorCommand = new DelegateCommand(OnOpenDoor));
  248. private DelegateCommand _CloseDoorCommand;
  249. public DelegateCommand CloseDoorCommand =>
  250. _CloseDoorCommand ?? (_CloseDoorCommand = new DelegateCommand(OnCloseDoor));
  251. private DelegateCommand _NewWaferCommand;
  252. public DelegateCommand NewWaferCommand =>
  253. _NewWaferCommand ?? (_NewWaferCommand = new DelegateCommand(OnNewWafer));
  254. private DelegateCommand _DeleteWaferCommand;
  255. public DelegateCommand DeleteWaferCommand =>
  256. _DeleteWaferCommand ?? (_DeleteWaferCommand = new DelegateCommand(OnDeleteWafer));
  257. private DelegateCommand _PlaceWaferCommand;
  258. public DelegateCommand PlaceWaferCommand =>
  259. _PlaceWaferCommand ?? (_PlaceWaferCommand = new DelegateCommand(OnPlaceWafer));
  260. private DelegateCommand _MoveWaferCommand;
  261. public DelegateCommand MoveWaferCommand =>
  262. _MoveWaferCommand ?? (_MoveWaferCommand = new DelegateCommand(OnMoveWafer));
  263. private DelegateCommand<object> _ControlValveCommand;
  264. public DelegateCommand<object> ControlValveCommand =>
  265. _ControlValveCommand ?? (_ControlValveCommand = new DelegateCommand<object>(OnControlValve));
  266. #endregion
  267. #region 构造函数
  268. public PlatformViewModel()
  269. {
  270. ModuleManager.Initialize();
  271. //m_PMAWaferIsVisibility = Visibility.Collapsed;
  272. //m_IsATM = true;
  273. //var test = RTData.GetRTData().RtDataValues;
  274. addDataKeys();
  275. DispatcherTimer timer = new DispatcherTimer();
  276. timer.Interval = TimeSpan.FromSeconds(0.1);
  277. timer.Tick += timer_Tick;
  278. timer.Start();
  279. }
  280. #endregion
  281. #region 命令方法
  282. private void OnPump()
  283. {
  284. if (PMCurrentState == PMState.PumpingLoadLock)
  285. {
  286. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.Abort}");
  287. }
  288. else
  289. {
  290. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.PumpLoadLock");
  291. }
  292. }
  293. private void OnPurge()
  294. {
  295. if (PMCurrentState == PMState.PurgingLoadLock)
  296. {
  297. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.Abort}");
  298. }
  299. else
  300. {
  301. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.PurgeLoadLock");
  302. }
  303. }
  304. private void OnVent()
  305. {
  306. if (PMCurrentState == PMState.VentingLoadLock)
  307. {
  308. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.Abort}");
  309. }
  310. else
  311. {
  312. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.VentLoadLock");
  313. }
  314. }
  315. private void OnOpenPump()
  316. {
  317. if (RtDataValues[$"{ModuleName}.FsmState"].ToString() == "LaunchingPump")
  318. {
  319. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.Abort}");
  320. return;
  321. }
  322. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.StartPump");
  323. }
  324. private void OnClosePump()
  325. {
  326. //InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.Abort}");
  327. }
  328. private void OnOpenDoor()
  329. {
  330. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.SetSlitDoor",true);
  331. }
  332. private void OnCloseDoor()
  333. {
  334. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.SetSlitDoor",false);
  335. }
  336. private void OnNewWafer()
  337. {
  338. InvokeClient.Instance.Service.DoOperation("CreateWafer", "PMA", 0);
  339. }
  340. private void OnDeleteWafer()
  341. {
  342. InvokeClient.Instance.Service.DoOperation("DeleteWafer", "PMA", 0);
  343. }
  344. private void OnPlaceWafer()
  345. {
  346. if (PMCurrentState == PMState.LLPlacing)
  347. {
  348. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.Abort}");
  349. return;
  350. }
  351. else
  352. {
  353. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.LLPlace}");
  354. }
  355. }
  356. private void OnMoveWafer()
  357. {
  358. if (PMCurrentState == PMState.LLPicking)
  359. {
  360. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.Abort}");
  361. return;
  362. }
  363. else
  364. {
  365. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.LLPick}");
  366. }
  367. }
  368. private void OnControlValve(object obj)
  369. {
  370. CommonValveControl commonValveControl = (CommonValveControl)obj;
  371. if (commonValveControl.IsCanEdit == true)
  372. {
  373. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.ControlValve", Convert.ToInt32(commonValveControl.Tag.ToString()), !commonValveControl.Status);
  374. }
  375. }
  376. #endregion
  377. #region 私有方法
  378. void timer_Tick(object sender, EventArgs e)
  379. {
  380. RtDataValues = QueryDataClient.Instance.Service.PollData(m_RtDataKeys);
  381. LoadLockPumpValveIsOpen = CommonFunction.GetValue<bool>(RtDataValues, $"{ModuleName}.ValveLoadlockPumping.IsOpen");
  382. LoadLockVentValveIsOpen = CommonFunction.GetValue<bool>(RtDataValues, $"{ModuleName}.ValveLoadlockVent.IsOpen");
  383. PumpIsOpen = (bool)RtDataValues[$"{ModuleName}.PumpIsRunning"];
  384. PurgeCounter=(int)RtDataValues[$"{ModuleName}.LoadLockPurge.PurgeCounter"];
  385. LLAWafer = ModuleManager.ModuleInfos["LLA"].WaferManager.Wafers[3];
  386. PMAWafer = ModuleManager.ModuleInfos["PMA"].WaferManager.Wafers[0];
  387. PMCurrentState= (PMState)Enum.Parse(typeof(PMState), RtDataValues[$"{ModuleName}.FsmState"].ToString());
  388. WaferInPosSensor = (bool)RtDataValues[$"{ModuleName}.SensorSmallWaferInPos.Value"];
  389. SoftPumpValveIsOpen = CommonFunction.GetValue<bool>(RtDataValues, $"{ModuleName}.ValveSoftPump.IsOpen");
  390. FastPumpValveIsOpen = CommonFunction.GetValue<bool>(RtDataValues, $"{ModuleName}.ValveFastPump.IsOpen");
  391. GuageValveIsOpen = CommonFunction.GetValue<bool>(RtDataValues, $"{ModuleName}.ValveGuage.IsOpen");
  392. TurboPumpPumpingValveIsOpen = CommonFunction.GetValue<bool>(RtDataValues, $"{ModuleName}.ValveTurboPumpPumping.IsOpen");
  393. TurboPumpPurgeValveIsOpen = CommonFunction.GetValue<bool>(RtDataValues, $"{ModuleName}.ValveTurboPumpPurge.IsOpen");
  394. PVHe1ValveIsOpen = CommonFunction.GetValue<bool>(RtDataValues, $"{ModuleName}.ValvePVHe1.IsOpen");
  395. PVHe2ValveIsOpen = CommonFunction.GetValue<bool>(RtDataValues, $"{ModuleName}.ValvePVHe2.IsOpen");
  396. PumpIsOpen = CommonFunction.GetValue<bool>(RtDataValues, $"{ModuleName}.PumpIsRunning");
  397. TurboIsOpen = CommonFunction.GetValue<bool>(RtDataValues, $"{ModuleName}.TurboPumpIsRunning");
  398. PendulumValvePosition = CommonFunction.GetValue<float>(RtDataValues, $"{ModuleName}.GetPVPosition");
  399. PositionValue = -((int)((PendulumValvePosition) * 0.09));
  400. ProcessHighPressure = CommonFunction.GetValue<float>(RtDataValues, $"{ModuleName}.ProcessHighPressure");
  401. ProcessLowPressure = CommonFunction.GetValue<float>(RtDataValues, $"{ModuleName}.ProcessLowPressure");
  402. ForelinePressure = CommonFunction.GetValue<float>(RtDataValues, $"{ModuleName}.ForelinePressure");
  403. TurboPumpRotationalSpeed = Convert.ToInt32(RtDataValues[$"{ModuleName}.TurboPumpRotationalSpeed"].ToString());
  404. MFCN2Data = CommonFunction.GetValue<AITMfcData>(RtDataValues, $"{ModuleName}.MfcN2");
  405. }
  406. private void addDataKeys()
  407. {
  408. m_RtDataKeys.Add($"{ModuleName}.FsmState");
  409. m_RtDataKeys.Add($"{ModuleName}.ValveLoadlockPumping.IsOpen");
  410. m_RtDataKeys.Add($"{ModuleName}.ValveLoadlockVent.IsOpen");
  411. m_RtDataKeys.Add($"{ModuleName}.PumpIsRunning");
  412. m_RtDataKeys.Add($"{ModuleName}.LoadLockPurge.PurgeCounter");
  413. m_RtDataKeys.Add($"{ModuleName}.IsSlitDoorClosed");
  414. m_RtDataKeys.Add($"{ModuleName}.LoadlockPressure");
  415. m_RtDataKeys.Add($"{ModuleName}.ForelinePressure");
  416. m_RtDataKeys.Add($"{ModuleName}.IsATMLoadlock");
  417. m_RtDataKeys.Add($"{ModuleName}.IsVACLoadlock");
  418. m_RtDataKeys.Add($"PMA.HasWafer");
  419. m_RtDataKeys.Add($"PMA.ModuleWaferList");
  420. m_RtDataKeys.Add($"LLA.HasWafer");
  421. m_RtDataKeys.Add($"LLA.ModuleWaferList");
  422. m_RtDataKeys.Add($"{ModuleName}.SensorSmallWaferInPos.Value");
  423. m_RtDataKeys.Add($"{ModuleName}.ValveSoftPump.IsOpen");
  424. m_RtDataKeys.Add($"{ModuleName}.ValveFastPump.IsOpen");
  425. m_RtDataKeys.Add($"{ModuleName}.ValveN2.IsOpen");
  426. m_RtDataKeys.Add($"{ModuleName}.ValvePVHe1.IsOpen");
  427. m_RtDataKeys.Add($"{ModuleName}.ValvePVHe2.IsOpen");
  428. m_RtDataKeys.Add($"{ModuleName}.ValveTurboPumpPumping.IsOpen");
  429. m_RtDataKeys.Add($"{ModuleName}.ValveTurboPumpPurge.IsOpen");
  430. m_RtDataKeys.Add($"{ModuleName}.ValveGuage.IsOpen");
  431. m_RtDataKeys.Add($"{ModuleName}.TurboPumpIsRunning");
  432. m_RtDataKeys.Add($"{ModuleName}.PumpIsRunning");
  433. m_RtDataKeys.Add($"{ModuleName}.IsATM");
  434. m_RtDataKeys.Add($"{ModuleName}.IsVAC");
  435. m_RtDataKeys.Add($"{ModuleName}.GetPVPosition");
  436. m_RtDataKeys.Add($"{ModuleName}.TurboPumpRotationalSpeed");
  437. m_RtDataKeys.Add($"{ModuleName}.MfcN2");
  438. }
  439. #endregion
  440. }
  441. }