综合平台编程器项目的远程存储
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

150 строки
5.9 KiB

  1. /**
  2. * @file runtime_panel_controller.h
  3. * @brief 定义运行监控面板控制器
  4. * @version 1.0.0
  5. * @author suyu
  6. * @date 2026-08-22
  7. */
  8. #pragma once
  9. #include "domain/runtime_state.h"
  10. #include "services/plc_communication_gateway.h"
  11. #include <QString>
  12. #include <functional>
  13. #include <memory>
  14. #include <string>
  15. class AlarmService;
  16. class HmiEditorService;
  17. class HmiEditorWidget;
  18. class HmiNavigationService;
  19. class HmiRuntimeService;
  20. class LogicEditorService;
  21. class LogicEditorWidget;
  22. class QLabel;
  23. class ProjectService;
  24. class RegisterMonitorService;
  25. class RuntimeModeService;
  26. class RuntimeMonitorWidget;
  27. class RuntimeMonitorWindow;
  28. class QTimer;
  29. class QWidget;
  30. /** 组织运行监控窗口、刷新定时器和本地逻辑执行器反馈 */
  31. class RuntimePanelController final
  32. {
  33. public:
  34. /** 向状态栏报告一条带超时的消息 */
  35. using StatusReporter = std::function<void(
  36. const QString &message, int timeout_ms)>;
  37. /** 向输出面板报告一条消息 */
  38. using OutputReporter = std::function<void(const QString &message)>;
  39. /** 请求上层退出当前运行态 */
  40. using RuntimeExitRequester = std::function<void()>;
  41. /** 创建运行面板控制器并注入运行模式、编辑器和监控窗口依赖 */
  42. RuntimePanelController(
  43. QWidget &parent,
  44. RuntimeModeService &runtime_mode_service,
  45. ProjectService &project_service,
  46. HmiEditorService &hmi_editor_service,
  47. HmiRuntimeService &hmi_runtime_service,
  48. LogicEditorService &logic_editor_service,
  49. HmiNavigationService &hmi_navigation_service,
  50. AlarmService &alarm_service,
  51. RegisterMonitorService &register_monitor_service,
  52. HmiEditorWidget &hmi_editor_widget,
  53. LogicEditorWidget &logic_editor_widget,
  54. QLabel &executor_status_label,
  55. std::function<std::string()> current_logic_id,
  56. std::function<void(const std::string &)> select_logic,
  57. std::function<void(const std::string &)> show_logic_properties,
  58. StatusReporter status_reporter,
  59. OutputReporter output_reporter,
  60. RuntimeExitRequester runtime_exit_requester);
  61. /** 停止刷新并释放控制器拥有的运行监控窗口 */
  62. ~RuntimePanelController();
  63. /** 连接运行监控相关信号并完成初始配置 */
  64. void configure();
  65. /** 配置专用用户运行版的精简控制栏行为 */
  66. void configureUserRuntimeMode(
  67. bool enabled,
  68. std::function<void(int)> mode_requester,
  69. std::function<void()> plc_configuration_requester,
  70. std::function<void()> plc_disconnect_requester);
  71. /** 创建或复用唯一监控窗口,并把当前工程投影到运行态 */
  72. void enterRuntime(
  73. const std::string &page_id,
  74. const std::string &logic_id,
  75. ApplicationMode mode,
  76. PlcConnectionState plc_state);
  77. /** 停止刷新并隐藏监控窗口,离线服务的停止由运行模式服务负责 */
  78. void leaveRuntime(ApplicationMode mode, PlcConnectionState plc_state);
  79. /** 应用退出时关闭运行监控窗口并停止相关刷新 */
  80. void closeForApplicationExit();
  81. /** 根据当前模式的本地执行器状态刷新运行界面 */
  82. void updateSimulationUi(bool report_fault);
  83. /** 返回当前唯一的运行监控控件 */
  84. RuntimeMonitorWidget *runtimeMonitorWidget() const;
  85. private:
  86. /** 处理运行刷新定时器到期事件 */
  87. void handleRuntimeTimer();
  88. /** 处理离线或真机只读轨迹执行器状态变化 */
  89. void handleSimulationStateChanged();
  90. /** 处理一次离线扫描完成事件 */
  91. void handleScanCompleted();
  92. /** 主窗口父对象,不由控制器拥有 */
  93. QWidget &parent_;
  94. /** 运行模式服务,不由控制器拥有 */
  95. RuntimeModeService &runtime_mode_service_;
  96. /** 工程服务,不由控制器拥有 */
  97. ProjectService &project_service_;
  98. /** HMI 编辑服务,不由控制器拥有 */
  99. HmiEditorService &hmi_editor_service_;
  100. /** HMI 运行服务,不由控制器拥有 */
  101. HmiRuntimeService &hmi_runtime_service_;
  102. /** 梯形图编辑服务,不由控制器拥有 */
  103. LogicEditorService &logic_editor_service_;
  104. /** HMI 页面导航服务,不由控制器拥有 */
  105. HmiNavigationService &hmi_navigation_service_;
  106. /** 报警服务,不由控制器拥有 */
  107. AlarmService &alarm_service_;
  108. /** 寄存器监控服务,不由控制器拥有 */
  109. RegisterMonitorService &register_monitor_service_;
  110. /** 主窗口中的 HMI 编辑器,不由控制器拥有 */
  111. HmiEditorWidget &hmi_editor_widget_;
  112. /** 主窗口中的梯形图编辑器,不由控制器拥有 */
  113. LogicEditorWidget &logic_editor_widget_;
  114. /** 显示当前本地执行器状态的标签 */
  115. QLabel &executor_status_label_;
  116. /** 获取当前控制逻辑标识的回调 */
  117. std::function<std::string()> current_logic_id_;
  118. /** 切换当前控制逻辑的回调 */
  119. std::function<void(const std::string &)> select_logic_;
  120. /** 显示控制逻辑属性的回调 */
  121. std::function<void(const std::string &)> show_logic_properties_;
  122. /** 向状态栏报告消息的回调 */
  123. StatusReporter status_reporter_;
  124. /** 向输出面板报告消息的回调 */
  125. OutputReporter output_reporter_;
  126. /** 请求主窗口退出运行态的回调 */
  127. RuntimeExitRequester runtime_exit_requester_;
  128. /** 唯一的运行监控顶层窗口 */
  129. std::unique_ptr<RuntimeMonitorWindow> runtime_monitor_window_;
  130. /** 运行监控窗口中的主控件,窗口拥有它 */
  131. RuntimeMonitorWidget *runtime_monitor_widget_ = nullptr;
  132. /** 定时刷新运行监控数据的计时器 */
  133. QTimer *runtime_refresh_timer_ = nullptr;
  134. /** 当前是否已经进入运行监控会话 */
  135. bool runtime_session_active_ = false;
  136. std::function<void(int)> mode_requester_;
  137. std::function<void()> plc_configuration_requester_;
  138. std::function<void()> plc_disconnect_requester_;
  139. };