# RNG 改动日志 **日期**:2026-05-13 **范围**:`TestProject/RNG/` 全部改动 **目标**:将硬编码的信号→数据源映射重构为 JSON 配置驱动的参数化模型架构 --- ## 概览 | 类别 | 数量 | |------|------| | 新增文件 | 20 | | 修改文件 | 5 | | 删除文件 | 1 | | 总行数变化 | +955 / -244 | --- ## 新增文件 | 文件 | 职责 | |------|------| | `json/rng_models.json` | 17 个预定义模型模板 | | `model/IModel.h` | 模型基类接口(evaluate / evaluateBool / linkPeers / reset) | | `model/ConstantModel.h` | 固定值 y = c | | `model/NormalModel.h` | 正态分布 y = μ + σ·N(0,1) | | `model/LinearModel.h` | 线性变化 y = k·t + b,支持 period_ms 周期取模 | | `model/SineModel.h` | 正弦波 y = A·sin(ω·t + φ) + offset | | `model/UniformModel.h` | 均匀随机 y = center ± delta | | `model/SpikeModel.h` | 随机毛刺注入(概率 × 幅值) | | `model/DriftModel.h` | 线性漂移 y = base + rate·t,支持 period_ms 周期取模 | | `model/CsvReplayModel.h` | CSV 历史数据模拟量回放 | | `model/BoolRandomModel.h` | 概率随机布尔 | | `model/BoolToggleModel.h` | 固定周期翻转布尔 | | `model/BoolCsvModel.h` | CSV 历史数据布尔回放 | | `model/ValvePairModel.h` | 阀动作→到位传感器时序仿真(四态状态机) | | `model/NotModel.h` | 布尔量取反包装器(`!` 前缀) | | `model/CompositeModel.h` | base + noise 组合模型(`+` 前缀) | | `model/ModelRegistry.h` | 工厂注册表声明(单例、模型注册、tables[1] 解析) | | `model/ModelRegistry.cc` | 工厂注册表实现(JSON 加载、12 种模式注册、语法解析、valve_pair 关联) | | `README.md` | 完整项目文档 | --- ## 修改文件 | 文件 | 改动内容 | |------|----------| | `Generator.h` | 新增 `ModelRegistry& registry` 引用成员 | | `Generator.cc` | 删除 ~150 行硬编码 if-else 链和 10 个全局 CSV 变量;替换为三遍扫描(创建→链接→求值) | | `RNG.cc` | 启动时加载 `rng_models.json`,带 try-catch 保护 | | `CMakeLists.txt` | 新增 `aux_source_directory(./model MODEL_DIR)` | | `read_csv.hpp` | 修复:`is_same_v` 加 `std::` 前缀;`std::exit(1)` 改为 `throw std::runtime_error`;移除重复 `#pragma once` | --- ## 删除文件 | 文件 | 原因 | |------|------| | `BaseData.h` | 仅被旧 Generator.cc 使用,重构后无引用 | --- ## 同时修改的外部文件 | 文件 | 改动 | 原因 | |------|------|------| | `RandT.h` (TestProject/RNG/) | `sqrt(sigma)` → `sigma` | 修正标准差语义:参数含义从方差改为标准差 | --- ## 架构变更 ### 旧架构 ``` RNG_icei → Generator::wtite_in_shm() ├─ if (item == "BR1_1_V_act") → 硬编码 CSV 列 ├─ else if (item == "BR2_2_I_act") → 硬编码 CSV 列 ├─ ... 150+ 行 strcmp 链 └─ else → RandT::RandT(-0.01, 0.01) ``` ### 新架构 ``` rng_models.json ──────────┐ ├─ ModelRegistry → 12 个 IModel 子类 DB2 T_LOV_FDAAITEM ──────┘ │ tables[1] 字段 │ getOrCreate(spec, defaultVal, itemName) ▼ RNG_icei → Generator::wtite_in_shm() ├─ Pass 1: 创建模型实例 (per signal key) ├─ Pass 2: 链接 valve_pair → 动作信号 └─ Pass 3: model->evaluate(t) / evaluateBool(t) ``` --- ## tables[1] 语法 | 格式 | 含义 | |------|------| | `模型名` | 引用 JSON 中的模型模板 | | `csv:文件:列号` | 内联 CSV 数据回放 | | `基模型+噪声模型` | 组合模型 | | `pair模型:动作模型` | 阀到位传感器引用动作信号 | | `!模型引用` | 布尔量取反 | | 空 / `default` | 默认 `normal_tiny` | --- ## 可复用设计 新增模型只需三步,不改现有代码: 1. 创建 `model/NewModel.h`,继承 `IModel`,实现 `evaluate()` 或 `evaluateBool()` 2. 在 `ModelRegistry.cc` 构造函数中加一行 `registerMode(...)` 3. 在 `rng_models.json` 中添加模板(可选)