diff --git a/TestProject/RNG/CHANGELOG.md b/TestProject/RNG/CHANGELOG.md new file mode 100644 index 0000000..e14777d --- /dev/null +++ b/TestProject/RNG/CHANGELOG.md @@ -0,0 +1,119 @@ +# 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` 中添加模板(可选)