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