eis/src/zhd/zhd_readme.md

103 lines
4.0 KiB
Markdown
Raw Normal View History

# zhd — 实时数据持久化服务
## 概述
zhd**Z**hen **H** istory **D**ata / 实时历史数据)是 EIS 系统中的 **实时数据持久化服务**。它将从共享内存读取的 PLC 遥测快照批量写入 iHyperDB 工业历史数据库,支持自动标签创建和 3D 温度场数据。
## 进程架构
```
共享内存 (PLC_DATA)
│ 读取遥测快照
┌──────────────────────────────────────┐
│ zhd │
│ │
│ zhdICEI::SendDataShort / TimeNotify │
│ │ │
│ ▼ │
│ SnapshotCus::Dispatch(eventNo, seq) │
│ │ │
│ ├→ eventNo 2000-2011: │
│ │ CacheCase() │
│ │ └→ BinaryTele 解析标签 │
│ │ └→ IDBStorage() 类型转换 │
│ │ └→ SnapShotLocal() 批量写入 │
│ │ │
│ ├→ eventNo 100: │
│ │ 批量区域事件 (循环多区域) │
│ │ │
│ ├→ eventNo 6000: │
│ │ WriteAlarm() 报警数据 │
│ │ │
│ └→ 3D数据: Write3D() │
│ └→ 热轧温度场 → JSON → 标签 │
│ │
└───────────────┬───────────────────────┘
iHyperDB (HD3 API)
sn3_save_snapshots() 批量写入
```
## 核心功能
### 1. 遥测快照持久化
- 从共享内存 `CMemFix<PLC_DATA>` 读取 PLC 数据
- 使用 `BinaryTele` 解析标签名和当前值
- 类型转换后通过 HD3 API 的 `sn3_save_snapshots()` 批量写入 iHyperDB
### 2. 自动标签管理
- 查询 iHyperDB 获取现有标签 ID
- 不存在的标签自动创建(`pt3_add_tag()`),设置 `bArchiving=true` 启用历史归档
- 标签 ID 缓存在 `mv_tagids` 映射中以减少查询开销
### 3. 类型转换
| 遥测类型 | HD3 类型 | 处理 |
|----------|----------|------|
| `'b'` (bool) | `INT8` | `atoi(value)` |
| `'s'` (short) | `INT16` | `atoi(value) × factor` |
| `'i'` (int) | `INT32` | `atoi(value) × factor` |
| `'f'` (float) | `FLOAT32` | `atof(value) × factor` |
| `'c'` (string) | `STRING` | 直接赋值 |
所有数据质量标记为 `192``HD3_QUALITY_GOOD`)。
### 4. 3D 温度场 (`Write3D`)
热轧带钢的特殊处理:将 3D 区域温度数据打包为 JSON`{"T":[v1,v2,...]}`),每 90 个值一个 tag命名格式 `MG2_3DZONE0`、`MG2_3DZONE1` 等。
## ICE 接口
| 方法 | 说明 |
|------|------|
| `SendDataShort(eventNo, seq)` | 接收遥测数据,委托 `SnapshotCus::Dispatch()` 处理 |
| `SendDataLong` | 未实现 |
| `TimeNotify(eventNo, seq)` | 同 `SendDataShort`,为定时触发设计 |
## iHyperDB 连接
- **API**: HD3 (iHyperDB 原生 C API)
- **连接参数**: 从 `CRGS` 配置文件读取地址/端口
- **认证**: `sc3_login("admin", "admin")`
- **错误恢复**: 连接丢失时(错误码 110372/119502/119632断开并退出
## 定时器观察者 (`TimerWatchI`)
(当前被 `#if 0` 禁用)设计用于订阅 iMultiLink 定时标签对,接收来自外部系统的计算值并按规则覆盖遥测数据。
## 源文件
```
src/zhd/
├── zhd.cpp # PACE 组件入口
├── zhdICEI.cpp # ICE servant
├── Snapshot.cpp # 基础快照类iHyperDB 连接/批量写入)
├── SnapshotCus.cpp # 定制快照从共享内存读取、3D 数据处理)
└── TimerWatchI.cpp # 定时器观察者(被禁用)
```