Add READMEs for all infrastructure services and overall project

- 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
This commit is contained in:
Huamonarch 2026-05-09 12:13:00 +08:00
parent bd7e93ae68
commit 09b48b07e5
10 changed files with 1118 additions and 0 deletions

266
EIS_README.md Normal file
View File

@ -0,0 +1,266 @@
# EIS — 设备智能监控系统
## 概述
EIS**E**quipment **I**ntelligence **S**ystem / 设备智能系统)是一个面向冷轧机组的工业设备状态监控与预测性维护平台。系统基于宝信 PACE 分布式框架构建,通过 ZeroC ICE 中间件实现进程间通信,以 ActiveMQ 连接外部系统使用共享内存内存映射文件作为实时数据总线iHyperDB 作为历史数据存储DB2 作为配置与结果数据库。
## 系统架构
```
┌──────────────────────┐
│ 外部系统 / Web UI │
└──────┬───────┬───────┘
│ │
ActiveMQ Memcached
│ │
┌──────────────────────────────┼───────┼──────────────────────────┐
│ ICE 消息总线 │
│ │ │
│ ┌───────────────────────────┴───────────────────────────────┐ │
│ │ 数据接收层 │ │
│ │ zsub (TCP订阅) zudp (UDP) zdsf (DSF) rcv (L1电文) │ │
│ └───────────────────────────┬───────────────────────────────┘ │
│ │ │
│ 共享内存 (GlobMem) │
│ │ │
│ ┌───────────────────────────┴───────────────────────────────┐ │
│ │ 数据处理与缓存层 │ │
│ │ zcache (缓存转换) zinit (DB→内存初始化) │ │
│ └───────────────────────────┬───────────────────────────────┘ │
│ │ │
│ ┌───────────────┬───────────┴───────────┬───────────────────┐ │
│ │ │ │ │ │
│ ▼ ▼ ▼ │ │
│ ┌─────────┐ ┌─────────┐ ┌──────────┐ │ │
│ │ eqpalg │ │ zhd │ │ eqpm │ │ │
│ │ 设备算法 │ │ 实时历史 │ │ 设备点检 │ │ │
│ │ 监控引擎 │ │ 数据存储 │ │ 状态管理 │ │ │
│ └────┬────┘ └────┬────┘ └────┬─────┘ │ │
│ │ │ │ │ │
│ ├─────┬─────┘ │ │ │
│ │ │ │ │ │
│ ▼ ▼ │ │ │
│ ┌────────┐ ┌────────┐ │ │ │
│ │ dsm │ │ RICS │ │ │ │
│ │数据归档│ │规则展示│ │ │ │
│ └────────┘ └────────┘ │ │ │
│ │ │ │
│ ┌────────────────────────────────────┴───────────────────┐ │
│ │ 消息中间件层 │ │
│ │ zmqp (生产者) ←── ICE ──→ zmqc (消费者) │ │
│ │ ↓ ↑ │ │
│ │ ActiveMQ ──── 外部系统 ──── ActiveMQ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└───────────────────────────────────────────────────────────────┘
```
## 数据流全景
```
PLC/传感器 (L1)
├──→ FDA 服务器 ──TCP──→ zsub ──→ 共享内存 FDA_DATA
├──→ UDP 广播 ──UDP──→ zudp ──→ 共享内存 PLC_DATA
├──→ DSF 服务器 ──SDK──→ zdsf ──→ ICE 转发
└──→ L1 电文 ──ICE──→ rcv ──→ zcache / ztrk / zmtr
zcache (缓存)
地址映射 + 类型转换
共享内存 PLC_DATA
┌─────────────────────┼─────────────────────┐
▼ ▼ ▼
eqpalg (mon) zhd (快照) ztrk/zmtr
实时报警监控 iHyperDB 持久化 物料跟踪
├──→ 报警 → AlarmPoster
│ ├──→ DB2 T_RULE_RESULT
│ ├──→ zmqp → ActiveMQ Topic
│ └──→ CMemQueue
├──→ 统计累积 → RuleStatShm
│ └──→ eqpalg (cron) → DAA::STA → DB2
└──→ 页面数据 → Memcached (RICS 读 DB2 配置)
eqpalg (task): 按需从 iHyperDB 拉取历史数据 → 拟合/统计 → DB2
dsm: ZONE10 → iHyperDB 查询 → JSON 文件归档
eqpm: 产量累积 → 预测检修日期 → Memcached 设备状态
```
## 服务清单
### 设备监控层eqpalg 体系)
| 服务 | 目录 | 职责 |
|------|------|------|
| **eqpalg-mon** | `eqpalg/` | 实时监控引擎:从共享内存读 PLC 数据,每 20ms 执行规则表达式,产出报警 |
| **eqpalg-cron** | `eqpalg/` | 定时学习引擎:从 RuleStatShm 读取统计累积,计算置信区间并写回 DB2 |
| **eqpalg-task** | `eqpalg/` | 单次执行引擎:按需从 iHyperDB 拉历史数据,做拟合/统计/回测 |
| **RICS** | `RICS/` | 规则信息展示服务:读 DB2 规则配置,格式化为 JSON 写入 Memcached |
| **dsm** | `dsm/` | 数据存储管理:从共享内存 ZONE10 读配置,查 iHyperDB归档为 JSON 文件 |
| **eqpm** | `eqpm/` | 设备点检管理:产量累积计算 + 检修日期预测 + 实时状态遥测解码 |
### 数据接收层(根据现场选用)
| 服务 | 目录 | 协议 | 适用场景 |
|------|------|------|----------|
| **zsub** | `src/zsub/` | TCP 订阅 | FDA 服务器已部署,标准 PLC 数据采集 |
| **zudp** | `src/zudp/` | UDP 广播 | 低延迟/广播式数据源 |
| **zdsf** | `src/zdsf/` | DSF SDK | DSF 数据平台,按命名标签订阅 |
| **rcv** | `src/rcv/` | ICE (iXcomTCP2) | L1 电文路由分发,通用入口 |
### 数据处理层
| 服务 | 目录 | 职责 |
|------|------|------|
| **zcache** | `src/zcache/` | 数据缓存中枢:原始二进制 → 地址映射 → 标准化浮点 → 共享内存环形缓冲 |
| **zhd** | `src/zhd/` | 实时历史数据:共享内存快照 → iHyperDB 批量写入(含自动标签创建) |
| **zinit** | `src/zinit/` | 数据库初始化:启动时从 DB2 加载配置表/参数到共享内存,运行时缓存遥测 |
### 消息中间件层
| 服务 | 目录 | 角色 | 传输方向 |
|------|------|------|----------|
| **zmqp** | `src/zmqp/` | ActiveMQ 生产者 | ICE → ActiveMQ Topic报警/计算结果→外部) |
| **zmqc** | `src/zmqc/` | ActiveMQ 消费者 | ActiveMQ Queue → ICE外部指令→内部服务 |
### 公共库
| 库 | 目录 | 用途 |
|----|------|------|
| `libbase` | `src/base/` | 基础工具位操作、文件流、时间、ping |
| `libglob` | `src/glob/` | 全局服务BinaryTele 编解码、ConnectionMag DB连接、ProxyMag ICE代理 |
| `libzlib` | `src/zlib/` | 共享内存管理MemFix/MemTable/DB2Mem、MemCachedClient、MemVar 全局变量) |
| `libproxy` | `src/proxy/` | ICE 接口定义MessageICE、CallBackICE |
| `libdao` | `src/dao/` | 数据访问对象DBMag、MatStructDBAX |
| `libdbax` | `src/dbax/` | 数据库表访问扩展 |
| `libcold` | `src/cold/` | 冷轧业务对象MatUnit、RollMachine、RollTele |
| `libcda` | `src/cda/` | 通用数据访问(报警日志、钢卷数据、调度数据) |
| `libzcus` | `src/zcus/` | 定制工具IHDB 读取、规则报警、REST API |
| `mix_cc` | `mix_cc/` | 表达式引擎、SQL DSL、iHyperDB API 封装、JSON、共享内存模板 |
## 关键技术栈
| 层级 | 技术 |
|------|------|
| 分布式框架 | Baosight PACE / iPlature |
| 进程间通信 | ZeroC Ice 3.7 |
| 外部消息 | Apache ActiveMQ-CPP 3.9 |
| 实时数据 | 共享内存Boost Memory-Mapped File、GlobMem |
| 缓存 | Memcached (libmemcached) |
| 历史数据库 | iHyperDB (HD3 API) |
| 关系数据库 | DB2 (通过 SQLAPI++) |
| 数值计算 | Eigen3、Armadillo、dlib、mlpack、GSL |
| JSON | nlohmann/json |
| 日志 | log4cplus |
| C++ 标准 | C++11 / C++17 / C++20各模块不同 |
## 工程目录结构
```
code/
├── EIS_README.md # 本文件
├── config/ # 全局配置文件
│ ├── config.json # DB2/IHDB/SHM/CronTab 配置
│ ├── dsfconfig.json # DSF 数据订阅配置
│ ├── zone.cfg # 共享内存区域定义
│ └── crgs.cfg # 配置注册系统
├── cmake_include/ # CMake 公共模块
├── inc/ # 全局头文件
│ ├── common/ # 公共定义L2Event、Macro
│ ├── glob/ # 全局服务头文件
│ ├── proxy/ # ICE 接口头文件
│ ├── zlib/ # 共享内存库头文件
│ ├── zcache/ # 各服务头文件
│ ├── ...
│ └── dbinc/ # DB2 表结构头文件
├── lib/ # 预编译库 (.a)
├── src/ # 基础服务源码
│ ├── base/ # libbase
│ ├── glob/ # libglob
│ ├── zlib/ # libzlib
│ ├── proxy/ # libproxy
│ ├── dao/ # libdao
│ ├── dbax/ # libdbax
│ ├── cold/ # libcold
│ ├── cda/ # libcda
│ ├── zcus/ # libzcus
│ ├── zsub/ # FDA TCP 订阅接收器
│ ├── zudp/ # UDP 接收器
│ ├── zdsf/ # DSF 接收器
│ ├── rcv/ # L1 电文路由
│ ├── zcache/ # 数据缓存中枢
│ ├── zhd/ # 实时历史数据
│ ├── zinit/ # 数据库初始化
│ ├── zmqp/ # ActiveMQ 生产者
│ ├── zmqc/ # ActiveMQ 消费者
│ └── ... # 其他辅助服务
├── eqpalg/ # 设备算法监控引擎
├── RICS/ # 规则信息展示服务
├── dsm/ # 数据存储管理
├── eqpm/ # 设备点检管理
├── mix_cc/ # 表达式引擎 / SQL DSL / 工具库
├── third_party/ # 第三方库
├── py/ # Python 辅助脚本
├── script/ # Shell 脚本
└── TestProject/ # 测试项目
```
## 现场部署模式
根据不同的现场情况,系统支持灵活部署:
### 标准部署FDA
```
zsub (TCP订阅FDA) → zcache → eqpalg + zhd
zinit (启动时加载DB配置)
```
### DSF 部署
```
zdsf (DSF标签订阅) → ICE → zcache → eqpalg + zhd
```
### UDP 广播部署
```
zudp (UDP接收) → 共享内存/ICE → zcache → eqpalg + zhd
```
### L1 电文部署
```
rcv (L1电文路由) → zcache/ztrk/zmtr → eqpalg + zhd
```
数据接收层可根据现场已有基础设施**任选一种或组合使用**,上层 eqpalg/zhd 等消费端不感知数据来源差异。
## 各服务 README 索引
| 服务 | README |
|------|--------|
| eqpalg | [eqpalg/eqpalg_readme.md](eqpalg/eqpalg_readme.md) |
| RICS | [RICS/RICS_readme.md](RICS/RICS_readme.md) |
| eqpm | [eqpm/eqpm_readme.md](eqpm/eqpm_readme.md) |
| dsm | [dsm/dsm_readme.md](dsm/dsm_readme.md) |
| zmqp | [src/zmqp/zmqp_readme.md](src/zmqp/zmqp_readme.md) |
| zmqc | [src/zmqc/zmqc_readme.md](src/zmqc/zmqc_readme.md) |
| zcache | [src/zcache/zcache_readme.md](src/zcache/zcache_readme.md) |
| zhd | [src/zhd/zhd_readme.md](src/zhd/zhd_readme.md) |
| zinit | [src/zinit/zinit_readme.md](src/zinit/zinit_readme.md) |
| zsub | [src/zsub/zsub_readme.md](src/zsub/zsub_readme.md) |
| zudp | [src/zudp/zudp_readme.md](src/zudp/zudp_readme.md) |
| zdsf | [src/zdsf/zdsf_readme.md](src/zdsf/zdsf_readme.md) |
| rcv | [src/rcv/rcv_readme.md](src/rcv/rcv_readme.md) |
## 作者
- Cat (null.null.null@qq.com)
- 宝信软件Baosight Co. Ltd.

