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

154 рядки
5.9 KiB

  1. /**
  2. * @file runtime_mode_service.h
  3. * @brief 定义面向 UI 的运行模式服务契约
  4. * @version 0.1.0
  5. * @author suyu
  6. * @date 2026-08-08
  7. */
  8. #pragma once
  9. #include "domain/runtime_state.h"
  10. #include "offline_simulation_service.h"
  11. #include "online_logic_monitor_service.h"
  12. #include "plc_communication_gateway.h"
  13. #include <cstdint>
  14. #include <functional>
  15. #include <vector>
  16. class ProjectService;
  17. class ActiveRegisterRepository;
  18. class RegisterRepository;
  19. // 隔离 UI 与领域状态机,并编排寄存器仓库切换和进入真机的前置条件
  20. class RuntimeModeService
  21. {
  22. public:
  23. /**
  24. * @brief 创建运行模式服务
  25. * @param project_service 只读工程服务,用于运行前校验和收集轮询地址
  26. * @param offline_simulation_service 离线仿真服务,由应用层负责其生命周期
  27. */
  28. RuntimeModeService(
  29. const ProjectService &project_service,
  30. OfflineSimulationService &offline_simulation_service,
  31. OnlineLogicMonitorService &online_logic_monitor_service);
  32. /**
  33. * @brief 解除 PLC 网关回调绑定
  34. */
  35. ~RuntimeModeService();
  36. /** @brief 获取当前应用运行模式 */
  37. ApplicationMode mode() const;
  38. /**
  39. * @brief 获取当前模式下允许的工程编辑和寄存器使用策略
  40. * @return 与当前运行模式对应的能力策略
  41. */
  42. ModePolicy policy() const;
  43. /**
  44. * @brief 退出离线或真机运行态并返回编辑态
  45. * @return 已处于编辑态或状态机拒绝切换时返回失败结果
  46. */
  47. ModeTransitionResult enterEditing();
  48. /**
  49. * @brief 从编辑态进入离线运行态
  50. * @return 非编辑态进入时返回必须先回到编辑态的失败结果
  51. */
  52. ModeTransitionResult enterOfflineRunning();
  53. /**
  54. * @brief 从编辑态进入真机运行态
  55. * @return 未完成 PLC 初次读取或非编辑态进入时返回失败结果
  56. */
  57. ModeTransitionResult enterOnlineRunning();
  58. /**
  59. * @brief 更新 PLC 是否已完成首次有效读取
  60. * @param completed 为 true 时允许在编辑态进入真机运行模式
  61. *
  62. * 由 PLC 通信服务在首次读取成功或缓存失效时调用
  63. */
  64. void setInitialPlcReadCompleted(bool completed);
  65. /**
  66. * @brief 查询 PLC 是否已完成首次有效读取
  67. * @return 已建立可用于进入真机运行态的 PLC 缓存时返回 true
  68. */
  69. bool initialPlcReadCompleted() const;
  70. /** @brief 获取离线仿真当前状态 */
  71. SimulationState simulationState() const;
  72. /** @brief 获取离线仿真成功完成的扫描轮数 */
  73. std::uint64_t successfulScanCount() const;
  74. /** @brief 获取离线仿真最近一次扫描错误 */
  75. const LogicScanResult &simulationError() const;
  76. /** @brief 返回服务持有的离线仿真服务引用 */
  77. OfflineSimulationService &offlineSimulationService();
  78. OnlineLogicMonitorService &onlineLogicMonitorService();
  79. /**
  80. * @brief 注入 PLC 网关、活动仓库和两种实际数据源
  81. *
  82. * 应用生命周期内只调用一次;真机模式使用 PLC 仓库,编辑/离线模式使用虚拟仓库
  83. */
  84. void configurePlc(
  85. PlcCommunicationGateway &gateway,
  86. ActiveRegisterRepository &active_repository,
  87. RegisterRepository &virtual_repository,
  88. RegisterRepository &plc_repository);
  89. /**
  90. * @brief 连接 PLC 并开始异步通信
  91. * @param configuration 串口、Modbus 和轮询配置
  92. * @return 连接请求受理结果,不阻塞 UI 等待首读完成
  93. */
  94. PlcCommunicationResult connectPlc(const PlcSerialConfiguration &configuration);
  95. /**
  96. * @brief 设置自由监控引用的地址并刷新 PLC 轮询集合
  97. * @param addresses 自由监控当前需要读取的 M/D 地址
  98. */
  99. void setMonitorAddresses(const std::vector<RegisterAddress> &addresses);
  100. void setMonitorAddresses(
  101. const std::vector<RegisterAddress> &addresses,
  102. const std::vector<RegisterAddress> &float32_starts);
  103. /**
  104. * @brief 汇总工程和自由监控引用并刷新 PLC 轮询地址
  105. * @return 网关未配置或地址数量超限时返回失败结果
  106. */
  107. PlcCommunicationResult refreshPlcPollAddresses();
  108. /**
  109. * @brief 退出真机运行、断开 PLC 并清除首读资格
  110. */
  111. void disconnectPlc();
  112. /** @brief 获取当前 PLC 连接状态;网关未配置时返回 Disconnected */
  113. PlcConnectionState plcConnectionState() const;
  114. /** @brief 获取 PLC 最近一次通信错误文本;网关未配置时返回空字符串 */
  115. const std::string &plcError() const;
  116. /**
  117. * @brief 设置 PLC 状态变化通知回调
  118. * @param callback 状态、首读资格或通信错误变化时调用的函数;可传空函数取消通知
  119. */
  120. void setPlcStatusChangedCallback(std::function<void()> callback);
  121. private:
  122. const ProjectService &project_service_; // 不拥有的只读工程服务
  123. OfflineSimulationService &offline_simulation_service_; // 不拥有的离线仿真服务
  124. OnlineLogicMonitorService &online_logic_monitor_service_; // 不拥有的真机只读轨迹服务
  125. RuntimeState state_; // 编辑、离线和真机模式状态机
  126. // PLC 缓存是否已通过有效首读建立,通信故障时清除
  127. bool initial_plc_read_completed_ = false;
  128. PlcCommunicationGateway *plc_gateway_ = nullptr; // 不拥有的 PLC 通信网关
  129. ActiveRegisterRepository *active_repository_ = nullptr; // 当前模式使用的仓库代理
  130. RegisterRepository *virtual_repository_ = nullptr; // 离线/编辑模式的虚拟仓库
  131. RegisterRepository *plc_repository_ = nullptr; // 真机模式的 PLC 缓存仓库
  132. std::function<void()> plc_status_changed_callback_; // PLC 状态变化通知
  133. std::vector<RegisterAddress> monitor_addresses_; // 自由监控额外引用的地址
  134. std::vector<RegisterAddress> monitor_float32_starts_; // 自由监控中的 Float32 起始地址
  135. };