综合平台编程器项目的远程存储
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 

169 rindas
5.8 KiB

  1. /**
  2. * @file main_window.h
  3. * @brief 定义综合平台编程器主窗口及运行模式界面协调逻辑
  4. * @version 0.2.0
  5. * @author suyu
  6. * @date 2026-08-08
  7. */
  8. #pragma once
  9. #include "domain/hmi_model.h"
  10. #include "domain/control_logic_model.h"
  11. #include "domain/runtime_state.h"
  12. #include "services/plc_communication_gateway.h"
  13. #include <QMainWindow>
  14. #include <memory>
  15. QT_BEGIN_NAMESPACE
  16. class QActionGroup;
  17. class QLabel;
  18. class QTimer;
  19. namespace Ui {
  20. class MainWindow;
  21. }
  22. QT_END_NAMESPACE
  23. class RuntimeModeService;
  24. class ProjectService;
  25. class HmiEditorService;
  26. class HmiRuntimeService;
  27. class HmiEditorWidget;
  28. class LogicEditorService;
  29. class LogicEditorWidget;
  30. class RegisterMonitorService;
  31. class RuntimeMonitorWidget;
  32. /**
  33. * @brief 组织主界面区域并将用户操作转交给服务层
  34. *
  35. * 主窗口不直接访问寄存器、工程文件或 PLC 通信实现
  36. */
  37. class MainWindow final : public QMainWindow
  38. {
  39. Q_OBJECT
  40. public:
  41. /**
  42. * @brief 创建主窗口并注入 UI 所需的应用服务
  43. * @param runtime_mode_service 运行模式服务,调用方必须保证其生命周期覆盖窗口
  44. * @param project_service 工程管理服务,调用方必须保证其生命周期覆盖窗口
  45. * @param hmi_editor_service HMI 编辑服务,调用方必须保证其生命周期覆盖窗口
  46. * @param hmi_runtime_service HMI 运行服务,调用方必须保证其生命周期覆盖窗口
  47. * @param parent Qt 父对象
  48. */
  49. explicit MainWindow(
  50. RuntimeModeService &runtime_mode_service,
  51. ProjectService &project_service,
  52. HmiEditorService &hmi_editor_service,
  53. LogicEditorService &logic_editor_service,
  54. HmiRuntimeService &hmi_runtime_service,
  55. RegisterMonitorService &register_monitor_service,
  56. QWidget *parent = nullptr);
  57. ~MainWindow() override;
  58. private:
  59. // 配置菜单和工具栏动作
  60. void configureActions();
  61. // 配置主窗口外观和状态栏
  62. void configureAppearance();
  63. // 创建并连接 HMI 编辑画布
  64. void configureHmiEditor();
  65. // 创建并连接控制逻辑编辑画布
  66. void configureLogicEditor();
  67. void configureRuntimeMonitor();
  68. // 创建并连接控件属性编辑表单
  69. void configurePropertyEditor();
  70. void configurePlcConnection();
  71. // 刷新工程树和当前 HMI 页面信息
  72. void refreshProjectUi();
  73. // 显示指定 HMI 控件的可编辑属性
  74. void showControlProperties(const std::string &control_id);
  75. // 显示指定控制逻辑节点的可编辑属性
  76. void showLogicNodeProperties(const std::string &node_id);
  77. // 向当前页面添加指定类型的 HMI 控件
  78. void addHmiControl(HmiControlType type);
  79. // 删除当前选中的 HMI 控件
  80. void deleteSelectedControl();
  81. // 将属性表单内容应用到当前选中控件
  82. void applySelectedControlProperties();
  83. // 在当前光标节点后添加串联条件,没有选择时追加到网络末尾
  84. void addLogicCondition(const LogicNodeConfig &config);
  85. // 为当前选中的连续逻辑范围建立并联支路
  86. void addLogicParallelBranch(const LogicNodeConfig &config);
  87. // 设置当前网络右侧的输出线圈
  88. void setLogicOutput(const LogicNodeConfig &config);
  89. // 新增一个梯形图网络
  90. void addLogicRung();
  91. // 删除当前选中的逻辑节点或网络
  92. void deleteSelectedLogicObject();
  93. // 将逻辑属性表单内容应用到当前选中节点
  94. void applySelectedLogicNodeProperties();
  95. void connectPlc();
  96. void disconnectPlc();
  97. // 合并同一事件循环内的 PLC 状态通知,避免重复刷新和重复日志
  98. void schedulePlcStatusUpdate();
  99. // 创建新的工程并刷新编辑界面
  100. void createNewProject();
  101. // 保存当前工程到已关联的路径
  102. void saveProject();
  103. // 将当前工程保存到用户指定的路径
  104. void saveProjectAs();
  105. // 从用户指定的路径加载工程
  106. void loadProject();
  107. // 在状态栏和输出面板显示工程操作结果
  108. void showProjectResult(const QString &action, const QString &message, bool succeeded);
  109. /**
  110. * @brief 请求服务层切换模式并同步界面状态
  111. * @param requested_mode 目标应用模式
  112. *
  113. * 失败时恢复与服务层当前状态一致的工具栏选项
  114. */
  115. void requestMode(ApplicationMode requested_mode);
  116. /**
  117. * @brief 根据服务层模式策略更新编辑权限和状态反馈
  118. * @param message 要显示在状态栏和输出区的模式结果消息
  119. */
  120. void updateModeUi(const QString &message);
  121. // 根据仿真服务实际状态刷新执行器反馈和 HMI 写权限
  122. void updateSimulationUi(bool report_fault);
  123. /**
  124. * @brief 将互斥模式动作同步到服务层当前状态
  125. */
  126. void restoreCurrentModeAction();
  127. std::unique_ptr<Ui::MainWindow> ui_;
  128. /**
  129. * @brief 非拥有的运行模式服务依赖,由应用入口保证生命周期
  130. */
  131. RuntimeModeService &runtime_mode_service_;
  132. /**
  133. * @brief 非拥有的工程和 HMI 服务依赖,由应用入口保证生命周期
  134. */
  135. ProjectService &project_service_;
  136. HmiEditorService &hmi_editor_service_;
  137. LogicEditorService &logic_editor_service_;
  138. HmiRuntimeService &hmi_runtime_service_;
  139. RegisterMonitorService &register_monitor_service_;
  140. QActionGroup *mode_action_group_ = nullptr;
  141. HmiEditorWidget *hmi_editor_widget_ = nullptr;
  142. LogicEditorWidget *logic_editor_widget_ = nullptr;
  143. RuntimeMonitorWidget *runtime_monitor_widget_ = nullptr;
  144. QTimer *runtime_refresh_timer_ = nullptr;
  145. QLabel *mode_status_label_ = nullptr;
  146. QLabel *register_status_label_ = nullptr;
  147. QLabel *executor_status_label_ = nullptr;
  148. PlcSerialConfiguration plc_configuration_;
  149. std::string selected_control_id_;
  150. std::string selected_logic_node_id_;
  151. bool plc_status_update_pending_ = false;
  152. int last_editing_tab_index_ = 0;
  153. };