# dsm — 数据存储管理 ## 概述 dsm(**D**ata **S**ave **M**anager / 数据存储管理)是 EIS 系统中的历史数据归档服务。它的核心职责是: - **周期性**从 iHyperDB 工业历史数据库查询指定规则的历史数据 - 将查询到的数据(标签值 + 时间戳)保存为 **JSON 文件**在磁盘上 - 按规则 ID 和日期组织文件,区分正常数据和报警数据 ## 进程架构 dsm 作为单个 PACE 平台组件运行,注册 ICE 端点 `"baosight/dsm"`。它**被动接收**其他进程推送的规则 ID 列表,然后定时从 iHyperDB 拉取数据归档。 ``` eqpalg / 其它进程 │ │ ICE SendDataShort(99999, {"ruleid": [...]}) ▼ ┌──────────────────────────────────────────┐ │ dsm 进程 │ │ │ │ dsmICEI::SendDataShort(99999) │ │ │ │ │ ▼ │ │ DsmAlg::dispose() → need_ruleid_ │ │ │ │ dsmICEI::TimeNotify() │ │ │ │ │ ▼ │ │ DsmAlg::timed_task() │ │ │ │ │ ├→ dsm_handle(ruleid) │ │ │ ├─ 读共享内存 ZONE10 获取配置 │ │ │ ├─ DataQuery → iHyperDB 查询 │ │ │ └─ save_json_file() → 写磁盘 │ │ │ │ └───────┼───────────────────────────────────┘ │ ▼ /dscdata/RuleNormData//.json (正常数据) /dscdata/RuleAlertData//.json (报警数据) ``` ## ICE 接口 | 方法 | 事件号 | 说明 | |------|--------|------| | `SendDataShort` | 99999 | 接收规则 ID 列表,解析 JSON `{"ruleid": [...]}` 存入 `need_ruleid_` | | `SendDataLong` | — | 未实现 | | `TimeNotify` | — | 定时触发 `timed_task()`,处理所有待处理的规则 | 定时器根据 `config/config.json` 中的 CronTab 配置触发(默认每分钟第 18、19 秒各执行一次)。 ## 核心模块 ### 1. DsmAlg — 数据归档调度 | 方法 | 说明 | |------|------| | `dispose(event_no, seq)` | 解析 ICE 消息中的 JSON,提取 `ruleid` 数组存入 `need_ruleid_` | | `timed_task()` | 遍历 `need_ruleid_`,调用 `dsm_handle()` 处理每个规则 | | `dsm_handle(ruleid)` | 核心归档逻辑(见下) | **`dsm_handle()` 工作流程**: 1. 从共享内存 `ZONE10` 读取该 `ruleid` 的 `DataInfo`(含 start/end/tags/data_type) 2. 根据 `data_type` 确定输出目录: - `flag=0` → `/dscdata/RuleNormData/`(正常数据) - `flag=1` → `/dscdata/RuleAlertData/`(报警数据) 3. 构建文件路径:`//.json` 4. 如果文件已存在则跳过(防止重复写入) 5. 调用 `DataQuery` 从 iHyperDB 拉取数据 6. 调用 `UtilityTools::save_json_file()` 写入磁盘 ### 2. DataQuery — iHyperDB 查询 通过 `mix_cc::ihd` API 查询工业历史数据库: - **输入**: 标签名称列表 + 时间范围 - **输出**: JSON 对象,每个标签对应一个 `vector` 值数组,外加 `"time"` 时间戳数组(毫秒 epoch) - **连接**: `config.json` 中配置的 `10.3.226.3:5673` ### 3. 共享内存 ZONE10 - **区名**: `"ZONE10"` - **结构**: `CMemMap` - **容量**: 最多 5000 条规则 - **DataInfo 字段**: - `start` / `end`: 时间范围(epoch 毫秒) - `tags`: 最多 30 个标签名,每个 50 字符 - `flag`: 0=正常数据,1=报警数据 ### 4. 定时调度 根据 `config/config.json`,ICE CronTab 每整分钟的第 **18 秒**和**第 19 秒**触发 `TimeNotify`。ICE 代理列表包含 `"baosight/ProxyTest"` 和 `"baosight/pyml"`。 ## 数据流 ``` 其他进程推送 ruleId │ ▼ dsm.process 维护 need_ruleid_ 列表 │ │ (每分钟两次) ▼ 共享内存 ZONE10 → 读取 DataInfo (start/end/tags/flag) │ ▼ iHyperDB 查询 → Eigen Matrix → JSON 转换 │ ▼ /dscdata/ ├── RuleNormData//YYYY-MM-DD.json └── RuleAlertData//YYYY-MM-DD.json ``` ## 与其它进程的关系 | 进程 | 关系 | |------|------| | **eqpalg** | eqpalg 产生报警和规则统计,写入共享内存 ZONE10,dsm 据此归档历史数据;eqpalg-mon 的 TimeNotify(5) 定期向 dsm 发送 ruleId JSON | | **RICS** | 独立模块,RICS 做规则配置展示,不直接交互 | | **eqpm** | 独立模块,eqpm 做设备点检管理,不直接交互 | dsm 本质上是 eqpalg 的**数据归档下游** — eqpalg 负责检测和报警,dsm 负责将相关规则的原始数据拉取保存到磁盘,供后续离线分析和问题追溯使用。 ## 目录结构 ``` dsm/ ├── dsm.cc/h # 进程入口 ├── dsm_icei.cc/h # ICE 接口 ├── dsm_alg.cc/h # 数据归档调度 ├── data_query.cc/h # iHyperDB 数据查询 ├── utility.cc/h # 时间/文件系统工具 ├── public.h # DataInfo / DsmMapConfig 数据结构 ├── table_struct/ # DB2 表结构(当前未直接使用) │ ├── fv_pdi.h │ ├── t_eqp_data.h │ └── t_eqp_repair.h ├── json/ # 测试/模板数据 │ ├── norm_info.json │ └── eqp_status.json └── CMakeLists.txt ``` ## 配置文件(项目级) | 文件 | 用途 | |------|------| | `config/config.json` | DB2 凭据、IHDB 连接参数、共享内存路径、样本目录、CronTab 调度 | | `config/dsfconfig.json` | DSF 数据源订阅配置(服务器 `10.64.3.20:1234`) | | `config/zone.cfg` | 共享内存区域定义(含 ZONE10) | ## 作者 - Cat (null.null.null@qq.com) - 宝信软件(Baosight Co. Ltd.)