95
src/rcv/rcv_readme.md Normal file
View File

@ -0,0 +1,95 @@
# rcv — L1 电文接收与路由
## 概述
rcv 是 EIS 系统中的 **L1 电文接收与路由分发器**。它通过 ICE 接收来自 L1一级自动化系统的各种电文telegram根据电文号和事件类型将数据路由到对应的 L2 服务数据缓存zcache、物料跟踪ztrk/zmtr
## 进程架构
```
L1 系统 / znode / zsub
│ ICE HandleMessage(ByteSeq)
┌──────────────────────────────────────────┐
│ rcv │
│ │
│ HandleMessage(ByteSeq) │
│ │ │
│ ├→ 解析 stru_recvtext7 结构 │
│ │ ├─ textbuf: 电文正文 │
│ │ ├─ textlenth: 电文长度 │
│ │ ├─ ctextno: 电文号 (TeleID) │
│ │ ├─ lineno: 回线号 │
│ │ └─ header: 报文头 │
│ │ │
│ ├→ TeleID < 2000 (排除1000):
│ │ MemoryData(带4字节头) │
│ │ │
│ └→ TeleID >= 2000 或 =1000: │
│ MemoryData(仅 textbuf) │
│ │
│ MemoryData() │
│ │ │
│ ├→ EV_TRK_SIGNAL (跟踪信号): │
│ │ ├→ ztrk_proxy (区域跟踪) │
│ │ └→ zmtr_proxy (物料跟踪) │
│ │ │
│ └→ 其他事件: │
│ └→ zcache_proxy (数据缓存) │
│ │
└──────────────────────────────────────────┘
```
## 核心职责
### 电文路由
rcv 不做数据解析,而是按电文类型做**纯路由**
| 电文类型 | 目标 | 用途 |
|----------|------|------|
| 跟踪信号 | `ztrk` + `zmtr` | 带钢位置跟踪和物料信息跟踪 |
| 其他所有 | `zcache` | 通用 PLC 数据缓存 |
### L1-L2 桥接
rcv 是 L1设备控制层和 L2过程控制层之间的关键桥接点。代码历史中保留了大量 L1-L2 电文路由的注释,包括:
- 跟踪初始化电文
- 入口/轧机/炉区/酸洗/出口各段的周期数据电文
- PDI/PDO 数据电文
- 称重数据电文
- 辊子性能电文
- 锌层厚度电文
这些历史路由已被简化,当前大多数电文统一转发到 zcache 进行处理。
## ICE 接口
### 服务端(接收调用)
| 方法 | 说明 |
|------|------|
| `HandleMessage(ByteSeq) → ByteSeq` | 同步请求-响应模式接收电文并返回相同数据echo |
### 客户端(代理调用)
| 代理 | 用途 |
|------|------|
| `baosight/zcache` | 通用数据缓存 |
| `baosight/ztrk` | 区域跟踪 |
| `baosight/zmtr` | 物料跟踪 |
## 现场适用场景
rcv 是 EIS 系统中**最通用的数据入口**,适用于通过 iXcomTCP2 协议接收 L1 电文的场景。它作为 L1-L2 的电文调度中心,将所有到达的电文按类型分发给正确的 L2 服务。
## 源文件
```
src/rcv/
├── RcvBase.cpp # PACE 组件入口 + ICE 代理初始化 + HandleMessage
├── RcvCus.cpp # MemoryData() 电文路由逻辑
└── makefile
```

