4. SECS-II消息结构

SECS-II 是 SEMI E5 标准定义的消息内容层协议,它规定了设备与主机之间“说什么”以及“怎么说”。一条 SECS-II 消息并不是一段自由文本,而是由流(Stream)、功能(Function)、数据项(Data Item)、消息头(Message Header)和系统字节(System Bytes)共同构成的严格结构化报文。理解这套结构,是排查通信异常、解析日志和开发 GEM 接口的基础。

一、流与功能:消息的“姓”与“名”

SECS-II 用两个字节来标识消息类型:第一个字节是流号(Stream),第二个字节是功能号(Function)。流号表示消息的业务类别,功能号表示该类别下的具体动作。例如 S1F1 表示“流1、功能1”,即 Are You There 请求;S1F2 是其应答。流号范围通常为 0~127,功能号范围 0~255,其中奇数功能一般表示请求(Primary),偶数功能表示应答(Secondary)。

常见流分类如下:

  • S1:设备状态与通信建立,如 S1F1/S1F2、S1F13/S1F14。
  • S2:设备控制与诊断,如 S2F41 远程命令。
  • S5:报警管理,如 S5F1 报警上报。
  • S6:事件与数据采集,如 S6F11 事件报告。
  • S7:配方管理,如 S7F3 配方发送。

二、数据项:SECS-II 的“数据类型系统”

数据项是消息体中承载实际参数的最小单元。每个数据项由格式字节和长度字节开头,后跟具体数据。格式字节的高 6 位表示格式码,低 2 位表示长度字节数(1、2 或 3 字节)。常见格式码包括:

格式码类型说明示例
0o20B二进制,1 字节0x01
0o21BOOLEAN布尔值TRUE/FALSE
0o30AASCII 字符串"EQP01"
0o31JIS-8日文编码字符串—
0o34I11 字节有符号整数-5
0o36I22 字节有符号整数1000
0o38I44 字节有符号整数100000
0o40F44 字节浮点数3.14
0o44F88 字节浮点数3.1415926
0o00L列表,可嵌套<L [A "X", I2 5]>

列表(List)是 SECS-II 中最重要的复合结构,它本身不携带数据,只用于组织子数据项。例如 S6F11 的事件报告就是典型的嵌套列表结构。

三、消息头与系统字节

消息头是 SECS-II 消息的“信封”,固定 10 字节,位于消息体之前。其结构为:

字节 0-1:设备ID(Device ID),2 字节无符号整数
字节 2  :W-bit + Stream,高 1 位为 W-bit,低 7 位为流号
字节 3  :Function,功能号
字节 4  :P-bit + 保留位,通常为 0
字节 5  :SECS-II 消息类型/保留
字节 6-9:System Bytes,4 字节系统字节

系统字节(System Bytes)是消息头中最关键的字段之一。它由发送方生成,用于将请求与应答配对。主机发送 S1F1 时携带一个系统字节值,设备回复 S1F2 时必须原样返回同一个值。这样即使多条消息并发,双方也能准确匹配。系统字节通常由递增计数器生成,范围 0~0xFFFFFFFF。

四、W-bit:等待位与事务语义

W-bit(Wait-bit)位于消息头第 2 字节的最高位,用于指示发送方是否需要对方回复。当 W-bit = 1 时,表示这是一条需要应答的请求消息,接收方必须回复对应的偶数功能消息;当 W-bit = 0 时,表示这是一条不需要应答的单向消息,接收方不应回复。

关键规则:W-bit 只对奇数功能(Primary)有意义。偶数功能(Secondary)作为应答消息,其 W-bit 通常为 0。如果主机发送 S1F1 时 W-bit=1,设备必须回复 S1F2;如果 W-bit=0,设备不应回复,否则会造成通信混乱。

五、消息编码规则与示例解析

一条完整的 SECS-II 消息在 HSMS 或 SECS-I 上传输时,编码顺序为:消息头(10 字节)→ 消息体(数据项序列)。消息体中的每个数据项按“格式字节 + 长度字节 + 数据”依次排列,列表则递归嵌套。

以 S1F1(Are You There)为例,其消息体为空,编码如下:

消息头:
  00 00        // Device ID = 0
  81           // W-bit=1, Stream=1
  01           // Function=1
  00           // P-bit=0
  00           // 保留
  00 00 00 01  // System Bytes = 1
消息体:无

再看 S1F2 应答,消息体通常包含设备型号和软件版本:

消息头:
  00 00
  01           // W-bit=0, Stream=1
  02           // Function=2
  00
  00
  00 00 00 01  // 原样返回 System Bytes = 1
消息体:
  01 02 41 42  // L, 2 个元素
  41 03 45 51  // A, 长度3, "EQ"
  41 05 31 2E 30  // A, 长度5, "1.0"

对于更复杂的 S6F11 事件报告,消息体是一个多层嵌套列表,通常包含 Data ID、CEID、Report ID 以及一组报告数据。解析时必须严格按照列表层级逐层展开,不能按字节流线性读取。

常见误区:很多初学者会把系统字节当成“消息序号”随意修改,或者在应答时重新生成系统字节,导致主机无法匹配请求与应答。正确做法是:应答消息必须原样复制请求消息的系统字节。此外,W-bit 与功能号的奇偶性必须一致,否则会被对方视为协议错误。

六、复盘:从日志到结构

在实际排障中,拿到一段 SECS-II 日志后,建议按以下顺序分析:先看消息头的 10 个字节,确认 Stream、Function、W-bit 和 System Bytes;再根据 Stream/Function 判断消息语义;最后按数据项格式逐层解析消息体。只要掌握“流定类别、功能定动作、W-bit 定应答、系统字节定配对、数据项定内容”这条主线,绝大多数 SECS-II 消息都能快速读懂。

SECS-II 消息结构总览 消息头(10 字节) Device ID 2 字节 W-bit + Stream 1 位 + 7 位 Function 1 字节 P-bit 1 字节 保留 1 字节 System Bytes 4 字节 消息体(数据项序列) 格式字节 高6位格式码 + 低2位长度字节数 长度字节 1~3 字节 数据内容 按格式码解释 列表(L)嵌套示例:S6F11 事件报告 L [3] Data ID CEID Report [n] VID + 值 W-bit 规则 W=1 → 需要应答 W=0 → 无需应答 应答须回传相同 System Bytes

掌握上述结构后,无论是阅读设备厂商的 SECS 日志,还是使用 EAP 工具抓包分析,都能快速定位到消息的流、功能、数据项和系统字节,从而判断通信是否正常、应答是否匹配、数据格式是否正确。这是 GEM 自动化集成中最基础也最核心的一项技能。