ReservoirEntity.cs 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. using Aitex.Core.RT.Fsm;
  2. using Aitex.Core.RT.Log;
  3. using Aitex.Core.RT.RecipeCenter;
  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.ProcessCell;
  9. using MECF.Framework.Common.RecipeCenter;
  10. using MECF.Framework.Common.ToolLayout;
  11. using PunkHPX8_Core;
  12. using System;
  13. using System.Collections.Generic;
  14. using System.Linq;
  15. using System.Text;
  16. using System.Threading.Tasks;
  17. namespace PunkHPX8_RT.Modules.Reservoir
  18. {
  19. public class ReservoirEntity : Entity, IEntity, IModuleEntity
  20. {
  21. #region 常量
  22. private const string STRATUS = "Stratus";
  23. private const string AUTO = "Auto";
  24. private const string MANUAL = "Manual";
  25. private const string DISABLED = "Disabled";
  26. private const string ENGINEERING = "Engineering";
  27. private const string PRODUCTION = "Production";
  28. #endregion
  29. #region 内部变量
  30. /// <summary>
  31. /// 持久化数值
  32. /// </summary>
  33. private ReservoirsPersistentValue _persistentValue;
  34. /// <summary>
  35. /// 当前recipe
  36. /// </summary>
  37. private ResRecipe _currentRecipe;
  38. #endregion
  39. #region 属性
  40. /// <summary>
  41. /// 模块名称
  42. /// </summary>
  43. public ModuleName Module { get; private set; }
  44. /// <summary>
  45. /// 是否Init
  46. /// </summary>
  47. public bool IsInit
  48. {
  49. get { return fsm.State == (int)ReservoirState.Init; }
  50. }
  51. /// <summary>
  52. /// 是否Idle
  53. /// </summary>
  54. public bool IsIdle
  55. {
  56. get
  57. {
  58. return fsm.State == (int)ReservoirState.Idle;
  59. }
  60. }
  61. /// <summary>
  62. /// 是否错误
  63. /// </summary>
  64. public bool IsError
  65. {
  66. get { return fsm.State == (int)ReservoirState.Error; }
  67. }
  68. /// <summary>
  69. /// 正在忙碌
  70. /// </summary>
  71. public bool IsBusy
  72. {
  73. get { return fsm.State == (int)ReservoirState.Initializing; }
  74. }
  75. /// <summary>
  76. /// 化学液
  77. /// </summary>
  78. public string Chemistry
  79. {
  80. get { return CurrentRecipe != null ? CurrentRecipe.Metal : ""; }
  81. }
  82. /// <summary>
  83. /// 是否禁用
  84. /// </summary>
  85. public bool IsDisable { get { return _persistentValue == null || _persistentValue.OperatingMode == DISABLED; } }
  86. /// <summary>
  87. /// 自动模式
  88. /// </summary>
  89. public bool IsAuto { get { return _persistentValue != null && _persistentValue.OperatingMode == AUTO; } }
  90. /// <summary>
  91. /// 自动模式
  92. /// </summary>
  93. public bool IsManual { get { return _persistentValue != null && _persistentValue.OperatingMode == MANUAL; } }
  94. /// <summary>
  95. /// 是否为工程模式
  96. /// </summary>
  97. public bool IsEngineering { get { return _persistentValue != null && _persistentValue.RecipeOperatingMode == ENGINEERING; } }
  98. /// <summary>
  99. /// 是否为产品模式
  100. /// </summary>
  101. public bool IsProduction { get { return _persistentValue != null && _persistentValue.RecipeOperatingMode == PRODUCTION; } }
  102. /// <summary>
  103. /// 状态机状态
  104. /// </summary>
  105. public ReservoirState State { get { return (ReservoirState)fsm.State; } }
  106. /// <summary>
  107. /// 是否初始化完成
  108. /// </summary>
  109. public bool IsInitialized { get { return fsm.State >= (int)ReservoirState.Initialized; } }
  110. /// <summary>
  111. /// 当前Recipe
  112. /// </summary>
  113. public ResRecipe CurrentRecipe { get { return LoadCurrentRecipe(); } }
  114. /// <summary>
  115. /// 用量
  116. /// </summary>
  117. public ReservoirUsage ReservoirUsage { get { return ReservoirUsageManager.Instance.GetReservoirUsage(Module.ToString()); } }
  118. #endregion
  119. /// <summary>
  120. /// 构造函数
  121. /// </summary>
  122. /// <param name="module"></param>
  123. public ReservoirEntity(ModuleName module)
  124. {
  125. this.Module = module;
  126. InitializeParameter();
  127. InitialFsm();
  128. }
  129. /// <summary>
  130. /// 初始化
  131. /// </summary>
  132. /// <returns></returns>
  133. protected override bool Init()
  134. {
  135. InitializeRoutine();
  136. InitializeDATA();
  137. InitializeOperation();
  138. return true;
  139. }
  140. /// <summary>
  141. /// 初始化参数
  142. /// </summary>
  143. private void InitializeParameter()
  144. {
  145. _persistentValue = ReservoirsPersistentManager.Instance.GetReservoirsPersistentValue(Module.ToString());
  146. if (_persistentValue == null)
  147. {
  148. LOG.WriteLog(eEvent.ERR_RESERVOIR, Module.ToString(), "Persistent Value Object is not exist");
  149. }
  150. }
  151. /// <summary>
  152. /// 加载当前recipe
  153. /// </summary>
  154. /// <returns></returns>
  155. private ResRecipe LoadCurrentRecipe()
  156. {
  157. if (_persistentValue != null && !string.IsNullOrEmpty(_persistentValue.Recipe))
  158. {
  159. return RecipeFileManager.Instance.LoadGenericityRecipe<ResRecipe>(_persistentValue.Recipe);
  160. }
  161. return null;
  162. }
  163. /// <summary>
  164. /// 初始化Routine
  165. /// </summary>
  166. private void InitializeRoutine()
  167. {
  168. }
  169. /// <summary>
  170. /// 初始化DATA
  171. /// </summary>
  172. private void InitializeDATA()
  173. {
  174. }
  175. /// <summary>
  176. /// 初始化Operation
  177. /// </summary>
  178. private void InitializeOperation()
  179. {
  180. }
  181. /// 初始化状态机
  182. /// </summary>
  183. private void InitialFsm()
  184. {
  185. fsm = new StateMachine<ReservoirEntity>(Module.ToString(), (int)ReservoirState.Init, 100);
  186. fsm.EnableRepeatedMsg(true);
  187. AnyStateTransition(ReservoirMsg.Error, NullFunc, ReservoirState.Error);
  188. //Initialized
  189. Transition(ReservoirState.Error, ReservoirMsg.Initialize, InitializeAll, ReservoirState.Initializing);
  190. Transition(ReservoirState.Init, ReservoirMsg.Initialize, InitializeAll, ReservoirState.Initializing);
  191. Transition(ReservoirState.Idle, ReservoirMsg.Initialize, InitializeAll, ReservoirState.Initializing);
  192. Transition(ReservoirState.Initializing, FSM_MSG.TIMER, InitializeAllMonitor, ReservoirState.Idle);
  193. //直接进入Idle
  194. Transition(ReservoirState.Initialized, FSM_MSG.TIMER, NullFunc, ReservoirState.Idle);
  195. //Enter Init
  196. Transition(ReservoirState.Idle, ReservoirMsg.Init, NullFunc, ReservoirState.Init);
  197. EnumLoop<ReservoirState>.ForEach((item) => { fsm.MapState((int)item, item.ToString()); });
  198. EnumLoop<ReservoirMsg>.ForEach((item) => { fsm.MapMessage((int)item, item.ToString()); });
  199. }
  200. #region Initialize All
  201. /// <summary>
  202. /// 初始化
  203. /// </summary>
  204. /// <returns></returns>
  205. private bool InitializeAll(object[] param)
  206. {
  207. return true;
  208. }
  209. /// <summary>
  210. /// Initialize 监控
  211. /// </summary>
  212. /// <param name="param"></param>
  213. /// <returns></returns>
  214. private bool InitializeAllMonitor(object[] param)
  215. {
  216. return true;
  217. }
  218. #endregion
  219. public bool Check(int msg, out string reason, params object[] args)
  220. {
  221. reason = "";
  222. return true;
  223. }
  224. public bool CheckAcked(int msg)
  225. {
  226. throw new NotImplementedException();
  227. }
  228. public int Invoke(string function, params object[] args)
  229. {
  230. throw new NotImplementedException();
  231. }
  232. }
  233. }