View File

@ -0,0 +1,98 @@
# 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 # 核心: 地址映射、数据缓存、类型转换
```

104
src/zdsf/zdsf_readme.md Normal file
View File

@ -0,0 +1,104 @@
# zdsf — DSF 数据流订阅接收器
## 概述
zdsf 是 EIS 系统中的 **DSFData Stream Framework数据流订阅接收器**。它通过宝信 DSF SDK`libdsfapi`)连接到 DSF 服务器,以命名标签方式订阅实时数据(支持指定采样频率),接收后按遥测配置组装数据并通过 ICE 转发。
## 进程架构
```
DSF 服务器 (tcp, 主/备)
│ DSF SDK 订阅回调
┌──────────────────────────────────────────┐
│ zdsf │
│ │
│ DsfInit() │
│ │ │
│ ├→ 从 config/dsfconfig.json 读取配置 │
│ ├→ DRSdkConnectParam 初始化连接 │
│ ├→ 读数据库 BinaryTele 遥测配置 │
│ ├→ 订阅标签 (tag 或 struct 模式) │
│ └→ 注册回调 (采样频率 ms) │
│ │
│ recvCallBack(tagNames, tagValues) │
│ │ │
│ ├→ tag模式: 顺序拷贝值到缓冲区 │
│ ├→ struct模式: 按名称匹配 │
│ ├→ ReBuild 重建遥测结构 │
│ ├→ ICE 转发到配置的代理 │
│ └→ eventNo=1002: 额外转发到 eqpm │
│ │
└──────────────────────────────────────────┘
```
## 核心特性
### 命名标签订阅
与 zsub基于地址的订阅不同zdsf 支持**按标签名订阅**,更加灵活:
- **tag 模式**: 按 FDA item 名映射到 DSF 标签名
- **struct 模式**: 从 JSON 配置数组中读取变量名列表
### 采样频率控制
支持配置订阅的采样频率(毫秒级),实现按需采样,避免不必要的数据洪流。
### 回调处理
数据到达时通过 DSF SDK 回调 `recvCallBack()` 处理,使用 `mutex` 保证线程安全。
## 订阅配置
`$CRGS/config/dsfconfig.json` 读取,按服务名 `sub_node[service_name]` 索引:
```json
{
"server": {
"ip": "10.64.3.20",
"port": 1234,
"timeout": 5000,
"threadpool": 10,
"heartbeat": 60
},
"sub_node": {
"zdsf": {
"mode": "tag",
"frequency_ms": 100,
"tags": ["tag1", "tag2", "..."]
}
}
}
```
## 与其它接收器对比
| 方面 | zsub | zudp | zdsf |
|------|------|------|------|
| 协议 | TCP 订阅 | UDP 广播 | DSF SDK |
| 寻址方式 | 地址电文 | IP:Port | 命名标签 |
| 数据解析 | 解析信号名/值 | 不解析 | 按标签名匹配 |
| 采样频率 | 服务端推送 | 服务端推送 | 客户端可配置 |
| 灵活性 | 中 | 低 | 高 |
## ICE 接口
| 方法 | 说明 |
|------|------|
| `Init` | DSF 连接初始化 |
| `regist` | 标签订阅注册 |
| `recvCallBack` | DSF 数据回调 |
## 现场适用场景
zdsf 适用于**已部署 DSF 数据平台的现代化现场**,通过命名标签灵活订阅所需数据,支持精确的采样频率控制,无需解析复杂的电文协议。
## 源文件
```
src/zdsf/
├── dsf.cpp # PACE 组件入口
└── DsfRcv.cpp # DSF 初始化、标签订阅、回调处理
```

102
src/zhd/zhd_readme.md Normal file
View File

@ -0,0 +1,102 @@
# 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 # 定时器观察者(被禁用)
```

