ReservoirEntity.cs 8.3 KB

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