RinseCycleManualProcessRecipeRoutine.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  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, startFirstRoutine, _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, startSecondRoutine, _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, startThirdRoutine, _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. /// 启动第一阶段Rinse
  160. /// </summary>
  161. /// <returns></returns>
  162. private bool startFirstRoutine()
  163. {
  164. bool result = _rinseFirstStepRoutine.Start(param) == RState.Running;
  165. if (!result)
  166. {
  167. AddLotTrackData();
  168. NotifyError(eEvent.ERR_RINSE, _rinseFirstStepRoutine.ErrorMsg, 0);
  169. }
  170. return result;
  171. }
  172. /// <summary>
  173. /// 启动第二阶段Rinse
  174. /// </summary>
  175. /// <returns></returns>
  176. private bool startSecondRoutine()
  177. {
  178. bool result = _rinseSecondStepRoutine.Start(param) == RState.Running;
  179. if (!result)
  180. {
  181. AddLotTrackData();
  182. NotifyError(eEvent.ERR_RINSE, _rinseSecondStepRoutine.ErrorMsg, 0);
  183. }
  184. return result;
  185. }
  186. /// <summary>
  187. /// 启动第三阶段Rinse
  188. /// </summary>
  189. /// <returns></returns>
  190. private bool startThirdRoutine()
  191. {
  192. bool result = _rinseThirdStepRoutine.Start(param) == RState.Running;
  193. if (!result)
  194. {
  195. AddLotTrackData();
  196. NotifyError(eEvent.ERR_RINSE, _rinseThirdStepRoutine.ErrorMsg, 0);
  197. }
  198. return result;
  199. }
  200. /// <summary>
  201. /// 检验Routine停止状态
  202. /// </summary>
  203. /// <param name="routine"></param>
  204. /// <param name="error"></param>
  205. /// <param name="index"></param>
  206. /// <returns></returns>
  207. private bool CheckRoutineStopStatus(IRoutine routine,string error,int index)
  208. {
  209. bool result=CommonFunction.CheckRoutineStopState(routine);
  210. if (result)
  211. {
  212. AddLotTrackData();
  213. NotifyError(eEvent.ERR_RINSE, error, 0);
  214. }
  215. return result;
  216. }
  217. /// <summary>
  218. /// 记录Lottrack
  219. /// </summary>
  220. private void LottrackRecord()
  221. {
  222. //记录Lottrack
  223. if (DateTime.Now.Subtract(_lotTackTime).TotalMilliseconds >= LOTTRACK_TIME)
  224. {
  225. AddLotTrackData();
  226. _lotTackTime = DateTime.Now;
  227. }
  228. }
  229. /// <summary>
  230. /// 获取Lot Track数据
  231. /// </summary>
  232. /// <returns></returns>
  233. private void AddLotTrackData()
  234. {
  235. RinseLotTrackData data = new RinseLotTrackData();
  236. data.TimeStamp = DateTime.Now;
  237. data.StateMachine = _device.CurrentStateMachine;
  238. data.WaterLevel = _device.RinseData.WaterLevel;
  239. data.DIFillEnabled = _device.RinseData.FillValve;
  240. data.DumpEnabled = _device.RinseData.DrainValve;
  241. data.WaterPressure = _facilities.GetCommonLimitDataByName(DI_WATER_PRESSURE_VALUE).Value;
  242. ResistivityController resistivityController = DEVICE.GetDevice<ResistivityController>(_device.RinseItem.ResistivityID);
  243. if (resistivityController != null)
  244. {
  245. try
  246. {
  247. data.Resistivity = double.Parse(resistivityController.ResisitivityValue.Trim());
  248. }
  249. catch
  250. {
  251. data.Resistivity = 0;
  252. }
  253. }
  254. _datas.Add(data);
  255. }
  256. /// <summary>
  257. /// 统计完成的Cycle次数
  258. /// </summary>
  259. /// <returns></returns>
  260. private bool AchievedCycleCount()
  261. {
  262. _achievedCycle += 1;
  263. return true;
  264. }
  265. /// <summary>
  266. /// 释放定时器
  267. /// </summary>
  268. /// <returns></returns>
  269. private bool DisposeTimer()
  270. {
  271. return true;
  272. }
  273. /// <summary>
  274. /// 获取已经完成的Cycle次数
  275. /// </summary>
  276. /// <returns></returns>
  277. public int GetAchievedCycle()
  278. {
  279. return _achievedCycle;
  280. }
  281. /// <summary>
  282. /// Abort
  283. /// </summary>
  284. public void Abort()
  285. {
  286. if (_device != null)
  287. {
  288. _device.N2ValveOff();
  289. _device.FillValveOff();
  290. }
  291. Runner.Stop("Cycle ManualRunRecipe Abort");
  292. }
  293. /// <summary>
  294. /// 重试
  295. /// </summary>
  296. /// <param name="step"></param>
  297. public RState Retry(int step)
  298. {
  299. if (_recipe == null)
  300. {
  301. NotifyError(eEvent.ERR_RINSE, "recipe is null",-1);
  302. return RState.Failed;
  303. }
  304. List<Enum> preStepIds = new List<Enum>();
  305. return Runner.Retry(CycleManualRunRecipeStep.LoopStart, preStepIds, Module, "Runrecipe Retry");
  306. }
  307. }
  308. }