PlatingCellVerticalEntity.cs 8.3 KB

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