161 lines
6.2 KiB
Markdown
161 lines
6.2 KiB
Markdown
|
|
# 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 产生报警和规则统计,写入共享内存 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.)
|