#pragma once namespace integrated_platform::domain { // 应用当前运行模式 enum class ApplicationMode { Editing, // 编辑工程状态 OfflineRunning, // 离线仿真运行状态 OnlineRunning // 真机联机运行状态 }; // 当前运行模式对应的能力策略 struct ModePolicy { // 是否允许编辑工程 bool allowsProjectEditing = false; // 是否使用虚拟寄存器 bool usesVirtualRegisters = false; // 是否使用 PLC 寄存器 bool usesPlcRegisters = false; // 是否运行软件逻辑执行器 bool runsLogicExecutor = false; // 是否要求进入真机前完成 PLC 初次读取 bool requiresInitialPlcRead = false; }; // 根据运行模式返回对应的能力策略 constexpr ModePolicy policyForMode(ApplicationMode mode) { switch (mode) { case ApplicationMode::Editing: { return {true, false, false, false, false}; } case ApplicationMode::OfflineRunning: { return {false, true, false, true, false}; } case ApplicationMode::OnlineRunning: { return {false, false, true, false, true}; } default: { return {}; } } } // 模式切换失败原因 enum class ModeTransitionError { None, // 切换成功 AlreadyInRequestedMode, // 已经处于目标模式 MustReturnToEditing, // 必须先返回编辑态 InitialPlcReadRequired // 进入真机态前必须完成 PLC 初次读取 }; // 模式切换操作结果 struct ModeTransitionResult { // 是否切换成功 bool succeeded = false; // 切换失败原因 ModeTransitionError error = ModeTransitionError::None; }; class RuntimeState { public: // 获取当前运行模式 ApplicationMode mode() const; // 获取当前模式能力策略 ModePolicy policy() const; // 返回编辑态 ModeTransitionResult enterEditing(); // 进入离线仿真运行态 ModeTransitionResult enterOfflineRunning(); /** * @brief 尝试进入真机联机运行态 * @param initial_plc_read_completed 是否已成功完成 PLC 初次读取并建立有效缓存 * @return 模式切换结果 */ ModeTransitionResult enterOnlineRunning(bool initial_plc_read_completed); private: // 当前运行模式 初始为编辑态 ApplicationMode mode_ = ApplicationMode::Editing; }; } // namespace integrated_platform::domain