106 lines
4.1 KiB
Markdown
106 lines
4.1 KiB
Markdown
|
|
# 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 专用处理器(温度转换、模型预测值等)
|
|||
|
|
```
|