3、消息结构详解:Message Header、Data Item、Stream & Function、Block与Multi-Block
SECS/GEM 协议的核心是设备与主机之间交换的结构化消息。理解消息的底层结构——从字节级的 Header 到逻辑级的 Block——是正确配置超时参数和设计重传策略的前提。本章将逐层拆解消息的构成要素,并揭示它们与通信可靠性的内在联系。
3.1 消息层级总览
一条完整的 SECS 消息从物理传输到业务解析,共经历四个抽象层级。下表总结了各层级的职责与关键字段:
| 层级 | 名称 | 核心职责 | 关键字段/概念 |
|---|---|---|---|
| L4 | Stream & Function | 定义消息的业务语义(如“发送设备状态数据”) | SxFy (如 S1F1, S2F17) |
| L3 | Data Item | 承载具体的数据载荷(如设备ID、报警文本) | 格式码 (Format Code)、长度、值 |
| L2 | Block | 实现消息的分片与重组,适配底层传输单元 | Block Number, Block Flag, Device ID |
| L1 | Message Header | 提供传输控制信息(长度、方向、应答要求) | Length, S/F, W-Bit, System Bytes |
3.2 Message Header:消息的“信封”
每个 SECS 消息(无论是单 Block 还是 Multi-Block)都以一个固定长度的 Header 开头。Header 是接收方判断消息类型、长度和是否需要回复的第一依据。
Message Header 结构(10 字节固定长度):
字节偏移 字段名 长度(字节) 说明
0-3 Length 4 消息体总长度(Header + Data,不含 Length 自身)
4 Device ID 1 设备标识(低7位有效,bit7为0)
5 Stream & Function 1 Stream号(高7位) + Function号(低7位) + W-Bit(bit7)
6 Block Number 1 当前Block序号(从1开始)
7 Block Flag 1 bit7=1: 最后一块; bit6=1: 需要ACK; 其余保留
8-9 System Bytes 2 系统字节,用于匹配请求与响应
其中 W-Bit(Wait-Bit)是超时参数 T3 的直接关联字段:
- W-Bit = 1:发送方要求接收方必须回复一个 Primary Message(即 SxFy 的 Reply 消息)。发送方在发送后启动 T3 计时器。
- W-Bit = 0:发送方不期望回复,属于“发后即忘”消息(如某些 Event 通知)。
3.3 Data Item:消息的“内容”
Data Item 是 SECS 消息中承载实际数据的单元。每个 Data Item 由三部分组成:格式码(Format Code)、长度(Length)和值(Value)。
格式码定义了数据类型,常见格式码如下:
| 格式码 (Hex) | 类型 | 说明 | 示例 |
|---|---|---|---|
| 0x00 | List | 容器,包含多个子 Item | 设备状态列表 |
| 0x10 | Binary | 字节数组 | 原始传感器数据 |
| 0x20 | Boolean | 布尔值(1字节) | True/False |
| 0x40 | ASCII | 字符串 | 设备名称、报警文本 |
| 0x60 | I8 | 8字节有符号整数 | 高精度计数器 |
| 0x70 | F8 | 8字节浮点数 | 工艺参数 |
Data Item 的嵌套结构(以 List 为例)直接影响消息的解析复杂度,进而影响超时窗口的估算:
Message: S1F1 (Are You There)
Data: List (0x00 0x02) -- 包含2个子Item
├── ASCII (0x41 0x05) "MDL01" -- 设备型号
└── ASCII (0x41 0x03) "001" -- 设备版本
3.4 Stream & Function:消息的“语义标签”
Stream 和 Function 共同构成 SECS 消息的业务标识。Stream 定义消息类别,Function 定义具体操作。标准 SECS-II 定义了 0~127 个 Stream,每个 Stream 下最多 255 个 Function。
常用 Stream 及其用途:
| Stream | 名称 | 典型 Function 示例 |
|---|---|---|
| S1 | 设备状态 | S1F1 (Are You There), S1F13 (Establish Communications) |
| S2 | 设备控制 | S2F17 (Date Time Set), S2F41 (Host Command) |
| S5 | 报警 | S5F1 (Alarm Report), S5F3 (Enable/Disable Alarm) |
| S6 | 数据收集 | S6F11 (Event Report), S6F15 (Trace Data) |
| S7 | 设备参数 | S7F1 (Process Program Load), S7F19 (Current Equipment Constant) |
Function 编号的奇偶性决定了消息方向:
- 奇数 Function:Primary Message(请求方发出,如 S1F1)。
- 偶数 Function:Secondary Message(响应方回复,如 S1F2)。
3.5 Block 与 Multi-Block:消息的“分片与重组”
当消息总长度超过底层传输单元的限制(HSMS 默认 4KB,SECS-I 默认 256 字节),发送方必须将消息拆分为多个 Block。接收方根据 Block Number 和 Block Flag 进行重组。
Block 结构的关键字段:
- Block Number:从 1 开始递增,标识分片顺序。
- Block Flag (bit7):E-Bit (End Bit)。1 表示当前 Block 是消息的最后一块;0 表示后续还有 Block。
- Block Flag (bit6):A-Bit (Acknowledge Bit)。1 表示接收方需对每个 Block 回复 ACK(用于可靠传输);0 表示无需逐块确认。
Multi-Block 传输流程(以 3-Block 消息为例):
发送方 接收方
| |
|--- Block 1 (E=0, A=1) ----->| (启动 T3 计时)
|<--- ACK for Block 1 --------| (停止 T3)
|--- Block 2 (E=0, A=1) ----->| (启动 T3)
|<--- ACK for Block 2 --------| (停止 T3)
|--- Block 3 (E=1, A=1) ----->| (启动 T3,等待完整消息回复)
|<--- Secondary Message -------| (停止 T3,消息重组完成)
以下 SVG 图展示了 Multi-Block 消息从分片到重组的完整生命周期:
3.6 消息结构与超时参数的关联
理解消息结构后,可以更精准地配置超时参数。下表总结了各结构要素与超时参数的映射关系:
| 消息结构要素 | 关联超时参数 | 优化建议 |
|---|---|---|
| W-Bit = 1 (Primary Message) | T3 (Reply Timeout) | 根据网络 RTT 和消息处理时间设置,通常 30~60s |
| Multi-Block (E-Bit = 0) | T3 (逐块等待 ACK) | 增大 T3 或启用 T6 流控,避免逐块超时 |
| Block Flag A-Bit = 1 | T3 (等待 ACK) | 仅在可靠传输场景使用,减少不必要的 ACK 开销 |
| Large Data Item (List 嵌套深) | T3 (解析耗时) | 控制 Data Item 层级 ≤ 5 层,降低解析延迟 |
| System Bytes 不匹配 | T3 (无法匹配回复) | 确保 System Bytes 唯一且不重复使用 |