SRDUnloaderRoutine.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. using Aitex.Core.Common;
  2. using Aitex.Core.RT.Device;
  3. using Aitex.Core.RT.Log;
  4. using Aitex.Core.RT.Routine;
  5. using Aitex.Core.RT.SCCore;
  6. using CyberX8_Core;
  7. using CyberX8_RT.Devices.AXIS;
  8. using CyberX8_RT.Devices.Facilities;
  9. using CyberX8_RT.Devices.SRD;
  10. using MECF.Framework.Common.Equipment;
  11. using MECF.Framework.Common.Routine;
  12. using MECF.Framework.Common.SubstrateTrackings;
  13. namespace CyberX8_RT.Modules.SRD
  14. {
  15. public class SRDUnloaderRoutine : RoutineBase, IRoutine
  16. {
  17. private enum SRDUnloaderStep
  18. {
  19. Unload_FlippersOut,
  20. Unload_ChuckVacuumOff,
  21. Unload_ChuckATMOn,
  22. Unload_CheckVacuum,
  23. Unload_LiftUpOn,
  24. Unload_CheckWaferPresent,
  25. Unload_OpenDoor,
  26. End
  27. }
  28. #region 常量
  29. private const int RETRY_TIMES = 3;
  30. #endregion
  31. #region 内部变量
  32. /// <summary>
  33. /// Rotation Axis
  34. /// </summary>
  35. private JetAxisBase _rotationAxis;
  36. /// <summary>
  37. /// SRD Common
  38. /// </summary>
  39. private SrdCommonDevice _srdCommon;
  40. /// <summary>
  41. /// Total SRD
  42. /// </summary>
  43. private TotalSRDDevice _totalSRDDevice;
  44. /// <summary>
  45. /// System Facility
  46. /// </summary>
  47. private SystemFacilities _systemFacilities;
  48. /// <summary>
  49. /// 当前WaferSize
  50. /// </summary>
  51. private int _waferSize = 200;
  52. /// <summary>
  53. /// 当前Retry次数
  54. /// </summary>
  55. private int _currentRetryTimes = 0;
  56. /// <summary>
  57. /// 真空值
  58. /// </summary>
  59. private int _vacuumOffLimit = 0;
  60. /// <summary>
  61. /// Process Error状态
  62. /// </summary>
  63. private bool _isProcessError = false;
  64. #endregion
  65. #region 属性
  66. #endregion
  67. /// <summary>
  68. /// 构造函数
  69. /// </summary>
  70. /// <param name="module"></param>
  71. public SRDUnloaderRoutine(string module) : base(module)
  72. {
  73. }
  74. /// <summary>
  75. /// 中止
  76. /// </summary>
  77. public void Abort()
  78. {
  79. Runner.Stop("SRD Loader Abort");
  80. }
  81. /// <summary>
  82. /// 监控
  83. /// </summary>
  84. /// <returns></returns>
  85. public RState Monitor()
  86. {
  87. Runner.RunIf(SRDUnloaderStep.Unload_FlippersOut, _isProcessError, FlippersOut, CheckFlippersOutEndStatus, CheckFlippersOutStopStatus)
  88. .Run(SRDUnloaderStep.Unload_ChuckVacuumOff, ChuckVacuumOff, CheckChuckVacuumOffEndStatus, CheckChuckVacuumOffStopStatus)
  89. .Run(SRDUnloaderStep.Unload_ChuckATMOn, ChuckATMOn, CheckChuckATMEndStatus, CheckChuckATMStopStatus)
  90. .WaitWithStopCondition(SRDUnloaderStep.Unload_CheckVacuum, CheckVacuumEndStatus, CheckVacuumStopStatus)
  91. .Run(SRDUnloaderStep.Unload_LiftUpOn, LiftUpOn, CheckLiftUpOnEndStatus, CheckLiftUpOnStopStatus)
  92. .Run(SRDUnloaderStep.Unload_CheckWaferPresent, CheckWaferPresent, _delay_1ms)
  93. .Run(SRDUnloaderStep.Unload_OpenDoor, OpenDoor, CheckDoorOpenedEndStatus, CheckDoorOpenedStopStatus)
  94. .End(SRDUnloaderStep.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. _srdCommon = DEVICE.GetDevice<SrdCommonDevice>($"{Module}.Common");
  105. _totalSRDDevice = DEVICE.GetDevice<TotalSRDDevice>("SRD");
  106. _rotationAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Rotation");
  107. _systemFacilities = DEVICE.GetDevice<SystemFacilities>("System.Facilities");
  108. _vacuumOffLimit = SC.GetValue<int>("SRD.ChuckVacuumOffLimit");
  109. if (objs.Length >= 1)
  110. {
  111. _isProcessError = (bool)objs[0];
  112. }
  113. if (!_isProcessError && !CheckPreCondition())
  114. {
  115. return RState.Failed;
  116. }
  117. if (!GetWaferSize())
  118. {
  119. NotifyError(eEvent.ERR_SRD, "Wafer Size is invalid", 0);
  120. return RState.Failed;
  121. }
  122. return Runner.Start(Module, "SRD Unloader Start");
  123. }
  124. /// <summary>
  125. /// Check Pre Condition
  126. /// </summary>
  127. /// <returns></returns>
  128. private bool CheckPreCondition()
  129. {
  130. //Check Rotation Home
  131. if (!_rotationAxis.IsHomed)
  132. {
  133. NotifyError(eEvent.ERR_SRD, "Rotation is not homed", 0);
  134. return false;
  135. }
  136. //Check LiftUp
  137. if (_srdCommon.CommonData.LiftUp)
  138. {
  139. NotifyError(eEvent.ERR_SRD, "LiftUp is on", 0);
  140. return false;
  141. }
  142. //Check LiftUp Status
  143. if (_srdCommon.CommonData.LiftUpStatus)
  144. {
  145. NotifyError(eEvent.ERR_SRD, "LiftUp sensor is on", 0);
  146. return false;
  147. }
  148. //Check Wafer Present
  149. if (!_srdCommon.CommonData.WaferPresent)
  150. {
  151. NotifyError(eEvent.ERR_SRD, "WaferPresent sensor is off", 0);
  152. return false;
  153. }
  154. //Check LoaderDI
  155. if (!_systemFacilities.LoaderDiEnable)
  156. {
  157. NotifyError(eEvent.ERR_SRD, "Load DI Is Disable", 0);
  158. return false;
  159. }
  160. //Check Vacuum
  161. int vacuumOnLimit = SC.GetValue<int>("SRD.ChuckVacuumOnLimit");
  162. if (!_srdCommon.CommonData.ChuckVacuum)
  163. {
  164. if(_srdCommon.CommonData.VacuumValue >= vacuumOnLimit)
  165. {
  166. LOG.WriteLog(eEvent.ERR_SRD, Module, $"VacuumValue:{_srdCommon.CommonData.VacuumValue}, VacuumOn Limit:{vacuumOnLimit}");
  167. return false;
  168. }
  169. }
  170. else
  171. {
  172. LOG.WriteLog(eEvent.ERR_SRD, Module, $"Chuck Vacuum is off");
  173. return false;
  174. }
  175. //Check Flippers
  176. if (_srdCommon.CommonData.FlippersIn150 || _srdCommon.CommonData.FlippersIn200) //|| _srdCommon.CommonData.FlippersIn100
  177. {
  178. NotifyError(eEvent.ERR_SRD, "FlippersIn is on", 0);
  179. return false;
  180. }
  181. if (!_srdCommon.CommonData.Flipper1Out150Status || !_srdCommon.CommonData.Flipper2Out150Status || !_srdCommon.CommonData.Flipper3Out150Status
  182. || !_srdCommon.CommonData.Flipper1Out200Status || !_srdCommon.CommonData.Flipper2Out200Status || !_srdCommon.CommonData.Flipper3Out200Status)
  183. //|| !_srdCommon.CommonData.Flipper1Out100Status || !_srdCommon.CommonData.Flipper2Out100Status || !_srdCommon.CommonData.Flipper3Out100Status
  184. {
  185. NotifyError(eEvent.ERR_SRD, "Flippers are at In position", 0);
  186. return false;
  187. }
  188. return true;
  189. }
  190. /// <summary>
  191. /// ChuckATMOn
  192. /// </summary>
  193. /// <returns></returns>
  194. private bool ChuckATMOn()
  195. {
  196. bool result = _srdCommon.ChuckATMAction("", null);
  197. if (!result)
  198. {
  199. NotifyError(eEvent.ERR_SRD, "Chuck ATM Action is failed", 0);
  200. return result;
  201. }
  202. return true;
  203. }
  204. /// <summary>
  205. /// Chuck ATM On End
  206. /// </summary>
  207. /// <returns></returns>
  208. private bool CheckChuckATMEndStatus()
  209. {
  210. return _srdCommon.Status == RState.End && !_srdCommon.CommonData.ChuckATMOn;
  211. }
  212. /// <summary>
  213. /// Chuck ATM On Stop
  214. /// </summary>
  215. /// <returns></returns>
  216. private bool CheckChuckATMStopStatus()
  217. {
  218. if (_srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout)
  219. {
  220. NotifyError(eEvent.ERR_SRD, "Check ChuckATM is failed", 0);
  221. return true;
  222. }
  223. return false;
  224. }
  225. /// <summary>
  226. /// Check Vacuum End
  227. /// </summary>
  228. /// <returns></returns>
  229. private bool CheckVacuumEndStatus()
  230. {
  231. if(_srdCommon.Status == RState.End && CheckVacuumValue())
  232. {
  233. return true;
  234. }
  235. return false;
  236. }
  237. /// <summary>
  238. /// Check Vacuum Stop
  239. /// </summary>
  240. /// <returns></returns>
  241. private bool CheckVacuumStopStatus()
  242. {
  243. if (_srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout)
  244. {
  245. NotifyError(eEvent.ERR_SRD, "Check ChuckATM is failed", 0);
  246. return true;
  247. }
  248. else if (_srdCommon.Status == RState.End)
  249. {
  250. if (_currentRetryTimes < RETRY_TIMES)
  251. {
  252. _currentRetryTimes++;
  253. NotifyError(eEvent.WARN_SRD, $"Current Chuck ATM Retry Times is {_currentRetryTimes}", 0);
  254. _srdCommon.ChuckATMAction("", null);
  255. }
  256. else
  257. {
  258. NotifyError(eEvent.ERR_SRD, $"Chuck ATM Retry Times is over {RETRY_TIMES}. ChuckATM is failed!", 0);
  259. return true;
  260. }
  261. }
  262. return false;
  263. }
  264. /// <summary>
  265. /// Check Vacuum Value
  266. /// </summary>
  267. /// <returns></returns>
  268. private bool CheckVacuumValue()
  269. {
  270. if (_srdCommon.CommonData.VacuumValue >= _vacuumOffLimit)
  271. {
  272. //LOG.WriteLog(eEvent.INFO_SRD, Module, $"VacuumValue:{_srdCommon.CommonData.VacuumValue}, VacuumOn Limit:{_vacuumOffLimit}");
  273. return true;
  274. }
  275. else
  276. {
  277. LOG.WriteLog(eEvent.WARN_SRD, Module, $"VacuumValue:{_srdCommon.CommonData.VacuumValue}, VacuumOn Limit:{_vacuumOffLimit}");
  278. return false;
  279. }
  280. }
  281. /// <summary>
  282. /// LiftUpOff
  283. /// </summary>
  284. /// <param name="param"></param>
  285. /// <returns></returns>
  286. private bool LiftUpOn()
  287. {
  288. bool result = _srdCommon.LiftUpOnAction("", null);
  289. if (!result)
  290. {
  291. NotifyError(eEvent.ERR_SRD, "Lift Up On Action is failed", 0);
  292. return result;
  293. }
  294. return true;
  295. }
  296. /// <summary>
  297. /// 检验LiftUpOff结束状态
  298. /// </summary>
  299. /// <param name="param"></param>
  300. /// <returns></returns>
  301. private bool CheckLiftUpOnEndStatus()
  302. {
  303. return _srdCommon.Status == RState.End && _srdCommon.CommonData.LiftUpStatus;
  304. }
  305. /// <summary>
  306. /// 检验LiftUpOff结束状态
  307. /// </summary>
  308. /// <param name="param"></param>
  309. /// <returns></returns>
  310. private bool CheckLiftUpOnStopStatus()
  311. {
  312. if (_srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout)
  313. {
  314. NotifyError(eEvent.ERR_SRD, "Check LiftUpOn is failed", 0);
  315. return true;
  316. }
  317. return false;
  318. }
  319. /// <summary>
  320. /// ChuckVacuumOn
  321. /// </summary>
  322. /// <param name="param"></param>
  323. /// <returns></returns>
  324. private bool ChuckVacuumOff()
  325. {
  326. bool result = _srdCommon.ChuckVacuumOffAction("", null);
  327. if (!result)
  328. {
  329. NotifyError(eEvent.ERR_SRD, "ChuckVacuumOff Action is failed", 0);
  330. return result;
  331. }
  332. return true;
  333. }
  334. /// <summary>
  335. /// 检验ChuckVacuumOn结束状态
  336. /// </summary>
  337. /// <param name="param"></param>
  338. /// <returns></returns>
  339. private bool CheckChuckVacuumOffEndStatus()
  340. {
  341. return _srdCommon.Status == RState.End && _srdCommon.CommonData.ChuckVacuum;
  342. }
  343. /// <summary>
  344. /// 检验ChuckVacuumOn结束状态
  345. /// </summary>
  346. /// <param name="param"></param>
  347. /// <returns></returns>
  348. private bool CheckChuckVacuumOffStopStatus()
  349. {
  350. if (_srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout)
  351. {
  352. NotifyError(eEvent.ERR_SRD, "Check ChuckVacuumOff is failed", 0);
  353. return true;
  354. }
  355. return false;
  356. }
  357. /// <summary>
  358. /// Check WaferPresent
  359. /// </summary>
  360. /// <returns></returns>
  361. private bool CheckWaferPresent()
  362. {
  363. if (!_srdCommon.CommonData.WaferPresent)
  364. {
  365. NotifyError(eEvent.ERR_SRD, "WaferPresent sensor is off", 0);
  366. return false;
  367. }
  368. return true;
  369. }
  370. /// <summary>
  371. /// Open Door
  372. /// </summary>
  373. /// <param name="param"></param>
  374. /// <returns></returns>
  375. private bool OpenDoor()
  376. {
  377. return _srdCommon.DoorOpenAction("", null);
  378. }
  379. /// <summary>
  380. /// 检验DoorOpened
  381. /// </summary>
  382. /// <param name="param"></param>
  383. /// <returns></returns>
  384. private bool CheckDoorOpenedEndStatus()
  385. {
  386. bool result = _srdCommon.Status == RState.End;
  387. if (result)
  388. {
  389. if (_srdCommon.CommonData.DoorOpened && !_srdCommon.CommonData.DoorClosed)
  390. {
  391. return true;
  392. }
  393. else
  394. {
  395. NotifyError(eEvent.ERR_SRD, $"Opened {_srdCommon.CommonData.DoorOpened}&&Closed {_srdCommon.CommonData.DoorClosed}", 0);
  396. return false;
  397. }
  398. }
  399. return false;
  400. }
  401. /// <summary>
  402. /// 检验Door
  403. /// </summary>
  404. /// <returns></returns>
  405. private bool CheckDoorOpenedStopStatus()
  406. {
  407. return _srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout;
  408. }
  409. /// <summary>
  410. /// Flippers Out
  411. /// </summary>
  412. /// <param name="param"></param>
  413. /// <returns></returns>
  414. private bool FlippersOut()
  415. {
  416. bool result = false;
  417. object[] objects = new object[1];
  418. objects[0] = _waferSize;
  419. result = _srdCommon.FlipperOutAction("", objects);
  420. if (!result)
  421. {
  422. NotifyError(eEvent.ERR_SRD, $"FlipperOut{_waferSize} Action is failed", 0);
  423. return result;
  424. }
  425. return true;
  426. }
  427. /// <summary>
  428. /// 检验FlippersOut结束状态
  429. /// </summary>
  430. /// <param name="param"></param>
  431. /// <returns></returns>
  432. private bool CheckFlippersOutEndStatus()
  433. {
  434. return _srdCommon.Status == RState.End;
  435. }
  436. /// <summary>
  437. /// 检验FlippersOut结束状态
  438. /// </summary>
  439. /// <param name="param"></param>
  440. /// <returns></returns>
  441. private bool CheckFlippersOutStopStatus()
  442. {
  443. if (_srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout)
  444. {
  445. NotifyError(eEvent.ERR_SRD, $"Check FlipperOut{_waferSize} Action is failed", 0);
  446. return true;
  447. }
  448. return false;
  449. }
  450. /// <summary>
  451. /// Get current WaferSize
  452. /// </summary>
  453. /// <returns></returns>
  454. private bool GetWaferSize()
  455. {
  456. WaferInfo waferInfo = WaferManager.Instance.GetWafer(ModuleNameString.ToEnum(Module), 0);
  457. if (waferInfo == null)
  458. {
  459. return false;
  460. }
  461. switch (waferInfo.Size)
  462. {
  463. case WaferSize.WS4:
  464. _waferSize = 100;
  465. break;
  466. case WaferSize.WS6:
  467. case WaferSize.WS150:
  468. case WaferSize.WS159:
  469. _waferSize = 150;
  470. break;
  471. case WaferSize.WS0:
  472. case WaferSize.WS8:
  473. _waferSize = 200;
  474. break;
  475. default:
  476. return false;
  477. }
  478. return true;
  479. }
  480. /// <summary>
  481. /// 关闭 Wafer N2
  482. /// </summary>
  483. /// <returns></returns>
  484. private bool N2Off()
  485. {
  486. if(!_srdCommon.CommonData.N2On) return true;
  487. bool result = _srdCommon.N2OffAction("", null);
  488. if (!result)
  489. {
  490. NotifyError(eEvent.ERR_SRD, $"N2 Off Action is failed", 0);
  491. }
  492. return result;
  493. }
  494. /// <summary>
  495. /// Water Off
  496. /// </summary>
  497. /// <param name="param"></param>
  498. /// <returns></returns>
  499. private bool WaterOff()
  500. {
  501. if (_srdCommon.CommonData.WaterOn)
  502. {
  503. bool result = _srdCommon.WaterOff();
  504. if (!result)
  505. {
  506. NotifyError(eEvent.ERR_SRD, "Water On is failed", 0);
  507. }
  508. return result;
  509. }
  510. return true;
  511. }
  512. }
  513. }