SchedulerSequenceRecipeManager.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. using Aitex.Core.RT.Fsm;
  2. using Aitex.Core.RT.Log;
  3. using Aitex.Core.Util;
  4. using MECF.Framework.Common.Equipment;
  5. using MECF.Framework.Common.RecipeCenter;
  6. using MECF.Framework.Common.ToolLayout;
  7. using MECF.Framework.Common.WaferHolder;
  8. using CyberX8_RT.Modules;
  9. using CyberX8_RT.Modules.Dryer;
  10. using CyberX8_RT.Modules.Metal;
  11. using CyberX8_RT.Modules.Reservoir;
  12. using System;
  13. using System.Collections.Generic;
  14. using System.Linq;
  15. using System.Text;
  16. using System.Threading.Tasks;
  17. namespace CyberX8_RT.Schedulers
  18. {
  19. public class SchedulerSequenceRecipeManager : Singleton<SchedulerSequenceRecipeManager>
  20. {
  21. /// <summary>
  22. /// 是否存在可用的cell
  23. /// </summary>
  24. /// <param name="sequenceRecipe"></param>
  25. /// <returns></returns>
  26. public bool ExistAvaibleProcessCell(SequenceRecipe sequenceRecipe, bool showError, bool checkSrd = false)
  27. {
  28. if (sequenceRecipe == null)
  29. {
  30. if (showError)
  31. {
  32. LOG.WriteLog(eEvent.ERR_SEQUENCE, "System", "sequence recipe is null");
  33. }
  34. return false;
  35. }
  36. int count = 0;
  37. for (int i = 0; i < sequenceRecipe.Recipes.Count; i++)
  38. {
  39. string item = sequenceRecipe.Recipes[i];
  40. if (string.IsNullOrEmpty(item))
  41. {
  42. continue;
  43. }
  44. if (item.ToLower().EndsWith("srd.rcp") && !checkSrd)
  45. {
  46. continue;
  47. }
  48. ModuleType moduleType = SequenceRecipeManager.Instance.GetModuleType(item);
  49. if (moduleType == ModuleType.None)
  50. {
  51. if (showError)
  52. {
  53. LOG.WriteLog(eEvent.ERR_SEQUENCE, "System", $"sequence {sequenceRecipe.Ppid} item {item} is invalid type");
  54. }
  55. return false;
  56. }
  57. if (moduleType == ModuleType.Metal)
  58. {
  59. DepRecipe depRecipe =(DepRecipe)SequenceRecipeManager.Instance.LoadSequenceTypeRecipe(sequenceRecipe.SequenceType,item, RecipeType.DEP);
  60. if (depRecipe == null)
  61. {
  62. if (showError)
  63. {
  64. LOG.WriteLog(eEvent.ERR_SEQUENCE, "System", $"sequece {sequenceRecipe.Ppid} metal recipe {depRecipe.Ppid} is invalid ");
  65. }
  66. return false;
  67. }
  68. List<MetalEntity> metals = SchedulerSequenceManager.Instance.GetAvaibleMetalList(depRecipe.Chemistry,sequenceRecipe.SequenceType,false);
  69. if(metals.Count==0)
  70. {
  71. if (showError)
  72. {
  73. LOG.WriteLog(eEvent.ERR_SEQUENCE, "System", $"sequece {sequenceRecipe.Ppid} metal recipe {depRecipe.Ppid} chemistry {depRecipe.Chemistry} has not avaible metal cell");
  74. }
  75. return false;
  76. }
  77. if (i < sequenceRecipe.Recipes.Count - 1)
  78. {
  79. MetalEntity metal = metals[0];
  80. string nextModuleType = sequenceRecipe.Recipes[i + 1];
  81. ModuleType nextModuleTypeEnum = SequenceRecipeManager.Instance.GetModuleType(nextModuleType);
  82. if (nextModuleTypeEnum==ModuleType.Rinse)
  83. {
  84. ModuleName rinseModule= SchedulerSequenceManager.Instance.GetAvaibleModuleCell(sequenceRecipe.SequenceType,
  85. nextModuleTypeEnum, metal.Module);
  86. if (rinseModule == ModuleName.Unknown)
  87. {
  88. if (showError)
  89. {
  90. LOG.WriteLog(eEvent.ERR_SEQUENCE, "System", $"sequece {sequenceRecipe.Ppid} metal {metal.Module} has not avaible {nextModuleTypeEnum} cell");
  91. }
  92. return false;
  93. }
  94. }
  95. }
  96. }
  97. else
  98. {
  99. ModuleName moduleName= SchedulerSequenceManager.Instance.GetAvaibleModuleCell(sequenceRecipe.SequenceType,moduleType);
  100. if(moduleName==ModuleName.Unknown)
  101. {
  102. if (showError)
  103. {
  104. LOG.WriteLog(eEvent.ERR_SEQUENCE, "System", $"sequece {sequenceRecipe.Ppid} has not avaible {moduleType} module");
  105. }
  106. return false;
  107. }
  108. }
  109. count++;
  110. }
  111. if (count == 0)
  112. {
  113. if (showError)
  114. {
  115. LOG.WriteLog(eEvent.ERR_SEQUENCE, "System", $"sequece {sequenceRecipe.Ppid} not set avaible cell");
  116. }
  117. return false;
  118. }
  119. return true;
  120. }
  121. /// <summary>
  122. /// 获取sequence的化学液
  123. /// </summary>
  124. /// <param name="sequenceRecipe"></param>
  125. /// <returns></returns>
  126. public List<string> GetSequenceChemistry(SequenceRecipe sequenceRecipe)
  127. {
  128. List<string> chemistries = new List<string>();
  129. for (int i = 0; i < sequenceRecipe.Recipes.Count; i++)
  130. {
  131. string item = sequenceRecipe.Recipes[i];
  132. if (string.IsNullOrEmpty(item))
  133. {
  134. continue;
  135. }
  136. ModuleType moduleType = SequenceRecipeManager.Instance.GetModuleType(item);
  137. if (moduleType == ModuleType.Metal)
  138. {
  139. DepRecipe depRecipe = (DepRecipe)SequenceRecipeManager.Instance.LoadSequenceTypeRecipe(sequenceRecipe.SequenceType, item, RecipeType.DEP);
  140. if (!chemistries.Contains(depRecipe.Chemistry))
  141. {
  142. chemistries.Add(depRecipe.Chemistry);
  143. }
  144. }
  145. }
  146. return chemistries;
  147. }
  148. /// <summary>
  149. /// 是否Sequence Recipe是否可用
  150. /// </summary>
  151. /// <param name="sequenceRecipe"></param>
  152. /// <returns></returns>
  153. public bool CheckSequenceRecipeAvaible(SequenceRecipe sequenceRecipe,ref string reason)
  154. {
  155. if (sequenceRecipe == null)
  156. {
  157. reason = "sequence recipe is null";
  158. LOG.WriteLog(eEvent.ERR_SEQUENCE, "System", reason);
  159. return false;
  160. }
  161. for (int i = 0; i < sequenceRecipe.Recipes.Count; i++)
  162. {
  163. string item = sequenceRecipe.Recipes[i];
  164. if (string.IsNullOrEmpty(item))
  165. {
  166. continue;
  167. }
  168. RecipeType recipeType= SequenceRecipeManager.Instance.GetRecipeType(item);
  169. object recipe = SequenceRecipeManager.Instance.LoadSequenceTypeRecipe(sequenceRecipe.SequenceType, item, recipeType);
  170. if (recipe == null)
  171. {
  172. reason = $"{item} is not in {sequenceRecipe.SequenceType}";
  173. LOG.WriteLog(eEvent.ERR_SEQUENCE, "System", reason);
  174. return false;
  175. }
  176. }
  177. return true;
  178. }
  179. }
  180. }