# zcache — 数据缓存与转换服务 ## 概述 zcache 是 EIS 系统中的 **实时数据缓存与转换中枢**。它从多个数据源接收原始二进制 PLC 遥测数据,按电文地址映射将原始数据解码为标准化浮点数组,存入共享内存环形缓冲区,供下游服务(eqpalg、zhd 等)直接读取。 ## 进程架构 ``` rcv / zprx / zsub │ │ ICE SendDataShort(eventNo, rawPLCData) ▼ ┌──────────────────────────────────────────┐ │ zcache │ │ │ │ ZcacheICEI::SendDataShort() │ │ │ │ │ ├→ CacheTele(eventNo, seq) │ │ │ └─ 原始字节 → CMemFix │ │ │ 按事件号环形缓存(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` 环形缓冲区 - 每个事件号保留最近 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 # 核心: 地址映射、数据缓存、类型转换 ```