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

112 строки
4.1 KiB

  1. /**
  2. * @file runtime_monitor_widget.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 "services/software_logic_executor.h"
  12. #include <QWidget>
  13. #include <memory>
  14. #include <string>
  15. namespace Ui {
  16. class RuntimeMonitorWidget;
  17. }
  18. class FreeMonitorWidget;
  19. class HmiEditorService;
  20. class HmiEditorWidget;
  21. class HmiRuntimeService;
  22. class AlarmService;
  23. class HmiNavigationService;
  24. class LogicEditorService;
  25. class LogicEditorWidget;
  26. class RegisterMonitorService;
  27. class ProjectService;
  28. /** 运行监控投影,普通模式组合 HMI/梯形图/自由监控,运行版仅保留 HMI */
  29. class RuntimeMonitorWidget final : public QWidget
  30. {
  31. Q_OBJECT
  32. public:
  33. /** 创建组合 HMI、梯形图和自由监控的运行投影 */
  34. RuntimeMonitorWidget(
  35. HmiEditorService &hmi_editor_service,
  36. HmiRuntimeService &hmi_runtime_service,
  37. LogicEditorService &logic_editor_service,
  38. ProjectService &project_service,
  39. HmiNavigationService &hmi_navigation_service,
  40. AlarmService &alarm_service,
  41. RegisterMonitorService &register_monitor_service,
  42. QWidget *parent = nullptr);
  43. /** 释放组合的运行监控子控件 */
  44. ~RuntimeMonitorWidget() override;
  45. /** 将当前页面和控制逻辑绑定到运行监控界面 */
  46. void setProjectObjects(const std::string &page_id, const std::string &logic_id);
  47. /** 切换运行监控中显示的 HMI 页面 */
  48. void setRuntimePage(const std::string &page_id);
  49. /** 根据模式决定是否显示本地逻辑轨迹以及是否允许写入 */
  50. void setMode(ApplicationMode mode, PlcConnectionState plc_state);
  51. /** 切换 HMI 专用用户运行版的界面模式 */
  52. void setHmiOnlyRuntime(bool enabled);
  53. /** 从寄存器仓库刷新 HMI 和自由监控中的当前值 */
  54. void refreshValues(ApplicationMode mode, PlcConnectionState plc_state);
  55. /** 设置 HMI 控件是否允许写入运行值 */
  56. void setHmiWriteEnabled(bool enabled);
  57. /** 设置自由监控是否允许写入寄存器 */
  58. void setFreeMonitorWriteEnabled(bool enabled);
  59. /** 接收离线轨迹或基于 PLC 缓存计算的真机本地推算轨迹 */
  60. void setLogicTrace(const LogicTraceSnapshot &trace, const std::string &fault_node_id = {});
  61. /** 返回自由监控子控件,供上层刷新或连接信号 */
  62. FreeMonitorWidget *freeMonitorWidget() const;
  63. /** 返回当前选中的控制逻辑标识 */
  64. std::string selectedLogicId() const;
  65. signals:
  66. /** 页面跳转失败时发出可直接显示的错误信息 */
  67. void navigationFailed(const QString &message);
  68. /** 用户请求退出运行态 */
  69. void exitRequested();
  70. /** 用户在专用运行版中请求切换模式 */
  71. void modeChangeRequested(int mode);
  72. private:
  73. /** 显示指定的运行监控页面 */
  74. void showRuntimePage(const std::string &page_id);
  75. /** 选中指定控制逻辑并刷新梯形图投影 */
  76. void selectRuntimeLogic(const std::string &logic_id);
  77. /** Qt Designer 生成的界面对象 */
  78. std::unique_ptr<Ui::RuntimeMonitorWidget> ui_;
  79. /** 工程服务,不由控件拥有 */
  80. ProjectService &project_service_;
  81. /** HMI 页面导航服务,不由控件拥有 */
  82. HmiNavigationService &hmi_navigation_service_;
  83. /** 运行监控中的 HMI 视图 */
  84. HmiEditorWidget *hmi_view_ = nullptr;
  85. /** 运行监控中的梯形图视图 */
  86. LogicEditorWidget *logic_view_ = nullptr;
  87. /** 运行监控中的自由监控控件 */
  88. FreeMonitorWidget *free_monitor_widget_ = nullptr;
  89. /** 当前选中的控制逻辑标识 */
  90. std::string selected_logic_id_;
  91. /** 最近一次收到的本地逻辑执行轨迹 */
  92. LogicTraceSnapshot latest_trace_;
  93. /** 最近一次本地执行故障节点标识 */
  94. std::string latest_fault_node_id_;
  95. /** 是否已经收到过可显示的逻辑轨迹 */
  96. bool has_logic_trace_ = false;
  97. /** 是否只显示 HMI 页面并隐藏所有诊断区域 */
  98. bool hmi_only_mode_ = false;
  99. };