ReservoirUsageManager.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. using Aitex.Core.RT.Log;
  2. using Aitex.Core.Util;
  3. using MECF.Framework.Common.DBCore;
  4. using MECF.Framework.Common.ProcessCell;
  5. using System;
  6. using System.Collections.Generic;
  7. namespace MECF.Framework.Common.ToolLayout
  8. {
  9. public class ReservoirUsageManager : Singleton<ReservoirUsageManager>
  10. {
  11. #region 内部变量
  12. /// <summary>
  13. /// Reservoir电量字典
  14. /// </summary>
  15. private Dictionary<string, ReservoirUsage> _reservoirUsageDictionary = new Dictionary<string, ReservoirUsage>();
  16. /// <summary>
  17. /// Reservoir 锁字典
  18. /// </summary>
  19. private Dictionary<string, object> _reservoirLockDictionary = new Dictionary<string, object>();
  20. #endregion
  21. /// <summary>
  22. /// 初始化
  23. /// </summary>
  24. public void Initialize()
  25. {
  26. List<ReservoirUsage> reservoirUsages = ReservoirUsageRecorder.GetAllReservoirUsages();
  27. foreach (var item in reservoirUsages)
  28. {
  29. _reservoirUsageDictionary[item.ReservoirName] = item;
  30. }
  31. List<string> installedReservoirs = ReservoirItemManager.Instance.InstalledModules;
  32. foreach (string item in installedReservoirs)
  33. {
  34. _reservoirLockDictionary[item] = new object();
  35. }
  36. }
  37. /// <summary>
  38. /// 更新Reservoir的用量
  39. /// </summary>
  40. /// <param name="metalName"></param>
  41. /// <param name="usage"></param>
  42. public void UpdateReservoirUsage(string reservoirName, double anodeAUsage, double anodeBUsage,int waferCount)
  43. {
  44. if (!_reservoirLockDictionary.ContainsKey(reservoirName))
  45. {
  46. LOG.WriteLog(eEvent.WARN_RESERVOIR, reservoirName, $"reservoir {reservoirName} usage has no locker");
  47. return;
  48. }
  49. lock (_reservoirLockDictionary[reservoirName])
  50. {
  51. bool isAdd = false;
  52. ReservoirUsage reservoirUsage = null;
  53. if (!_reservoirUsageDictionary.ContainsKey(reservoirName))
  54. {
  55. reservoirUsage = new ReservoirUsage();
  56. reservoirUsage.ReservoirName = reservoirName;
  57. _reservoirUsageDictionary[reservoirName] = reservoirUsage;
  58. isAdd = true;
  59. }
  60. else
  61. {
  62. reservoirUsage = _reservoirUsageDictionary[reservoirName];
  63. }
  64. reservoirUsage.TotalUsage += anodeAUsage + anodeBUsage;
  65. reservoirUsage.BathUsage += anodeAUsage + anodeBUsage;
  66. reservoirUsage.AnodeUsage += anodeAUsage + anodeBUsage;
  67. reservoirUsage.MembranceUsage += anodeAUsage + anodeBUsage;
  68. reservoirUsage.TotalWafers += waferCount;
  69. DateTime now=DateTime.Now;
  70. if (isAdd)
  71. {
  72. reservoirUsage.BathUsageDays = 0;
  73. reservoirUsage.BathResetTime = now;
  74. ReservoirUsageRecorder.AddReservoirUsage(reservoirUsage);
  75. }
  76. else
  77. {
  78. int days = (int)Math.Floor(now.Subtract(reservoirUsage.BathResetTime).TotalDays);
  79. if (days >= reservoirUsage.BathUsageDays)
  80. {
  81. reservoirUsage.BathUsageDays = days;
  82. }
  83. ReservoirUsageRecorder.UpdateReservoirUsageData(reservoirName, reservoirUsage);
  84. }
  85. }
  86. }
  87. /// <summary>
  88. /// 在PMCounter页面手动修改值
  89. /// </summary>
  90. /// <param name="metalName"></param>
  91. public void UpdateReservoirUsageByManualOperation(string reservoirName, string CounterName, string NewValue)
  92. {
  93. if (_reservoirUsageDictionary.ContainsKey(reservoirName))
  94. {
  95. switch (CounterName)
  96. {
  97. case "Total Usage(AHr)":
  98. _reservoirUsageDictionary[reservoirName].TotalUsage = double.Parse(NewValue); break;
  99. case "Bath Usage(AHr)":
  100. _reservoirUsageDictionary[reservoirName].BathUsage = double.Parse(NewValue); break;
  101. case "Anolyte Bath Usage(AHr)":
  102. _reservoirUsageDictionary[reservoirName].AnodeUsage = double.Parse(NewValue); break;
  103. case "Bath Usage(Days)":
  104. _reservoirUsageDictionary[reservoirName].BathUsageDays = int.Parse(NewValue);
  105. _reservoirUsageDictionary[reservoirName].BathResetTime = DateTime.Now;
  106. break;
  107. case "Membrane Usage(AHr)":
  108. _reservoirUsageDictionary[reservoirName].MembranceUsage = double.Parse(NewValue); break;
  109. case "Total Wafers":
  110. _reservoirUsageDictionary[reservoirName].TotalWafers = int.Parse(NewValue); break;
  111. case "CMM Anode Usage(AHr)":
  112. _reservoirUsageDictionary[reservoirName].CMMAnodeUsage = double.Parse(NewValue); break;
  113. case "CMM Cathode Usage(AHr)":
  114. _reservoirUsageDictionary[reservoirName].CMMMembranceUsage = double.Parse(NewValue); break;
  115. }
  116. ReservoirUsageRecorder.UpdateReservoirUsageData(reservoirName, _reservoirUsageDictionary[reservoirName]);
  117. }
  118. }
  119. /// <summary>
  120. /// 获取Reservoir用量
  121. /// </summary>
  122. /// <param name="metalName"></param>
  123. /// <returns></returns>
  124. public ReservoirUsage GetReservoirUsage(string reservoirName)
  125. {
  126. return _reservoirUsageDictionary.ContainsKey(reservoirName) ? _reservoirUsageDictionary[reservoirName] : null;
  127. }
  128. /// <summary>
  129. /// 更新CMMPowerUsage
  130. /// </summary>
  131. /// <param name="reservoirName"></param>
  132. /// <param name="cmmUsage"></param>
  133. public void UpdateReservoirCMMUsage(string reservoirName, double cmmUsage)
  134. {
  135. if (!_reservoirLockDictionary.ContainsKey(reservoirName))
  136. {
  137. LOG.WriteLog(eEvent.WARN_RESERVOIR, reservoirName, $"reservoir {reservoirName} usage has no locker");
  138. return;
  139. }
  140. lock (_reservoirLockDictionary[reservoirName])
  141. {
  142. bool isAdd = false;
  143. ReservoirUsage reservoirUsage = null;
  144. if (!_reservoirUsageDictionary.ContainsKey(reservoirName))
  145. {
  146. reservoirUsage = new ReservoirUsage();
  147. reservoirUsage.ReservoirName = reservoirName;
  148. _reservoirUsageDictionary[reservoirName] = reservoirUsage;
  149. isAdd = true;
  150. }
  151. else
  152. {
  153. reservoirUsage = _reservoirUsageDictionary[reservoirName];
  154. }
  155. reservoirUsage.CMMAnodeUsage += cmmUsage;
  156. reservoirUsage.CMMMembranceUsage += cmmUsage;
  157. DateTime now = DateTime.Now;
  158. if (isAdd)
  159. {
  160. reservoirUsage.BathUsageDays = 0;
  161. reservoirUsage.BathResetTime = now;
  162. ReservoirUsageRecorder.AddReservoirUsage(reservoirUsage);
  163. }
  164. else
  165. {
  166. ReservoirUsageRecorder.UpdateReservoirUsageData(reservoirName, reservoirUsage);
  167. }
  168. }
  169. }
  170. }
  171. }