PlatingCellVerticalEntity.cs 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. using Aitex.Core.RT.Device;
  2. using Aitex.Core.RT.Fsm;
  3. using Aitex.Core.RT.Log;
  4. using Aitex.Core.Util;
  5. using Aitex.Core.Utilities;
  6. using MECF.Framework.Common.CommonData.PUF;
  7. using MECF.Framework.Common.Equipment;
  8. using MECF.Framework.Common.Persistent.Reservoirs;
  9. using MECF.Framework.Common.Persistent.Temperature;
  10. using MECF.Framework.Common.ToolLayout;
  11. using PunkHPX8_Core;
  12. using PunkHPX8_RT.Devices.AXIS;
  13. using PunkHPX8_RT.Modules.Reservoir;
  14. using PunkHPX8_RT.Modules.VpwCell;
  15. using System;
  16. using System.Collections.Generic;
  17. using System.Linq;
  18. using System.Text;
  19. using System.Threading.Tasks;
  20. using static PunkHPX8_RT.Modules.PlatingCell.PlatingCellEntity;
  21. namespace PunkHPX8_RT.Modules.PlatingCell
  22. {
  23. public class PlatingCellVerticalEntity : Entity, IEntity, IModuleEntity
  24. {
  25. public enum VerticalMsg
  26. {
  27. NONE,
  28. Error,
  29. ResumeError,
  30. Initialize,
  31. Abort,
  32. Init,
  33. Position
  34. }
  35. #region 内部变量
  36. private PlatingCellVerticalInitializeRoutine _initializeRoutine;
  37. private PlatingCellVerticalPositionRoutine _positionRoutine;
  38. /// <summary>
  39. /// vertical axis
  40. /// </summary>
  41. private JetAxisBase _verticalAxis;
  42. #endregion
  43. #region 属性
  44. /// <summary>
  45. /// 模块名称
  46. /// </summary>
  47. public ModuleName Module { get; private set; }
  48. /// <summary>
  49. /// 是否Init
  50. /// </summary>
  51. public bool IsInit
  52. {
  53. get { return fsm.State == (int)PlatingCellVerticalState.Init; }
  54. }
  55. /// <summary>
  56. /// 是否Idle
  57. /// </summary>
  58. public bool IsIdle
  59. {
  60. get
  61. {
  62. return fsm.State == (int)PlatingCellVerticalState.Idle;
  63. }
  64. }
  65. /// <summary>
  66. /// 是否错误
  67. /// </summary>
  68. public bool IsError
  69. {
  70. get { return fsm.State == (int)PlatingCellVerticalState.Error; }
  71. }
  72. /// <summary>
  73. /// 正在忙碌
  74. /// </summary>
  75. public bool IsBusy
  76. {
  77. get { return fsm.State == (int)PlatingCellVerticalState.Initializing; }
  78. }
  79. /// <summary>
  80. /// 状态
  81. /// </summary>
  82. public int State { get { return fsm.State; } }
  83. public bool IsDisable { get { return false; } }
  84. public bool IsAuto { get { return true; } }
  85. public bool IsEngineering { get { return false; } }
  86. public bool IsProduction { get { return true; } }
  87. /// <summary>
  88. /// 运动数据对象
  89. /// </summary>
  90. public CommandMotionData MotionData { get { return _verticalAxis.MotionData; } }
  91. /// <summary>
  92. /// 是否在Load位置
  93. /// </summary>
  94. public bool IsInLoad { get { return _verticalAxis.CheckPositionIsInStation(_verticalAxis.MotionData.MotorPosition, "Load"); } }
  95. #endregion
  96. /// <summary>
  97. /// 构造函数
  98. /// </summary>
  99. /// <param name="module"></param>
  100. public PlatingCellVerticalEntity(ModuleName module)
  101. {
  102. Module = module;
  103. _verticalAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Vertical");
  104. InitialFsm();
  105. }
  106. /// <summary>
  107. /// 初始化
  108. /// </summary>
  109. /// <returns></returns>
  110. protected override bool Init()
  111. {
  112. InitializeRoutine();
  113. return true;
  114. }
  115. /// <summary>
  116. /// 初始化Routine
  117. /// </summary>
  118. private void InitializeRoutine()
  119. {
  120. _initializeRoutine = new PlatingCellVerticalInitializeRoutine(Module.ToString());
  121. _positionRoutine=new PlatingCellVerticalPositionRoutine(Module.ToString());
  122. }
  123. /// 初始化状态机
  124. /// </summary>
  125. private void InitialFsm()
  126. {
  127. fsm = new StateMachine<PlatingCellVerticalEntity>(Module.ToString(), (int)PlatingCellVerticalState.Idle, 100);
  128. fsm.EnableRepeatedMsg(true);
  129. AnyStateTransition(VerticalMsg.Initialize, InitializeAll, PlatingCellVerticalState.Initializing);
  130. Transition(PlatingCellVerticalState.Initializing, FSM_MSG.TIMER, InitializeAllMonitor, PlatingCellVerticalState.Idle);
  131. Transition(PlatingCellVerticalState.Initializing, VerticalMsg.Abort, HomeAbort, PlatingCellVerticalState.Init);
  132. AnyStateTransition(VerticalMsg.Error, NullFunc, PlatingCellVerticalState.Error);
  133. //Enter Init
  134. Transition(PlatingCellVerticalState.Idle, VerticalMsg.Init, NullFunc, PlatingCellVerticalState.Init);
  135. //Position
  136. Transition(PlatingCellVerticalState.Idle,VerticalMsg.Position,Position,PlatingCellVerticalState.Positioning);
  137. Transition(PlatingCellVerticalState.Positioning, VerticalMsg.Position, NullFunc, PlatingCellVerticalState.Positioning);
  138. Transition(PlatingCellVerticalState.Positioning, FSM_MSG.TIMER, PositionMonitor, PlatingCellVerticalState.Idle);
  139. Transition(PlatingCellVerticalState.Positioning, VerticalMsg.Abort, PositionAbort, PlatingCellVerticalState.Idle);
  140. EnumLoop<PlatingCellVerticalState>.ForEach((item) => { fsm.MapState((int)item, item.ToString()); });
  141. EnumLoop<VerticalMsg>.ForEach((item) => { fsm.MapMessage((int)item, item.ToString()); });
  142. }
  143. #region 初始化
  144. /// <summary>
  145. /// 初始化
  146. /// </summary>
  147. /// <returns></returns>
  148. private bool InitializeAll(object[] param)
  149. {
  150. return _initializeRoutine.Start() == RState.Running;
  151. }
  152. /// <summary>
  153. /// Initialize 监控
  154. /// </summary>
  155. /// <param name="param"></param>
  156. /// <returns></returns>
  157. private bool InitializeAllMonitor(object[] param)
  158. {
  159. RState rsstate = _initializeRoutine.Monitor();
  160. if (rsstate == RState.End)
  161. {
  162. return true;
  163. }
  164. else if (rsstate == RState.Failed || rsstate == RState.Timeout)
  165. {
  166. PostMsg(VerticalMsg.Error);
  167. return false;
  168. }
  169. return false;
  170. }
  171. /// <summary>
  172. /// 中止Home
  173. /// </summary>
  174. /// <param name="param"></param>
  175. /// <returns></returns>
  176. private bool HomeAbort(object[] param)
  177. {
  178. _initializeRoutine.Abort();
  179. return true;
  180. }
  181. #endregion
  182. #region Position
  183. /// <summary>
  184. /// Position
  185. /// </summary>
  186. /// <returns></returns>
  187. private bool Position(object[] param)
  188. {
  189. return _positionRoutine.Start(param) == RState.Running;
  190. }
  191. /// <summary>
  192. /// Position 监控
  193. /// </summary>
  194. /// <param name="param"></param>
  195. /// <returns></returns>
  196. private bool PositionMonitor(object[] param)
  197. {
  198. RState rsstate = _positionRoutine.Monitor();
  199. if (rsstate == RState.End)
  200. {
  201. return true;
  202. }
  203. else if (rsstate == RState.Failed || rsstate == RState.Timeout)
  204. {
  205. PostMsg(VerticalMsg.Error);
  206. return false;
  207. }
  208. return false;
  209. }
  210. /// <summary>
  211. /// 中止
  212. /// </summary>
  213. /// <param name="param"></param>
  214. /// <returns></returns>
  215. private bool PositionAbort(object[] param)
  216. {
  217. _positionRoutine.Abort();
  218. return true; ;
  219. }
  220. #endregion
  221. public bool Check(int msg, out string reason, params object[] args)
  222. {
  223. reason = "";
  224. return true;
  225. }
  226. public bool CheckAcked(int msg)
  227. {
  228. return true;
  229. }
  230. public int Invoke(string function, params object[] args)
  231. {
  232. return (int)FSM_MSG.NONE;
  233. }
  234. }
  235. }