#pragma once // 应用当前运行模式 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, // allowsProjectEditing 允许编辑工程 false, // usesVirtualRegisters 不使用虚拟寄存器 false, // usesPlcRegisters 不使用 PLC 寄存器 false, // runsLogicExecutor 不运行软件逻辑执行器 false // requiresInitialPlcRead 不要求 PLC 初次读取 }; } case ApplicationMode::OfflineRunning: { // 离线运行态禁止改工程,使用虚拟 M/D 并运行软件逻辑 return { false, // allowsProjectEditing 禁止编辑工程 true, // usesVirtualRegisters 使用虚拟寄存器 false, // usesPlcRegisters 不使用 PLC 寄存器 true, // runsLogicExecutor 运行软件逻辑执行器 false // requiresInitialPlcRead 不要求 PLC 初次读取 }; } case ApplicationMode::OnlineRunning: { // 真机运行态禁止改工程,使用 PLC 数据且禁止软件逻辑重复控制 PLC return { false, // allowsProjectEditing 禁止编辑工程 false, // usesVirtualRegisters 不使用虚拟寄存器 true, // usesPlcRegisters 使用 PLC 寄存器 false, // runsLogicExecutor 不运行软件逻辑执行器 true // requiresInitialPlcRead 必须先完成 PLC 初次读取 }; } default: { return {}; } } } // 模式切换失败原因 enum class ModeTransitionError { None, // 切换成功 AlreadyInRequestedMode, // 已经处于目标模式 MustReturnToEditing, // 必须先返回编辑态 InitialPlcReadRequired, // 进入真机态前必须完成 PLC 初次读取 ProjectNotReady, // 工程存在未配置或未完成的运行项 SimulationStartFailed // 离线执行器预检或启动失败 }; // 模式切换操作结果 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; };