diff --git a/EIS_README.md b/EIS_README.md new file mode 100644 index 0000000..2391eeb --- /dev/null +++ b/EIS_README.md @@ -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.) diff --git a/src/rcv/rcv_readme.md b/src/rcv/rcv_readme.md new file mode 100644 index 0000000..9facc09 --- /dev/null +++ b/src/rcv/rcv_readme.md @@ -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 +``` diff --git a/src/zcache/zcache_readme.md b/src/zcache/zcache_readme.md new file mode 100644 index 0000000..5032a4d --- /dev/null +++ b/src/zcache/zcache_readme.md @@ -0,0 +1,98 @@ +# 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 # 核心: 地址映射、数据缓存、类型转换 +``` diff --git a/src/zdsf/zdsf_readme.md b/src/zdsf/zdsf_readme.md new file mode 100644 index 0000000..1338a6e --- /dev/null +++ b/src/zdsf/zdsf_readme.md @@ -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 初始化、标签订阅、回调处理 +``` diff --git a/src/zhd/zhd_readme.md b/src/zhd/zhd_readme.md new file mode 100644 index 0000000..9726490 --- /dev/null +++ b/src/zhd/zhd_readme.md @@ -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 数据 +- 使用 `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 # 定时器观察者(被禁用) +``` diff --git a/src/zinit/zinit_readme.md b/src/zinit/zinit_readme.md new file mode 100644 index 0000000..6238852 --- /dev/null +++ b/src/zinit/zinit_readme.md @@ -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` 模板 | +| `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` | 关系表 → 固定大小内存区域 | +| PLC 遥测 | `CMemTable` | 运行时原始数据环形缓冲 | +| 全局变量 | `GLB_VAR` | 系统参数常量 | + +## 源文件 + +``` +src/zinit/ +├── zinit.cpp # PACE 组件入口 +├── ZInitICEI.cpp # ICE servant:初始化触发 + 运行时缓存 +├── InitMag.cpp # 数据库→共享内存加载器 +└── CacheMag.cpp # 地址映射构建 + 遥测转换 +``` diff --git a/src/zmqc/zmqc_readme.md b/src/zmqc/zmqc_readme.md new file mode 100644 index 0000000..41f9cc2 --- /dev/null +++ b/src/zmqc/zmqc_readme.md @@ -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 两种模式) +``` diff --git a/src/zmqp/zmqp_readme.md b/src/zmqp/zmqp_readme.md new file mode 100644 index 0000000..7fcdf87 --- /dev/null +++ b/src/zmqp/zmqp_readme.md @@ -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 生产者封装 +``` diff --git a/src/zsub/zsub_readme.md b/src/zsub/zsub_readme.md new file mode 100644 index 0000000..23f4687 --- /dev/null +++ b/src/zsub/zsub_readme.md @@ -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() — 解析 │ + │ ├→ SplitSignal() — 解析数据值+时间戳 │ + │ ├→ CheckCache() — 找最小缓存深度 │ + │ ├→ AssembleTeles() — 标签→遥测项映射 │ + │ │ ├─ NORMAL: 直接赋值浮点数 │ + │ │ └─ BINARY: 从整数中提取位 │ + │ └→ MessageSend() │ + │ ├→ 共享内存 FDA_DATA 缓存 │ + │ └→ ICE 转发到 zprx/znode │ + │ │ + └──────────────────────────────────────────┘ +``` + +## 数据协议 + +### 信号定义解析 (`SplitSignalName`) + +FDA 数据包中使用 XML 风格的信号定义: +```xml + + + ... + +``` +解析结果存入 `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 专用处理器(温度转换、模型预测值等) +``` diff --git a/src/zudp/zudp_readme.md b/src/zudp/zudp_readme.md new file mode 100644 index 0000000..fc5018b --- /dev/null +++ b/src/zudp/zudp_readme.md @@ -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 共享内存缓存│ + │ ├→ 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 # 数据转发逻辑 +```