97
src/zinit/zinit_readme.md Normal file
View File

@ -0,0 +1,97 @@
# zinit — 数据库初始化服务
## 概述
zinit**Z**ero **Init** / 零初始化)是 EIS 系统中的 **数据库→共享内存 初始化服务**。它在系统启动时从关系数据库加载静态配置表、参数常量和遥测地址映射到共享内存,供所有 PACE 组件直接访问;运行时接收遥测数据并缓存到共享内存。
## 进程架构
```
启动时
┌──────────────────────────────────────────┐
│ zinit │
│ │
│ ZInitICEI 构造 │
│ │ │
│ ├→ InitMag::LoadTable() │
│ │ └→ DB2表 → DB2Mem → 共享内存 │
│ │ ├─ T_LOV_FDAAITEM (遥测项目录) │
│ │ ├─ T_LOV_TAB1/TAB2 (映射表) │
│ │ ├─ T_TIME_SET (时间设置) │
│ │ └─ T_PDO_CFG (PDO配置) │
│ │ │
│ └→ InitMag::LoadConstant() │
│ └→ T_LOV_PARAM → GLB_VAR.gbconst│
│ ├─ 各段速度标签名 │
│ ├─ 各段运行状态标签名 │
│ ├─ 事件范围 (START/END) │
│ └─ IHDB 查询间隔等 │
│ │
└──────────────────────────────────────────┘
运行时
┌──────────────────────────────────────────┐
│ ICE SendDataShort(eventNo, seq) │
│ │ │
│ ├→ CacheMag::CacheTele() │
│ │ └─ 原始数据 → 共享内存缓存 │
│ │ │
│ ├→ eventNo 1010/1012: │
│ │ CacheMag::ConvertTele() │
│ │ └─ 地址映射处理(位提取等) │
│ │ │
│ └→ eventNo 99999: │
│ InitMag::LoadTable() 重新加载 │
│ │
└──────────────────────────────────────────┘
```
## 核心模块
### InitMag — 静态数据加载
| 方法 | 功能 |
|------|------|
| `LoadTable()` | 从数据库表加载遥测项目录、时间设置、PDO 配置到共享内存,使用 `DB2Mem<T>` 模板 |
| `LoadConstant()` | 从 `T_LOV_PARAM` 表加载系统参数到全局变量 `GLB_VAR.gbconst` |
**加载的关键参数**
- 各工艺段EIS/ENT/ACD/AXT/TCM的速度标签名和运行状态标签名
- 事件号范围(`EVENT_EIS_START/END`
- IHDB 查询间隔(`EIS_QIHD_INTERVAL_TIME`
- 编码器参数、卷材尺寸限制、焊缝跟踪范围、剪切位置等
### CacheMag — 运行时遥测缓存
| 方法 | 功能 |
|------|------|
| `CacheTele(eventNo, seq)` | 原始二进制数据写入共享内存环形缓冲区 |
| `ConvertTele(eventNo, seq)` | 根据地址映射解析分解遥测数据(位提取/类型转换) |
## ICE 接口
| 方法 | 说明 |
|------|------|
| `SendDataShort(eventNo, seq)` | eventNo 1010/1012: 转换遥测eventNo 99999: 重新加载配置 |
| `SendDataLong` | 未实现 |
| `TimeNotify` | 未实现 |
## 共享内存架构
所有数据通过 `GlobMem` 管理的命名共享内存区域存取:
| 数据类型 | 内存结构 | 用途 |
|----------|----------|------|
| 数据库表 | `DB2Mem<T,S>` | 关系表 → 固定大小内存区域 |
| PLC 遥测 | `CMemTable<PLC_DATA>` | 运行时原始数据环形缓冲 |
| 全局变量 | `GLB_VAR` | 系统参数常量 |
## 源文件
```
src/zinit/
├── zinit.cpp # PACE 组件入口
├── ZInitICEI.cpp # ICE servant初始化触发 + 运行时缓存
├── InitMag.cpp # 数据库→共享内存加载器
└── CacheMag.cpp # 地址映射构建 + 遥测转换
```

85
src/zmqc/zmqc_readme.md Normal file
View File

@ -0,0 +1,85 @@
# zmqc — ActiveMQ 消息消费者
## 概述
zmqc 是 EIS 系统中的 **ActiveMQ 消息消费服务**。它作为 ActiveMQ→ICE 的桥接器,监听 ActiveMQ 队列,将收到的消息通过 ICE 转发给对应的内部服务。
## 进程架构
zmqc 是 PACE 平台组件,注册 ICE 端点 `"baosight/zmqc"`
```
ActiveMQ Broker
│ Queue: /queue/{UnitNo}_invokeModel
│ Queue: /queue/{UnitNo}_eqpalg
│ Queue: /queue/{UnitNo}_repair
┌──────────────────────────┐
│ zmqc │
│ │
│ 启动 3 个 ConsumerMQ 线程 │
│ │
│ tHDL4: invokeModel 队列 │──→ ICE SendDataShort(99999) → baosight/eqpalg-task
│ tHDL2: eqpalg 队列 │──→ ICE SendDataShort(99999) → baosight/eqpalg-mon
│ tHDL1: repair 队列 │──→ ICE SendDataShort(99999) → baosight/eqpm
│ │
└──────────────────────────┘
```
## 三个监听线程
| 线程 | ActiveMQ 目标 | ICE 代理目标 | 用途 |
|------|-------------|-------------|------|
| tHDL4 | `/queue/{UnitNo}_invokeModel` | `baosight/eqpalg-task` | 外部触发算法单次执行 |
| tHDL2 | `/queue/{UnitNo}_eqpalg` | `baosight/eqpalg-mon` | 外部发送规则 CRUD 指令 |
| tHDL1 | `/queue/{UnitNo}_repair` | `baosight/eqpm` | 外部触发设备点检更新 |
## ICE 接口
| 方法 | 说明 |
|------|------|
| `SendDataShort` | 空操作zmqc 不做 ICE 服务端处理) |
| `SendDataLong` | 未实现 |
| `TimeNotify` | 未实现 |
zmqc 的核心逻辑在 **ICE 客户端角色** — 它通过 `ConsumerMQ` 线程从 ActiveMQ 接收消息,然后调用其他 ICE 服务的 `SendDataShort` 转发。
## ActiveMQ 连接
- **库**: Apache ActiveMQ-CPP 3.9.3
- **配置**: 从 `CRGS` 配置文件读取 `[activemq]` 段的 `server` 属性
- **模式**: 使用 Queue点对点模式
## 典型数据流
```
外部系统Web UI 触发单次执行)
ActiveMQ Queue: /queue/C308_invokeModel
zmqc ConsumerMQ 线程 → ICE SendDataShort(99999, json)
eqpalg-task → AlgorithmManager::dispose() → exec_task()
```
## MQ 桥接总结
```
外部系统 ──ActiveMQ──→ zmqc ──ICE──→ 内部服务 (eqpalg/eqpm)
内部服务 ──ICE──→ zmqp ──ActiveMQ──→ 外部系统
```
zmqc + zmqp 共同构成了 **ICE ↔ ActiveMQ 双向桥接**
## 源文件
```
src/zmqc/
├── zmqc.cpp # PACE 组件入口
├── ZmqcICEI.cpp # ICE servant + 启动3个消费线程
└── ConsumerMQ.cpp # ActiveMQ 消费者线程Topic/Queue 两种模式)
```

85
src/zmqp/zmqp_readme.md Normal file
View File

@ -0,0 +1,85 @@
# zmqp — ActiveMQ 消息生产者
## 概述
zmqp 是 EIS 系统中的 **ActiveMQ 消息发布服务**。它作为 ICE→ActiveMQ 的桥接器,其他进程通过 ICE 调用 `SendDataShort`zmqp 将消息发布到 ActiveMQ Topic供外部系统消费。
## 进程架构
zmqp 是 PACE 平台组件,注册 ICE 端点 `"baosight/zmqp"`
```
eqpalg / zad / ztrk
│ ICE SendDataShort(eventNo, data)
┌──────────────────────────┐
│ zmqp │
│ │
│ ZmqpICEI::SendDataShort │
│ │ │
│ ├→ eventNo=911 ────→ ActiveMQ Topic: {UnitNo}_EIS_RuleTopic
│ ├→ eventNo=912 ────→ ActiveMQ Topic: {UnitNo}_EMS_TaskTopic
│ ├→ eventNo=601 ────→ ActiveMQ Topic: {UnitNo}_ems_eqpalg
│ ├→ eventNo=602 ────→ ActiveMQ Topic: {UnitNo}_ems_eqpstats
│ ├→ eventNo=101 ────→ ActiveMQ Topic: {UnitNo}_backToStaParams
│ └→ ...其他事件号 → 对应 Topic
│ │
└──────────────────────────┘
```
## ICE 接口
| 方法 | 说明 |
|------|------|
| `SendDataShort(eventNo, seq)` | 核心接口,根据 eventNo 将消息发布到对应的 ActiveMQ Topic |
| `SendDataLong` | 未实现 |
| `TimeNotify` | 调试用,向 `RuleTopic` 发送测试消息 |
## 事件号与 Topic 映射
| eventNo | 常量 | Topic 后缀 | 用途 |
|---------|------|-----------|------|
| 911 | `EV_MQP_EQPALGMON` | `_EIS_RuleTopic` | eqpalg-mon 报警信息 |
| 912 | `EV_MQP_EQPALGTASK` | `_EMS_TaskTopic` | eqpalg-task 计算结果 |
| 601 | `EV_MQP_EQPALG` | `_ems_eqpalg` | 设备算法消息 |
| 602 | `EV_MQP_EQPSTATS` | `_ems_eqpstats` | 设备统计信息 |
| — | `EV_MQP_ZONETRK` | `_zonetrk` | 区域跟踪 |
| — | `EV_MQP_TAGMSG` | `_tagmsg` | 标签消息 |
| — | `EV_MQP_ITEMTAG` | `_itemtag` | 测点标签 |
| — | `EV_MQP_PDILIST` | `_pdilist` | PDI 列表 |
| — | `EV_MQP_PDOLIST` | `_pdolist` | PDO 列表 |
| — | `EV_MQP_RULEMSG` | `_RuleTopic` | 规则消息 |
| 101 | — | `_backToStaParams` | 统计参数回传 |
所有 Topic 名称格式: `{UnitNo}_{suffix}`(如 `C308_EIS_RuleTopic`)。
## ActiveMQ 连接
- **库**: Apache ActiveMQ-CPP 3.9.3
- **配置**: 从 `CRGS` 配置文件读取 `[activemq]` 段的 `server` 属性
- **模式**: 默认使用 Topic`istopic=true`),非持久化投递
## 典型数据流
```
eqpalg 检测到报警
alarm_poster → ICE SendDataShort(911, alarm_json)
zmqp → ProducerMQ::Publish("{UnitNo}_EIS_RuleTopic", alarm_json)
ActiveMQ Broker → 外部系统Web UI / 第三方告警平台)
```
## 源文件
```
src/zmqp/
├── zmqp.cpp # PACE 组件入口
├── ZmqpICEI.cpp # ICE servant: 事件号→Topic 路由
└── ProducerMQ.cpp # ActiveMQ 生产者封装
```

