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 嵌套构成。
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 |
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 字节 |
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 (可变长度):实际数据内容。
3.5 List 结构
List 是 SECS-II 中用于组织多个 Data Item 或子 List 的容器。List 本身也是一个特殊的 Data Item,其 Format Code 为 0x00。List 的 Length 表示包含的子项数量,而不是字节数。
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
解析步骤:
- 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
- Message Body (剩余字节):
00 03 40 05 48 45 4C 4C 4F 80 02 00 64 00 02 40 03 57 4F 52 4C 4400 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"
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 字节长度) |
0x70 (INT1),长度字段固定为 1 字节,如果收到长度大于 1 的数据,应视为协议错误并记录日志。