MetalLotTrackUtil.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using Aitex.Common.Util;
  2. using Aitex.Core.RT.Log;
  3. using MECF.Framework.Common.CommonData;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.IO;
  7. using System.Threading.Tasks;
  8. using MECF.Framework.Common.CommonData.Metal;
  9. using MECF.Framework.Common.WaferHolder;
  10. using Aitex.Core.Common;
  11. using MECF.Framework.Common.SubstrateTrackings;
  12. using MECF.Framework.Common.RecipeCenter;
  13. namespace CyberX8_RT.Modules.Metal
  14. {
  15. public class MetalLotTrackUtil
  16. {
  17. /// <summary>
  18. /// CSV文件分隔符
  19. /// </summary>
  20. private const char CVS_SPLIT_CHAR = ',';
  21. /// <summary>
  22. /// 导出至csv
  23. /// </summary>
  24. /// <param name="moduleName"></param>
  25. /// <param name="datas"></param>
  26. public static async void ExportMetalLotTrack(string moduleName, List<MetalLotTrackData> datas, LotTrackFileHeaderCommonData headerData, bool isAuto, DepRecipe recipe, string metalType)
  27. {
  28. await Task.Run(() =>
  29. {
  30. try
  31. {
  32. if (datas == null || datas.Count == 0) return;
  33. string strPath;
  34. FileInfo fi;
  35. if (isAuto)
  36. {
  37. WaferHolderInfo whInfo = WaferHolderManager.Instance.GetWaferHolder(moduleName);
  38. if (whInfo == null) return;
  39. WaferInfo waferInfoA = WaferManager.Instance.GetWaferByWaferId(whInfo.WaferAId);
  40. WaferInfo waferInfoB = WaferManager.Instance.GetWaferByWaferId(whInfo.WaferBId);
  41. if (waferInfoA != null && !string.IsNullOrEmpty(waferInfoA.LotId))
  42. {
  43. strPath = waferInfoA.LotTrackPath;
  44. }
  45. else if (waferInfoA != null && !string.IsNullOrEmpty(waferInfoA.LotId))
  46. {
  47. strPath = waferInfoB.LotTrackPath;
  48. }
  49. else
  50. {
  51. LOG.WriteLog(eEvent.ERR_METAL, moduleName, $"{moduleName} is failed to write LotTrackDatas");
  52. return;
  53. }
  54. fi = new FileInfo(PathManager.GetLotTrackFilePath() + strPath);
  55. }
  56. else
  57. {
  58. strPath = $"{moduleName}_M{DateTime.Now.ToString("MM")}_D{DateTime.Now.ToString("dd")}_H{DateTime.Now.ToString("HH")}_M{DateTime.Now.ToString("mm")}_S{DateTime.Now.ToString("ss")}.csv";
  59. fi = new FileInfo(PathManager.GetLotTrackFilePath() + $"Manual\\{DateTime.Now.Year}\\{DateTime.Now.Month}\\" + strPath);
  60. }
  61. //目录不存在则创建
  62. if (!fi.Directory.Exists)
  63. {
  64. fi.Directory.Create();
  65. }
  66. FileStream fs = new FileStream(fi.FullName, System.IO.FileMode.Append, System.IO.FileAccess.Write);
  67. StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8);
  68. if (!isAuto)
  69. {
  70. sw.WriteLine(fi.FullName);
  71. sw.WriteLine($"Date:{DateTime.Now.ToShortDateString()}");
  72. sw.WriteLine($"ToolID:{headerData.ToolID}");
  73. sw.WriteLine($"SW Version:{headerData.SoftWareVersion}");
  74. sw.WriteLine($"Sequence Recipe:{headerData.SequenceRecipe}");
  75. }
  76. if (headerData.ProcessTransferList != null)
  77. {
  78. foreach (var item in headerData.ProcessTransferList)
  79. {
  80. sw.WriteLine(item);
  81. }
  82. }
  83. sw.WriteLine(moduleName);
  84. sw.WriteLine($"Recipe:{headerData.Recipe}");
  85. sw.WriteLine($"SingleWafer:{headerData.IsSingleWafe}");
  86. sw.WriteLine($"ProcessTime:{headerData.ProcessTime}");
  87. sw.WriteLine($"FaultPercent:{recipe.FaultPercent}");
  88. sw.WriteLine($"PlatingDelay:{recipe.PlatingDelaySeconds}");
  89. sw.Write(CVS_SPLIT_CHAR);
  90. string resStr = (metalType == "Stratus" ? "" : $"ANLevel{CVS_SPLIT_CHAR}CAPumpSpeed{CVS_SPLIT_CHAR}");
  91. string str = $"TimeStamp{CVS_SPLIT_CHAR}"+ resStr + $"StepNum{CVS_SPLIT_CHAR}DurationRef{CVS_SPLIT_CHAR}DurationAdj{CVS_SPLIT_CHAR}" +
  92. $"RunTimeRef{CVS_SPLIT_CHAR}RunTimeAdj{CVS_SPLIT_CHAR}RunTime{CVS_SPLIT_CHAR}CurrentSPRef{CVS_SPLIT_CHAR}CurrentSP{CVS_SPLIT_CHAR}NegCurrentSPRef{CVS_SPLIT_CHAR}NegCurrentSP{CVS_SPLIT_CHAR}PosCurrentA{CVS_SPLIT_CHAR}" +
  93. $"PosCurrentB{CVS_SPLIT_CHAR}NegCurrentA{CVS_SPLIT_CHAR}NegCurrentB{CVS_SPLIT_CHAR}PowerSupplyA{CVS_SPLIT_CHAR}PowerSupplyB{CVS_SPLIT_CHAR}PosVoltageA{CVS_SPLIT_CHAR}PosVoltageB{CVS_SPLIT_CHAR}" +
  94. $"NegVoltageA{CVS_SPLIT_CHAR}NegVoltageB{CVS_SPLIT_CHAR}Flow{CVS_SPLIT_CHAR}CALevel{CVS_SPLIT_CHAR}Temperature{CVS_SPLIT_CHAR}ShearPlateSpeed{CVS_SPLIT_CHAR}CDA_1_Pressure{CVS_SPLIT_CHAR}CDA_2_Pressure{CVS_SPLIT_CHAR}ClampCycleEngaged";
  95. sw.WriteLine(str);
  96. for (int i = 0; i < datas.Count; i++)
  97. {
  98. MetalLotTrackData data = datas[i];
  99. string resDatas = (metalType == "Stratus" ? "" : $"{data.ANLevel}{CVS_SPLIT_CHAR}{data.CAPumpSpeed}{CVS_SPLIT_CHAR}");
  100. string tmp = $"{CVS_SPLIT_CHAR}{data.TimeStamp.ToString("HH:mm:ss")}{CVS_SPLIT_CHAR}"+ resDatas + $"{data.StepNum}{CVS_SPLIT_CHAR}{data.DurationRef}{CVS_SPLIT_CHAR}{data.DurationAdj}{CVS_SPLIT_CHAR}" +
  101. $"{data.RunTimeRef}{CVS_SPLIT_CHAR}{data.RunTimeAdj}{CVS_SPLIT_CHAR}{data.RunTime.ToString("F3")}{CVS_SPLIT_CHAR}{data.CurrentSPRef}{CVS_SPLIT_CHAR}{data.CurrentSP}{CVS_SPLIT_CHAR}{data.NegCurrentSPRef}{CVS_SPLIT_CHAR}{data.NegCurrentSP}{CVS_SPLIT_CHAR}{data.PosCurrentA}{CVS_SPLIT_CHAR}" +
  102. $"{data.PosCurrentB}{CVS_SPLIT_CHAR}{data.NegCurrentA}{CVS_SPLIT_CHAR}{data.NegCurrentB}{CVS_SPLIT_CHAR}{data.PowerSupplyA}{CVS_SPLIT_CHAR}{data.PowerSupplyB}{CVS_SPLIT_CHAR}{data.PosVoltageA}{CVS_SPLIT_CHAR}{data.PosVoltageB}{CVS_SPLIT_CHAR}" +
  103. $"{data.NegVoltageA}{CVS_SPLIT_CHAR}{data.NegVoltageB}{CVS_SPLIT_CHAR}{data.Flow}{CVS_SPLIT_CHAR}{data.CALevel}{CVS_SPLIT_CHAR}{data.Temperature.ToString("F2")}{CVS_SPLIT_CHAR}{data.ShearPlateSpeed}{CVS_SPLIT_CHAR}{data.CDA_1_Pressure}{CVS_SPLIT_CHAR}{data.CDA_2_Pressure}{CVS_SPLIT_CHAR}{data.ClampCycleEngaged}";
  104. sw.WriteLine(tmp);
  105. }
  106. sw.WriteLine("");
  107. sw.Close();
  108. fs.Close();
  109. }
  110. catch
  111. {
  112. LOG.WriteLog(eEvent.ERR_METAL, moduleName, $"{moduleName} LotTrack file writing is failed!");
  113. }
  114. });
  115. }
  116. }
  117. }