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 字节)。常见格式码包括:
| 格式码 | 类型 | 说明 | 示例 |
|---|---|---|---|
| 0o20 | B | 二进制,1 字节 | 0x01 |
| 0o21 | BOOLEAN | 布尔值 | TRUE/FALSE |
| 0o30 | A | ASCII 字符串 | "EQP01" |
| 0o31 | JIS-8 | 日文编码字符串 | — |
| 0o34 | I1 | 1 字节有符号整数 | -5 |
| 0o36 | I2 | 2 字节有符号整数 | 1000 |
| 0o38 | I4 | 4 字节有符号整数 | 100000 |
| 0o40 | F4 | 4 字节浮点数 | 3.14 |
| 0o44 | F8 | 8 字节浮点数 | 3.1415926 |
| 0o00 | L | 列表,可嵌套 | <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 日志,还是使用 EAP 工具抓包分析,都能快速定位到消息的流、功能、数据项和系统字节,从而判断通信是否正常、应答是否匹配、数据格式是否正确。这是 GEM 自动化集成中最基础也最核心的一项技能。