PreProcess.cs 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  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. if (wafer.WaferType == WaferType.SD)
  73. {
  74. var maintenanceItemCarrierUseFreq = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.SDCarrierUseFreq.ToString());
  75. var maintenanceItemWaferThickness = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.SDWaferThickness.ToString());
  76. var maintenanceItemWaferUserTime = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.SDWaferUserTime.ToString());
  77. if (maintenanceItemCarrierUseFreq.StartValue > 0 && wafer.UseCount > maintenanceItemCarrierUseFreq.StartValue && wafer.UseCount < maintenanceItemCarrierUseFreq.LimitValue)
  78. {
  79. if (maintenanceItemCarrierUseFreq.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString() ||
  80. maintenanceItemCarrierUseFreq.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString())
  81. {
  82. var msg = pm.GetAlarmWarningMsg(maintenanceItemCarrierUseFreq, false, wafer.UseCount.ToString(), maintenanceItemCarrierUseFreq.StartValue.ToString(), maintenanceItemCarrierUseFreq.LimitValue.ToString());
  83. Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountWarning.Set(msg);
  84. }
  85. }
  86. if (maintenanceItemWaferUserTime.StartValue > 0 && wafer.UseTime > maintenanceItemWaferUserTime.StartValue && wafer.UseTime < maintenanceItemWaferUserTime.LimitValue)
  87. {
  88. if (maintenanceItemWaferUserTime.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString() ||
  89. maintenanceItemWaferUserTime.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString())
  90. {
  91. var currentValue = DateTimeUtil.SecondToHHmmss(maintenanceItemWaferUserTime.CurrentValue.ToString());
  92. var minValue = DateTimeUtil.SecondToHHmmss(maintenanceItemWaferUserTime.StartValue.ToString());
  93. var maxValue = DateTimeUtil.SecondToHHmmss(maintenanceItemWaferUserTime.LimitValue.ToString());
  94. var msg = pm.GetAlarmWarningMsg(maintenanceItemWaferUserTime, true, currentValue, minValue, maxValue);
  95. Singleton<EquipmentManager>.Instance.SDWaferTypeUseTimeWarning.Set(msg);
  96. }
  97. }
  98. if (maintenanceItemWaferThickness.StartValue > 0 && wafer.UseThick > maintenanceItemWaferThickness.StartValue && wafer.UseThick < maintenanceItemWaferThickness.LimitValue)
  99. {
  100. if (maintenanceItemWaferThickness.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString() ||
  101. maintenanceItemWaferThickness.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString())
  102. {
  103. var msg = pm.GetAlarmWarningMsg(maintenanceItemWaferThickness, false, wafer.UseThick.ToString(), maintenanceItemWaferThickness.StartValue.ToString(), maintenanceItemWaferThickness.LimitValue.ToString());
  104. Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessWarning.Set(msg);
  105. }
  106. }
  107. if (maintenanceItemCarrierUseFreq.StartValue > 0 && wafer.UseCount >= maintenanceItemCarrierUseFreq.LimitValue)
  108. {
  109. if (maintenanceItemCarrierUseFreq.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString())
  110. {
  111. var msg = pm.GetAlarmWarningMsg(maintenanceItemCarrierUseFreq, false, wafer.UseCount.ToString(), maintenanceItemCarrierUseFreq.StartValue.ToString(), maintenanceItemCarrierUseFreq.LimitValue.ToString());
  112. Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountAlarm.Set(msg);
  113. return Result.FAIL;
  114. }
  115. else if (maintenanceItemCarrierUseFreq.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString())
  116. {
  117. var msg = pm.GetAlarmWarningMsg(maintenanceItemCarrierUseFreq, true);
  118. if (string.IsNullOrEmpty(maintenanceItemCarrierUseFreq.AssociationProcessRecipeName))
  119. {
  120. Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountAlarm.Set(msg);
  121. return Result.FAIL;
  122. }
  123. Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountAlarm.Set(msg);
  124. pm.TriggerJobAutoStart(maintenanceItemCarrierUseFreq.AssociationProcessRecipeName, RecipeExecEntryEnum.SDWaferRangeTrigger);
  125. LOG.Info($"{msg} Trigger {maintenanceItemCarrierUseFreq.AssociationProcessRecipeName},auto clear CurrentValue {maintenanceItemCarrierUseFreq.LimitValue} to 0");
  126. // Singleton<ScheduleMaintenanceDataManager>.Instance.SetValue(maintenanceItemCarrierUseFreq.Item, 0, true);
  127. return Result.FAIL;
  128. }
  129. }
  130. if (maintenanceItemWaferUserTime.StartValue > 0 && wafer.UseTime >= maintenanceItemWaferUserTime.LimitValue)
  131. {
  132. var currentValue = DateTimeUtil.SecondToHHmmss(maintenanceItemWaferUserTime.CurrentValue.ToString());
  133. var minValue = DateTimeUtil.SecondToHHmmss(maintenanceItemWaferUserTime.StartValue.ToString());
  134. var maxValue = DateTimeUtil.SecondToHHmmss(maintenanceItemWaferUserTime.LimitValue.ToString());
  135. var msg = pm.GetAlarmWarningMsg(maintenanceItemWaferUserTime, true, currentValue, minValue, maxValue);
  136. if (maintenanceItemWaferUserTime.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString())
  137. {
  138. Singleton<EquipmentManager>.Instance.SDWaferTypeUseTimeAlarm.Set(msg);
  139. return Result.FAIL;
  140. }
  141. else if (maintenanceItemWaferUserTime.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString())
  142. {
  143. if (string.IsNullOrEmpty(maintenanceItemWaferUserTime.AssociationProcessRecipeName))
  144. {
  145. Singleton<EquipmentManager>.Instance.SDWaferTypeUseTimeAlarm.Set(msg);
  146. return Result.FAIL;
  147. }
  148. Singleton<EquipmentManager>.Instance.SDWaferTypeUseTimeAlarm.Set(msg);
  149. pm.TriggerJobAutoStart(maintenanceItemWaferUserTime.AssociationProcessRecipeName, RecipeExecEntryEnum.SDWaferRangeTrigger);
  150. LOG.Info($"{msg} Trigger {maintenanceItemWaferUserTime.AssociationProcessRecipeName},auto clear CurrentValue {maintenanceItemWaferUserTime.LimitValue} to 0");
  151. // Singleton<ScheduleMaintenanceDataManager>.Instance.SetValue(maintenanceItemWaferUserTime.Item, 0, true);
  152. return Result.FAIL;
  153. }
  154. }
  155. if (maintenanceItemWaferThickness.StartValue > 0 && wafer.UseThick >= maintenanceItemWaferThickness.LimitValue)
  156. {
  157. if (maintenanceItemWaferThickness.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString())
  158. {
  159. var msg = pm.GetAlarmWarningMsg(maintenanceItemWaferThickness, false, wafer.UseThick.ToString(), maintenanceItemWaferThickness.StartValue.ToString(), maintenanceItemWaferThickness.LimitValue.ToString());
  160. Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessAlarm.Set(msg);
  161. return Result.FAIL;
  162. }
  163. else if (maintenanceItemWaferThickness.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString())
  164. {
  165. var msg = pm.GetAlarmWarningMsg(maintenanceItemWaferThickness, true);
  166. if (string.IsNullOrEmpty(maintenanceItemWaferThickness.AssociationProcessRecipeName))
  167. {
  168. Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessAlarm.Set(msg);
  169. return Result.FAIL;
  170. }
  171. Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessAlarm.Set(msg);
  172. pm.TriggerJobAutoStart(maintenanceItemWaferThickness.AssociationProcessRecipeName, RecipeExecEntryEnum.SDWaferRangeTrigger);
  173. LOG.Info($"{msg} Trigger {maintenanceItemWaferThickness.AssociationProcessRecipeName},auto clear CurrentValue {maintenanceItemWaferThickness.LimitValue} to 0");
  174. // Singleton<ScheduleMaintenanceDataManager>.Instance.SetValue(maintenanceItemWaferThickness.Item, 0, true);
  175. return Result.FAIL;
  176. }
  177. }
  178. }
  179. #endregion
  180. #region ED
  181. if (wafer.WaferType == WaferType.ED)
  182. {
  183. var maintenanceItemCarrierUseFreq = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.FDCarrierUseFreq.ToString());
  184. var maintenanceItemWaferThickness = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.FDWaferThickness.ToString());
  185. var maintenanceItemWaferUserTime = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.FDWaferUserTime.ToString());
  186. if (maintenanceItemCarrierUseFreq.StartValue > 0 && wafer.UseCount > maintenanceItemCarrierUseFreq.StartValue && wafer.UseCount < maintenanceItemCarrierUseFreq.LimitValue)
  187. {
  188. if (maintenanceItemCarrierUseFreq.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString() ||
  189. maintenanceItemCarrierUseFreq.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString())
  190. {
  191. var msg = pm.GetAlarmWarningMsg(maintenanceItemCarrierUseFreq, false, wafer.UseCount.ToString(), maintenanceItemCarrierUseFreq.StartValue.ToString(), maintenanceItemCarrierUseFreq.LimitValue.ToString());
  192. Singleton<EquipmentManager>.Instance.FDWaferTypeUseCountWarning.Set(msg);
  193. }
  194. }
  195. if (maintenanceItemWaferUserTime.StartValue > 0 && wafer.UseTime > maintenanceItemWaferUserTime.StartValue && wafer.UseTime < maintenanceItemWaferUserTime.LimitValue)
  196. {
  197. if (maintenanceItemWaferUserTime.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString() ||
  198. maintenanceItemWaferUserTime.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString())
  199. {
  200. var currentValue = DateTimeUtil.SecondToHHmmss(maintenanceItemWaferUserTime.CurrentValue.ToString());
  201. var minValue = DateTimeUtil.SecondToHHmmss(maintenanceItemWaferUserTime.StartValue.ToString());
  202. var maxValue = DateTimeUtil.SecondToHHmmss(maintenanceItemWaferUserTime.LimitValue.ToString());
  203. var msg = pm.GetAlarmWarningMsg(maintenanceItemWaferUserTime, true, currentValue, minValue, maxValue);
  204. Singleton<EquipmentManager>.Instance.FDWaferTypeUseTimeWarning.Set(msg);
  205. }
  206. }
  207. if (maintenanceItemWaferThickness.StartValue > 0 && wafer.UseThick > maintenanceItemWaferThickness.StartValue && wafer.UseThick < maintenanceItemWaferThickness.LimitValue)
  208. {
  209. if (maintenanceItemWaferThickness.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString() ||
  210. maintenanceItemWaferThickness.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString())
  211. {
  212. var msg = pm.GetAlarmWarningMsg(maintenanceItemWaferThickness, false, wafer.UseThick.ToString(), maintenanceItemWaferThickness.StartValue.ToString(), maintenanceItemWaferThickness.LimitValue.ToString());
  213. Singleton<EquipmentManager>.Instance.FDWaferTypeThicknessWarning.Set(msg);
  214. }
  215. }
  216. if (maintenanceItemCarrierUseFreq.StartValue > 0 && wafer.UseCount >= maintenanceItemCarrierUseFreq.LimitValue)
  217. {
  218. if (maintenanceItemCarrierUseFreq.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString())
  219. {
  220. var msg = pm.GetAlarmWarningMsg(maintenanceItemCarrierUseFreq, false, wafer.UseCount.ToString(), maintenanceItemCarrierUseFreq.StartValue.ToString(), maintenanceItemCarrierUseFreq.LimitValue.ToString());
  221. Singleton<EquipmentManager>.Instance.FDWaferTypeUseCountAlarm.Set(msg);
  222. return Result.FAIL;
  223. }
  224. else if (maintenanceItemCarrierUseFreq.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString())
  225. {
  226. var msg = pm.GetAlarmWarningMsg(maintenanceItemCarrierUseFreq);
  227. if (string.IsNullOrEmpty(maintenanceItemCarrierUseFreq.AssociationProcessRecipeName))
  228. {
  229. Singleton<EquipmentManager>.Instance.FDWaferTypeUseCountAlarm.Set(msg);
  230. return Result.FAIL;
  231. }
  232. Singleton<EquipmentManager>.Instance.FDWaferTypeUseCountAlarm.Set(msg);
  233. pm.TriggerJobAutoStart(maintenanceItemCarrierUseFreq.AssociationProcessRecipeName, RecipeExecEntryEnum.EDWaferRangeTrigger);
  234. LOG.Info($"{msg} Trigger {maintenanceItemCarrierUseFreq.AssociationProcessRecipeName},auto clear CurrentValue {maintenanceItemCarrierUseFreq.LimitValue} to 0");
  235. // Singleton<ScheduleMaintenanceDataManager>.Instance.SetValue(maintenanceItemCarrierUseFreq.Item, 0, true);
  236. return Result.FAIL;
  237. }
  238. }
  239. if (maintenanceItemWaferUserTime.StartValue > 0 && wafer.UseTime >= maintenanceItemWaferUserTime.LimitValue)
  240. {
  241. var currentValue = DateTimeUtil.SecondToHHmmss(maintenanceItemWaferUserTime.CurrentValue.ToString());
  242. var minValue = DateTimeUtil.SecondToHHmmss(maintenanceItemWaferUserTime.StartValue.ToString());
  243. var maxValue = DateTimeUtil.SecondToHHmmss(maintenanceItemWaferUserTime.LimitValue.ToString());
  244. var msg = pm.GetAlarmWarningMsg(maintenanceItemWaferUserTime, true, currentValue, minValue, maxValue);
  245. if (maintenanceItemWaferUserTime.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString())
  246. {
  247. Singleton<EquipmentManager>.Instance.FDWaferTypeUseTimeAlarm.Set(msg);
  248. return Result.FAIL;
  249. }
  250. else if (maintenanceItemWaferUserTime.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString())
  251. {
  252. if (string.IsNullOrEmpty(maintenanceItemWaferUserTime.AssociationProcessRecipeName))
  253. {
  254. Singleton<EquipmentManager>.Instance.FDWaferTypeUseTimeAlarm.Set(msg);
  255. return Result.FAIL;
  256. }
  257. Singleton<EquipmentManager>.Instance.FDWaferTypeUseTimeAlarm.Set(msg);
  258. pm.TriggerJobAutoStart(maintenanceItemWaferUserTime.AssociationProcessRecipeName, RecipeExecEntryEnum.EDWaferRangeTrigger);
  259. LOG.Info($"{msg} Trigger {maintenanceItemWaferUserTime.AssociationProcessRecipeName},auto clear CurrentValue {maintenanceItemWaferUserTime.LimitValue} to 0");
  260. // Singleton<ScheduleMaintenanceDataManager>.Instance.SetValue(maintenanceItemWaferUserTime.Item, 0, true);
  261. return Result.FAIL;
  262. }
  263. }
  264. if (maintenanceItemWaferThickness.StartValue > 0 && wafer.UseThick >= maintenanceItemWaferThickness.LimitValue)
  265. {
  266. if (maintenanceItemWaferThickness.MaintenanceProcessing == MaintenanceProcessingCommandEnum.AlarmReport.ToString())
  267. {
  268. var msg = pm.GetAlarmWarningMsg(maintenanceItemWaferThickness, false, wafer.UseThick.ToString(), maintenanceItemWaferThickness.StartValue.ToString(), maintenanceItemWaferThickness.LimitValue.ToString());
  269. Singleton<EquipmentManager>.Instance.FDWaferTypeThicknessAlarm.Set(msg);
  270. return Result.FAIL;
  271. }
  272. else if (maintenanceItemWaferThickness.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString())
  273. {
  274. var msg = pm.GetAlarmWarningMsg(maintenanceItemWaferThickness, true);
  275. if (string.IsNullOrEmpty(maintenanceItemWaferThickness.AssociationProcessRecipeName))
  276. {
  277. Singleton<EquipmentManager>.Instance.FDWaferTypeThicknessAlarm.Set(msg);
  278. return Result.FAIL;
  279. }
  280. Singleton<EquipmentManager>.Instance.FDWaferTypeThicknessAlarm.Set(msg);
  281. pm.TriggerJobAutoStart(maintenanceItemWaferThickness.AssociationProcessRecipeName, RecipeExecEntryEnum.EDWaferRangeTrigger);
  282. LOG.Info($"{msg} Trigger {maintenanceItemWaferThickness.AssociationProcessRecipeName},auto clear CurrentValue {maintenanceItemWaferThickness.LimitValue} to 0");
  283. //Singleton<ScheduleMaintenanceDataManager>.Instance.SetValue(maintenanceItemWaferThickness.Item, 0, true);
  284. return Result.FAIL;
  285. }
  286. }
  287. }
  288. #endregion
  289. }
  290. #endregion
  291. }
  292. }
  293. pm.CheckBoatRecipeThicknessMoreThan(out var boatRecipeThicknessIsPause);
  294. if (boatRecipeThicknessIsPause)
  295. return Result.FAIL;
  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. PMModule.RecipeRunningInfo.ExecRecipeType = recipeSteps.Count > 0 ? recipeSteps[0].RecipeType : string.Empty;
  320. }
  321. Reset();
  322. Notify($"Start");
  323. return Result.RUN;
  324. }
  325. public override Result Monitor()
  326. {
  327. try
  328. {
  329. //ToReadyProcessState((int)Routine.ToReadyProcessState, PMModule, _liftTimeout);
  330. //ExecuteRoutine((int)Routine.Pump, _pumpRoutine);
  331. //MovePinDown((int)Routine.PinDown, PMModule, _liftTimeout);
  332. }
  333. catch (RoutineBreakException)
  334. {
  335. return Result.RUN;
  336. }
  337. catch (RoutineFaildException)
  338. {
  339. return Result.FAIL;
  340. }
  341. return Result.DONE;
  342. }
  343. public override void Abort()
  344. {
  345. }
  346. }
  347. }