综合平台编程器项目的远程存储
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 

115 wiersze
3.6 KiB

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