综合平台编程器项目的远程存储
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 

96 lignes
2.4 KiB

  1. #pragma once
  2. namespace integrated_platform::domain {
  3. // 应用当前运行模式
  4. enum class ApplicationMode
  5. {
  6. Editing, // 编辑工程状态
  7. OfflineRunning, // 离线仿真运行状态
  8. OnlineRunning // 真机联机运行状态
  9. };
  10. // 当前运行模式对应的能力策略
  11. struct ModePolicy
  12. {
  13. // 是否允许编辑工程
  14. bool allowsProjectEditing = false;
  15. // 是否使用虚拟寄存器
  16. bool usesVirtualRegisters = false;
  17. // 是否使用 PLC 寄存器
  18. bool usesPlcRegisters = false;
  19. // 是否运行软件逻辑执行器
  20. bool runsLogicExecutor = false;
  21. // 是否要求进入真机前完成 PLC 初次读取
  22. bool requiresInitialPlcRead = false;
  23. };
  24. // 根据运行模式返回对应的能力策略
  25. constexpr ModePolicy policyForMode(ApplicationMode mode)
  26. {
  27. switch (mode)
  28. {
  29. case ApplicationMode::Editing:
  30. {
  31. return {true, false, false, false, false};
  32. }
  33. case ApplicationMode::OfflineRunning:
  34. {
  35. return {false, true, false, true, false};
  36. }
  37. case ApplicationMode::OnlineRunning:
  38. {
  39. return {false, false, true, false, true};
  40. }
  41. default:
  42. {
  43. return {};
  44. }
  45. }
  46. }
  47. // 模式切换失败原因
  48. enum class ModeTransitionError
  49. {
  50. None, // 切换成功
  51. AlreadyInRequestedMode, // 已经处于目标模式
  52. MustReturnToEditing, // 必须先返回编辑态
  53. InitialPlcReadRequired // 进入真机态前必须完成 PLC 初次读取
  54. };
  55. // 模式切换操作结果
  56. struct ModeTransitionResult
  57. {
  58. // 是否切换成功
  59. bool succeeded = false;
  60. // 切换失败原因
  61. ModeTransitionError error = ModeTransitionError::None;
  62. };
  63. class RuntimeState
  64. {
  65. public:
  66. // 获取当前运行模式
  67. ApplicationMode mode() const;
  68. // 获取当前模式能力策略
  69. ModePolicy policy() const;
  70. // 返回编辑态
  71. ModeTransitionResult enterEditing();
  72. // 进入离线仿真运行态
  73. ModeTransitionResult enterOfflineRunning();
  74. /**
  75. * @brief 尝试进入真机联机运行态
  76. * @param initial_plc_read_completed 是否已成功完成 PLC 初次读取并建立有效缓存
  77. * @return 模式切换结果
  78. */
  79. ModeTransitionResult enterOnlineRunning(bool initial_plc_read_completed);
  80. private:
  81. // 当前运行模式 初始为编辑态
  82. ApplicationMode mode_ = ApplicationMode::Editing;
  83. };
  84. } // namespace integrated_platform::domain