ModuleDataMonitor.cs 7.7 KB

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