105
src/zsub/zsub_readme.md Normal file
View File

@ -0,0 +1,105 @@
# zsub — FDA TCP 订阅数据接收器
## 概述
zsub 是 EIS 系统中的 **FDA现场数据采集TCP 订阅数据接收器**。它通过 TCP 连接到 FDA 服务器,发送包含所有信号地址的订阅电文,然后持续接收实时信号数据包,解析后存入共享内存并转发给下游服务。
这是 EIS 系统获取 PLC 实时数据的主要通道之一。
## 进程架构
```
FDA 服务器 (TCP 8089)
│ TCP 订阅 + 持续数据推送
┌──────────────────────────────────────────┐
│ zsub │
│ │
│ SubscribeFDA 线程 │
│ │ │
│ ├→ TCP 连接 (zsub.server:8089) │
│ ├→ 发送订阅电文 (含所有信号地址) │
│ └→ recv() 循环 │
│ └→ AssembleMsg() 包拼装 │
│ └→ 推入 gb_qtcache (线程安全队列) │
│ │
│ HandleMessage 线程 │
│ │ │
│ ├→ 从 gb_qtcache 取消息 │
│ ├→ SplitSignalName() — 解析<Signal>
│ ├→ SplitSignal() — 解析数据值+时间戳 │
│ ├→ CheckCache() — 找最小缓存深度 │
│ ├→ AssembleTeles() — 标签→遥测项映射 │
│ │ ├─ NORMAL: 直接赋值浮点数 │
│ │ └─ BINARY: 从整数中提取位 │
│ └→ MessageSend() │
│ ├→ 共享内存 FDA_DATA 缓存 │
│ └→ ICE 转发到 zprx/znode │
│ │
└──────────────────────────────────────────┘
```
## 数据协议
### 信号定义解析 (`SplitSignalName`)
FDA 数据包中使用 XML 风格的信号定义:
```xml
<Module name="酸洗段">
<Signal name="C308_ACD_SPEED_ACT" item="ACD_SPEED" no="1234"/>
...
</Module>
```
解析结果存入 `mp_tagid`item名→item编号`mp_addr`(索引→地址结构)。
### 数据值解析 (`SplitSignal`)
每个数据包包含浮点值数组和时间偏移,按地址索引存入 `mp_tagdat`tag名→值列表
### 信号组装 (`AssembleTeles`)
根据数据库 `T_LOV_FDAAITEM` 配置的地址模式,将原始标签值映射到遥测项:
- **NORMAL 模式**: 直接取浮点值
- **BINARY 模式**: 从整数值中按位提取
### 断线检测
如果前 3 个值为 -1判定为 PLC/FDA 断线,丢弃数据不转发。
## 多实例支持
根据进程名长度确定事件号:若 `name()` > 4 字符,`eventNo = 2000 + atoi(id)`支持多个实例zsub1→2001, zsub2→2002...
## ICE 代理
| 目标 | 条件 | 用途 |
|------|------|------|
| `baosight/zprx` | eventNo=2016 | 代理转发 |
| `baosight/znode` | eventNo=2000 | 节点数据 |
| `baosight/ztrk/zmtr/zmc` | eventNo=1000 | 跟踪数据 |
| `baosight/ptg` | eventNo=2007 | 报警转发 |
## ICE 接口
| 方法 | 说明 |
|------|------|
| `SendDataShort` | 空操作zsub 是纯数据接收端) |
| `SendDataLong` | 空操作 |
| `TimeNotify` | 空操作 |
## 现场适用场景
zsub 是**冷轧/热轧生产线的 FDA 数据接收器**,适用于现场已部署 FDA 服务器,通过 TCP 订阅方式获取 PLC 数据的场景。接收的信号包括:轧制力、张力、厚度、温度、压力、速度、设备状态位等。
## 源文件
```
src/zsub/
├── zsub.cpp # PACE 组件入口
├── zsubICEI.cpp # ICE servant
├── SubscribeFDA.cpp # TCP 订阅线程
├── HandleMessage.cpp # 主消息处理线程(信号解析、缓存、转发)
└── HandleMessage008.cpp # 事件 008 专用处理器(温度转换、模型预测值等)
```

