3. SECS-II 消息结构解析:Message Header、Data Item、List、Format Code 详解

SECS-II 是 SEMI 标准 E5 定义的消息层协议,它规定了设备与主机之间交换数据的结构化格式。理解 SECS-II 消息结构是解析日志、定位 GEM 功能故障的基础。本节将深入拆解 SECS-II 消息的四个核心组成部分:Message Header(消息头)、Data Item(数据项)、List(列表)以及Format Code(格式码)。

3.1 SECS-II 消息整体结构

一条完整的 SECS-II 消息由 Message Header 和 Message Body 组成。Message Header 固定 10 个字节,用于路由和控制;Message Body 则包含实际的数据负载,由 Data Item 和 List 嵌套构成。

关键概念:SECS-II 消息采用 TLV(Type-Length-Value)编码方式,其中 Type 由 Format Code 定义,Length 指明数据长度,Value 为实际数据或子结构。
SECS-II 消息整体结构 SECS-II 消息结构 Message Header (10 字节) Message Body (可变长度) 由 Data Item、List、Format Code 嵌套构成 固定长度 可变长度

3.2 Message Header 详解

Message Header 固定 10 字节,包含 5 个字段,每个字段 2 字节(16 位)。Header 决定了消息的路由方向、会话标识和消息类型。

字节偏移 字段名称 说明 典型值示例
0-1 Device ID 设备标识符,用于区分多设备环境 0x0001
2-3 Message ID (Stream & Function) 高字节为 Stream,低字节为 Function 0x0101 (S1F1)
4-5 Reply Expected 是否需要回复:0x8000 表示需要,0x0000 表示不需要 0x8000
6-7 Block Number 消息块编号,用于多块传输 0x0001
8-9 System Bytes 系统字节,用于匹配请求与响应 0x1234
日志分析技巧:在 SECS/GEM 日志中,Message Header 通常以十六进制字符串形式出现。例如 0001 0101 8000 0001 1234 表示:Device ID=1,S1F1 消息,需要回复,块号 1,系统字节 0x1234。检查 System Bytes 是否匹配是定位超时故障的关键。

3.3 Format Code 详解

Format Code 是 SECS-II 数据类型的标识符,占用 1 字节。它定义了后续数据的编码格式和长度计算方式。Format Code 的高 4 位表示类型,低 4 位表示长度位数。

Format Code (十六进制) 类型名称 说明 长度位数
0x00 LIST 列表,包含多个数据项 1-4 字节
0x10 BIN 二进制数据 1-4 字节
0x20 BOOLEAN 布尔值 (00/01) 1-4 字节
0x40 ASCII ASCII 字符串 1-4 字节
0x60 INT8 8 位有符号整数 1-4 字节
0x70 INT1 1 字节有符号整数 1 字节
0x80 INT2 2 字节有符号整数 1-4 字节
0x90 INT4 4 字节有符号整数 1-4 字节
0xA0 UINT8 8 位无符号整数 1-4 字节
0xB0 UINT1 1 字节无符号整数 1 字节
0xC0 UINT2 2 字节无符号整数 1-4 字节
0xD0 UINT4 4 字节无符号整数 1-4 字节
0xE0 FLOAT4 4 字节浮点数 1-4 字节
0xF0 FLOAT8 8 字节浮点数 1-4 字节
常见故障点:Format Code 解析错误是日志解析中最常见的问题。例如,将 0x40 (ASCII) 误解析为 0x60 (INT8) 会导致数据乱码。在日志中,如果看到 ASCII 字符串显示为数字序列,请检查 Format Code 是否匹配。

3.4 Data Item 结构

Data Item 是 SECS-II 消息中的最小数据单元,由三部分组成:Format Code、Length 和 Value。Length 字段的字节数由 Format Code 的低 4 位决定。

  • Format Code (1 字节):标识数据类型。
  • Length (1-4 字节):表示 Value 的字节数。长度位数由 Format Code 低 4 位指定:0x0n 表示 n 字节长度。
  • Value (可变长度):实际数据内容。
Data Item 结构 Data Item 结构 (TLV 编码) Format Code 1 字节 Length 1-4 字节 Value 可变长度 (由 Length 指定) 示例:0x40 0x05 "HELLO" → ASCII 字符串,长度 5 字节

3.5 List 结构

List 是 SECS-II 中用于组织多个 Data Item 或子 List 的容器。List 本身也是一个特殊的 Data Item,其 Format Code 为 0x00。List 的 Length 表示包含的子项数量,而不是字节数。

List 嵌套规则:List 可以嵌套任意深度。在日志解析时,需要递归解析每个子项。常见的 GEM 消息如 S7F19 (Equipment Constant 请求) 通常包含多层 List 嵌套。
List 嵌套结构 List 嵌套结构示例 外层 List (Format Code = 0x00, Length = 3) Item 1: ASCII "MODEL" Item 2: INT4 12345 内层 List (Length=2) Sub-Item A: BOOLEAN Sub-Item B: UINT2

3.6 日志解析实战:从十六进制到结构化数据

以下是一个实际的 SECS-II 消息日志片段,我们将逐步解析其结构。

原始日志(十六进制):

00 01 01 01 80 00 00 01 12 34 00 03 40 05 48 45 4C 4C 4F 80 02 00 64 00 02 40 03 57 4F 52 4C 44

解析步骤:

  1. Message Header (10 字节): 00 01 01 01 80 00 00 01 12 34
    • Device ID: 0x0001
    • Stream/Function: 0x0101 (S1F1)
    • Reply Expected: 0x8000 (需要回复)
    • Block Number: 0x0001
    • System Bytes: 0x1234
  2. Message Body (剩余字节): 00 03 40 05 48 45 4C 4C 4F 80 02 00 64 00 02 40 03 57 4F 52 4C 44
    • 00 03 → 外层 List,包含 3 个子项
    • 40 05 48 45 4C 4C 4F → ASCII 字符串 "HELLO"
    • 80 02 00 64 → INT2 值 100 (0x0064)
    • 00 02 40 03 57 4F 52 4C 44 → 内层 List,包含 2 个子项,其中第一个是 ASCII "WORLD"
故障定位技巧:如果日志解析器报告 "Unexpected end of data" 或 "Length mismatch",请检查 List 的 Length 字段是否与实际子项数量一致。例如,如果外层 List 声明 Length=3,但实际只提供了 2 个子项,则解析会提前终止。这是 GEM 通信中常见的协议错误。

3.7 常见 Format Code 解析错误与排查

错误现象 可能原因 排查方法
ASCII 字符串显示为乱码 Format Code 被误判为 INT 或 BIN 检查日志中 Format Code 是否为 0x40
数值溢出或符号错误 INT/UINT 类型混淆 确认 Format Code 高 4 位 (0x6 vs 0xA)
List 解析提前终止 List Length 与实际子项数不匹配 手动计数子项数量,对比 Length 字段
长度字段读取错误 Format Code 低 4 位指定的长度位数与实际不符 验证低 4 位值 (0x0-0x3 对应 1-4 字节长度)
重要提示:在编写或调试 SECS/GEM 解析器时,务必对每个 Format Code 进行严格的边界检查。例如,对于 0x70 (INT1),长度字段固定为 1 字节,如果收到长度大于 1 的数据,应视为协议错误并记录日志。