eis/src/zcache/zcache_readme.md

99 lines
3.9 KiB
Markdown
Raw Normal View History

# 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 做转换eventNo2000 仅缓存 |
| `SendDataLong` | 未实现 |
| `TimeNotify` | 未实现 |
## 源文件
```
src/zcache/
├── zcache.cpp # PACE 组件入口
├── ZcacheICEI.cpp # ICE servant: SendDataShort 入口
└── CacheMag.cpp # 核心: 地址映射、数据缓存、类型转换
```