RinseCycleManualProcessRecipeRoutine.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. using Aitex.Core.RT.Device;
  2. using Aitex.Core.RT.Routine;
  3. using MECF.Framework.Common.RecipeCenter;
  4. using MECF.Framework.Common.Routine;
  5. using CyberX8_Core;
  6. using CyberX8_RT.Devices.Rinse;
  7. using System;
  8. using System.Collections.Generic;
  9. using MECF.Framework.Common.Utilities;
  10. using Aitex.Core.RT.Log;
  11. using MECF.Framework.Common.CommonData.Rinse;
  12. using CyberX8_RT.Devices.Resistivity;
  13. using MECF.Framework.Common.CommonData;
  14. using Aitex.Core.Util;
  15. using CyberX8_RT.Devices.Facilities;
  16. using Aitex.Core.RT.SCCore;
  17. namespace CyberX8_RT.Modules.Rinse
  18. {
  19. sealed class RinseCycleManualProcessRecipeRoutine : RoutineBase,IRoutine
  20. {
  21. private const int LOTTRACK_TIME = 1000;
  22. private const string DI_WATER_PRESSURE_VALUE = "DiWaterPressure";
  23. private enum CycleManualRunRecipeStep
  24. {
  25. LoopStart,
  26. LoopRunFirstStep,
  27. LoopWaitRunFirstStepProcess,
  28. LoopFirstStepDelay,
  29. LoopRunSecondStep,
  30. LoopWaitRunSecondStepProcess,
  31. LoopSecondStepDelay,
  32. LoopRunThirdStep,
  33. LoopWaitRunThirdStepProcess,
  34. LoopThirdStepDelay,
  35. LoopEnd,
  36. ProcessComplete
  37. }
  38. #region 内部变量
  39. private RinseFirstStepRoutine _rinseFirstStepRoutine;
  40. private RinseSecondStepRoutine _rinseSecondStepRoutine;
  41. private RinseThirdStepRoutine _rinseThirdStepRoutine;
  42. private int _cycle = 0;
  43. private int _achievedCycle;
  44. private object[] param;
  45. /// <summary>
  46. /// 设备对象
  47. /// </summary>
  48. private RinseDevice _device;
  49. /// <summary>
  50. /// Recipe
  51. /// </summary>
  52. private QdrRecipe _recipe;
  53. /// <summary>
  54. /// 当前执行到哪一步的显示
  55. /// </summary>
  56. private string _currentStateMachine;
  57. /// <summary>
  58. /// lock track time
  59. /// </summary>
  60. private DateTime _lotTackTime = DateTime.Now;
  61. /// <summary>
  62. /// LotTrack数据
  63. /// </summary>
  64. private List<RinseLotTrackData> _datas = new List<RinseLotTrackData>();
  65. /// <summary>
  66. /// LotTrack文件头数据
  67. /// </summary>
  68. private LotTrackFileHeaderCommonData _header = new LotTrackFileHeaderCommonData();
  69. /// <summary>
  70. /// Facilities
  71. /// </summary>
  72. private SystemFacilities _facilities;
  73. #endregion
  74. #region 属性
  75. /// <summary>
  76. /// LotTrack数据
  77. /// </summary>
  78. public List<RinseLotTrackData> RinseLotTrackDatas { get { return _datas; } }
  79. /// <summary>
  80. /// LotTrack文件头数据
  81. /// </summary>
  82. public LotTrackFileHeaderCommonData RinseLotTrackHeaderDatas { get { return _header; } }
  83. #endregion
  84. /// <summary>
  85. /// 构造函数
  86. /// </summary>
  87. /// <param name="module"></param>
  88. public RinseCycleManualProcessRecipeRoutine(string module) : base(module)
  89. {
  90. _rinseFirstStepRoutine = new RinseFirstStepRoutine(module);
  91. _rinseSecondStepRoutine = new RinseSecondStepRoutine(module);
  92. _rinseThirdStepRoutine = new RinseThirdStepRoutine(module);
  93. }
  94. /// <summary>
  95. /// Start 参数包括cycle和recipe
  96. /// </summary>
  97. public RState Start(params object[] objs)
  98. {
  99. //清除lotTrack数据
  100. _datas.Clear();
  101. _device = DEVICE.GetDevice<RinseDevice>(Module);
  102. _recipe = objs[0] as QdrRecipe;
  103. if (_recipe == null)
  104. {
  105. NotifyError(eEvent.ERR_RINSE, "recipe is null",-1);
  106. return RState.Failed;
  107. }
  108. _cycle = (int)objs[1];
  109. _achievedCycle = 0;
  110. param = objs;
  111. if (SC.ContainsItem("System.ToolID")) _header.ToolID = SC.GetStringValue("System.ToolID");
  112. _header.SoftWareVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
  113. _header.Recipe = $"{_recipe.Ppid}.qdr.rcp";
  114. //lotTract记录SequenceRecipe
  115. RinseEntity rinseEntity = Singleton<RouteManager>.Instance.GetModule<RinseEntity>(Module);
  116. if (rinseEntity.WaferHolderInfo != null && rinseEntity.WaferHolderInfo.SequenceRecipe != null && !String.IsNullOrEmpty(rinseEntity.WaferHolderInfo.SequenceRecipe.Ppid.ToString()))
  117. {
  118. _header.SequenceRecipe = rinseEntity.WaferHolderInfo.SequenceRecipe.Ppid.ToString();
  119. _header.ProcessTransferList = new List<string>();
  120. _header.ProcessTransferList.AddRange(rinseEntity.WaferHolderInfo.SchedulerModules);
  121. rinseEntity.WaferHolderInfo.SchedulerModules.Clear();
  122. }
  123. _facilities = DEVICE.GetDevice<SystemFacilities>("System.Facilities");
  124. if(_facilities == null)
  125. {
  126. LOG.WriteLog(eEvent.ERR_RINSE, Module, "Facility is null");
  127. return RState.Failed;
  128. }
  129. _lotTackTime = DateTime.Now;
  130. return Runner.Start(Module, "Start cycle ManualRunRecipe");
  131. }
  132. /// <summary>
  133. /// Monitor
  134. /// </summary>
  135. /// <returns></returns>
  136. public RState Monitor()
  137. {
  138. _currentStateMachine = Runner.CurrentStep.ToString();
  139. _device.UpdateStatus(_currentStateMachine);
  140. LottrackRecord();
  141. Runner.LoopStart(CycleManualRunRecipeStep.LoopStart, "Loop Start ManualRunRecipe", _cycle, NullFun, _delay_1ms)
  142. .LoopRun(CycleManualRunRecipeStep.LoopRunFirstStep, () => _rinseFirstStepRoutine.Start(param) == RState.Running, _delay_1ms)
  143. .LoopRunWithStopStatus(CycleManualRunRecipeStep.LoopWaitRunFirstStepProcess, () => CommonFunction.CheckRoutineEndState(_rinseFirstStepRoutine),
  144. () => { return CheckRoutineStopStatus(_rinseFirstStepRoutine, _rinseFirstStepRoutine.ErrorMsg, 0); })
  145. .LoopDelay(CycleManualRunRecipeStep.LoopFirstStepDelay, _delay_1ms)
  146. .LoopRun(CycleManualRunRecipeStep.LoopRunSecondStep, () => _rinseSecondStepRoutine.Start(param) == RState.Running, _delay_1ms)
  147. .LoopRunWithStopStatus(CycleManualRunRecipeStep.LoopWaitRunSecondStepProcess, () => CommonFunction.CheckRoutineEndState(_rinseSecondStepRoutine),
  148. () => { return CheckRoutineStopStatus(_rinseSecondStepRoutine, _rinseSecondStepRoutine.ErrorMsg, 0); })
  149. .LoopDelay(CycleManualRunRecipeStep.LoopSecondStepDelay, _delay_1ms)
  150. .LoopRunIf(CycleManualRunRecipeStep.LoopRunThirdStep, _recipe.FinalRinseDry == true, () => _rinseThirdStepRoutine.Start(param) == RState.Running, _delay_1ms)
  151. .LoopRunIfWithStopStatus(CycleManualRunRecipeStep.LoopWaitRunThirdStepProcess, _recipe.FinalRinseDry == true, () => CommonFunction.CheckRoutineEndState(_rinseThirdStepRoutine),
  152. () => { return CheckRoutineStopStatus(_rinseThirdStepRoutine, _rinseThirdStepRoutine.ErrorMsg, 0); })
  153. .LoopRunIf(CycleManualRunRecipeStep.LoopThirdStepDelay, _recipe.FinalRinseDry == true, NullFun, _delay_1ms)
  154. .LoopEnd(CycleManualRunRecipeStep.LoopEnd, AchievedCycleCount, _delay_1ms)
  155. .End(CycleManualRunRecipeStep.ProcessComplete, NullFun, _delay_1ms);
  156. return Runner.Status;
  157. }
  158. /// <summary>
  159. /// 检验Routine停止状态
  160. /// </summary>
  161. /// <param name="routine"></param>
  162. /// <param name="error"></param>
  163. /// <param name="index"></param>
  164. /// <returns></returns>
  165. private bool CheckRoutineStopStatus(IRoutine routine,string error,int index)
  166. {
  167. bool result=CommonFunction.CheckRoutineStopState(routine);
  168. if (result)
  169. {
  170. AddLotTrackData();
  171. NotifyError(eEvent.ERR_RINSE, error, 0);
  172. }
  173. return result;
  174. }
  175. /// <summary>
  176. /// 记录Lottrack
  177. /// </summary>
  178. private void LottrackRecord()
  179. {
  180. //记录Lottrack
  181. if (DateTime.Now.Subtract(_lotTackTime).TotalMilliseconds >= LOTTRACK_TIME)
  182. {
  183. AddLotTrackData();
  184. _lotTackTime = DateTime.Now;
  185. }
  186. }
  187. /// <summary>
  188. /// 获取Lot Track数据
  189. /// </summary>
  190. /// <returns></returns>
  191. private void AddLotTrackData()
  192. {
  193. RinseLotTrackData data = new RinseLotTrackData();
  194. data.TimeStamp = DateTime.Now;
  195. data.StateMachine = _device.CurrentStateMachine;
  196. data.WaterLevel = _device.RinseData.WaterLevel;
  197. data.DIFillEnabled = _device.RinseData.FillValve;
  198. data.DumpEnabled = _device.RinseData.DrainValve;
  199. data.WaterPressure = _facilities.GetCommonLimitDataByName(DI_WATER_PRESSURE_VALUE).Value;
  200. ResistivityController resistivityController = DEVICE.GetDevice<ResistivityController>(_device.RinseItem.ResistivityID);
  201. if (resistivityController != null)
  202. {
  203. try
  204. {
  205. data.Resistivity = double.Parse(resistivityController.ResisitivityValue.Trim());
  206. }
  207. catch
  208. {
  209. data.Resistivity = 0;
  210. }
  211. }
  212. _datas.Add(data);
  213. }
  214. /// <summary>
  215. /// 统计完成的Cycle次数
  216. /// </summary>
  217. /// <returns></returns>
  218. private bool AchievedCycleCount()
  219. {
  220. _achievedCycle += 1;
  221. return true;
  222. }
  223. /// <summary>
  224. /// 释放定时器
  225. /// </summary>
  226. /// <returns></returns>
  227. private bool DisposeTimer()
  228. {
  229. return true;
  230. }
  231. /// <summary>
  232. /// 获取已经完成的Cycle次数
  233. /// </summary>
  234. /// <returns></returns>
  235. public int GetAchievedCycle()
  236. {
  237. return _achievedCycle;
  238. }
  239. /// <summary>
  240. /// Abort
  241. /// </summary>
  242. public void Abort()
  243. {
  244. if (_device != null)
  245. {
  246. _device.N2ValveOff();
  247. _device.FillValveOff();
  248. }
  249. Runner.Stop("Cycle ManualRunRecipe Abort");
  250. }
  251. /// <summary>
  252. /// 重试
  253. /// </summary>
  254. /// <param name="step"></param>
  255. public RState Retry(int step)
  256. {
  257. if (_recipe == null)
  258. {
  259. NotifyError(eEvent.ERR_RINSE, "recipe is null",-1);
  260. return RState.Failed;
  261. }
  262. List<Enum> preStepIds = new List<Enum>();
  263. return Runner.Retry(CycleManualRunRecipeStep.LoopStart, preStepIds, Module, "Runrecipe Retry");
  264. }
  265. }
  266. }