StandardHotRunRecipeRoutine.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. using Aitex.Core.RT.Device;
  2. using Aitex.Core.RT.Log;
  3. using Aitex.Core.RT.Routine;
  4. using CyberX8_Core;
  5. using CyberX8_RT.Devices.Metal;
  6. using CyberX8_RT.Devices.PowerSupplier;
  7. using MECF.Framework.Common.CommonData;
  8. using MECF.Framework.Common.CommonData.Metal;
  9. using MECF.Framework.Common.CommonData.PowerSupplier;
  10. using MECF.Framework.Common.CommonData.SRD;
  11. using MECF.Framework.Common.Device.PowerSupplier;
  12. using MECF.Framework.Common.RecipeCenter;
  13. using MECF.Framework.Common.Routine;
  14. using MECF.Framework.Common.Utilities;
  15. using System;
  16. using System.Collections.Generic;
  17. using System.Linq;
  18. using System.Text;
  19. using System.Threading.Tasks;
  20. namespace CyberX8_RT.Modules.Metal
  21. {
  22. public class StandardHotRunRecipeRoutine : RoutineBase, IRoutine
  23. {
  24. private enum RecipeStep
  25. {
  26. WaferHolderClampOn,
  27. RunRecipe,
  28. RunRecipeWait,
  29. WaferHolderUnclampOn,
  30. End
  31. }
  32. #region 内部变量
  33. /// <summary>
  34. /// recipe
  35. /// </summary>
  36. private DepRecipe _recipe;
  37. /// <summary>
  38. /// 单面
  39. /// </summary>
  40. private string _side;
  41. /// <summary>
  42. /// Metal设备
  43. /// </summary>
  44. private StandardHotMetalDevice _device;
  45. /// <summary>
  46. /// RunRecipe routine
  47. /// </summary>
  48. private ReservoirRunRecipeRoutine _runRecipeRoutine;
  49. #endregion
  50. #region 属性
  51. /// <summary>
  52. /// A面电量
  53. /// </summary>
  54. public double AnodeAUsage { get { return _runRecipeRoutine.AnodeAUsage; } }
  55. /// <summary>
  56. /// B面电量
  57. /// </summary>
  58. public double AnodeBUsage { get { return _runRecipeRoutine.AnodeBUsage; } }
  59. /// <summary>
  60. /// LotTrack数据
  61. /// </summary>
  62. public List<MetalLotTrackData> MetalLotTrackDatas { get { return _runRecipeRoutine.MetalLotTrackDatas; } }
  63. /// <summary>
  64. /// LotTrack文件头数据
  65. /// </summary>
  66. public LotTrackFileHeaderCommonData MetalLotTrackHeaderDatas { get { return _runRecipeRoutine.MetalLotTrackHeaderDatas; } }
  67. #endregion
  68. /// <summary>
  69. /// 构造函数
  70. /// </summary>
  71. /// <param name="module"></param>
  72. public StandardHotRunRecipeRoutine(string module) : base(module)
  73. {
  74. _runRecipeRoutine=new ReservoirRunRecipeRoutine(module);
  75. }
  76. /// <summary>
  77. /// 中止
  78. /// </summary>
  79. public void Abort()
  80. {
  81. _runRecipeRoutine.Abort();
  82. Runner.Stop("Manual Abort");
  83. }
  84. /// <summary>
  85. /// 监控
  86. /// </summary>
  87. /// <returns></returns>
  88. public RState Monitor()
  89. {
  90. Runner.Run(RecipeStep.WaferHolderClampOn, () => _device.WaferHolderClampOn("", null), () => _device.MetalDeviceData.WaferHolderClamp,_delay_1s)
  91. .Run(RecipeStep.RunRecipe, () => _runRecipeRoutine.Start(new object[] { _recipe, _side }) == RState.Running, _delay_1ms)
  92. .WaitWithStopCondition(RecipeStep.RunRecipeWait, () => CommonFunction.CheckRoutineEndState(_runRecipeRoutine), CheckRunRecipeStopStatus)
  93. .Run(RecipeStep.WaferHolderUnclampOn, () => _device.WaferHolderClampOff("", null), () => !_device.MetalDeviceData.WaferHolderClamp,_delay_1s)
  94. .End(RecipeStep.End, NullFun, _delay_1ms);
  95. return Runner.Status;
  96. }
  97. /// <summary>
  98. /// 启动
  99. /// </summary>
  100. /// <param name="objs"></param>
  101. /// <returns></returns>
  102. public RState Start(params object[] objs)
  103. {
  104. _recipe=(DepRecipe)objs[0];
  105. if(objs.Length>1)
  106. {
  107. _side = objs[1].ToString();
  108. }
  109. _device = DEVICE.GetDevice<StandardHotMetalDevice>(Module);
  110. if(!CheckPreCondition())
  111. {
  112. return RState.Failed;
  113. }
  114. return Runner.Start(Module, "Start run recipe");
  115. }
  116. /// <summary>
  117. /// 检验前置条件
  118. /// </summary>
  119. /// <returns></returns>
  120. private bool CheckPreCondition()
  121. {
  122. if(_recipe==null)
  123. {
  124. LOG.WriteLog(eEvent.ERR_METAL, Module, "Recipe is null");
  125. return false;
  126. }
  127. if(_recipe.CurrentRampProfileSteps.Count==0)
  128. {
  129. LOG.WriteLog(eEvent.ERR_METAL, Module, "Recipe RampProfileSteps count is 0");
  130. return false;
  131. }
  132. return true;
  133. }
  134. /// <summary>
  135. /// RunRecipe停止状态
  136. /// </summary>
  137. /// <returns></returns>
  138. public bool CheckRunRecipeStopStatus()
  139. {
  140. bool result = CommonFunction.CheckRoutineStopState(_runRecipeRoutine);
  141. if (result)
  142. {
  143. AddLotTrackData();
  144. if (_device.SideAPowerSupplier != null)
  145. {
  146. _device.SideAPowerSupplier.DisableOperation("", null);
  147. }
  148. if (_device.SideBPowerSupplier != null)
  149. {
  150. _device.SideBPowerSupplier.DisableOperation("", null);
  151. }
  152. }
  153. return result;
  154. }
  155. /// <summary>
  156. /// 获取Lot Track数据
  157. /// </summary>
  158. /// <returns></returns>
  159. public void AddLotTrackData()
  160. {
  161. _runRecipeRoutine.AddLotTrackData();
  162. }
  163. }
  164. }