123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- using Aitex.Core.RT.Log;
- using Aitex.Core.Util;
- using MECF.Framework.Common.DBCore;
- using MECF.Framework.Common.ProcessCell;
- using System;
- using System.Collections.Generic;
- namespace MECF.Framework.Common.ToolLayout
- {
- public class ReservoirUsageManager : Singleton<ReservoirUsageManager>
- {
- #region 内部变量
- /// <summary>
- /// Reservoir电量字典
- /// </summary>
- private Dictionary<string, ReservoirUsage> _reservoirUsageDictionary = new Dictionary<string, ReservoirUsage>();
- /// <summary>
- /// Reservoir 锁字典
- /// </summary>
- private Dictionary<string, object> _reservoirLockDictionary = new Dictionary<string, object>();
- #endregion
- /// <summary>
- /// 初始化
- /// </summary>
- public void Initialize()
- {
- List<ReservoirUsage> reservoirUsages = ReservoirUsageRecorder.GetAllReservoirUsages();
- foreach (var item in reservoirUsages)
- {
- _reservoirUsageDictionary[item.ReservoirName] = item;
- }
- List<string> installedReservoirs = ReservoirItemManager.Instance.InstalledModules;
- foreach (string item in installedReservoirs)
- {
- _reservoirLockDictionary[item] = new object();
- }
- }
- /// <summary>
- /// 更新Reservoir的用量
- /// </summary>
- /// <param name="metalName"></param>
- /// <param name="usage"></param>
- public void UpdateReservoirUsage(string reservoirName, double anodeAUsage, double anodeBUsage,int waferCount)
- {
- if (!_reservoirLockDictionary.ContainsKey(reservoirName))
- {
- LOG.WriteLog(eEvent.WARN_RESERVOIR, reservoirName, $"reservoir {reservoirName} usage has no locker");
- return;
- }
- lock (_reservoirLockDictionary[reservoirName])
- {
- bool isAdd = false;
- ReservoirUsage reservoirUsage = null;
- if (!_reservoirUsageDictionary.ContainsKey(reservoirName))
- {
- reservoirUsage = new ReservoirUsage();
- reservoirUsage.ReservoirName = reservoirName;
- _reservoirUsageDictionary[reservoirName] = reservoirUsage;
- isAdd = true;
- }
- else
- {
- reservoirUsage = _reservoirUsageDictionary[reservoirName];
- }
- reservoirUsage.TotalUsage += anodeAUsage + anodeBUsage;
- reservoirUsage.BathUsage += anodeAUsage + anodeBUsage;
- reservoirUsage.AnodeUsage += anodeAUsage + anodeBUsage;
- reservoirUsage.MembranceUsage += anodeAUsage + anodeBUsage;
- reservoirUsage.TotalWafers += waferCount;
- DateTime now=DateTime.Now;
- if (isAdd)
- {
- reservoirUsage.BathUsageDays = 0;
- reservoirUsage.BathResetTime = now;
- ReservoirUsageRecorder.AddReservoirUsage(reservoirUsage);
- }
- else
- {
- int days = (int)Math.Floor(now.Subtract(reservoirUsage.BathResetTime).TotalDays);
- if (days >= reservoirUsage.BathUsageDays)
- {
- reservoirUsage.BathUsageDays = days;
- }
- ReservoirUsageRecorder.UpdateReservoirUsageData(reservoirName, reservoirUsage);
- }
- }
- }
- /// <summary>
- /// 在PMCounter页面手动修改值
- /// </summary>
- /// <param name="metalName"></param>
- public void UpdateReservoirUsageByManualOperation(string reservoirName, string CounterName, string NewValue)
- {
- if (_reservoirUsageDictionary.ContainsKey(reservoirName))
- {
- switch (CounterName)
- {
- case "Total Usage(AHr)":
- _reservoirUsageDictionary[reservoirName].TotalUsage = double.Parse(NewValue); break;
- case "Bath Usage(AHr)":
- _reservoirUsageDictionary[reservoirName].BathUsage = double.Parse(NewValue); break;
- case "Anolyte Bath Usage(AHr)":
- _reservoirUsageDictionary[reservoirName].AnodeUsage = double.Parse(NewValue); break;
- case "Bath Usage(Days)":
- _reservoirUsageDictionary[reservoirName].BathUsageDays = int.Parse(NewValue);
- _reservoirUsageDictionary[reservoirName].BathResetTime = DateTime.Now;
- break;
- case "Membrane Usage(AHr)":
- _reservoirUsageDictionary[reservoirName].MembranceUsage = double.Parse(NewValue); break;
- case "Total Wafers":
- _reservoirUsageDictionary[reservoirName].TotalWafers = int.Parse(NewValue); break;
- case "CMM Anode Usage(AHr)":
- _reservoirUsageDictionary[reservoirName].CMMAnodeUsage = double.Parse(NewValue); break;
- case "CMM Cathode Usage(AHr)":
- _reservoirUsageDictionary[reservoirName].CMMMembranceUsage = double.Parse(NewValue); break;
- }
- ReservoirUsageRecorder.UpdateReservoirUsageData(reservoirName, _reservoirUsageDictionary[reservoirName]);
- }
- }
- /// <summary>
- /// 获取Reservoir用量
- /// </summary>
- /// <param name="metalName"></param>
- /// <returns></returns>
- public ReservoirUsage GetReservoirUsage(string reservoirName)
- {
- return _reservoirUsageDictionary.ContainsKey(reservoirName) ? _reservoirUsageDictionary[reservoirName] : null;
- }
- /// <summary>
- /// 更新CMMPowerUsage
- /// </summary>
- /// <param name="reservoirName"></param>
- /// <param name="cmmUsage"></param>
- public void UpdateReservoirCMMUsage(string reservoirName, double cmmUsage)
- {
- if (!_reservoirLockDictionary.ContainsKey(reservoirName))
- {
- LOG.WriteLog(eEvent.WARN_RESERVOIR, reservoirName, $"reservoir {reservoirName} usage has no locker");
- return;
- }
- lock (_reservoirLockDictionary[reservoirName])
- {
- bool isAdd = false;
- ReservoirUsage reservoirUsage = null;
- if (!_reservoirUsageDictionary.ContainsKey(reservoirName))
- {
- reservoirUsage = new ReservoirUsage();
- reservoirUsage.ReservoirName = reservoirName;
- _reservoirUsageDictionary[reservoirName] = reservoirUsage;
- isAdd = true;
- }
- else
- {
- reservoirUsage = _reservoirUsageDictionary[reservoirName];
- }
- reservoirUsage.CMMAnodeUsage += cmmUsage;
- reservoirUsage.CMMMembranceUsage += cmmUsage;
- DateTime now = DateTime.Now;
- if (isAdd)
- {
- reservoirUsage.BathUsageDays = 0;
- reservoirUsage.BathResetTime = now;
- ReservoirUsageRecorder.AddReservoirUsage(reservoirUsage);
- }
- else
- {
- ReservoirUsageRecorder.UpdateReservoirUsageData(reservoirName, reservoirUsage);
- }
- }
- }
- }
- }
|