IO1ViewModel.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. using System.Collections.Generic;
  2. using System.Collections.ObjectModel;
  3. using System.Windows;
  4. using Aitex.Core.RT.IOCore;
  5. using MECF.Framework.Common.DataCenter;
  6. using MECF.Framework.Common.IOCore;
  7. using MECF.Framework.Common.OperationCenter;
  8. using MECF.Framework.UI.Client.ClientBase;
  9. using OpenSEMI.ClientBase.IO;
  10. namespace FurnaceUI.Models.Maintenances.IO1
  11. {
  12. public class IO1ViewModel : UiViewModelBase, ISupportMultipleSystem
  13. {
  14. public bool IsPermission { get => this.Permission == 3; }
  15. public string SystemName { get; set; }
  16. public Visibility DIVisibility
  17. {
  18. get { return DIs.Count > 0 ? Visibility.Visible : Visibility.Collapsed; }
  19. }
  20. public Visibility DOVisibility
  21. {
  22. get { return DOs.Count > 0 ? Visibility.Visible : Visibility.Collapsed; }
  23. }
  24. public Visibility AIVisibility
  25. {
  26. get { return AIs.Count > 0 ? Visibility.Visible : Visibility.Collapsed; }
  27. }
  28. public Visibility AOVisibility
  29. {
  30. get { return AOs.Count > 0 ? Visibility.Visible : Visibility.Collapsed; }
  31. }
  32. public int DIWidth
  33. {
  34. get { return (DIs.Count / 31 + 1) * 355; }
  35. }
  36. public int DOWidth
  37. {
  38. get { return (DOs.Count / 31 + 1) * 405; }
  39. }
  40. public int AIWidth
  41. {
  42. get { return (AIs.Count / 31 + 1) * 550; }
  43. }
  44. public int AOWidth
  45. {
  46. get { return (AOs.Count / 31 + 1) * 370; }
  47. }
  48. public ObservableCollection<IOItem<float>> AIs { get; private set; }
  49. public ObservableCollection<AOItemFloat> AOs { get; private set; }
  50. public ObservableCollection<IOItem<bool>> DIs { get; private set; }
  51. public ObservableCollection<IOItem<bool>> DOs { get; private set; }
  52. private string _diKey;
  53. private string _doKey;
  54. private string _aiKey;
  55. private string _aoKey;
  56. private List<string> _fitlerIOKey;
  57. protected override void OnInitialize()
  58. {
  59. base.OnInitialize();
  60. LoadFitlerIOData();
  61. _diKey = $"{SystemName}.DIItemList";
  62. _doKey = $"{SystemName}.DOItemList";
  63. _aiKey = $"{SystemName}.AIItemList";
  64. _aoKey = $"{SystemName}.AOItemList";
  65. this.AIs = InitIOData<float>(IOType.AI, _aiKey);
  66. this.AOs = InitIOData(IOType.AO, _aoKey);
  67. this.DIs = InitIOData<bool>(IOType.DI, _diKey);
  68. this.DOs = InitIOData<bool>(IOType.DO, _doKey);
  69. _diKey = $"{SystemName}.DIList";
  70. _doKey = $"{SystemName}.DOList";
  71. _aiKey = $"{SystemName}.AIList";
  72. _aoKey = $"{SystemName}.AOList";
  73. Subscribe(_aiKey);
  74. Subscribe(_aoKey);
  75. Subscribe(_diKey);
  76. Subscribe(_doKey);
  77. }
  78. protected override void OnActivate()
  79. {
  80. base.OnActivate();
  81. }
  82. protected override void OnDeactivate(bool close)
  83. {
  84. base.OnDeactivate(close);
  85. }
  86. protected override void InvokeAfterUpdateProperty(Dictionary<string, object> data)
  87. {
  88. base.InvokeAfterUpdateProperty(data);
  89. if (data.ContainsKey(_aiKey)&&data[_aiKey] != null)
  90. {
  91. List<NotifiableIoItem> lstData = (List<NotifiableIoItem>)data[_aiKey];
  92. Dictionary<string, float> dicValues = new Dictionary<string, float>();
  93. for (int i = 0; i < lstData.Count; i++)
  94. {
  95. dicValues[lstData[i].Name] = lstData[i].FloatValue;
  96. }
  97. foreach (IOItem<float> item in AIs)
  98. {
  99. if (dicValues.ContainsKey(item.Name))
  100. item.Value = dicValues[item.Name];
  101. }
  102. }
  103. if (data.ContainsKey(_aoKey) && data[_aoKey] != null)
  104. {
  105. List<NotifiableIoItem> lstData = (List<NotifiableIoItem>)data[_aoKey];
  106. Dictionary<string, float> dicValues = new Dictionary<string, float>();
  107. for (int i = 0; i < lstData.Count; i++)
  108. {
  109. dicValues[lstData[i].Name] = lstData[i].FloatValue;
  110. }
  111. foreach (IOItem<float> item in AOs)
  112. {
  113. if (dicValues.ContainsKey(item.Name))
  114. item.Value = dicValues[item.Name];
  115. }
  116. }
  117. if (data.ContainsKey(_diKey) && data[_diKey] != null)
  118. {
  119. List<NotifiableIoItem> lstData = (List<NotifiableIoItem>)data[_diKey];
  120. Dictionary<string, bool> dicValues = new Dictionary<string, bool>();
  121. for (int i = 0; i < lstData.Count; i++)
  122. {
  123. dicValues[lstData[i].Name] = lstData[i].BoolValue;
  124. }
  125. foreach (IOItem<bool> item in DIs)
  126. {
  127. if (dicValues.ContainsKey(item.Name))
  128. item.Value = dicValues[item.Name];
  129. }
  130. }
  131. if (data.ContainsKey(_doKey) && data[_doKey] != null)
  132. {
  133. List<NotifiableIoItem> lstData = (List<NotifiableIoItem>)data[_doKey];
  134. Dictionary<string, bool> dicValues = new Dictionary<string, bool>();
  135. for (int i = 0; i < lstData.Count; i++)
  136. {
  137. dicValues[lstData[i].Name] = lstData[i].BoolValue;
  138. }
  139. foreach (IOItem<bool> item in DOs)
  140. {
  141. if (dicValues.ContainsKey(item.Name))
  142. item.Value = dicValues[item.Name];
  143. }
  144. }
  145. }
  146. public void SetDO(IOItem<bool> doItem)
  147. {
  148. if (MessageBox.Show(
  149. $"Please be attention, direct control DO is generally forbidden, Are you sure you want to do the operation?\r\n {doItem.Name} = {!doItem.Value}",
  150. "Warning", MessageBoxButton.YesNo, MessageBoxImage.Warning) != MessageBoxResult.Yes)
  151. return;
  152. InvokeClient.Instance.Service.DoOperation("System.SetDoValue", doItem.Name, !doItem.Value);
  153. }
  154. public void SetAO(AOItemFloat aoItem)
  155. {
  156. if (MessageBox.Show(
  157. $"Please be attention, direct control AO is generally forbidden, Are you sure you want to do the operation?\r\n {aoItem.Name} = {aoItem.NewValueFloat}",
  158. "Warning", MessageBoxButton.YesNo, MessageBoxImage.Warning) != MessageBoxResult.Yes)
  159. return;
  160. InvokeClient.Instance.Service.DoOperation("System.SetAoValueFloat", aoItem.Name, aoItem.NewValueFloat);
  161. aoItem.TextSavedFloat = true;
  162. }
  163. public ObservableCollection<IOItem<T>> InitIOData<T>(IOType type, string dataName)
  164. {
  165. //get the whole informations
  166. ObservableCollection<IOItem<T>> da = new ObservableCollection<IOItem<T>>();
  167. if (type == IOType.DI)
  168. {
  169. var diList = QueryDataClient.Instance.Service.GetData(dataName);
  170. if (diList != null)
  171. {
  172. List<NotifiableIoItem> di = (List<NotifiableIoItem>)diList;
  173. for (int i = 0; i < di.Count; i++)
  174. {
  175. bool value = true;
  176. if (value is T && !_fitlerIOKey.Contains(di[i].Name))
  177. {
  178. da.Add(new IOItem<T>()
  179. {
  180. Index = da.Count,
  181. Name = di[i].Name,
  182. //DisplayName = di[i].Name.Substring(di[i].Name.IndexOf('.') + 1),
  183. DisplayName = di[i].Description,
  184. Value = (T)(object)di[i].BoolValue,
  185. Address = di[i].Address
  186. }) ;
  187. }
  188. }
  189. }
  190. }
  191. if (type == IOType.DO)
  192. {
  193. var diList = QueryDataClient.Instance.Service.GetData(dataName);
  194. if (diList != null)
  195. {
  196. List<NotifiableIoItem> item = (List<NotifiableIoItem>)diList;
  197. for (int i = 0; i < item.Count; i++)
  198. {
  199. bool value = true;
  200. if (value is T)
  201. {
  202. da.Add(new IOItem<T>()
  203. {
  204. Index = da.Count,
  205. Name = item[i].Name ,
  206. //DisplayName = item[i].Name.Substring(item[i].Name.IndexOf('.') + 1),
  207. DisplayName = item[i].Description,
  208. Value = (T)(object)item[i].BoolValue,
  209. Address = item[i].Address
  210. });
  211. }
  212. }
  213. }
  214. }
  215. if (type == IOType.AI)
  216. {
  217. var diList = QueryDataClient.Instance.Service.GetData(dataName);
  218. if (diList != null)
  219. {
  220. List<NotifiableIoItem> item = (List<NotifiableIoItem>)diList;
  221. for (int i = 0; i < item.Count; i++)
  222. {
  223. da.Add(new IOItem<T>()
  224. {
  225. Index = da.Count,
  226. Name = item[i].Name ,
  227. //DisplayName = item[i].Name.Substring(item[i].Name.IndexOf('.') + 1),
  228. DisplayName = item[i].Description,
  229. Value = (T)(object)item[i].FloatValue,
  230. Address = item[i].Address
  231. });
  232. }
  233. }
  234. }
  235. return da;
  236. }
  237. public ObservableCollection<AOItemFloat> InitIOData(IOType type, string dataName)
  238. {
  239. //get the whole informations
  240. ObservableCollection<AOItemFloat> da = new ObservableCollection<AOItemFloat>();
  241. if (type == IOType.AO)
  242. {
  243. var diList = QueryDataClient.Instance.Service.GetData(dataName);
  244. if (diList != null)
  245. {
  246. List<NotifiableIoItem> item = (List<NotifiableIoItem>)diList;
  247. for (int i = 0; i < item.Count; i++)
  248. {
  249. {
  250. da.Add(new AOItemFloat()
  251. {
  252. Index = da.Count,
  253. Name = item[i].Name ,
  254. //DisplayName = item[i].Name.Substring(item[i].Name.IndexOf('.') + 1),
  255. DisplayName = item[i].Description,
  256. Value = item[i].FloatValue,
  257. Address = item[i].Address
  258. });
  259. }
  260. }
  261. }
  262. }
  263. return da;
  264. }
  265. private void LoadFitlerIOData()
  266. {
  267. _fitlerIOKey = new List<string>();
  268. //{
  269. // "EFEM.DI_LightCurtainsStateEFEM",
  270. // "EFEM.DI_CDAPressureSensorState",
  271. // "EFEM.DI_EMOState",
  272. // "EFEM.DI_SafeDoorState",
  273. // "EFEM.DI_SystemPowerONState",
  274. // "EFEM.DI_CSFfuOK",
  275. // "EFEM.DI_IOPortFfuOK",
  276. // "EFEM.DI_IOBtmExhFanOK",
  277. // "EFEM.DI_FncExhFanOK",
  278. // "EFEM.DI_Station1PresenceSensor",
  279. // "EFEM.DI_Station2PresenceSensor",
  280. // "EFEM.DI_Station3PresenceSensor",
  281. // "EFEM.DI_Station4PresenceSensor",
  282. // "EFEM.DI_Station5PresenceSensor",
  283. // "EFEM.DI_Station6PresenceSensor",
  284. // "EFEM.DI_Station7PresenceSensor",
  285. // "EFEM.DI_Station8PresenceSensor",
  286. // "EFEM.DI_Station9PresenceSensor",
  287. // "EFEM.DI_Station10PresenceSensor",
  288. // "EFEM.DI_Station11PresenceSensor",
  289. // "EFEM.DI_Station12PresenceSensor",
  290. // "EFEM.DI_Station13PresenceSensor",
  291. // "EFEM.DI_Station14PresenceSensor",
  292. // "EFEM.DI_Station15PresenceSensor",
  293. // "EFEM.DI_Station16PresenceSensor",
  294. // "EFEM.DI_Station17PresenceSensor",
  295. // "EFEM.DI_Station18PresenceSensor",
  296. // "EFEM.DI_Station19PresenceSensor",
  297. // "EFEM.DI_Station20PresenceSensor",
  298. // "EFEM.DI_Station21PresenceSensor",
  299. // "EFEM.DI_CassetteProtrusionSensor1",
  300. // "EFEM.DI_CassetteProtrusionSensor2",
  301. // "EFEM.DI_CassetteProtrusionSensor3",
  302. // "EFEM.DI_CassetteProtrusionSensor4",
  303. // "EFEM.DI_CassetteProtrusionSensor5",
  304. // "EFEM.DI_CassetteProtrusionSensor6",
  305. // "EFEM.DI_CassetteProtrusionSensor7",
  306. // "EFEM.DI_CassetteProtrusionSensor8",
  307. // "EFEM.DI_CassetteProtrusionSensor9",
  308. // "EFEM.DI_Stage1LockPosition",
  309. // "EFEM.DI_Stage1UnlockPosition",
  310. // "EFEM.DI_Stage2LockPosition",
  311. // "EFEM.DI_Stage2UnlockPosition",
  312. // "EFEM.DI_Stage1CASSPresenceSensor",
  313. // "EFEM.DI_Stage2CASSPresenceSensor",
  314. // "EFEM.DI_R3NotExtendToStage1",
  315. // "EFEM.DI_R3NotExtendToStage2",
  316. // "EFEM.DI_R5NotExtendToStage1",
  317. // "EFEM.DI_R5NotExtendToStage2",
  318. // "MF.DI_ASOpenPosition",
  319. // "MF.DI_ASClosePosition",
  320. // "MF.DI_ASUpPosition",
  321. // "MF.DI_ASDownPosition",
  322. // "MF.DI_ASOpenStatus",
  323. // "MF.DI_ASTiltStatus",
  324. // "MF.DI_SideDoorFfuOK",
  325. // "MF.DI_ZAxisUpLimit",
  326. // "MF.DI_ZAxisDownLimit",
  327. // "MF.DI_BEHumanInterlockSensor",
  328. // "MF.DI_CapCloseSensor",
  329. // "MF.DI_Zone1Sensor",
  330. // "MF.DI_Zone2Sensor",
  331. // "MF.DI_R5ArmNotExtendToBE",
  332. // "MF.DI_CapILOK",
  333. // "MF.DI_PPPosition",
  334. // "MF.DI_HomePosition",
  335. // "PM1.DI_A_SClosePosition",
  336. // "SMIF.DI_LightCurtainsStateSMIF",
  337. // "SMIF.DI_Smif1PodLockPosition",
  338. // "SMIF.DI_Smif1PodUnlockPositionSersor",
  339. // "SMIF.DI_Smif1PodOpenPositionSensor",
  340. // "SMIF.DI_Smif1PodClosePositionSensor",
  341. // "SMIF.DI_Smif1PodPresenceSensor",
  342. // "SMIF.DI_Smif1ZAxisUnloadPositionSensor",
  343. // "SMIF.DI_Smif1ZAxisLoadPositionSensor",
  344. // "SMIF.DI_Smif1ZAxisPosition1Sensor",
  345. // "SMIF.DI_Smif1ZAxisPosition2Sensor",
  346. // "SMIF.DI_Smif1RotateAxisCheckSensor1",
  347. // "SMIF.DI_Smif1RotateAxisCheckSensor2",
  348. // "SMIF.DI_Smif1SlideAxisExtendSensor",
  349. // "SMIF.DI_Smif1SlideAxisRetractSensor",
  350. // "SMIF.DI_Smif1ProtrudedWaferSensor",
  351. // "SMIF.DI_Smif1MappingSensor",
  352. // "SMIF.DI_Smif2PodLockPosition",
  353. // "SMIF.DI_Smif2PodUnlockPositionSersor",
  354. // "SMIF.DI_Smif2PodOpenPositionSensor",
  355. // "SMIF.DI_Smif2PodClosePositionSensor",
  356. // "SMIF.DI_Smif2PodPresenceSensor",
  357. // "SMIF.DI_Smif2ZAxisUnloadPositionSensor",
  358. // "SMIF.DI_Smif2ZAxisLoadPositionSensor",
  359. // "SMIF.DI_Smif2ZAxisPosition1Sensor",
  360. // "SMIF.DI_Smif2ZAxisPosition2Sensor",
  361. // "SMIF.DI_Smif2RotateAxisCheckSensor1",
  362. // "SMIF.DI_Smif2RotateAxisCheckSensor2",
  363. // "SMIF.DI_Smif2SlideAxisExtendSensor",
  364. // "SMIF.DI_Smif2SlideAxisRetractSensor",
  365. // "SMIF.DI_Smif2ProtrudedWaferSensor",
  366. // "SMIF.DI_Smif2MappingSensor",
  367. // "SMIF.DI_SmifFfuOK",
  368. // "SMIF.DI_R3ArmNotExtendToSmif1",
  369. // "SMIF.DI_R3ArmNotExtendToSmif2",
  370. //};
  371. }
  372. }
  373. }