- EIS_README.md: Overall project architecture, data flow, service inventory - zmqp/zmqc_readme: ActiveMQ producer/consumer bridging ICE - zcache_readme: Data cache hub with address mapping and type conversion - zhd_readme: Real-time snapshot persistence to iHyperDB - zinit_readme: DB2-to-shared-memory initialization service - zsub/zudp/zdsf/rcv_readme: Data receiver layer for different on-site protocols
99 lines
3.9 KiB
Markdown
99 lines
3.9 KiB
Markdown
# zcache — 数据缓存与转换服务
|
||
|
||
## 概述
|
||
|
||
zcache 是 EIS 系统中的 **实时数据缓存与转换中枢**。它从多个数据源接收原始二进制 PLC 遥测数据,按电文地址映射将原始数据解码为标准化浮点数组,存入共享内存环形缓冲区,供下游服务(eqpalg、zhd 等)直接读取。
|
||
|
||
## 进程架构
|
||
|
||
```
|
||
rcv / zprx / zsub
|
||
│
|
||
│ ICE SendDataShort(eventNo, rawPLCData)
|
||
▼
|
||
┌──────────────────────────────────────────┐
|
||
│ zcache │
|
||
│ │
|
||
│ ZcacheICEI::SendDataShort() │
|
||
│ │ │
|
||
│ ├→ CacheTele(eventNo, seq) │
|
||
│ │ └─ 原始字节 → CMemFix<PLC_DATA> │
|
||
│ │ 按事件号环形缓存(TEL_CACHE_SIZE=10) │
|
||
│ │ │
|
||
│ ├→ ConvertTele(eventNo, seq) │
|
||
│ │ └─ mv_tele 地址映射 │
|
||
│ │ ├─ NORMAL模式: 值×factor │
|
||
│ │ └─ BINARY模式: 位提取 │
|
||
│ │ → TELTMP 暂存缓冲区 │
|
||
│ │ │
|
||
│ └→ eventNo==1003: │
|
||
│ PutTempTelInCache() │
|
||
│ └─ TELTMP → m_mapfix 批量刷新 │
|
||
│ │
|
||
└──────────────┬───────────────────────────┘
|
||
│
|
||
▼
|
||
共享内存 (GlobMem)
|
||
│
|
||
┌────────────┼────────────┐
|
||
▼ ▼ ▼
|
||
eqpalg zhd ztrk
|
||
(实时监控) (历史存储) (物料跟踪)
|
||
```
|
||
|
||
## 核心职责
|
||
|
||
### 1. 数据缓存
|
||
|
||
- 将到达的原始二进制遥测数据按事件号存入 `CMemFix<PLC_DATA>` 环形缓冲区
|
||
- 每个事件号保留最近 10 条消息
|
||
|
||
### 2. 数据转换 (`ConvertTele`)
|
||
|
||
根据从 `T_LOV_FDAAITEM` 构建的地址映射表,将原始二进制数据解码:
|
||
|
||
| 转换模式 | 处理方式 |
|
||
|----------|----------|
|
||
| NORMAL(普通数值) | 读取源值 × 转换因子 → 目标缓冲区 |
|
||
| BINARY(位提取) | 右移指定位 → 与 1 进行 AND 运算 → 布尔/整型 |
|
||
|
||
支持的数据类型: `float`(浮点)、`int`(整型)、`short`(短整型)、`bool`(布尔)
|
||
|
||
### 3. 暂存与批量刷新
|
||
|
||
- `eventNo==1003` 触发批量刷新:将暂存区 `TELTMP` 的全部数据写入各事件号的环形缓冲区 `m_mapfix`
|
||
|
||
## 数据来源
|
||
|
||
| 来源服务 | 调用方式 | 数据内容 |
|
||
|----------|----------|----------|
|
||
| **rcv** | ICE `SendDataShort(eventNo, seq)` | L1 二进制遥测电文 |
|
||
| **zprx** | ICE `SendDataShort(eventNo, seq)` | 转发的事件 2000-2010 数据 |
|
||
|
||
## 数据消费
|
||
|
||
下游服务**不通过 ICE 调用 zcache**,而是直接读取共享内存中的 `PLC_DATA` 缓冲区:
|
||
|
||
| 消费者 | 读取内容 |
|
||
|--------|----------|
|
||
| **eqpalg** | `GlobaltemSharedMemory::cache_data()` 从 PLC_DATA 读取实时值 |
|
||
| **zhd** | 从共享内存读取快照写入 iHyperDB |
|
||
| **ztrk** | 读取区域跟踪数据 |
|
||
|
||
## ICE 接口
|
||
|
||
| 方法 | 说明 |
|
||
|------|------|
|
||
| `SendDataShort(eventNo, seq)` | 核心入口: 缓存 + 转换 raw 数据。eventNo=1002 跳过;eventNo<2000 做转换;eventNo≥2000 仅缓存 |
|
||
| `SendDataLong` | 未实现 |
|
||
| `TimeNotify` | 未实现 |
|
||
|
||
## 源文件
|
||
|
||
```
|
||
src/zcache/
|
||
├── zcache.cpp # PACE 组件入口
|
||
├── ZcacheICEI.cpp # ICE servant: SendDataShort 入口
|
||
└── CacheMag.cpp # 核心: 地址映射、数据缓存、类型转换
|
||
```
|