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:
parent
bd7e93ae68
commit
09b48b07e5
266
EIS_README.md
Normal file
266
EIS_README.md
Normal 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
95
src/rcv/rcv_readme.md
Normal 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
|
||||
```
|
||||
98
src/zcache/zcache_readme.md
Normal file
98
src/zcache/zcache_readme.md
Normal 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 做转换;eventNo≥2000 仅缓存 |
|
||||
| `SendDataLong` | 未实现 |
|
||||
| `TimeNotify` | 未实现 |
|
||||
|
||||
## 源文件
|
||||
|
||||
```
|
||||
src/zcache/
|
||||
├── zcache.cpp # PACE 组件入口
|
||||
├── ZcacheICEI.cpp # ICE servant: SendDataShort 入口
|
||||
└── CacheMag.cpp # 核心: 地址映射、数据缓存、类型转换
|
||||
```
|
||||
104
src/zdsf/zdsf_readme.md
Normal file
104
src/zdsf/zdsf_readme.md
Normal file
@ -0,0 +1,104 @@
|
||||
# zdsf — DSF 数据流订阅接收器
|
||||
|
||||
## 概述
|
||||
|
||||
zdsf 是 EIS 系统中的 **DSF(Data 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
102
src/zhd/zhd_readme.md
Normal 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
97
src/zinit/zinit_readme.md
Normal 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
85
src/zmqc/zmqc_readme.md
Normal 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
85
src/zmqp/zmqp_readme.md
Normal 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
105
src/zsub/zsub_readme.md
Normal 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
81
src/zudp/zudp_readme.md
Normal 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 # 数据转发逻辑
|
||||
```
|
||||
Loading…
Reference in New Issue
Block a user