ModuleDataMonitor.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Linq;
  5. using System.Threading;
  6. using System.Windows;
  7. using System.Windows.Threading;
  8. using Aitex.Core.RT.Log;
  9. using Aitex.Core.Util;
  10. using MECF.Framework.Common.DataCenter;
  11. using MECF.Framework.Common.OperationCenter;
  12. using RTDefine = Aitex.Core.Common;
  13. namespace MECF.Framework.UI.Client.ClientBase
  14. {
  15. public class ModuleDataMonitor
  16. {
  17. public Dictionary<string, ModuleInfo> _mapWaferDataModule = new Dictionary<string, ModuleInfo>();
  18. public List<string> _lstWaferDataName = new List<string>();
  19. private PeriodicJob _monitorThread;
  20. public ModuleDataMonitor()
  21. {
  22. foreach (var moduleInfo in ModuleManager.ModuleInfos)
  23. {
  24. if (!string.IsNullOrEmpty(moduleInfo.Value.WaferDataName))
  25. {
  26. _lstWaferDataName.Add(moduleInfo.Value.WaferDataName);
  27. _mapWaferDataModule[moduleInfo.Value.WaferDataName] = moduleInfo.Value;
  28. }
  29. }
  30. _monitorThread = new PeriodicJob(500, OnTimer, "Monitor Module Data Thread", true);
  31. }
  32. private bool OnTimer()
  33. {
  34. try
  35. {
  36. var changeModule = QueryDataClient.Instance.Service.GetData("System.ChangeWafers");
  37. if (changeModule is Dictionary<string, bool> module && module?.Count > 0)
  38. {
  39. var changedModule = module.Where(r => r.Value);
  40. if (!changedModule.Any()) return true;
  41. InvokeClient.Instance.Service.DoOperation("System.UpdateWafersNotify", changeModule);
  42. Dictionary<string, object> data = QueryDataClient.Instance.Service.PollData(changedModule.Select(r => $"{r.Key}.ModuleWaferList"));
  43. if (data != null && Application.Current != null)
  44. {
  45. Application.Current.Dispatcher.Invoke(new Action(() =>
  46. {
  47. foreach (var waferData in data)
  48. {
  49. if (!_mapWaferDataModule.ContainsKey(waferData.Key))
  50. continue;
  51. RTDefine.WaferInfo[] wafers = waferData.Value as RTDefine.WaferInfo[];
  52. if (wafers == null)
  53. continue;
  54. ModuleInfo info = _mapWaferDataModule[waferData.Key];
  55. if (info.WaferManager.Wafers.Count == 0)
  56. {
  57. for (int i = 0; i < wafers.Length; i++)
  58. {
  59. info.WaferManager.Wafers.Add(WaferInfoConverter(wafers[i], info.WaferModuleID, i));
  60. }
  61. if (info.IsWaferReverseDisplay)
  62. {
  63. info.WaferManager.Wafers = new ObservableCollection<WaferInfo>(info.WaferManager.Wafers.Reverse());
  64. }
  65. continue;
  66. }
  67. if (wafers.Length == info.WaferManager.Wafers.Count)
  68. {
  69. int index;
  70. for (int i = 0; i < wafers.Length; i++)
  71. {
  72. if (info.IsWaferReverseDisplay)
  73. index = wafers.Length - i - 1;
  74. else
  75. index = i;
  76. var convertedWafer = WaferInfoConverter(wafers[index], info.WaferModuleID, index);
  77. info.WaferManager.Wafers[i].WaferStatus = convertedWafer.WaferStatus;
  78. info.WaferManager.Wafers[i].WaferID = convertedWafer.WaferID;
  79. info.WaferManager.Wafers[i].SourceName = convertedWafer.SourceName;
  80. info.WaferManager.Wafers[i].WaferType = convertedWafer.WaferType;
  81. info.WaferManager.Wafers[i].UseCount = convertedWafer.UseCount;
  82. info.WaferManager.Wafers[i].UseTime = convertedWafer.UseTime;
  83. info.WaferManager.Wafers[i].UseThick = convertedWafer.UseThick;
  84. info.WaferManager.Wafers[i].Thick = convertedWafer.Thick;
  85. info.WaferManager.Wafers[i].LotId = convertedWafer.LotId;
  86. info.WaferManager.Wafers[i].ProcessJobID = convertedWafer.ProcessJobID;
  87. }
  88. }
  89. }
  90. }));
  91. }
  92. }
  93. }
  94. catch (Exception ex)
  95. {
  96. LOG.Error(ex.Message);
  97. }
  98. return true;
  99. }
  100. private WaferInfo WaferInfoConverter(RTDefine.WaferInfo awafer, string modid, int slotid)
  101. {
  102. WaferInfo wafer = new WaferInfo();
  103. wafer.ModuleID = modid;
  104. wafer.SlotID = slotid;
  105. wafer.SlotIndex = slotid + 1;
  106. wafer.WaferID = awafer.WaferID;
  107. wafer.SourceName = awafer.WaferOrigin;
  108. wafer.WaferStatus = WaferStatusConverter(awafer);
  109. wafer.WaferType = awafer.WaferType;
  110. wafer.UseCount = awafer.UseCount;
  111. wafer.UseThick = awafer.UseThick;
  112. wafer.Thick = awafer.Thick;
  113. wafer.UseTime = awafer.UseTime;
  114. wafer.LotId = awafer.LotId;
  115. wafer.ProcessJobID = awafer.ProcessJobID;
  116. return wafer;
  117. }
  118. //0: no wafer
  119. //1:light blue == idle no pj
  120. //2:blue = idle with pj
  121. //3:cyan = in process
  122. //4:green = complete
  123. //5:error = error
  124. //6:dummy
  125. //7:warning = has error
  126. //8:partial processed
  127. //9:abort
  128. private int WaferStatusConverter(RTDefine.WaferInfo awafer)
  129. {
  130. if (awafer.Status == RTDefine.WaferStatus.Empty)
  131. return 0;
  132. if (awafer.Status == RTDefine.WaferStatus.Normal)
  133. {
  134. switch (awafer.ProcessState)
  135. {
  136. case RTDefine.EnumWaferProcessStatus.InProcess: return 3;
  137. case RTDefine.EnumWaferProcessStatus.Completed: return awafer.HasError ? 5 :(awafer.HasWarning?7:4);
  138. case RTDefine.EnumWaferProcessStatus.Failed: return 5;
  139. case RTDefine.EnumWaferProcessStatus.Wait: return 3;
  140. case RTDefine.EnumWaferProcessStatus.Idle: return awafer.ProcessJob == null ? 1 : 2;
  141. case RTDefine.EnumWaferProcessStatus.Abort: return 9;
  142. }
  143. }
  144. if (awafer.Status == RTDefine.WaferStatus.Dummy)
  145. {
  146. return 6;
  147. }
  148. return 5;
  149. }
  150. }
  151. }