ProcessStationManager.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. using SKMC.Api.Common;
  2. using SKMC.Api.Common.Tasks;
  3. using System;
  4. using System.Collections.Concurrent;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace SKMC.Api.Process.Model
  10. {
  11. /// <summary>
  12. /// 流程站点管理器接口
  13. /// </summary>
  14. public abstract class ProcessStationManager
  15. {
  16. protected static readonly ILogger log = LogFactory.Get();
  17. /// <summary>
  18. /// 流程站点Id与站点对象的字典
  19. /// </summary>
  20. public readonly Dictionary<int, ProcessStation> processStations = new Dictionary<int, ProcessStation>();
  21. /// <summary>
  22. /// 已运行的流程站点
  23. /// </summary>
  24. public readonly Dictionary<int, ProcessStation> runningStations = new Dictionary<int, ProcessStation>();
  25. /// <summary>
  26. /// 运行中的流程步骤
  27. /// </summary>
  28. public readonly ConcurrentDictionary<int, ProcessStep> runningSteps = new ConcurrentDictionary<int, ProcessStep>();
  29. /// <summary>
  30. /// 获取流程站点
  31. /// </summary>
  32. /// <param name="stationId">流程站点Id</param>
  33. /// <returns></returns>
  34. public virtual ProcessStation Get(int stationId) => processStations[stationId];
  35. /// <summary>
  36. /// 添加流程站点
  37. /// </summary>
  38. /// <param name="processStation">流程站点</param>
  39. public virtual void Add(ProcessStation processStation) => processStations.Add(processStation.Id, processStation);
  40. /// <summary>
  41. /// 所有站点是否空闲
  42. /// 空闲是指自动运行状态下没有打料
  43. /// </summary>
  44. /// <returns></returns>
  45. public abstract bool IsIdle();
  46. /// <summary>
  47. /// 判断多个Station的取消状态(中断点)
  48. /// </summary>
  49. /// <returns>如果其中一个是取消状态则返回true</returns>
  50. public bool CheckStationsCancelled(int[] stationIds)
  51. {
  52. bool checkResult = false;
  53. foreach(int stationId in stationIds)
  54. {
  55. checkResult |= TaskTokener.IsCancelled(stationId);
  56. }
  57. return checkResult;
  58. }
  59. /// <summary>
  60. /// 启动所有流程站点自动运行
  61. /// </summary>
  62. public abstract void StartAll();
  63. /// <summary>
  64. /// 启动特定的流程站点自动运行
  65. /// </summary>
  66. /// <param name="stationId"></param>
  67. public virtual void Start(int stationId)
  68. {
  69. if (!runningStations.ContainsKey(stationId))
  70. {
  71. ProcessStation processStation = Get(stationId);
  72. runningStations.Add(stationId, processStation);
  73. processStation.Start();
  74. }
  75. else
  76. {
  77. log.Warn($"Station[{stationId}] Is Actived, Start Failed");
  78. }
  79. }
  80. /// <summary>
  81. /// 复位所有流程站点
  82. /// </summary>
  83. public abstract void ResetAll();
  84. /// <summary>
  85. /// 复位特定的流程站点
  86. /// </summary>
  87. /// <param name="stationId">流程站点Id</param>
  88. public virtual void Reset(int stationId)
  89. {
  90. // 如果复位异常往上抛出
  91. Get(stationId).Reset();
  92. Get(stationId).ResetResult = 0;
  93. }
  94. /// <summary>
  95. /// 停止所有站点自动运行
  96. /// <param name="hasAction">是否有停止动作</param>
  97. /// </summary>
  98. public abstract void StopAll(bool hasAction = false);
  99. /// <summary>
  100. /// 停止特定的站点自动运行
  101. /// </summary>
  102. /// <param name="stationId">流程站点Id</param>
  103. /// <param name="hasAction">是否有停止动作</param>
  104. public virtual void Stop(int stationId, bool hasAction = false)
  105. {
  106. log.Debug($"Ready Remove stationId: {stationId},Exist:{runningStations.ContainsKey(stationId)}");
  107. runningStations.Remove(stationId);
  108. log.Debug($"After Remove stationId: {stationId},Exist:{runningStations.ContainsKey(stationId)}");
  109. Get(stationId).Stop(hasAction);
  110. runningStations.Remove(stationId);
  111. }
  112. /// <summary>
  113. /// 暂停所有的流程站点
  114. /// </summary>
  115. public abstract void PauseAll();
  116. /// <summary>
  117. /// 暂停特定的流程站点
  118. /// </summary>
  119. /// <param name="stationId">流程站点Id</param>
  120. public virtual void Pause(int stationId) => Get(stationId).Pause();
  121. /// <summary>
  122. /// 恢复所有的流程站点运行
  123. /// </summary>
  124. public abstract void ResumeAll();
  125. /// <summary>
  126. /// 恢复所有的流程站点状态(中断点)
  127. /// </summary>
  128. public abstract void RestoreAll();
  129. /// <summary>
  130. /// 恢复特定的流程站点
  131. /// </summary>
  132. /// <param name="stationId">流程站点Id</param>
  133. public virtual void Resume(int stationId) => Get(stationId).Resume();
  134. /// <summary>
  135. /// 异常报警并暂停所有流程站点
  136. /// </summary>
  137. /// <param name="reqBuzzerOn">蜂鸣器是否开启</param>
  138. public abstract void AlarmPause(bool reqBuzzerOn = true);
  139. /// <summary>
  140. /// 不暂停设备只变更状态与灯
  141. /// </summary>
  142. /// <param name="reqBuzzerOn">蜂鸣器是否开启</param>
  143. public abstract void AlarmOnly(bool reqBuzzerOn = true);
  144. /// <summary>
  145. /// 关闭报警状态
  146. /// </summary>
  147. public abstract void CloseAlarm();
  148. }
  149. }