eis/dsm/dsm_readme.md

161 lines
6.2 KiB
Markdown
Raw Permalink Normal View History

# 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/<ruleid>/<yyyy-mm-dd>.json (正常数据)
/dscdata/RuleAlertData/<ruleid>/<yyyy-mm-dd>.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. 构建文件路径:`<root>/<ruleid>/<yyyy-mm-dd>.json`
4. 如果文件已存在则跳过(防止重复写入)
5. 调用 `DataQuery` 从 iHyperDB 拉取数据
6. 调用 `UtilityTools::save_json_file()` 写入磁盘
### 2. DataQuery — iHyperDB 查询
通过 `mix_cc::ihd` API 查询工业历史数据库:
- **输入**: 标签名称列表 + 时间范围
- **输出**: JSON 对象,每个标签对应一个 `vector<double>` 值数组,外加 `"time"` 时间戳数组(毫秒 epoch
- **连接**: `config.json` 中配置的 `10.3.226.3:5673`
### 3. 共享内存 ZONE10
- **区名**: `"ZONE10"`
- **结构**: `CMemMap<string, DataInfo>`
- **容量**: 最多 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/<ruleid>/YYYY-MM-DD.json
└── RuleAlertData/<ruleid>/YYYY-MM-DD.json
```
## 与其它进程的关系
| 进程 | 关系 |
|------|------|
| **eqpalg** | eqpalg 产生报警和规则统计,写入共享内存 ZONE10dsm 据此归档历史数据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.