PlatingCellVerticalEntity.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  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. #endregion
  92. /// <summary>
  93. /// 构造函数
  94. /// </summary>
  95. /// <param name="module"></param>
  96. public PlatingCellVerticalEntity(ModuleName module)
  97. {
  98. Module = module;
  99. _verticalAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Vertical");
  100. InitialFsm();
  101. }
  102. /// <summary>
  103. /// 初始化
  104. /// </summary>
  105. /// <returns></returns>
  106. protected override bool Init()
  107. {
  108. InitializeRoutine();
  109. return true;
  110. }
  111. /// <summary>
  112. /// 初始化Routine
  113. /// </summary>
  114. private void InitializeRoutine()
  115. {
  116. _initializeRoutine = new PlatingCellVerticalInitializeRoutine(Module.ToString());
  117. _positionRoutine=new PlatingCellVerticalPositionRoutine(Module.ToString());
  118. }
  119. /// 初始化状态机
  120. /// </summary>
  121. private void InitialFsm()
  122. {
  123. fsm = new StateMachine<PlatingCellVerticalEntity>(Module.ToString(), (int)PlatingCellVerticalState.Idle, 100);
  124. fsm.EnableRepeatedMsg(true);
  125. AnyStateTransition(VerticalMsg.Initialize, InitializeAll, PlatingCellVerticalState.Initializing);
  126. Transition(PlatingCellVerticalState.Initializing, FSM_MSG.TIMER, InitializeAllMonitor, PlatingCellVerticalState.Idle);
  127. Transition(PlatingCellVerticalState.Initializing, VerticalMsg.Abort, HomeAbort, PlatingCellVerticalState.Init);
  128. AnyStateTransition(VerticalMsg.Error, NullFunc, PlatingCellVerticalState.Error);
  129. //Enter Init
  130. Transition(PlatingCellVerticalState.Idle, VerticalMsg.Init, NullFunc, PlatingCellVerticalState.Init);
  131. //Position
  132. Transition(PlatingCellVerticalState.Idle,VerticalMsg.Position,Position,PlatingCellVerticalState.Positioning);
  133. Transition(PlatingCellVerticalState.Positioning, VerticalMsg.Position, NullFunc, PlatingCellVerticalState.Positioning);
  134. Transition(PlatingCellVerticalState.Positioning, FSM_MSG.TIMER, PositionMonitor, PlatingCellVerticalState.Idle);
  135. Transition(PlatingCellVerticalState.Positioning, VerticalMsg.Abort, PositionAbort, PlatingCellVerticalState.Idle);
  136. EnumLoop<PlatingCellVerticalState>.ForEach((item) => { fsm.MapState((int)item, item.ToString()); });
  137. EnumLoop<VerticalMsg>.ForEach((item) => { fsm.MapMessage((int)item, item.ToString()); });
  138. }
  139. #region 初始化
  140. /// <summary>
  141. /// 初始化
  142. /// </summary>
  143. /// <returns></returns>
  144. private bool InitializeAll(object[] param)
  145. {
  146. return _initializeRoutine.Start() == RState.Running;
  147. }
  148. /// <summary>
  149. /// Initialize 监控
  150. /// </summary>
  151. /// <param name="param"></param>
  152. /// <returns></returns>
  153. private bool InitializeAllMonitor(object[] param)
  154. {
  155. RState rsstate = _initializeRoutine.Monitor();
  156. if (rsstate == RState.End)
  157. {
  158. return true;
  159. }
  160. else if (rsstate == RState.Failed || rsstate == RState.Timeout)
  161. {
  162. PostMsg(VerticalMsg.Error);
  163. return false;
  164. }
  165. return false;
  166. }
  167. /// <summary>
  168. /// 中止Home
  169. /// </summary>
  170. /// <param name="param"></param>
  171. /// <returns></returns>
  172. private bool HomeAbort(object[] param)
  173. {
  174. _initializeRoutine.Abort();
  175. return true;
  176. }
  177. #endregion
  178. #region Position
  179. /// <summary>
  180. /// Position
  181. /// </summary>
  182. /// <returns></returns>
  183. private bool Position(object[] param)
  184. {
  185. return _positionRoutine.Start(param) == RState.Running;
  186. }
  187. /// <summary>
  188. /// Position 监控
  189. /// </summary>
  190. /// <param name="param"></param>
  191. /// <returns></returns>
  192. private bool PositionMonitor(object[] param)
  193. {
  194. RState rsstate = _positionRoutine.Monitor();
  195. if (rsstate == RState.End)
  196. {
  197. return true;
  198. }
  199. else if (rsstate == RState.Failed || rsstate == RState.Timeout)
  200. {
  201. PostMsg(VerticalMsg.Error);
  202. return false;
  203. }
  204. return false;
  205. }
  206. /// <summary>
  207. /// 中止
  208. /// </summary>
  209. /// <param name="param"></param>
  210. /// <returns></returns>
  211. private bool PositionAbort(object[] param)
  212. {
  213. _positionRoutine.Abort();
  214. return true; ;
  215. }
  216. #endregion
  217. public bool Check(int msg, out string reason, params object[] args)
  218. {
  219. reason = "";
  220. return true;
  221. }
  222. public bool CheckAcked(int msg)
  223. {
  224. return true;
  225. }
  226. public int Invoke(string function, params object[] args)
  227. {
  228. return (int)FSM_MSG.NONE;
  229. }
  230. }
  231. }