SRDUnloaderRoutine.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. using Aitex.Core.RT.Device;
  2. using Aitex.Core.RT.Log;
  3. using Aitex.Core.RT.Routine;
  4. using Aitex.Core.RT.SCCore;
  5. using CyberX8_Core;
  6. using CyberX8_RT.Devices.AXIS;
  7. using CyberX8_RT.Devices.Facilities;
  8. using CyberX8_RT.Devices.SRD;
  9. using MECF.Framework.Common.Routine;
  10. namespace CyberX8_RT.Modules.SRD
  11. {
  12. public class SRDUnloaderRoutine : RoutineBase, IRoutine
  13. {
  14. private enum SRDUnloaderStep
  15. {
  16. ChuckVacuumOff,
  17. ChuckATMOn,
  18. CheckVacuum,
  19. LiftUpOn,
  20. CheckWaferPresent,
  21. OpenDoor,
  22. End
  23. }
  24. #region 常量
  25. private const int RETRY_TIMES = 3;
  26. #endregion
  27. #region 内部变量
  28. /// <summary>
  29. /// Rotation Axis
  30. /// </summary>
  31. private JetAxisBase _rotationAxis;
  32. /// <summary>
  33. /// SRD Common
  34. /// </summary>
  35. private SrdCommonDevice _srdCommon;
  36. /// <summary>
  37. /// Total SRD
  38. /// </summary>
  39. private TotalSRDDevice _totalSRDDevice;
  40. /// <summary>
  41. /// System Facility
  42. /// </summary>
  43. private SystemFacilities _systemFacilities;
  44. /// <summary>
  45. /// 当前WaferSize
  46. /// </summary>
  47. private int _waferSize = 200;
  48. /// <summary>
  49. /// 当前Retry次数
  50. /// </summary>
  51. private int _currentRetryTimes = 0;
  52. /// <summary>
  53. /// 真空值
  54. /// </summary>
  55. private int _vacuumOffLimit = 0;
  56. #endregion
  57. #region 属性
  58. #endregion
  59. /// <summary>
  60. /// 构造函数
  61. /// </summary>
  62. /// <param name="module"></param>
  63. public SRDUnloaderRoutine(string module) : base(module)
  64. {
  65. }
  66. /// <summary>
  67. /// 中止
  68. /// </summary>
  69. public void Abort()
  70. {
  71. Runner.Stop("SRD Loader Abort");
  72. }
  73. /// <summary>
  74. /// 监控
  75. /// </summary>
  76. /// <returns></returns>
  77. public RState Monitor()
  78. {
  79. Runner.Run(SRDUnloaderStep.ChuckVacuumOff, ChuckVacuumOff, CheckChuckVacuumOffEndStatus, CheckChuckVacuumOffStopStatus)
  80. .Run(SRDUnloaderStep.ChuckATMOn, ChuckATMOn, CheckChuckATMEndStatus, CheckChuckATMStopStatus)
  81. .WaitWithStopCondition(SRDUnloaderStep.CheckVacuum, CheckVacuumEndStatus, CheckVacuumStopStatus)
  82. .Run(SRDUnloaderStep.LiftUpOn, LiftUpOn, CheckLiftUpOnEndStatus, CheckLiftUpOnStopStatus)
  83. .Run(SRDUnloaderStep.CheckWaferPresent, CheckWaferPresent, _delay_1ms)
  84. .Run(SRDUnloaderStep.OpenDoor, OpenDoor, CheckDoorOpenedEndStatus, CheckDoorOpenedStopStatus)
  85. .End(SRDUnloaderStep.End, NullFun, _delay_1ms);
  86. return Runner.Status;
  87. }
  88. /// <summary>
  89. /// 启动
  90. /// </summary>
  91. /// <param name="objs"></param>
  92. /// <returns></returns>
  93. public RState Start(params object[] objs)
  94. {
  95. _srdCommon = DEVICE.GetDevice<SrdCommonDevice>($"{Module}.Common");
  96. _totalSRDDevice = DEVICE.GetDevice<TotalSRDDevice>("SRD");
  97. _rotationAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Rotation");
  98. _systemFacilities = DEVICE.GetDevice<SystemFacilities>("System.Facilities");
  99. _vacuumOffLimit = SC.GetValue<int>("SRD.ChuckVacuumOffLimit");
  100. if (!CheckPreCondition())
  101. {
  102. return RState.Failed;
  103. }
  104. return Runner.Start(Module, "SRD Unloader Start");
  105. }
  106. /// <summary>
  107. /// Check Pre Condition
  108. /// </summary>
  109. /// <returns></returns>
  110. private bool CheckPreCondition()
  111. {
  112. //Check Rotation Home
  113. //if (!_rotationAxis.IsHomed)
  114. //{
  115. // NotifyError(eEvent.ERR_SRD, "Rotation is not homed", 0);
  116. // return false;
  117. //}
  118. //Check LiftUp
  119. if (_srdCommon.CommonData.LiftUp)
  120. {
  121. NotifyError(eEvent.ERR_SRD, "LiftUp is on", 0);
  122. return false;
  123. }
  124. //Check LiftUp Status
  125. if (_srdCommon.CommonData.LiftUpStatus)
  126. {
  127. NotifyError(eEvent.ERR_SRD, "LiftUp sensor is on", 0);
  128. return false;
  129. }
  130. //Check Wafer Present
  131. if (!_srdCommon.CommonData.WaferPresent)
  132. {
  133. NotifyError(eEvent.ERR_SRD, "WaferPresent sensor is off", 0);
  134. return false;
  135. }
  136. //Check LoaderDI
  137. if (!_systemFacilities.LoaderDiEnable)
  138. {
  139. NotifyError(eEvent.ERR_SRD, "Load DI Is Disable", 0);
  140. return false;
  141. }
  142. //Check Vacuum
  143. int vacuumOnLimit = SC.GetValue<int>("SRD.ChuckVacuumOnLimit");
  144. if (!_srdCommon.CommonData.ChuckVacuum)
  145. {
  146. if(_srdCommon.CommonData.VacuumValue >= vacuumOnLimit)
  147. {
  148. LOG.WriteLog(eEvent.ERR_SRD, Module, $"VacuumValue:{_srdCommon.CommonData.VacuumValue}, VacuumOn Limit:{vacuumOnLimit}");
  149. return false;
  150. }
  151. }
  152. else
  153. {
  154. LOG.WriteLog(eEvent.ERR_SRD, Module, $"Chuck Vacuum is off");
  155. return false;
  156. }
  157. //Check Flippers
  158. if (_srdCommon.CommonData.FlippersIn150 || _srdCommon.CommonData.FlippersIn200) //|| _srdCommon.CommonData.FlippersIn100
  159. {
  160. NotifyError(eEvent.ERR_SRD, "FlippersIn is on", 0);
  161. return false;
  162. }
  163. if (!_srdCommon.CommonData.Flipper1Out150Status || !_srdCommon.CommonData.Flipper2Out150Status || !_srdCommon.CommonData.Flipper3Out150Status
  164. || !_srdCommon.CommonData.Flipper1Out200Status || !_srdCommon.CommonData.Flipper2Out200Status || !_srdCommon.CommonData.Flipper3Out200Status)
  165. //|| !_srdCommon.CommonData.Flipper1Out100Status || !_srdCommon.CommonData.Flipper2Out100Status || !_srdCommon.CommonData.Flipper3Out100Status
  166. {
  167. NotifyError(eEvent.ERR_SRD, "Flippers are at In position", 0);
  168. return false;
  169. }
  170. return true;
  171. }
  172. /// <summary>
  173. /// ChuckATMOn
  174. /// </summary>
  175. /// <returns></returns>
  176. private bool ChuckATMOn()
  177. {
  178. bool result = _srdCommon.ChuckATMAction("", null);
  179. if (!result)
  180. {
  181. NotifyError(eEvent.ERR_SRD, "Chuck ATM Action is failed", 0);
  182. return result;
  183. }
  184. return true;
  185. }
  186. /// <summary>
  187. /// Chuck ATM On End
  188. /// </summary>
  189. /// <returns></returns>
  190. private bool CheckChuckATMEndStatus()
  191. {
  192. return _srdCommon.Status == RState.End && !_srdCommon.CommonData.ChuckATMOn;
  193. }
  194. /// <summary>
  195. /// Chuck ATM On Stop
  196. /// </summary>
  197. /// <returns></returns>
  198. private bool CheckChuckATMStopStatus()
  199. {
  200. if (_srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout)
  201. {
  202. NotifyError(eEvent.ERR_SRD, "Check ChuckATM is failed", 0);
  203. return true;
  204. }
  205. return false;
  206. }
  207. /// <summary>
  208. /// Check Vacuum End
  209. /// </summary>
  210. /// <returns></returns>
  211. private bool CheckVacuumEndStatus()
  212. {
  213. if(_srdCommon.Status == RState.End && CheckVacuumValue())
  214. {
  215. return true;
  216. }
  217. return false;
  218. }
  219. /// <summary>
  220. /// Check Vacuum Stop
  221. /// </summary>
  222. /// <returns></returns>
  223. private bool CheckVacuumStopStatus()
  224. {
  225. if (_srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout)
  226. {
  227. NotifyError(eEvent.ERR_SRD, "Check ChuckATM is failed", 0);
  228. return true;
  229. }
  230. else if (_srdCommon.Status == RState.End)
  231. {
  232. if (_currentRetryTimes < RETRY_TIMES)
  233. {
  234. _currentRetryTimes++;
  235. NotifyError(eEvent.WARN_SRD, $"Current Chuck ATM Retry Times is {_currentRetryTimes}", 0);
  236. _srdCommon.ChuckATMAction("", null);
  237. }
  238. else
  239. {
  240. NotifyError(eEvent.ERR_SRD, $"Chuck ATM Retry Times is over {RETRY_TIMES}. ChuckATM is failed!", 0);
  241. return true;
  242. }
  243. }
  244. return false;
  245. }
  246. /// <summary>
  247. /// Check Vacuum Value
  248. /// </summary>
  249. /// <returns></returns>
  250. private bool CheckVacuumValue()
  251. {
  252. if (_srdCommon.CommonData.VacuumValue >= _vacuumOffLimit)
  253. {
  254. //LOG.WriteLog(eEvent.INFO_SRD, Module, $"VacuumValue:{_srdCommon.CommonData.VacuumValue}, VacuumOn Limit:{_vacuumOffLimit}");
  255. return true;
  256. }
  257. else
  258. {
  259. LOG.WriteLog(eEvent.WARN_SRD, Module, $"VacuumValue:{_srdCommon.CommonData.VacuumValue}, VacuumOn Limit:{_vacuumOffLimit}");
  260. return false;
  261. }
  262. }
  263. /// <summary>
  264. /// LiftUpOff
  265. /// </summary>
  266. /// <param name="param"></param>
  267. /// <returns></returns>
  268. private bool LiftUpOn()
  269. {
  270. bool result = _srdCommon.LiftUpOnAction("", null);
  271. if (!result)
  272. {
  273. NotifyError(eEvent.ERR_SRD, "Lift Up On Action is failed", 0);
  274. return result;
  275. }
  276. return true;
  277. }
  278. /// <summary>
  279. /// 检验LiftUpOff结束状态
  280. /// </summary>
  281. /// <param name="param"></param>
  282. /// <returns></returns>
  283. private bool CheckLiftUpOnEndStatus()
  284. {
  285. return _srdCommon.Status == RState.End && _srdCommon.CommonData.LiftUpStatus;
  286. }
  287. /// <summary>
  288. /// 检验LiftUpOff结束状态
  289. /// </summary>
  290. /// <param name="param"></param>
  291. /// <returns></returns>
  292. private bool CheckLiftUpOnStopStatus()
  293. {
  294. if (_srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout)
  295. {
  296. NotifyError(eEvent.ERR_SRD, "Check LiftUpOn is failed", 0);
  297. return true;
  298. }
  299. return false;
  300. }
  301. /// <summary>
  302. /// ChuckVacuumOn
  303. /// </summary>
  304. /// <param name="param"></param>
  305. /// <returns></returns>
  306. private bool ChuckVacuumOff()
  307. {
  308. bool result = _srdCommon.ChuckVacuumOffAction("", null);
  309. if (!result)
  310. {
  311. NotifyError(eEvent.ERR_SRD, "ChuckVacuumOff Action is failed", 0);
  312. return result;
  313. }
  314. return true;
  315. }
  316. /// <summary>
  317. /// 检验ChuckVacuumOn结束状态
  318. /// </summary>
  319. /// <param name="param"></param>
  320. /// <returns></returns>
  321. private bool CheckChuckVacuumOffEndStatus()
  322. {
  323. return _srdCommon.Status == RState.End && _srdCommon.CommonData.ChuckVacuum;
  324. }
  325. /// <summary>
  326. /// 检验ChuckVacuumOn结束状态
  327. /// </summary>
  328. /// <param name="param"></param>
  329. /// <returns></returns>
  330. private bool CheckChuckVacuumOffStopStatus()
  331. {
  332. if (_srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout)
  333. {
  334. NotifyError(eEvent.ERR_SRD, "Check ChuckVacuumOff is failed", 0);
  335. return true;
  336. }
  337. return false;
  338. }
  339. /// <summary>
  340. /// Check WaferPresent
  341. /// </summary>
  342. /// <returns></returns>
  343. private bool CheckWaferPresent()
  344. {
  345. if (!_srdCommon.CommonData.WaferPresent)
  346. {
  347. NotifyError(eEvent.ERR_SRD, "WaferPresent sensor is off", 0);
  348. return false;
  349. }
  350. return true;
  351. }
  352. /// <summary>
  353. /// Open Door
  354. /// </summary>
  355. /// <param name="param"></param>
  356. /// <returns></returns>
  357. private bool OpenDoor()
  358. {
  359. return _srdCommon.DoorOpenAction("", null);
  360. }
  361. /// <summary>
  362. /// 检验DoorOpened
  363. /// </summary>
  364. /// <param name="param"></param>
  365. /// <returns></returns>
  366. private bool CheckDoorOpenedEndStatus()
  367. {
  368. bool result = _srdCommon.Status == RState.End;
  369. if (result)
  370. {
  371. if (_srdCommon.CommonData.DoorOpened && !_srdCommon.CommonData.DoorClosed)
  372. {
  373. return true;
  374. }
  375. else
  376. {
  377. NotifyError(eEvent.ERR_SRD, $"Opened {_srdCommon.CommonData.DoorOpened}&&Closed {_srdCommon.CommonData.DoorClosed}", 0);
  378. return false;
  379. }
  380. }
  381. return false;
  382. }
  383. /// <summary>
  384. /// 检验Door
  385. /// </summary>
  386. /// <returns></returns>
  387. private bool CheckDoorOpenedStopStatus()
  388. {
  389. return _srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout;
  390. }
  391. }
  392. }