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
关键认知: 超时参数 T3(Reply Timeout)和 T5(Connect Timeout)直接作用于 L2 和 L1 层;而重传策略的触发条件(如未收到 ACK 或 Reply)则依赖于对 Block Flag 和 W-Bit 的正确解析。

3.2 Message Header:消息的“信封”

每个 SECS 消息(无论是单 Block 还是 Multi-Block)都以一个固定长度的 Header 开头。Header 是接收方判断消息类型、长度和是否需要回复的第一依据。

字节序约定: SECS-I (RS-232) 使用大端序 (Big-Endian);HSMS (TCP/IP) 同样使用大端序。所有多字节字段(如 Length, System Bytes)均需按网络字节序解析。

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 通知)。
常见配置错误: 若设备将 W-Bit 置 1 但主机未配置对应的 Reply 消息,会导致 T3 超时并触发重传,造成总线拥堵。务必在 GEM 配置文件中明确声明所有 Primary/Secondary 消息对。

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"    -- 设备版本
重传优化提示: 对于包含大量 Data Item 的消息(如 S6F11 报警报告),建议将总长度控制在单个 Block 的 MTU 内(通常 4KB),避免触发 Multi-Block 分片。分片越多,T3 超时重传的概率越高。

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)。
W-Bit 与 Function 的配合: 只有 Primary Message(奇数 Function)才能设置 W-Bit=1。Secondary Message 的 W-Bit 必须为 0。这是协议强制规则,违反会导致通信异常。

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,消息重组完成)
超时风险点: 若网络延迟较高,每个 Block 的 ACK 都可能触发 T3 超时。建议在 Multi-Block 场景下适当增大 T3 值(如从 45s 增至 60s),或使用 HSMS 的 T6(Control Timeout)配合流控机制。

以下 SVG 图展示了 Multi-Block 消息从分片到重组的完整生命周期:

Multi-Block 消息分片与重组流程 Multi-Block 消息分片与重组流程 发送方 (Host/Equipment) 接收方 (Equipment/Host) 原始消息 (12KB) 分片器 Block 1 (4KB) Block 2 (4KB) Block 3 (4KB) E=1 Block 1 (E=0, A=1) ACK 1 Block 2 (E=0, A=1) ACK 2 Block 3 (E=1, A=1) 重组器 完整消息 (12KB) T3 计时器在每次发送 Block 后启动 收到 ACK 或 Secondary Message 后停止

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 唯一且不重复使用
实践建议: 在设备调试阶段,使用协议分析仪(如 SECS Monitor)抓取消息流,逐一核对 Header 中的 W-Bit、E-Bit、A-Bit 和 System Bytes。任何一位的错误都可能导致超时重传风暴。建议将抓包结果与 GEM 配置文件交叉验证,确保消息结构定义与实际实现一致。