PlatingCellVerticalEntity.cs 7.5 KB

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