PreProcess.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. using Aitex.Core.RT.Routine;
  2. using MECF.Framework.Common.Equipment;
  3. using System;
  4. using Aitex.Core.RT.SCCore;
  5. using FurnaceRT.Equipments.PMs.Routines;
  6. using System.Collections.Generic;
  7. using FurnaceRT.Equipments.Systems;
  8. using Aitex.Core.Util;
  9. using MECF.Framework.Common.SubstrateTrackings;
  10. using System.Linq;
  11. using Aitex.Core.Common;
  12. using MECF.Framework.Common.CommonData.EnumData;
  13. using MECF.Framework.Common.DataCenter;
  14. using MECF.Framework.Common.Utilities;
  15. using Aitex.Core.RT.Log;
  16. namespace FurnaceRT.Equipments.PMs.RecipeExecutions
  17. {
  18. public class PreProcess : PMBaseRoutine, IRoutine
  19. {
  20. public enum Routine
  21. {
  22. ToReadyProcessState,
  23. Pump,
  24. PinDown,
  25. }
  26. private string _recipeName;
  27. private int _liftTimeout;
  28. private bool _isProcessRecipe;
  29. public PreProcess(ModuleName module, PMModule pm) : base(module, pm)
  30. {
  31. Module = module.ToString();
  32. Name = "PreProcess";
  33. }
  34. public void Init(string recipeName, bool isProcessRecipe = true)
  35. {
  36. _recipeName = recipeName;
  37. _isProcessRecipe = isProcessRecipe;
  38. }
  39. public override Result Start(params object[] objs)
  40. {
  41. RecipeHead recipeHead;
  42. List<RecipeStep> recipeSteps;
  43. Dictionary<int, List<RecipeStep>> abortRecipe;
  44. Dictionary<int, string> abortRecipeName;
  45. Dictionary<int, List<RecipeStep>> subRecipe;
  46. Dictionary<int, string> subRecipeName;
  47. string reason = string.Empty;
  48. if (_isProcessRecipe)
  49. {
  50. if (!RecipeParser.Parse(_recipeName, Module, out recipeHead, out recipeSteps, out reason, "Process"))
  51. {
  52. PMModule.PreprocessStartFailedWarning.Set($"Load process recipe {_recipeName} failed, {reason}");
  53. return Result.FAIL;
  54. }
  55. #region MyRegion
  56. var isScheduleMaintenance = SC.ContainsItem("System.EnableScheduleMaintenance") && SC.GetValue<bool>("System.EnableScheduleMaintenance");
  57. if (isScheduleMaintenance)
  58. {
  59. var pm = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule);
  60. pm.GetAllDBRecord();
  61. var wafers = WaferManager.Instance.GetWafers(ModuleName.PM1);
  62. if (wafers != null && wafers.Count() > 0)
  63. {
  64. foreach (var wafer in wafers)
  65. {
  66. if (wafer == null || wafer.IsEmpty || (wafer.WaferType != WaferType.SD && wafer.WaferType != WaferType.ED))
  67. continue;
  68. #region New
  69. if (isScheduleMaintenance)
  70. {
  71. #region SD Dummy 时间/次数/膜厚限制
  72. var maintenanceItemSDCarrierUseFreq = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.SDCarrierUseFreq.ToString());
  73. var maintenanceItemSDWaferThickness = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.SDWaferThickness.ToString());
  74. var maintenanceItemSDWaferUserTime = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.SDWaferUserTime.ToString());
  75. if (wafer.WaferType == WaferType.SD && maintenanceItemSDCarrierUseFreq.StartValue > 0 && wafer.UseCount > maintenanceItemSDCarrierUseFreq.StartValue && wafer.UseCount < maintenanceItemSDCarrierUseFreq.LimitValue)
  76. {
  77. if (maintenanceItemSDCarrierUseFreq.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString() ||
  78. maintenanceItemSDCarrierUseFreq.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString())
  79. {
  80. var msg = pm.GetAlarmWarningMsg(maintenanceItemSDCarrierUseFreq);
  81. Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountWarning.Set(msg);
  82. }
  83. }
  84. if (wafer.WaferType == WaferType.SD && maintenanceItemSDWaferUserTime.StartValue > 0 && wafer.UseTime > maintenanceItemSDWaferUserTime.StartValue && wafer.UseTime < maintenanceItemSDWaferUserTime.LimitValue)
  85. {
  86. if (maintenanceItemSDWaferUserTime.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString() ||
  87. maintenanceItemSDWaferUserTime.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString())
  88. {
  89. var currentValue = DateTimeUtil.SecondToHHmmss(maintenanceItemSDWaferUserTime.CurrentValue.ToString());
  90. var minValue = DateTimeUtil.SecondToHHmmss(maintenanceItemSDWaferUserTime.StartValue.ToString());
  91. var maxValue = DateTimeUtil.SecondToHHmmss(maintenanceItemSDWaferUserTime.LimitValue.ToString());
  92. var msg = pm.GetAlarmWarningMsg(maintenanceItemSDWaferUserTime, true, currentValue, minValue, maxValue);
  93. Singleton<EquipmentManager>.Instance.SDWaferTypeUseTimeWarning.Set(msg);
  94. }
  95. }
  96. if (wafer.WaferType == WaferType.SD && maintenanceItemSDWaferThickness.StartValue > 0 && wafer.UseThick > maintenanceItemSDWaferThickness.StartValue && wafer.UseThick < maintenanceItemSDWaferThickness.LimitValue)
  97. {
  98. if (maintenanceItemSDWaferThickness.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString() ||
  99. maintenanceItemSDWaferThickness.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString()
  100. )
  101. {
  102. var msg = pm.GetAlarmWarningMsg(maintenanceItemSDWaferThickness);
  103. Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessWarning.Set(msg);
  104. }
  105. }
  106. if (wafer.WaferType == WaferType.SD && maintenanceItemSDCarrierUseFreq.StartValue > 0 && wafer.UseCount >= maintenanceItemSDCarrierUseFreq.LimitValue)
  107. {
  108. if (maintenanceItemSDCarrierUseFreq.MaintenanceProcessing == MaintenanceProcessingCommandEnum.None.ToString())
  109. continue;
  110. if (maintenanceItemSDCarrierUseFreq.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString())
  111. {
  112. var msg = pm.GetAlarmWarningMsg(maintenanceItemSDCarrierUseFreq);
  113. Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountAlarm.Set(msg);
  114. return Result.FAIL;
  115. }
  116. else if (maintenanceItemSDCarrierUseFreq.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString())
  117. {
  118. var msg = pm.GetAlarmWarningMsg(maintenanceItemSDCarrierUseFreq, true);
  119. if (string.IsNullOrEmpty(maintenanceItemSDCarrierUseFreq.AssociationProcessRecipeName))
  120. {
  121. Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountAlarm.Set(msg);
  122. return Result.FAIL;
  123. }
  124. Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountAlarm.Set(msg);
  125. pm.TriggerJobAutoStart(maintenanceItemSDCarrierUseFreq.AssociationProcessRecipeName);
  126. LOG.Info($"{msg} Trigger {maintenanceItemSDCarrierUseFreq.AssociationProcessRecipeName}");
  127. return Result.FAIL;
  128. }
  129. }
  130. if (wafer.WaferType == WaferType.SD && maintenanceItemSDWaferUserTime.StartValue > 0 && wafer.UseTime >= maintenanceItemSDWaferUserTime.LimitValue)
  131. {
  132. if (maintenanceItemSDWaferUserTime.MaintenanceProcessing == MaintenanceProcessingCommandEnum.None.ToString())
  133. continue;
  134. var currentValue = DateTimeUtil.SecondToHHmmss(maintenanceItemSDWaferUserTime.CurrentValue.ToString());
  135. var minValue = DateTimeUtil.SecondToHHmmss(maintenanceItemSDWaferUserTime.StartValue.ToString());
  136. var maxValue = DateTimeUtil.SecondToHHmmss(maintenanceItemSDWaferUserTime.LimitValue.ToString());
  137. var msg = pm.GetAlarmWarningMsg(maintenanceItemSDWaferUserTime, true, currentValue, minValue, maxValue);
  138. if (maintenanceItemSDWaferUserTime.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString())
  139. {
  140. Singleton<EquipmentManager>.Instance.SDWaferTypeUseTimeAlarm.Set(msg);
  141. return Result.FAIL;
  142. }
  143. else if (maintenanceItemSDWaferUserTime.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString())
  144. {
  145. if (string.IsNullOrEmpty(maintenanceItemSDWaferUserTime.AssociationProcessRecipeName))
  146. {
  147. Singleton<EquipmentManager>.Instance.SDWaferTypeUseTimeAlarm.Set(msg);
  148. return Result.FAIL;
  149. }
  150. Singleton<EquipmentManager>.Instance.SDWaferTypeUseTimeAlarm.Set(msg);
  151. pm.TriggerJobAutoStart(maintenanceItemSDWaferUserTime.AssociationProcessRecipeName);
  152. LOG.Info($"{msg} Trigger {maintenanceItemSDWaferUserTime.AssociationProcessRecipeName}");
  153. return Result.FAIL;
  154. }
  155. }
  156. if (wafer.WaferType == WaferType.SD && maintenanceItemSDWaferThickness.StartValue > 0 && wafer.UseThick >= maintenanceItemSDWaferThickness.LimitValue)
  157. {
  158. if (maintenanceItemSDWaferThickness.MaintenanceProcessing == MaintenanceProcessingCommandEnum.None.ToString())
  159. continue;
  160. if (maintenanceItemSDWaferThickness.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString())
  161. {
  162. var msg = pm.GetAlarmWarningMsg(maintenanceItemSDWaferThickness);
  163. Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessAlarm.Set(msg);
  164. return Result.FAIL;
  165. }
  166. else if (maintenanceItemSDWaferThickness.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString())
  167. {
  168. var msg = pm.GetAlarmWarningMsg(maintenanceItemSDWaferThickness, true);
  169. if (string.IsNullOrEmpty(maintenanceItemSDWaferThickness.AssociationProcessRecipeName))
  170. {
  171. Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessAlarm.Set(msg);
  172. return Result.FAIL;
  173. }
  174. Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessAlarm.Set(msg);
  175. pm.TriggerJobAutoStart(maintenanceItemSDWaferThickness.AssociationProcessRecipeName);
  176. LOG.Info($"{msg} Trigger {maintenanceItemSDWaferThickness.AssociationProcessRecipeName}");
  177. return Result.FAIL;
  178. }
  179. }
  180. #endregion
  181. #region ED
  182. var maintenanceItemEDCarrierUseFreq = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.FDCarrierUseFreq.ToString());
  183. var maintenanceItemEDWaferThickness = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.FDWaferThickness.ToString());
  184. var maintenanceItemEDWaferUserTime = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.FDWaferUserTime.ToString());
  185. if (wafer.WaferType == WaferType.ED && maintenanceItemEDCarrierUseFreq.StartValue > 0 && maintenanceItemEDCarrierUseFreq.CurrentValue > maintenanceItemEDCarrierUseFreq.StartValue && wafer.UseCount < maintenanceItemEDCarrierUseFreq.LimitValue)
  186. {
  187. if (maintenanceItemEDCarrierUseFreq.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString()||
  188. maintenanceItemEDCarrierUseFreq.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString()
  189. )
  190. {
  191. var msg = pm.GetAlarmWarningMsg(maintenanceItemEDCarrierUseFreq);
  192. Singleton<EquipmentManager>.Instance.FDWaferTypeUseCountWarning.Set(msg);
  193. }
  194. }
  195. if (wafer.WaferType == WaferType.ED && maintenanceItemEDWaferUserTime.StartValue > 0 && wafer.UseTime > maintenanceItemEDWaferUserTime.StartValue && wafer.UseTime < maintenanceItemEDWaferUserTime.LimitValue)
  196. {
  197. if (maintenanceItemEDWaferUserTime.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString()||
  198. maintenanceItemEDWaferUserTime.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString()
  199. )
  200. {
  201. var currentValue = DateTimeUtil.SecondToHHmmss(maintenanceItemEDWaferUserTime.CurrentValue.ToString());
  202. var minValue = DateTimeUtil.SecondToHHmmss(maintenanceItemEDWaferUserTime.StartValue.ToString());
  203. var maxValue = DateTimeUtil.SecondToHHmmss(maintenanceItemEDWaferUserTime.LimitValue.ToString());
  204. var msg = pm.GetAlarmWarningMsg(maintenanceItemEDWaferUserTime, true, currentValue, minValue, maxValue);
  205. Singleton<EquipmentManager>.Instance.FDWaferTypeUseTimeWarning.Set(msg);
  206. }
  207. }
  208. if (wafer.WaferType == WaferType.ED && maintenanceItemEDWaferThickness.StartValue > 0 && wafer.UseThick > maintenanceItemEDWaferThickness.StartValue && wafer.UseThick < maintenanceItemEDWaferThickness.LimitValue)
  209. {
  210. if (maintenanceItemEDWaferThickness.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString()||
  211. maintenanceItemEDWaferThickness.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString())
  212. {
  213. var msg = pm.GetAlarmWarningMsg(maintenanceItemEDWaferThickness);
  214. Singleton<EquipmentManager>.Instance.FDWaferTypeThicknessWarning.Set(msg);
  215. }
  216. }
  217. if (wafer.WaferType == WaferType.ED && maintenanceItemEDCarrierUseFreq.StartValue > 0 && wafer.UseCount >= maintenanceItemEDCarrierUseFreq.LimitValue)
  218. {
  219. if (maintenanceItemEDCarrierUseFreq.MaintenanceProcessing == MaintenanceProcessingCommandEnum.None.ToString())
  220. continue;
  221. if (maintenanceItemEDCarrierUseFreq.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString())
  222. {
  223. var msg = pm.GetAlarmWarningMsg(maintenanceItemEDCarrierUseFreq);
  224. Singleton<EquipmentManager>.Instance.FDWaferTypeUseCountAlarm.Set(msg);
  225. return Result.FAIL;
  226. }
  227. else if (maintenanceItemEDCarrierUseFreq.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString())
  228. {
  229. var msg = pm.GetAlarmWarningMsg(maintenanceItemEDCarrierUseFreq);
  230. if (string.IsNullOrEmpty(maintenanceItemEDCarrierUseFreq.AssociationProcessRecipeName))
  231. {
  232. Singleton<EquipmentManager>.Instance.FDWaferTypeUseCountAlarm.Set(msg);
  233. return Result.FAIL;
  234. }
  235. Singleton<EquipmentManager>.Instance.FDWaferTypeUseCountAlarm.Set(msg);
  236. pm.TriggerJobAutoStart(maintenanceItemEDCarrierUseFreq.AssociationProcessRecipeName);
  237. LOG.Info($"{msg} Trigger {maintenanceItemEDCarrierUseFreq.AssociationProcessRecipeName}");
  238. return Result.FAIL;
  239. }
  240. }
  241. if (wafer.WaferType == WaferType.ED && maintenanceItemEDWaferUserTime.StartValue > 0 && wafer.UseTime >= maintenanceItemEDWaferUserTime.LimitValue)
  242. {
  243. if (maintenanceItemEDWaferUserTime.MaintenanceProcessing == MaintenanceProcessingCommandEnum.None.ToString())
  244. continue;
  245. var currentValue = DateTimeUtil.SecondToHHmmss(maintenanceItemEDWaferUserTime.CurrentValue.ToString());
  246. var minValue = DateTimeUtil.SecondToHHmmss(maintenanceItemEDWaferUserTime.StartValue.ToString());
  247. var maxValue = DateTimeUtil.SecondToHHmmss(maintenanceItemEDWaferUserTime.LimitValue.ToString());
  248. var msg = pm.GetAlarmWarningMsg(maintenanceItemEDWaferUserTime, true, currentValue, minValue, maxValue);
  249. if (maintenanceItemEDWaferUserTime.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString())
  250. {
  251. Singleton<EquipmentManager>.Instance.FDWaferTypeUseTimeAlarm.Set(msg);
  252. return Result.FAIL;
  253. }
  254. else if (maintenanceItemEDWaferUserTime.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString())
  255. {
  256. if (string.IsNullOrEmpty(maintenanceItemEDWaferUserTime.AssociationProcessRecipeName))
  257. {
  258. Singleton<EquipmentManager>.Instance.FDWaferTypeUseTimeAlarm.Set(msg);
  259. return Result.FAIL;
  260. }
  261. Singleton<EquipmentManager>.Instance.FDWaferTypeUseTimeAlarm.Set(msg);
  262. pm.TriggerJobAutoStart(maintenanceItemEDWaferUserTime.AssociationProcessRecipeName);
  263. LOG.Info($"{msg} Trigger {maintenanceItemEDWaferUserTime.AssociationProcessRecipeName}");
  264. return Result.FAIL;
  265. }
  266. }
  267. if (wafer.WaferType == WaferType.ED && maintenanceItemEDWaferThickness.StartValue > 0 && wafer.UseThick >= maintenanceItemEDWaferThickness.LimitValue)
  268. {
  269. if (maintenanceItemEDWaferThickness.MaintenanceProcessing == MaintenanceProcessingCommandEnum.None.ToString())
  270. continue;
  271. if (maintenanceItemEDWaferThickness.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString())
  272. {
  273. var msg = pm.GetAlarmWarningMsg(maintenanceItemEDWaferThickness);
  274. Singleton<EquipmentManager>.Instance.FDWaferTypeThicknessAlarm.Set(msg);
  275. return Result.FAIL;
  276. }
  277. else if (maintenanceItemEDWaferThickness.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString())
  278. {
  279. var msg = pm.GetAlarmWarningMsg(maintenanceItemEDWaferThickness, true);
  280. if (string.IsNullOrEmpty(maintenanceItemEDWaferThickness.AssociationProcessRecipeName))
  281. {
  282. Singleton<EquipmentManager>.Instance.FDWaferTypeThicknessAlarm.Set(msg);
  283. return Result.FAIL;
  284. }
  285. Singleton<EquipmentManager>.Instance.FDWaferTypeThicknessAlarm.Set(msg);
  286. pm.TriggerJobAutoStart(maintenanceItemEDWaferThickness.AssociationProcessRecipeName);
  287. LOG.Info($"{msg} Trigger {maintenanceItemEDWaferThickness.AssociationProcessRecipeName}");
  288. return Result.FAIL;
  289. }
  290. }
  291. #endregion
  292. }
  293. #endregion
  294. }
  295. }
  296. pm.CheckRecipeThicknessMoreThan(_recipeName, out var isPause);
  297. if (isPause)
  298. return Result.FAIL;
  299. pm.CheckRecipeExecuteFreqMoreThan(_recipeName, out var isPause1);
  300. if (isPause1)
  301. return Result.FAIL;
  302. foreach (var item in recipeSteps)
  303. {
  304. pm.CheckRecipeStepFreqMoreThan(item.StepName, out var isPause2);
  305. if (isPause2)
  306. return Result.FAIL;
  307. pm.CheckRecipeStepTimeMoreThan(item.StepName, out var isPause3);
  308. if (isPause3)
  309. return Result.FAIL;
  310. pm.CheckRecipeStepGroupThicknessMoreThan(item.StepName, out var isPause4);
  311. if (isPause4)
  312. return Result.FAIL;
  313. }
  314. }
  315. #endregion
  316. PMModule.RecipeRunningInfo.MainRecipeName = _recipeName;
  317. PMModule.RecipeRunningInfo.Head = recipeHead;
  318. PMModule.RecipeRunningInfo.RecipeStepList = recipeSteps;
  319. }
  320. Reset();
  321. Notify($"Start");
  322. return Result.RUN;
  323. }
  324. public override Result Monitor()
  325. {
  326. try
  327. {
  328. //ToReadyProcessState((int)Routine.ToReadyProcessState, PMModule, _liftTimeout);
  329. //ExecuteRoutine((int)Routine.Pump, _pumpRoutine);
  330. //MovePinDown((int)Routine.PinDown, PMModule, _liftTimeout);
  331. }
  332. catch (RoutineBreakException)
  333. {
  334. return Result.RUN;
  335. }
  336. catch (RoutineFaildException)
  337. {
  338. return Result.FAIL;
  339. }
  340. return Result.DONE;
  341. }
  342. public override void Abort()
  343. {
  344. }
  345. }
  346. }