81
src/zudp/zudp_readme.md Normal file
View File

@ -0,0 +1,81 @@
# zudp — UDP 数据接收器
## 概述
zudp 是 EIS 系统中的 **UDP 协议数据接收器**。它通过 UDP 接收原始二进制数据包,缓存到共享内存,并通过 ICE 代理转发给下游服务。与 zsub 不同zudp **不解析数据内容**,仅做透明转发。
## 进程架构
```
UDP 数据源
│ UDP 数据包
┌──────────────────────────────────────┐
│ zudp │
│ │
│ UdpConnection 接收线程 │
│ │ │
│ ├→ 从 config/udpconfig.json 读取│
│ │ 服务器 IP/端口配置 │
│ ├→ 接收 UDP 数据报 │
│ └→ 推入 gb_qtcache_udp 队列 │
│ │
│ HandleMessage 处理线程 │
│ │ │
│ ├→ 从 gb_qtcache_udp 取消息 │
│ ├→ 构造 Ice::ByteSeq │
│ ├→ CMemFix<PLC_DATA> 共享内存缓存│
│ ├→ ICE Proxy() 转发 │
│ │ └→ 目标由 udpconfig.json 配置 │
│ └→ eventNo=1004: │
│ 额外转发到 zprx │
│ │
└──────────────────────────────────────┘
```
## 与 zsub 的区别
| 方面 | zsub | zudp |
|------|------|------|
| 传输协议 | TCP (流式) | UDP (数据报) |
| 数据源 | FDA 服务器 (订阅) | 任意 UDP 源 |
| 数据处理 | 解析信号名/值,映射到遥测项 | 不解析,透明转发 |
| 配置方式 | INI 属性文件 | JSON 配置文件 |
| 适用场景 | 标准 FDA 数据采集 | 低延迟/广播式数据中继 |
## 配置
`$CRGS/config/udpconfig.json` 读取,按服务名索引:
```json
{
"zudp": {
"ip": "192.168.1.x",
"port": 1234,
"proxy": "baosight/zcache"
}
}
```
## ICE 接口
| 方法 | 说明 |
|------|------|
| `SendDataShort` | 空操作 |
| `SendDataLong` | 空操作 |
| `TimeNotify` | 空操作 |
zudp 是纯客户端 — 接收 UDP 数据后通过 ICE 代理转发。
## 现场适用场景
zudp 适用于需要低延迟、无需建立 TCP 连接的数据接收场景,通常用于**对实时性要求极高的 DSC 控制信号或广播式数据源**。
## 源文件
```
src/zudp/
├── zudp.cpp # PACE 组件入口
├── zudpICEI.cpp # ICE servant + UDP 连接 + 消息处理器创建
└── HandleMessage.cpp # 数据转发逻辑
```