TransporterHomeRoutine.cs 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. using Aitex.Core.RT.Device;
  2. using Aitex.Core.RT.Log;
  3. using Aitex.Core.RT.Routine;
  4. using Aitex.Core.Util;
  5. using MECF.Framework.Common.Equipment;
  6. using MECF.Framework.Common.Routine;
  7. using MECF.Framework.Common.Utilities;
  8. using CyberX8_Core;
  9. using CyberX8_RT.Devices.AXIS;
  10. using CyberX8_RT.Devices.Facilities;
  11. using System;
  12. using System.Collections.Generic;
  13. using System.Linq;
  14. using System.Text;
  15. using System.Threading.Tasks;
  16. using CyberX8_RT.Devices.Safety;
  17. namespace CyberX8_RT.Modules.Transporter
  18. {
  19. public class TransporterHomeRoutine : RoutineBase, IRoutine
  20. {
  21. private enum HomeAllStep
  22. {
  23. CheckSafety,
  24. CheckCDAWithN2,
  25. VerticalHome,
  26. VerticalHomeWait,
  27. VerticalLow,
  28. VerticalLowWait,
  29. GantryHome,
  30. GantryHomeWait,
  31. GantryPark,
  32. GantryParkWait,
  33. End
  34. }
  35. #region 内部变量
  36. private JetAxisBase _gantryAxis;
  37. private JetAxisBase _elevatorAxis;
  38. private SystemFacilities _facilities;
  39. private TransporterEntity _transporterEntity;
  40. #endregion
  41. public TransporterHomeRoutine(string module) : base(module)
  42. {
  43. }
  44. public void Abort()
  45. {
  46. Runner.Stop("Manual Abort");
  47. }
  48. public RState Monitor()
  49. {
  50. Runner.Run(HomeAllStep.CheckSafety,CheckSafety,_delay_1ms)
  51. .Run(HomeAllStep.CheckCDAWithN2, StartEnaleCDAndN2, CheckCDAWithN2, _delay_1s)
  52. .Run(HomeAllStep.VerticalHome, VerticalAxisHome, _delay_1ms)
  53. .WaitWithStopCondition(HomeAllStep.VerticalHomeWait, CheckVerticalPositionStatus, CheckVerticalPositionRunStop)
  54. .Run(HomeAllStep.VerticalLow, () => { return _elevatorAxis.PositionStation("LOW", true); },NullFun,100)
  55. .WaitWithStopCondition(HomeAllStep.VerticalLowWait,CheckVerticalPositionStatus, CheckVerticalPositionRunStop)
  56. .Run(HomeAllStep.GantryHome, GantryAxisHome, _delay_1ms)
  57. .WaitWithStopCondition(HomeAllStep.GantryHomeWait,CheckGantryPositionStatus,CheckGantryPositionRunStop)
  58. .Run(HomeAllStep.GantryPark, () => { return _gantryAxis.PositionStation("Park", true); }, NullFun, 100)
  59. .WaitWithStopCondition(HomeAllStep.GantryParkWait, CheckGantryPositionStatus, CheckGantryPositionRunStop)
  60. .End(HomeAllStep.End,NullFun);
  61. return Runner.Status;
  62. }
  63. /// <summary>
  64. /// 检验Safety
  65. /// </summary>
  66. /// <returns></returns>
  67. private bool CheckSafety()
  68. {
  69. SafetyDevice safetyDevice = DEVICE.GetDevice<SafetyDevice>("Safety");
  70. if (safetyDevice == null)
  71. {
  72. LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module.ToString(), "Safety device is null");
  73. return false;
  74. }
  75. if (safetyDevice.SafetyData.TwincatState != 8)
  76. {
  77. LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module.ToString(), "Twincat Status is not OP status");
  78. return false;
  79. }
  80. if (safetyDevice.SafetyData.TransportCommErr)
  81. {
  82. LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module.ToString(), "Twincat Transporter Communication status is error");
  83. return false;
  84. }
  85. if (safetyDevice.SafetyData.TransporterFunctionBlockErr)
  86. {
  87. LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module.ToString(), "Twincat Transporter function block status is error");
  88. return false;
  89. }
  90. return true;
  91. }
  92. /// <summary>
  93. /// 检验前置条件
  94. /// </summary>
  95. /// <returns></returns>
  96. private bool CheckPreCondition()
  97. {
  98. //所有运动模块均已Initialized
  99. if(! _gantryAxis.IsSwitchOn)
  100. {
  101. LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module.ToString(), "Gantry is switchoff");
  102. return false;
  103. }
  104. if(!_elevatorAxis.IsSwitchOn)
  105. {
  106. LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module.ToString(), "Elevator is switchoff");
  107. return false;
  108. }
  109. if(_transporterEntity.WaferHolderInfo!=null)
  110. {
  111. LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module.ToString(), "transporter exsit wafer Shuttle,can not home");
  112. return false;
  113. }
  114. if (Module == ModuleName.Transporter1.ToString())
  115. {
  116. TransporterEntity transporterEntity1 = Singleton<RouteManager>.Instance.GetModule<TransporterEntity>(ModuleName.Transporter2.ToString());
  117. if (!transporterEntity1.IsHomed)
  118. {
  119. LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module.ToString(), "Loader Transporter is not homed");
  120. return false;
  121. }
  122. }
  123. return true;
  124. }
  125. /// <summary>
  126. /// 启动CDA和N2
  127. /// </summary>
  128. /// <returns></returns>
  129. private bool StartEnaleCDAndN2()
  130. {
  131. if(!_facilities.CDAEnable)
  132. {
  133. bool result= _facilities.N2EnableOperation("", true);
  134. if(!result)
  135. {
  136. return false;
  137. }
  138. }
  139. if(!_facilities.N2Enable)
  140. {
  141. bool result = _facilities.CDAEnableOperation("", true);
  142. if(!result)
  143. {
  144. return false;
  145. }
  146. }
  147. return true;
  148. }
  149. /// <summary>
  150. /// 检验CDA和N2 Enable
  151. /// </summary>
  152. /// <returns></returns>
  153. private bool CheckCDAWithN2()
  154. {
  155. return _facilities.CDAEnable && _facilities.N2Enable;
  156. }
  157. /// <summary>
  158. /// Vertical Home
  159. /// </summary>
  160. /// <returns></returns>
  161. private bool VerticalAxisHome()
  162. {
  163. return _elevatorAxis.Home();
  164. }
  165. /// <summary>
  166. /// 检验Vertical Home状态
  167. /// </summary>
  168. /// <returns></returns>
  169. private bool CheckVerticalHome()
  170. {
  171. return _elevatorAxis.IsHomed&&_elevatorAxis.Status==RState.End;
  172. }
  173. /// <summary>
  174. /// 检验Vertical移动状态
  175. /// </summary>
  176. /// <returns></returns>
  177. private bool CheckVerticalPositionStatus()
  178. {
  179. return _elevatorAxis.Status == RState.End;
  180. }
  181. /// <summary>
  182. /// 检验Vertical是否还在运动
  183. /// </summary>
  184. /// <returns></returns>
  185. private bool CheckVerticalPositionRunStop()
  186. {
  187. return _elevatorAxis.Status==RState.Failed;
  188. }
  189. /// <summary>
  190. /// Gantry Home
  191. /// </summary>
  192. /// <returns></returns>
  193. private bool GantryAxisHome()
  194. {
  195. return _gantryAxis.Home();
  196. }
  197. /// <summary>
  198. /// 检验Gantry Home状态
  199. /// </summary>
  200. /// <returns></returns>
  201. private bool CheckGantryHome()
  202. {
  203. return _gantryAxis.IsHomed && _gantryAxis.Status == RState.End;
  204. }
  205. /// <summary>
  206. /// 检验Gantry移动状态
  207. /// </summary>
  208. /// <returns></returns>
  209. private bool CheckGantryPositionStatus()
  210. {
  211. return _gantryAxis.Status == RState.End;
  212. }
  213. /// <summary>
  214. /// 检验Gantry是否还在运动
  215. /// </summary>
  216. /// <returns></returns>
  217. private bool CheckGantryPositionRunStop()
  218. {
  219. return _gantryAxis.Status == RState.Failed;
  220. }
  221. /// <summary>
  222. /// 启动
  223. /// </summary>
  224. /// <param name="objs"></param>
  225. /// <returns></returns>
  226. public RState Start(params object[] objs)
  227. {
  228. _transporterEntity = Singleton<RouteManager>.Instance.GetModule<TransporterEntity>(Module);
  229. _gantryAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Gantry");
  230. _elevatorAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Elevator");
  231. _facilities = DEVICE.GetDevice<SystemFacilities>("System.Facilities");
  232. if (!CheckPreCondition())
  233. {
  234. return RState.Failed;
  235. }
  236. return Runner.Start(Module, "Home");
  237. }
  238. }
  239. }