ProcessDefine.cs 56 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243
  1. using System;
  2. using System.Collections.Generic;
  3. //using System.
  4. using Venus_RT.Devices;
  5. using Aitex.Core.RT.Log;
  6. using Venus_Core;
  7. using Aitex.Core.RT.SCCore;
  8. using Aitex.Core.RT.Tolerance;
  9. using System.Diagnostics;
  10. //#pragma warning disable 0436
  11. namespace Venus_RT.Modules.PMs
  12. {
  13. class ProcessHelper
  14. {
  15. protected JetPMBase Chamber;
  16. private string Module;
  17. public RecipeHead m_RecipeHead;
  18. private static Dictionary<string, Func<ProcessUnitBase, RecipeStep, RState>> startHelper = new Dictionary<string, Func<ProcessUnitBase, RecipeStep, RState>>();
  19. private static Dictionary<string, Func<ProcessUnitBase, RecipeStep, RState>> checkerHelper = new Dictionary<string, Func<ProcessUnitBase, RecipeStep, RState>>();
  20. private static Dictionary<string, Action<ProcessUnitBase, RecipeStep>> endHelper = new Dictionary<string, Action<ProcessUnitBase, RecipeStep>>();
  21. private List<float> rfMatchC1 = new List<float>();
  22. private List<float> rfMatchC2 = new List<float>();
  23. private int rfMatchC1C2Index = 0;
  24. private List<float> biasRfMatchC1 = new List<float>();
  25. private List<float> biasRfMatchC2 = new List<float>();
  26. private int biasRfMatchC1C2Index = 0;
  27. public bool isLoop = false;
  28. public int loopsteps = 0;
  29. public int currentStepIndex = 0;
  30. private bool biasRFSetPointFlag = true;
  31. private double _scRFPowerAlarmTime;
  32. private double _scBiasRFPowerAlarmTime;
  33. private RecipeToleranceChecker _GasFlowToleranceChecker;
  34. private RecipeToleranceChecker _RFToleranceChecker;
  35. private RecipeToleranceChecker _BiasRFToleranceChecker;
  36. //private RecipeToleranceChecker _HeliumToleranceChecker;
  37. private RecipeToleranceChecker _PressureToleranceChecker;
  38. private RecipeToleranceChecker _HighTemperatureToleranceChecker;
  39. private bool _isEnableMatchC1C2Offset;
  40. private int _matchC1C2OffsetValue;
  41. private bool _isEnableBiasMatchC1C2Offset;
  42. private int _biasMatchC1C2OffsetValue;
  43. private bool _isInstalledEPD;
  44. private Stopwatch _lastEPDStepTimeStopwatch;
  45. public long lastEPDStepTime;
  46. public ProcessHelper(JetPMBase pm)
  47. {
  48. Chamber = pm;
  49. Module = pm.Module.ToString();
  50. Init();
  51. _GasFlowToleranceChecker = new RecipeToleranceChecker(Module);
  52. _RFToleranceChecker = new RecipeToleranceChecker(Module);
  53. _BiasRFToleranceChecker = new RecipeToleranceChecker(Module);
  54. //_HeliumToleranceChecker = new RecipeToleranceChecker(Module);
  55. _PressureToleranceChecker = new RecipeToleranceChecker(Module);
  56. _HighTemperatureToleranceChecker = new RecipeToleranceChecker(Module);
  57. if (Chamber.ChamberType == JetChamber.Kepler2300 || Chamber.ChamberType == JetChamber.VenusSE || Chamber.ChamberType == JetChamber.VenusDE)
  58. {
  59. _isInstalledEPD = SC.GetValue<bool>($"{Module}.EPD.IsEnabled");
  60. }
  61. if (_isInstalledEPD)
  62. {
  63. _lastEPDStepTimeStopwatch = new Stopwatch();
  64. }
  65. }
  66. private void Init()
  67. {
  68. startHelper[$"{Module}.PressureByPressureModeUnit"] = (ProcessUnitBase unit, RecipeStep step) => PressureByPressureModeUnit_Start(unit, step);
  69. checkerHelper[$"{Module}.PressureByPressureModeUnit"] = (ProcessUnitBase unit, RecipeStep step) => PressureByPressureModeUnit_Check(unit, step);
  70. endHelper[$"{Module}.PressureByPressureModeUnit"] = (ProcessUnitBase unit, RecipeStep step) => PressureByPressureModeUnit_End(unit, step);
  71. //startHelper [$"{Module}.PressureByValveModeUnit"] = (ProcessUnitBase unit, RecipeStep step) => PressureByValveModeUnit_Start(unit, step);
  72. //checkerHelper [$"{Module}.PressureByValveModeUnit"] = (ProcessUnitBase unit, RecipeStep step) => PressureByValveModeUnit_Check(unit, step);
  73. //endHelper [$"{Module}.PressureByValveModeUnit"] = (ProcessUnitBase unit, RecipeStep step) => PressureByValveModeUnit_End(unit, step);
  74. startHelper[$"{Module}.TCPUnit"] = (ProcessUnitBase unit, RecipeStep step) => TCPUnit_Start(unit, step);
  75. checkerHelper[$"{Module}.TCPUnit"] = (ProcessUnitBase unit, RecipeStep step) => TCPUnit_Check(unit, step);
  76. endHelper[$"{Module}.TCPUnit"] = (ProcessUnitBase unit, RecipeStep step) => TCPUnit_End(unit, step);
  77. startHelper[$"{Module}.BiasUnit"] = (ProcessUnitBase unit, RecipeStep step) => BiasUnit_Start(unit, step);
  78. checkerHelper[$"{Module}.BiasUnit"] = (ProcessUnitBase unit, RecipeStep step) => BiasUnit_Check(unit, step);
  79. endHelper[$"{Module}.BiasUnit"] = (ProcessUnitBase unit, RecipeStep step) => BiasUnit_End(unit, step);
  80. startHelper[$"{Module}.GasControlUnit"] = (ProcessUnitBase unit, RecipeStep step) => GasControlUnit_Start(unit, step);
  81. checkerHelper[$"{Module}.GasControlUnit"] = (ProcessUnitBase unit, RecipeStep step) => GasControlUnit_Check(unit, step);
  82. endHelper[$"{Module}.GasControlUnit"] = (ProcessUnitBase unit, RecipeStep step) => GasControlUnit_End(unit, step);
  83. startHelper[$"{Module}.VenusSEGasControlUnit"] = (ProcessUnitBase unit, RecipeStep step) => VenusSEGasControlUnit_Start(unit, step);
  84. checkerHelper[$"{Module}.VenusSEGasControlUnit"] = (ProcessUnitBase unit, RecipeStep step) => VenusSEGasControlUnit_Check(unit, step);
  85. endHelper[$"{Module}.VenusSEGasControlUnit"] = (ProcessUnitBase unit, RecipeStep step) => VenusSEGasControlUnit_End(unit, step);
  86. startHelper[$"{Module}.VenusDEGasControlUnit"] = (ProcessUnitBase unit, RecipeStep step) => VenusDEGasControlUnit_Start(unit, step);
  87. checkerHelper[$"{Module}.VenusDEGasControlUnit"] = (ProcessUnitBase unit, RecipeStep step) => VenusDEGasControlUnit_Check(unit, step);
  88. endHelper[$"{Module}.VenusDEGasControlUnit"] = (ProcessUnitBase unit, RecipeStep step) => VenusDEGasControlUnit_End(unit, step);
  89. startHelper[$"{Module}.ESCHVUnit"] = (ProcessUnitBase unit, RecipeStep step) => ESCHVUnit_Start(unit, step);
  90. checkerHelper[$"{Module}.ESCHVUnit"] = (ProcessUnitBase unit, RecipeStep step) => ESCHVUnit_Check(unit, step);
  91. endHelper[$"{Module}.ESCHVUnit"] = (ProcessUnitBase unit, RecipeStep step) => ESCHVUnit_End(unit, step);
  92. startHelper[$"{Module}.ProcessKitUnit"] = (ProcessUnitBase unit, RecipeStep step) => ProcessKitUnit_Start(unit, step);
  93. checkerHelper[$"{Module}.ProcessKitUnit"] = (ProcessUnitBase unit, RecipeStep step) => ProcessKitUnit_Check(unit, step);
  94. endHelper[$"{Module}.ProcessKitUnit"] = (ProcessUnitBase unit, RecipeStep step) => ProcessKitUnit_End(unit, step);
  95. startHelper[$"{Module}.Kepler2200GasControlUnit"] = (ProcessUnitBase unit, RecipeStep step) => Kepler2200GasControlUnit_Start(unit, step);
  96. checkerHelper[$"{Module}.Kepler2200GasControlUnit"] = (ProcessUnitBase unit, RecipeStep step) => Kepler2200GasControlUnit_Check(unit, step);
  97. endHelper[$"{Module}.Kepler2200GasControlUnit"] = (ProcessUnitBase unit, RecipeStep step) => Kepler2200GasControlUnit_End(unit, step);
  98. startHelper[$"{Module}.HeaterUnit"] = (ProcessUnitBase unit, RecipeStep step) => HeaterUnit_Start(unit, step);
  99. checkerHelper[$"{Module}.HeaterUnit"] = (ProcessUnitBase unit, RecipeStep step) => HeaterUnit_Check(unit, step);
  100. endHelper[$"{Module}.HeaterUnit"] = (ProcessUnitBase unit, RecipeStep step) => HeaterUnit_End(unit, step);
  101. startHelper[$"{Module}.RFBoxUnit"] = (ProcessUnitBase unit, RecipeStep step) => RFBoxUnit_Start(unit, step);
  102. checkerHelper[$"{Module}.RFBoxUnit"] = (ProcessUnitBase unit, RecipeStep step) => RFBoxUnit_Check(unit, step);
  103. endHelper[$"{Module}.RFBoxUnit"] = (ProcessUnitBase unit, RecipeStep step) => RFBoxUnit_End(unit, step);
  104. startHelper[$"{Module}.MagnetUnit"] = (ProcessUnitBase unit, RecipeStep step) => MagnetUnit_Start(unit, step);
  105. checkerHelper[$"{Module}.MagnetUnit"] = (ProcessUnitBase unit, RecipeStep step) => MagnetUnit_Check(unit, step);
  106. endHelper[$"{Module}.MagnetUnit"] = (ProcessUnitBase unit, RecipeStep step) => MagnetUnit_End(unit, step);
  107. }
  108. private RState PressureByPressureModeUnit_Start(ProcessUnitBase unit, RecipeStep step)
  109. {
  110. var ProcessUnit = unit as PressureByPressureModeUnit;
  111. List<ToleranceObject> toleranceObjects = new List<ToleranceObject>();
  112. _PressureToleranceChecker.IsStable = true;
  113. if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  114. {
  115. toleranceObjects.Add(new ToleranceObject("Pressure", ProcessUnit.StartValue, ProcessUnit.StartValueWarningRange, ProcessUnit.StartValueAlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  116. _PressureToleranceChecker.Start(toleranceObjects,step.Type==StepType.Stable);
  117. }
  118. if (ProcessUnit.PressureUnitMode == PressureUnitMode.Pressure)
  119. {
  120. if (Chamber.SetPVPressure(ProcessUnit.StartValue))
  121. {
  122. return RState.Running;
  123. }
  124. }
  125. else if (ProcessUnit.PressureUnitMode == PressureUnitMode.Valve)
  126. {
  127. if (Chamber.SetPVPostion(ProcessUnit.StartValue))
  128. {
  129. return RState.Running;
  130. }
  131. }
  132. return RState.Failed;
  133. }
  134. private RState PressureByPressureModeUnit_Check(ProcessUnitBase unit, RecipeStep step)
  135. {
  136. var ProcessUnit = unit as PressureByPressureModeUnit;
  137. if (ProcessUnit.EnableRamp)
  138. {
  139. if (ProcessUnit.PressureUnitMode == PressureUnitMode.Pressure)
  140. {
  141. if (Chamber.SetPVPressure(ProcessUnit.StartValue + (int)((ProcessUnit.TargetValue - ProcessUnit.StartValue) * step.RampFactor())))
  142. return RState.Running;
  143. else
  144. return RState.Failed;
  145. }
  146. else if (ProcessUnit.PressureUnitMode == PressureUnitMode.Valve)
  147. {
  148. if (Chamber.SetPVPostion(ProcessUnit.StartValue + (int)((ProcessUnit.TargetValue - ProcessUnit.StartValue) * step.RampFactor())))
  149. return RState.Running;
  150. else
  151. return RState.Failed;
  152. }
  153. }
  154. if (ProcessUnit.PressureUnitMode == PressureUnitMode.Pressure && ProcessUnit.ToleranceMode != ToleranceMode.None)
  155. {
  156. return _PressureToleranceChecker.Monitor(Chamber.PendulumPressure);
  157. }
  158. else if (ProcessUnit.PressureUnitMode == PressureUnitMode.Valve && ProcessUnit.ToleranceMode != ToleranceMode.None)
  159. {
  160. return _PressureToleranceChecker.Monitor(Chamber.PendulumPosition);
  161. }
  162. return RState.Running;
  163. }
  164. private void PressureByPressureModeUnit_End(ProcessUnitBase unit, RecipeStep step)
  165. {
  166. var ProcessUnit = unit as PressureByPressureModeUnit;
  167. if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  168. {
  169. _PressureToleranceChecker.End();
  170. }
  171. }
  172. private RState TCPUnit_Start(ProcessUnitBase unit, RecipeStep step)
  173. {
  174. _isEnableMatchC1C2Offset = SC.GetValue<bool>($"{Module}.Match.EnableC1C2StepOffset");
  175. _matchC1C2OffsetValue = SC.GetValue<int>($"{Module}.Match.C1C2StepOffsetValue");
  176. var ProcessUnit = unit as TCPUnit;
  177. List<ToleranceObject> toleranceObjects = new List<ToleranceObject>();
  178. if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  179. {
  180. toleranceObjects.Add(new ToleranceObject("RF", ProcessUnit.RFPower, ProcessUnit.RFPowerWarningRange, ProcessUnit.RFPowerAlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  181. _RFToleranceChecker.Start(toleranceObjects, step.Type == StepType.Stable);
  182. }
  183. float p1;
  184. float p2;
  185. if (ProcessUnit.C1 > 0)
  186. {
  187. p1 = ProcessUnit.C1;
  188. }
  189. else
  190. {
  191. p1 = ProcessUnit.AutoC1;
  192. }
  193. if (ProcessUnit.C2 > 0)
  194. {
  195. p2 = ProcessUnit.C2;
  196. }
  197. else
  198. {
  199. p2 = ProcessUnit.AutoC2;
  200. }
  201. if (_isEnableMatchC1C2Offset = false || Math.Abs(Chamber.RFMatchC1 - p1) > _matchC1C2OffsetValue || Math.Abs(Chamber.RFMatchC2 - p2) > _matchC1C2OffsetValue)
  202. {
  203. Chamber.SetMatchPosition(p1, p2);
  204. }
  205. if (ProcessUnit.RFPower > 5)
  206. {
  207. Chamber.GeneratorSetpower(ProcessUnit.RFPower);
  208. Chamber.GeneratorPowerOn(true);
  209. }
  210. else
  211. {
  212. Chamber.GeneratorSetpower(0);
  213. Chamber.GeneratorPowerOn(false);
  214. }
  215. if (ProcessUnit.MatchWorkMode == MatchWorkMode.Auto)
  216. {
  217. Chamber.SetMatchWorkMode(MatchWorkMode.Auto);
  218. }
  219. else if (ProcessUnit.MatchWorkMode == MatchWorkMode.Manual)
  220. {
  221. Chamber.SetMatchWorkMode(MatchWorkMode.Manual);
  222. }
  223. _scRFPowerAlarmTime = SC.GetValue<double>($"{Chamber.Name}.Rf.PowerAlarmTime");
  224. rfMatchC1.Clear();
  225. rfMatchC1.Clear();
  226. rfMatchC1C2Index = 0;
  227. return RState.Running;
  228. }
  229. private RState TCPUnit_Check(ProcessUnitBase unit, RecipeStep step)
  230. {
  231. var ProcessUnit = unit as TCPUnit;
  232. if (ProcessUnit.MaxReflectedPower > 0 && Chamber.ReflectPower > ProcessUnit.MaxReflectedPower && step.ElapsedTime() > _scRFPowerAlarmTime * 1000)
  233. {
  234. LOG.Write(eEvent.ERR_PROCESS, Chamber.Module, $"Step:{step.StepNo} failed, RF Reflect Power:{Chamber.ReflectPower} exceeds the Max Limit:{ProcessUnit.MaxReflectedPower}");
  235. return RState.Failed;
  236. }
  237. if (step.ElapsedTime() > m_RecipeHead.RFHoldTime * 1000)
  238. {
  239. Chamber.GeneratorSetpower(0);
  240. Chamber.GeneratorPowerOn(false);
  241. }
  242. if (step.ElapsedTime() > rfMatchC1C2Index * 1000)
  243. {
  244. rfMatchC1.Add(Chamber.RFMatchC1);
  245. rfMatchC2.Add(Chamber.RFMatchC2);
  246. rfMatchC1C2Index += 1;
  247. }
  248. if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  249. {
  250. return _RFToleranceChecker.Monitor(Chamber.ForwardPower);
  251. }
  252. return RState.Running;
  253. }
  254. private void TCPUnit_End(ProcessUnitBase unit, RecipeStep step)
  255. {
  256. var ProcessUnit = unit as TCPUnit;
  257. if (rfMatchC1.Count >= 6)
  258. {
  259. float allValue = 0;
  260. for (int i = 4; i < rfMatchC1.Count; i++)
  261. {
  262. allValue += rfMatchC1[i];
  263. }
  264. var average = allValue / (rfMatchC1.Count - 4);
  265. ProcessUnit.AutoC1 = (int)average;
  266. }
  267. if (rfMatchC2.Count >= 6)
  268. {
  269. float allValue = 0;
  270. for (int i = 4; i < rfMatchC2.Count; i++)
  271. {
  272. allValue += rfMatchC2[i];
  273. }
  274. var average = allValue / (rfMatchC2.Count - 4);
  275. ProcessUnit.AutoC2 = (int)average;
  276. }
  277. rfMatchC1.Clear();
  278. rfMatchC2.Clear();
  279. if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  280. {
  281. _RFToleranceChecker.End();
  282. }
  283. }
  284. private RState BiasUnit_Start(ProcessUnitBase unit, RecipeStep step)
  285. {
  286. _isEnableBiasMatchC1C2Offset = SC.GetValue<bool>($"{Module}.BiasMatch.EnableC1C2StepOffset");
  287. _biasMatchC1C2OffsetValue = SC.GetValue<int>($"{Module}.BiasMatch.C1C2StepOffsetValue");
  288. var ProcessUnit = unit as BiasUnit;
  289. float p1;
  290. float p2;
  291. if (ProcessUnit.BiasC1 > 0)
  292. {
  293. p1 = ProcessUnit.BiasC1;
  294. }
  295. else
  296. {
  297. p1 = ProcessUnit.AutoBiasC1;
  298. }
  299. if (ProcessUnit.BiasC2 > 0)
  300. {
  301. p2 = ProcessUnit.BiasC2;
  302. }
  303. else
  304. {
  305. p2 = ProcessUnit.AutoBiasC2;
  306. }
  307. if (_isEnableBiasMatchC1C2Offset == false || Math.Abs(Chamber.BiasRFMatchC1 - p1) > _biasMatchC1C2OffsetValue || Math.Abs(Chamber.BiasRFMatchC2 - p2) > _biasMatchC1C2OffsetValue)
  308. {
  309. Chamber.SetBiasMatchPosition(p1, p2);
  310. }
  311. if (ProcessUnit.BiasRFPower > 5)
  312. {
  313. Chamber.GeneratorBiasPowerOn(true);
  314. if ((ProcessUnit.EnableRamp == false))
  315. {
  316. Chamber.GeneratorBiasSetpower(ProcessUnit.BiasRFPower);
  317. }
  318. }
  319. else
  320. {
  321. Chamber.GeneratorBiasPowerOn(false);
  322. Chamber.GeneratorBiasSetpower(0);
  323. }
  324. if (ProcessUnit.BiasMatchWorkMode == MatchWorkMode.Auto)
  325. {
  326. Chamber.SetBiasMatchWorkMode(MatchWorkMode.Auto);
  327. }
  328. else if (ProcessUnit.BiasMatchWorkMode == MatchWorkMode.Manual)
  329. {
  330. Chamber.SetBiasMatchWorkMode(MatchWorkMode.Manual);
  331. }
  332. if (ProcessUnit.BiasGeneratorMode == GeneratorMode.Pulsing)
  333. {
  334. Chamber.SetBiasPulseMode(true);
  335. Chamber.SetBiasPulseRateFreq(ProcessUnit.PulseRateFreq);
  336. Chamber.SetDiasPulseDutyCycle(ProcessUnit.PulseDutyCycle);
  337. }
  338. else
  339. {
  340. Chamber.SetBiasPulseMode(false);
  341. }
  342. List<ToleranceObject> toleranceObjects = new List<ToleranceObject>();
  343. if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  344. {
  345. toleranceObjects.Add(new ToleranceObject("BiasRF", ProcessUnit.BiasRFPower, ProcessUnit.RFPowerWarningRange, ProcessUnit.RFPowerAlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  346. _BiasRFToleranceChecker.Start(toleranceObjects, step.Type == StepType.Stable);
  347. }
  348. _scBiasRFPowerAlarmTime = SC.GetValue<double>($"{Chamber.Name}.BiasRf.PowerAlarmTime");
  349. biasRfMatchC1.Clear();
  350. biasRfMatchC1.Clear();
  351. biasRfMatchC1C2Index = 0;
  352. biasRFSetPointFlag = true;
  353. return RState.Running;
  354. }
  355. private RState BiasUnit_Check(ProcessUnitBase unit, RecipeStep step)
  356. {
  357. //var _scPowerAlarmTime = SC.GetValue<double>($"{Chamber.Name}.BiasRf.PowerAlarmTime");
  358. var ProcessUnit = unit as BiasUnit;
  359. if (ProcessUnit.BiasMaxReflectedPower > 0 && Chamber.BiasReflectPower > ProcessUnit.BiasMaxReflectedPower && step.ElapsedTime() > _scBiasRFPowerAlarmTime * 1000)
  360. {
  361. LOG.Write(eEvent.ERR_PROCESS, Chamber.Module, $"Step:{step.StepNo} failed, Bias Reflect Power:{Chamber.BiasReflectPower} exceeds the Max Limit:{ProcessUnit.BiasMaxReflectedPower}");
  362. return RState.Failed;
  363. }
  364. if (step.ElapsedTime() > m_RecipeHead.BiasRFHoldTime * 1000)
  365. {
  366. Chamber.GeneratorBiasSetpower(0);
  367. Chamber.GeneratorBiasPowerOn(false);
  368. }
  369. if (step.ElapsedTime() > biasRfMatchC1C2Index * 1000)
  370. {
  371. biasRfMatchC1.Add(Chamber.BiasRFMatchC1);
  372. biasRfMatchC2.Add(Chamber.BiasRFMatchC2);
  373. biasRfMatchC1C2Index += 1;
  374. }
  375. if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  376. {
  377. return _BiasRFToleranceChecker.Monitor(Chamber.BiasForwardPower);
  378. }
  379. if (ProcessUnit.EnableRamp)
  380. {
  381. //if (step.ElapsedTime() <= 500*cycleIndex)
  382. //{
  383. // return RState.Running;
  384. //}
  385. //cycleIndex += 1;
  386. if (ProcessUnit.TargetMode == TargetMode.Cycle)
  387. {
  388. if (biasRFSetPointFlag == true)
  389. {
  390. biasRFSetPointFlag = false;
  391. Chamber.GeneratorBiasSetpower((float)((ProcessUnit.BiasRFPower + (float)((float)(ProcessUnit.TargetBiasRFPower - ProcessUnit.BiasRFPower) / ((float)(loopsteps - 1) / (float)(currentStepIndex))))));
  392. }
  393. //float rampFactor = (float)currentStepIndex / (float)(loopsteps-1);
  394. //double rampFactor = step.RampFactor();
  395. //Chamber.GeneratorBiasSetpower((float)((ProcessUnit.BiasRFPower+ (ProcessUnit.TargetBiasRFPower - ProcessUnit.BiasRFPower)/(loopsteps)*currentStepIndex) + ((double)(ProcessUnit.TargetBiasRFPower - ProcessUnit.BiasRFPower) / ((double)loopsteps)) * rampFactor));
  396. }
  397. else
  398. {
  399. //double rampFactor = step.RampFactor();
  400. //Chamber.GeneratorBiasSetpower((float)(ProcessUnit.BiasRFPower + (ProcessUnit.TargetBiasRFPower - ProcessUnit.BiasRFPower) * rampFactor));
  401. }
  402. }
  403. return RState.Running;
  404. }
  405. private void BiasUnit_End(ProcessUnitBase unit, RecipeStep step)
  406. {
  407. var ProcessUnit = unit as BiasUnit;
  408. //Chamber.GeneratorBiasSetpower(0);
  409. //Chamber.GeneratorBiasPowerOn(false);
  410. if (biasRfMatchC1.Count >= 6)
  411. {
  412. float allValue = 0;
  413. for (int i = 4; i < biasRfMatchC1.Count; i++)
  414. {
  415. allValue += biasRfMatchC1[i];
  416. }
  417. var average = allValue / (biasRfMatchC1.Count - 4);
  418. ProcessUnit.AutoBiasC1 = (int)average;
  419. }
  420. if (biasRfMatchC2.Count >= 6)
  421. {
  422. float allValue = 0;
  423. for (int i = 4; i < biasRfMatchC2.Count; i++)
  424. {
  425. allValue += biasRfMatchC2[i];
  426. }
  427. var average = allValue / (biasRfMatchC2.Count - 4);
  428. ProcessUnit.AutoBiasC2 = (int)average;
  429. }
  430. biasRfMatchC1.Clear();
  431. biasRfMatchC1.Clear();
  432. biasRfMatchC1C2Index = 0;
  433. //cycleIndex = 0;
  434. biasRFSetPointFlag = true;
  435. if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  436. {
  437. _BiasRFToleranceChecker.End();
  438. }
  439. }
  440. private RState GasControlUnit_Start(ProcessUnitBase unit, RecipeStep step)
  441. {
  442. Chamber.OpenValve(ValveType.GasFinal, true);
  443. var ProcessUnit = unit as GasControlUnit;
  444. if (ProcessUnit.Gas1 >= 1)
  445. {
  446. Chamber.FlowGas(0, ProcessUnit.Gas1);
  447. }
  448. else
  449. {
  450. Chamber.FlowGas(0, 0);
  451. }
  452. if (ProcessUnit.Gas2 >= 1)
  453. {
  454. Chamber.FlowGas(1, ProcessUnit.Gas2);
  455. }
  456. else
  457. {
  458. Chamber.FlowGas(1, 0);
  459. }
  460. if (ProcessUnit.Gas3 >= 1)
  461. {
  462. Chamber.FlowGas(2, ProcessUnit.Gas3);
  463. }
  464. else
  465. {
  466. Chamber.FlowGas(2, 0);
  467. }
  468. if (ProcessUnit.Gas4 >= 1)
  469. {
  470. Chamber.FlowGas(3, ProcessUnit.Gas4);
  471. }
  472. else
  473. {
  474. Chamber.FlowGas(3, 0);
  475. }
  476. if (ProcessUnit.Gas5 >= 1)
  477. {
  478. Chamber.FlowGas(4, ProcessUnit.Gas5);
  479. }
  480. else
  481. {
  482. Chamber.FlowGas(4, 0);
  483. }
  484. if (ProcessUnit.Gas6 >= 1)
  485. {
  486. Chamber.FlowGas(5, ProcessUnit.Gas6);
  487. }
  488. else
  489. {
  490. Chamber.FlowGas(5, 0);
  491. }
  492. if (ProcessUnit.Gas7 >= 1)
  493. {
  494. Chamber.FlowGas(6, ProcessUnit.Gas7);
  495. }
  496. else
  497. {
  498. Chamber.FlowGas(6, 0);
  499. }
  500. if (ProcessUnit.Gas8 >= 1)
  501. {
  502. Chamber.FlowGas(7, ProcessUnit.Gas8);
  503. }
  504. else
  505. {
  506. Chamber.FlowGas(7, 0);
  507. }
  508. _GasFlowToleranceChecker.IsStable = true;
  509. if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  510. {
  511. List<ToleranceObject> toleranceObjects = new List<ToleranceObject>();
  512. toleranceObjects.Add(new ToleranceObject("Gas1", ProcessUnit.Gas1, ProcessUnit.Gas1WarningRange, ProcessUnit.Gas1AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  513. toleranceObjects.Add(new ToleranceObject("Gas2", ProcessUnit.Gas2, ProcessUnit.Gas2WarningRange, ProcessUnit.Gas2AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  514. toleranceObjects.Add(new ToleranceObject("Gas3", ProcessUnit.Gas3, ProcessUnit.Gas3WarningRange, ProcessUnit.Gas3AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  515. toleranceObjects.Add(new ToleranceObject("Gas4", ProcessUnit.Gas4, ProcessUnit.Gas4WarningRange, ProcessUnit.Gas4AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  516. toleranceObjects.Add(new ToleranceObject("Gas5", ProcessUnit.Gas5, ProcessUnit.Gas5WarningRange, ProcessUnit.Gas5AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  517. toleranceObjects.Add(new ToleranceObject("Gas6", ProcessUnit.Gas6, ProcessUnit.Gas6WarningRange, ProcessUnit.Gas6AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  518. toleranceObjects.Add(new ToleranceObject("Gas7", ProcessUnit.Gas7, ProcessUnit.Gas7WarningRange, ProcessUnit.Gas7AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  519. toleranceObjects.Add(new ToleranceObject("Gas8", ProcessUnit.Gas8, ProcessUnit.Gas8WarningRange, ProcessUnit.Gas8AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  520. _GasFlowToleranceChecker.Start(toleranceObjects, step.Type == StepType.Stable);
  521. }
  522. return RState.Running;
  523. }
  524. private RState GasControlUnit_Check(ProcessUnitBase unit, RecipeStep step)
  525. {
  526. var ProcessUnit = unit as GasControlUnit;
  527. if (ProcessUnit.EnableRamp)
  528. {
  529. double rampFactor = step.RampFactor();
  530. Chamber.FlowGas(0, ProcessUnit.Gas1 + (ProcessUnit.Gas1Target - ProcessUnit.Gas1) * rampFactor);
  531. Chamber.FlowGas(1, ProcessUnit.Gas2 + (ProcessUnit.Gas2Target - ProcessUnit.Gas2) * rampFactor);
  532. Chamber.FlowGas(2, ProcessUnit.Gas3 + (ProcessUnit.Gas3Target - ProcessUnit.Gas3) * rampFactor);
  533. Chamber.FlowGas(3, ProcessUnit.Gas4 + (ProcessUnit.Gas4Target - ProcessUnit.Gas4) * rampFactor);
  534. Chamber.FlowGas(4, ProcessUnit.Gas5 + (ProcessUnit.Gas5Target - ProcessUnit.Gas5) * rampFactor);
  535. Chamber.FlowGas(5, ProcessUnit.Gas6 + (ProcessUnit.Gas6Target - ProcessUnit.Gas6) * rampFactor);
  536. Chamber.FlowGas(6, ProcessUnit.Gas7 + (ProcessUnit.Gas7Target - ProcessUnit.Gas7) * rampFactor);
  537. Chamber.FlowGas(7, ProcessUnit.Gas8 + (ProcessUnit.Gas8Target - ProcessUnit.Gas8) * rampFactor);
  538. }
  539. if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  540. {
  541. return _GasFlowToleranceChecker.Monitor(Chamber.MFC1FeedBack, Chamber.MFC2FeedBack, Chamber.MFC3FeedBack, Chamber.MFC4FeedBack, Chamber.MFC5FeedBack, Chamber.MFC6FeedBack, Chamber.MFC7FeedBack, Chamber.MFC8FeedBack);
  542. }
  543. return RState.Running;
  544. }
  545. private void GasControlUnit_End(ProcessUnitBase unit, RecipeStep step)
  546. {
  547. var ProcessUnit = unit as GasControlUnit;
  548. if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  549. {
  550. _GasFlowToleranceChecker.End();
  551. }
  552. }
  553. private RState Kepler2200GasControlUnit_Start(ProcessUnitBase unit, RecipeStep step)
  554. {
  555. List<ToleranceObject> toleranceObjects = new List<ToleranceObject>();
  556. Chamber.OpenValve(ValveType.GasFinal, true);
  557. var ProcessUnit = unit as Kepler2200GasControlUnit;
  558. if (ProcessUnit.Gas1 >= 1)
  559. {
  560. Chamber.FlowGas(0, ProcessUnit.Gas1);
  561. }
  562. else
  563. {
  564. Chamber.FlowGas(0, 0);
  565. }
  566. if (ProcessUnit.Gas2 >= 1)
  567. {
  568. Chamber.FlowGas(1, ProcessUnit.Gas2);
  569. }
  570. else
  571. {
  572. Chamber.FlowGas(1, 0);
  573. }
  574. if (ProcessUnit.Gas3 >= 1)
  575. {
  576. Chamber.FlowGas(2, ProcessUnit.Gas3);
  577. }
  578. else
  579. {
  580. Chamber.FlowGas(2, 0);
  581. }
  582. if (ProcessUnit.Gas4 >= 1)
  583. {
  584. Chamber.FlowGas(3, ProcessUnit.Gas4);
  585. }
  586. else
  587. {
  588. Chamber.FlowGas(3, 0);
  589. }
  590. if (ProcessUnit.Gas5 >= 1)
  591. {
  592. Chamber.FlowGas(4, ProcessUnit.Gas5);
  593. }
  594. else
  595. {
  596. Chamber.FlowGas(4, 0);
  597. }
  598. if (ProcessUnit.Gas6 >= 1)
  599. {
  600. Chamber.FlowGas(5, ProcessUnit.Gas6);
  601. }
  602. else
  603. {
  604. Chamber.FlowGas(5, 0);
  605. }
  606. _GasFlowToleranceChecker.IsStable = true;
  607. if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  608. {
  609. toleranceObjects.Add(new ToleranceObject("Gas1", ProcessUnit.Gas1, ProcessUnit.Gas1WarningRange, ProcessUnit.Gas1AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  610. toleranceObjects.Add(new ToleranceObject("Gas2", ProcessUnit.Gas2, ProcessUnit.Gas2WarningRange, ProcessUnit.Gas2AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  611. toleranceObjects.Add(new ToleranceObject("Gas3", ProcessUnit.Gas3, ProcessUnit.Gas3WarningRange, ProcessUnit.Gas3AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  612. toleranceObjects.Add(new ToleranceObject("Gas4", ProcessUnit.Gas4, ProcessUnit.Gas4WarningRange, ProcessUnit.Gas4AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  613. toleranceObjects.Add(new ToleranceObject("Gas5", ProcessUnit.Gas5, ProcessUnit.Gas5WarningRange, ProcessUnit.Gas5AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  614. toleranceObjects.Add(new ToleranceObject("Gas6", ProcessUnit.Gas6, ProcessUnit.Gas6WarningRange, ProcessUnit.Gas6AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  615. _GasFlowToleranceChecker.Start(toleranceObjects, step.Type == StepType.Stable);
  616. }
  617. return RState.Running;
  618. }
  619. private RState Kepler2200GasControlUnit_Check(ProcessUnitBase unit, RecipeStep step)
  620. {
  621. var ProcessUnit = unit as Kepler2200GasControlUnit;
  622. if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  623. {
  624. return _GasFlowToleranceChecker.Monitor(Chamber.MFC1FeedBack, Chamber.MFC2FeedBack, Chamber.MFC3FeedBack, Chamber.MFC4FeedBack, Chamber.MFC5FeedBack, Chamber.MFC6FeedBack);
  625. }
  626. return RState.Running;
  627. }
  628. private void Kepler2200GasControlUnit_End(ProcessUnitBase unit, RecipeStep step)
  629. {
  630. var ProcessUnit = unit as Kepler2200GasControlUnit;
  631. if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  632. {
  633. _GasFlowToleranceChecker.End();
  634. }
  635. }
  636. private RState VenusSEGasControlUnit_Start(ProcessUnitBase unit, RecipeStep step)
  637. {
  638. Chamber.OpenValve(ValveType.GasFinal, true);
  639. var ProcessUnit = unit as VenusSEGasControlUnit;
  640. Chamber.FlowGas(0, ProcessUnit.Gas1);
  641. if (ProcessUnit.Gas1 >= 1)
  642. {
  643. Chamber.OpenValve(ValveType.PV11, true);
  644. }
  645. Chamber.FlowGas(1, ProcessUnit.Gas2);
  646. if (ProcessUnit.Gas2 >= 1)
  647. {
  648. Chamber.OpenValve(ValveType.PV21, true);
  649. }
  650. Chamber.FlowGas(2, ProcessUnit.Gas3);
  651. if (ProcessUnit.Gas3 >= 1)
  652. {
  653. Chamber.OpenValve(ValveType.PV31, true);
  654. }
  655. Chamber.FlowGas(3, ProcessUnit.Gas4);
  656. if (ProcessUnit.Gas4 >= 1)
  657. {
  658. Chamber.OpenValve(ValveType.PV41, true);
  659. }
  660. Chamber.FlowGas(4, ProcessUnit.Gas5);
  661. if (ProcessUnit.Gas5 >= 1)
  662. {
  663. Chamber.OpenValve(ValveType.PV51, true);
  664. }
  665. Chamber.FlowGas(5, ProcessUnit.Gas6);
  666. if (ProcessUnit.Gas6 >= 1)
  667. {
  668. Chamber.OpenValve(ValveType.PV61, true);
  669. }
  670. Chamber.FlowGas(6, ProcessUnit.Gas7);
  671. if (ProcessUnit.Gas7 >= 1)
  672. {
  673. Chamber.OpenValve(ValveType.PV71, true);
  674. }
  675. Chamber.FlowGas(7, ProcessUnit.Gas8);
  676. if (ProcessUnit.Gas8 >= 1)
  677. {
  678. Chamber.OpenValve(ValveType.PV81, true);
  679. }
  680. Chamber.FlowGas(8, ProcessUnit.Gas9);
  681. if (ProcessUnit.Gas9 >= 1)
  682. {
  683. Chamber.OpenValve(ValveType.PV91, true);
  684. }
  685. Chamber.FlowGas(9, ProcessUnit.Gas10);
  686. if (ProcessUnit.Gas10 >= 1)
  687. {
  688. Chamber.OpenValve(ValveType.PVA1, true);
  689. }
  690. Chamber.FlowGas(10, ProcessUnit.Gas11);
  691. if (ProcessUnit.Gas11 >= 1)
  692. {
  693. Chamber.OpenValve(ValveType.PVB1, true);
  694. }
  695. Chamber.FlowGas(11, ProcessUnit.Gas12);
  696. if (ProcessUnit.Gas12 >= 1)
  697. {
  698. Chamber.OpenValve(ValveType.PVC1, true);
  699. }
  700. _GasFlowToleranceChecker.IsStable = true;
  701. if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  702. {
  703. List<ToleranceObject> toleranceObjects = new List<ToleranceObject>();
  704. toleranceObjects.Add(new ToleranceObject("Gas1", ProcessUnit.Gas1, ProcessUnit.Gas1WarningRange, ProcessUnit.Gas1AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  705. toleranceObjects.Add(new ToleranceObject("Gas2", ProcessUnit.Gas2, ProcessUnit.Gas2WarningRange, ProcessUnit.Gas2AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  706. toleranceObjects.Add(new ToleranceObject("Gas3", ProcessUnit.Gas3, ProcessUnit.Gas3WarningRange, ProcessUnit.Gas3AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  707. toleranceObjects.Add(new ToleranceObject("Gas4", ProcessUnit.Gas4, ProcessUnit.Gas4WarningRange, ProcessUnit.Gas4AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  708. toleranceObjects.Add(new ToleranceObject("Gas5", ProcessUnit.Gas5, ProcessUnit.Gas5WarningRange, ProcessUnit.Gas5AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  709. toleranceObjects.Add(new ToleranceObject("Gas6", ProcessUnit.Gas6, ProcessUnit.Gas6WarningRange, ProcessUnit.Gas6AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  710. toleranceObjects.Add(new ToleranceObject("Gas7", ProcessUnit.Gas7, ProcessUnit.Gas7WarningRange, ProcessUnit.Gas7AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  711. toleranceObjects.Add(new ToleranceObject("Gas8", ProcessUnit.Gas8, ProcessUnit.Gas8WarningRange, ProcessUnit.Gas8AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  712. toleranceObjects.Add(new ToleranceObject("Gas9", ProcessUnit.Gas9, ProcessUnit.Gas9WarningRange, ProcessUnit.Gas9AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  713. toleranceObjects.Add(new ToleranceObject("Gas10", ProcessUnit.Gas10, ProcessUnit.Gas10WarningRange, ProcessUnit.Gas10AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  714. toleranceObjects.Add(new ToleranceObject("Gas11", ProcessUnit.Gas11, ProcessUnit.Gas11WarningRange, ProcessUnit.Gas11AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  715. toleranceObjects.Add(new ToleranceObject("Gas12", ProcessUnit.Gas12, ProcessUnit.Gas12WarningRange, ProcessUnit.Gas12AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  716. _GasFlowToleranceChecker.Start(toleranceObjects, step.Type == StepType.Stable);
  717. }
  718. return RState.Running;
  719. }
  720. private RState VenusSEGasControlUnit_Check(ProcessUnitBase unit, RecipeStep step)
  721. {
  722. var ProcessUnit = unit as VenusSEGasControlUnit;
  723. if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  724. {
  725. return _GasFlowToleranceChecker.Monitor(Chamber.MFC1FeedBack, Chamber.MFC2FeedBack, Chamber.MFC3FeedBack, Chamber.MFC4FeedBack, Chamber.MFC5FeedBack, Chamber.MFC6FeedBack, Chamber.MFC7FeedBack, Chamber.MFC8FeedBack, Chamber.MFC9FeedBack, Chamber.MFC10FeedBack, Chamber.MFC11FeedBack, Chamber.MFC12FeedBack);
  726. }
  727. return RState.Running;
  728. }
  729. private void VenusSEGasControlUnit_End(ProcessUnitBase unit, RecipeStep step)
  730. {
  731. Chamber.FlowGas(0, 0);
  732. Chamber.FlowGas(1, 0);
  733. Chamber.FlowGas(2, 0);
  734. Chamber.FlowGas(3, 0);
  735. Chamber.FlowGas(4, 0);
  736. Chamber.FlowGas(5, 0);
  737. Chamber.FlowGas(6, 0);
  738. Chamber.FlowGas(7, 0);
  739. Chamber.FlowGas(8, 0);
  740. Chamber.FlowGas(9, 0);
  741. Chamber.FlowGas(10, 0);
  742. Chamber.FlowGas(11, 0);
  743. Chamber.FlowGas(12, 0);
  744. var ProcessUnit = unit as VenusSEGasControlUnit;
  745. if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  746. {
  747. _GasFlowToleranceChecker.End();
  748. }
  749. }
  750. private RState VenusDEGasControlUnit_Start(ProcessUnitBase unit, RecipeStep step)
  751. {
  752. Chamber.OpenValve(ValveType.GasFinal, true);
  753. var ProcessUnit = unit as VenusDEGasControlUnit;
  754. Chamber.FlowGas(0, ProcessUnit.Gas1);
  755. if (ProcessUnit.Gas1 >= 1)
  756. {
  757. Chamber.OpenValve(ValveType.PV11, true);
  758. }
  759. Chamber.FlowGas(1, ProcessUnit.Gas2);
  760. if (ProcessUnit.Gas2 >= 1)
  761. {
  762. Chamber.OpenValve(ValveType.PV21, true);
  763. }
  764. Chamber.FlowGas(2, ProcessUnit.Gas3);
  765. if (ProcessUnit.Gas3 >= 1)
  766. {
  767. Chamber.OpenValve(ValveType.PV31, true);
  768. }
  769. Chamber.FlowGas(3, ProcessUnit.Gas4);
  770. if (ProcessUnit.Gas4 >= 1)
  771. {
  772. Chamber.OpenValve(ValveType.PV41, true);
  773. }
  774. Chamber.FlowGas(4, ProcessUnit.Gas5);
  775. if (ProcessUnit.Gas5 >= 1)
  776. {
  777. Chamber.OpenValve(ValveType.PV51, true);
  778. }
  779. Chamber.FlowGas(5, ProcessUnit.Gas6);
  780. if (ProcessUnit.Gas6 >= 1)
  781. {
  782. Chamber.OpenValve(ValveType.PV61, true);
  783. }
  784. Chamber.FlowGas(6, ProcessUnit.Gas7);
  785. if (ProcessUnit.Gas7 >= 1)
  786. {
  787. Chamber.OpenValve(ValveType.PV71, true);
  788. }
  789. Chamber.FlowGas(7, ProcessUnit.Gas8);
  790. if (ProcessUnit.Gas8 >= 1)
  791. {
  792. Chamber.OpenValve(ValveType.PV81, true);
  793. }
  794. Chamber.FlowGas(8, ProcessUnit.Gas9);
  795. if (ProcessUnit.Gas9 >= 1)
  796. {
  797. Chamber.OpenValve(ValveType.PV91, true);
  798. }
  799. Chamber.FlowGas(9, ProcessUnit.Gas10);
  800. if (ProcessUnit.Gas10 >= 1)
  801. {
  802. Chamber.OpenValve(ValveType.PVA1, true);
  803. }
  804. Chamber.FlowGas(10, ProcessUnit.Gas11);
  805. if (ProcessUnit.Gas11 >= 1)
  806. {
  807. Chamber.OpenValve(ValveType.PVB1, true);
  808. }
  809. Chamber.FlowGas(11, ProcessUnit.Gas12);
  810. if (ProcessUnit.Gas12 >= 1)
  811. {
  812. Chamber.OpenValve(ValveType.PVC1, true);
  813. }
  814. _GasFlowToleranceChecker.IsStable = true;
  815. if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  816. {
  817. List<ToleranceObject> toleranceObjects = new List<ToleranceObject>();
  818. toleranceObjects.Add(new ToleranceObject("Gas1", ProcessUnit.Gas1, ProcessUnit.Gas1WarningRange, ProcessUnit.Gas1AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  819. toleranceObjects.Add(new ToleranceObject("Gas2", ProcessUnit.Gas2, ProcessUnit.Gas2WarningRange, ProcessUnit.Gas2AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  820. toleranceObjects.Add(new ToleranceObject("Gas3", ProcessUnit.Gas3, ProcessUnit.Gas3WarningRange, ProcessUnit.Gas3AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  821. toleranceObjects.Add(new ToleranceObject("Gas4", ProcessUnit.Gas4, ProcessUnit.Gas4WarningRange, ProcessUnit.Gas4AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  822. toleranceObjects.Add(new ToleranceObject("Gas5", ProcessUnit.Gas5, ProcessUnit.Gas5WarningRange, ProcessUnit.Gas5AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  823. toleranceObjects.Add(new ToleranceObject("Gas6", ProcessUnit.Gas6, ProcessUnit.Gas6WarningRange, ProcessUnit.Gas6AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  824. toleranceObjects.Add(new ToleranceObject("Gas7", ProcessUnit.Gas7, ProcessUnit.Gas7WarningRange, ProcessUnit.Gas7AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  825. toleranceObjects.Add(new ToleranceObject("Gas8", ProcessUnit.Gas8, ProcessUnit.Gas8WarningRange, ProcessUnit.Gas8AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  826. toleranceObjects.Add(new ToleranceObject("Gas9", ProcessUnit.Gas9, ProcessUnit.Gas9WarningRange, ProcessUnit.Gas9AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  827. toleranceObjects.Add(new ToleranceObject("Gas10", ProcessUnit.Gas10, ProcessUnit.Gas10WarningRange, ProcessUnit.Gas10AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  828. toleranceObjects.Add(new ToleranceObject("Gas11", ProcessUnit.Gas11, ProcessUnit.Gas11WarningRange, ProcessUnit.Gas11AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  829. toleranceObjects.Add(new ToleranceObject("Gas12", ProcessUnit.Gas12, ProcessUnit.Gas12WarningRange, ProcessUnit.Gas12AlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  830. _GasFlowToleranceChecker.Start(toleranceObjects, step.Type == StepType.Stable);
  831. }
  832. return RState.Running;
  833. }
  834. private RState VenusDEGasControlUnit_Check(ProcessUnitBase unit, RecipeStep step)
  835. {
  836. var ProcessUnit = unit as VenusDEGasControlUnit;
  837. if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  838. {
  839. return _GasFlowToleranceChecker.Monitor(Chamber.MFC1FeedBack, Chamber.MFC2FeedBack, Chamber.MFC3FeedBack, Chamber.MFC4FeedBack, Chamber.MFC5FeedBack, Chamber.MFC6FeedBack, Chamber.MFC7FeedBack, Chamber.MFC8FeedBack, Chamber.MFC9FeedBack, Chamber.MFC10FeedBack, Chamber.MFC11FeedBack, Chamber.MFC12FeedBack);
  840. }
  841. return RState.Running;
  842. }
  843. private void VenusDEGasControlUnit_End(ProcessUnitBase unit, RecipeStep step)
  844. {
  845. Chamber.FlowGas(0, 0);
  846. Chamber.FlowGas(1, 0);
  847. Chamber.FlowGas(2, 0);
  848. Chamber.FlowGas(3, 0);
  849. Chamber.FlowGas(4, 0);
  850. Chamber.FlowGas(5, 0);
  851. Chamber.FlowGas(6, 0);
  852. Chamber.FlowGas(7, 0);
  853. Chamber.FlowGas(8, 0);
  854. Chamber.FlowGas(9, 0);
  855. Chamber.FlowGas(10, 0);
  856. Chamber.FlowGas(11, 0);
  857. Chamber.FlowGas(12, 0);
  858. var ProcessUnit = unit as VenusDEGasControlUnit;
  859. if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  860. {
  861. _GasFlowToleranceChecker.End();
  862. }
  863. }
  864. private RState ESCHVUnit_Start(ProcessUnitBase unit, RecipeStep step)
  865. {
  866. var ProcessUnit = unit as ESCHVUnit;
  867. if (ProcessUnit.ESCClampValtage > 0)
  868. {
  869. Chamber.SetESCClampVoltage(ProcessUnit.ESCClampValtage);
  870. }
  871. else
  872. {
  873. Chamber.SetESCClampVoltage(0);
  874. }
  875. Chamber.SetBacksideHePressure(ProcessUnit.BacksideHelium);
  876. Chamber.SetBacksideHeThreshold(ProcessUnit.MinHeFlow, ProcessUnit.MaxHeFlow);
  877. //List<ToleranceObject> toleranceObjects = new List<ToleranceObject>();
  878. //if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  879. //{
  880. // toleranceObjects.Add(new ToleranceObject("ESCTemperature", ProcessUnit.ESCTemperature, ProcessUnit.ESCTemperatureWarningRange, ProcessUnit.ESCTemperatureAlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  881. // toleranceObjects.Add(new ToleranceObject("WallTemperature", ProcessUnit.WallTemperature, ProcessUnit.WallTemperatureWarningRange, ProcessUnit.WallTemperatureAlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  882. // _HeliumToleranceChecker.Start(toleranceObjects);
  883. //}
  884. return RState.Running;
  885. }
  886. private RState ESCHVUnit_Check(ProcessUnitBase unit, RecipeStep step)
  887. {
  888. var ProcessUnit = unit as ESCHVUnit;
  889. if (Chamber.BackSideHeOutOfRange && step.ElapsedTime() > ProcessUnit.CheckDelay)
  890. {
  891. LOG.Write(eEvent.ERR_PROCESS, Chamber.Module, $"Step:{step.StepNo} failed, Backside Helium out of range.");
  892. return RState.Failed;
  893. }
  894. //if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  895. //{
  896. // return _HeliumToleranceChecker.Monitor(Chamber.ESCTemperature,Chamber.WallTemperature);
  897. //}
  898. return RState.Running;
  899. }
  900. private void ESCHVUnit_End(ProcessUnitBase unit, RecipeStep step)
  901. {
  902. Chamber.SetBacksideHeThreshold(0, 0);
  903. //var ProcessUnit = unit as ESCHVUnit;
  904. //if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  905. //{
  906. // _HeliumToleranceChecker.End();
  907. //}
  908. }
  909. private RState ProcessKitUnit_Start(ProcessUnitBase unit, RecipeStep step)
  910. {
  911. var ProcessUnit = unit as ProcessKitUnit;
  912. if (Chamber.SetLiftPin(ProcessUnit.LiftPinPostion, out string reason))
  913. {
  914. return RState.Running;
  915. }
  916. else
  917. {
  918. LOG.Write(eEvent.ERR_PROCESS, Chamber.Module, $"Step:{step.StepNo} failed. Target Position:{ProcessUnit.LiftPinPostion}");
  919. return RState.Failed;
  920. }
  921. }
  922. private RState ProcessKitUnit_Check(ProcessUnitBase unit, RecipeStep step)
  923. {
  924. //var ProcessUnit = unit as ProcessKitUnit;
  925. return RState.Running;
  926. }
  927. private void ProcessKitUnit_End(ProcessUnitBase unit, RecipeStep step)
  928. {
  929. }
  930. private RState MagnetUnit_Start(ProcessUnitBase unit, RecipeStep step)
  931. {
  932. var ProcessUnit = unit as MagnetUnit;
  933. if (Chamber.MagnetSetpower(ProcessUnit.MagnetIntensity)&& Chamber.SetFieldRatio(ProcessUnit.FieldRatio) && Chamber.SetWaveform(ProcessUnit.MagnetWaveform))
  934. {
  935. return RState.Running;
  936. }
  937. else
  938. {
  939. LOG.Write(eEvent.ERR_PROCESS, Chamber.Module, $"Step:{step.StepNo} failed duo to Magnet Write Intensity failed");
  940. return RState.Failed;
  941. }
  942. }
  943. private RState MagnetUnit_Check(ProcessUnitBase unit, RecipeStep step)
  944. {
  945. return RState.Running;
  946. }
  947. private void MagnetUnit_End(ProcessUnitBase unit, RecipeStep step)
  948. {
  949. }
  950. private RState RFBoxUnit_Start(ProcessUnitBase unit, RecipeStep step)
  951. {
  952. var ProcessUnit = unit as RFBoxUnit;
  953. if (Chamber.SetRFBoxC1Position(ProcessUnit.C1))
  954. {
  955. return RState.Running;
  956. }
  957. else
  958. {
  959. LOG.Write(eEvent.ERR_PROCESS, Chamber.Module, $"Step:{step.StepNo} failed duo to RFBox Write C1 failed ");
  960. return RState.Failed;
  961. }
  962. }
  963. private RState RFBoxUnit_Check(ProcessUnitBase unit, RecipeStep step)
  964. {
  965. return RState.Running;
  966. }
  967. private void RFBoxUnit_End(ProcessUnitBase unit, RecipeStep step)
  968. {
  969. }
  970. private RState HeaterUnit_Start(ProcessUnitBase unit, RecipeStep step)
  971. {
  972. var ProcessUnit = unit as HeaterUnit;
  973. var position = (HighTemperatureHeaterPosition)Enum.Parse(typeof(HighTemperatureHeaterPosition), ProcessUnit.SuspectPosition.ToString());
  974. Chamber.HighTemperatureHeaterGotoPosition(position);
  975. if (ProcessUnit.HeaterTemp > 0)
  976. {
  977. Chamber.SetHighTemperatureHeaterTemperature(ProcessUnit.HeaterTemp);
  978. }
  979. if (ProcessUnit.HeaterRatio > 0)
  980. {
  981. Chamber.SetHighTemperatureHeaterRatio(ProcessUnit.HeaterRatio);
  982. }
  983. _HighTemperatureToleranceChecker.IsStable = true;
  984. if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  985. {
  986. List<ToleranceObject> toleranceObjects = new List<ToleranceObject>();
  987. toleranceObjects.Add(new ToleranceObject("HighTemperatureHeater Temperature", ProcessUnit.HeaterTemp, ProcessUnit.HeaterTempWarningRange, ProcessUnit.HeaterTempAlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
  988. _HighTemperatureToleranceChecker.Start(toleranceObjects, step.Type == StepType.Stable);
  989. }
  990. return RState.Running;
  991. }
  992. private RState HeaterUnit_Check(ProcessUnitBase unit, RecipeStep step)
  993. {
  994. var ProcessUnit = unit as HeaterUnit;
  995. if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  996. {
  997. return _HighTemperatureToleranceChecker.Monitor(Chamber.ChamberTemperature);
  998. }
  999. return RState.Running;
  1000. }
  1001. private void HeaterUnit_End(ProcessUnitBase unit, RecipeStep step)
  1002. {
  1003. var ProcessUnit = unit as HeaterUnit;
  1004. if (ProcessUnit.ToleranceMode != ToleranceMode.None)
  1005. {
  1006. _HighTemperatureToleranceChecker.End();
  1007. }
  1008. }
  1009. public bool LoadMethods(ProcessUnitBase unit)
  1010. {
  1011. var className = $"{Module}.{unit.GetType().Name}";
  1012. if (startHelper.ContainsKey(className) && checkerHelper.ContainsKey(className) && endHelper.ContainsKey(className))
  1013. {
  1014. unit.starter = startHelper[className];
  1015. unit.checker = checkerHelper[className];
  1016. unit.end = endHelper[className];
  1017. return true;
  1018. }
  1019. return false;
  1020. }
  1021. //public void loopStep(bool isloop,int loopCount,int loopIndex)
  1022. //{
  1023. // isLoop = isloop;
  1024. // loopsteps=loopCount;
  1025. // currentStepIndex = loopIndex;
  1026. //}
  1027. private RState stepStarter(RecipeStep step)
  1028. {
  1029. step.StartStepTimer();
  1030. //switch (step.Type)
  1031. //{
  1032. // case StepType.EndPoint:
  1033. // Chamber.EPDStepStart(step.EPDConfig, step.StepNo);
  1034. // break;
  1035. //}
  1036. if (_isInstalledEPD)
  1037. {
  1038. Chamber.EPDStepStart(step.EPDConfig, step.StepNo);
  1039. if (step.Type == StepType.EndPoint)
  1040. {
  1041. _lastEPDStepTimeStopwatch.Restart();
  1042. }
  1043. }
  1044. return RState.Running;
  1045. }
  1046. private RState stepChecker(RecipeStep step)
  1047. {
  1048. switch (step.Type)
  1049. {
  1050. case StepType.Time:
  1051. return step.ElapsedTime() >= step.Time * 1000 ? RState.End : RState.Running;
  1052. case StepType.OverEtch:
  1053. lastEPDStepTime = _lastEPDStepTimeStopwatch.ElapsedMilliseconds * step.OverEtchPercent / 100;
  1054. return step.ElapsedTime() >= lastEPDStepTime ? RState.End : RState.Running;
  1055. case StepType.EndPoint:
  1056. if (step.ElapsedTime() > step.MaxEndPointTime * 1000)
  1057. {
  1058. LOG.Write(eEvent.ERR_PROCESS, Chamber.Module, $"Step:{step.StepNo} timeout, did not capture endpoint signal in {step.MaxEndPointTime} seconds");
  1059. return RState.Failed;
  1060. }
  1061. else
  1062. {
  1063. if (Chamber.EPDCaptured)
  1064. {
  1065. if (step.ElapsedTime() < step.MinEndPointTime * 1000)
  1066. {
  1067. LOG.Write(eEvent.ERR_PROCESS, Chamber.Module, $"Step:{step.StepNo} timeout, capture endpoint signal less than {step.MinEndPointTime} seconds");
  1068. return RState.Failed;
  1069. }
  1070. else
  1071. {
  1072. return RState.End;
  1073. }
  1074. }
  1075. else
  1076. {
  1077. return RState.Running;
  1078. }
  1079. //return Chamber.EPDCaptured ? RState.End : RState.Running;
  1080. }
  1081. case StepType.Stable:
  1082. if (step.ElapsedTime() >= step.Time * 1000)
  1083. {
  1084. LOG.Write(eEvent.ERR_PROCESS, Chamber.Module, $"Step:{step.StepNo} timeout, did not Stable in {step.Time} seconds");
  1085. return RState.Failed;
  1086. }
  1087. else
  1088. {
  1089. if (_GasFlowToleranceChecker.IsStable && _PressureToleranceChecker.IsStable && _HighTemperatureToleranceChecker.IsStable)
  1090. {
  1091. return RState.End;
  1092. }
  1093. }
  1094. return RState.Running;
  1095. }
  1096. return RState.Running;
  1097. }
  1098. private RState stepEnder(RecipeStep step)
  1099. {
  1100. //if (step.Type == StepType.EndPoint)
  1101. //{
  1102. // Chamber.EPDStepStop();
  1103. //}
  1104. if (_isInstalledEPD)
  1105. {
  1106. Chamber.EPDStepStop();
  1107. if (step.Type == StepType.EndPoint)
  1108. {
  1109. _lastEPDStepTimeStopwatch.Stop();
  1110. }
  1111. }
  1112. return RState.End;
  1113. }
  1114. public bool LoadStepFuns(RecipeStep step)
  1115. {
  1116. step.starter = stepStarter;
  1117. step.checker = stepChecker;
  1118. step.ender = stepEnder;
  1119. return true;
  1120. }
  1121. }
  1122. }