2. SECS 消息结构
SECS 消息是半导体设备与主机(Host)之间通信的基本数据单元。理解其结构是进行协议分析、测试与故障排除的基础。SECS 消息遵循严格的层级格式,由固定长度的消息头(Message Header)和可变长度的消息体(Message Body)组成。
2.1 消息头格式(Message Header)
每个 SECS 消息都以一个 10 字节的固定长度消息头开始。消息头包含了路由、识别和控制消息处理的关键信息。
| 字节偏移 | 字段名称 | 长度(字节) | 描述 |
|---|---|---|---|
| 0-1 | Length | 2 | 消息体长度(字节数),不包括消息头本身。大端序。 |
| 2-3 | Device ID | 2 | 设备标识符。低 15 位为设备 ID,最高位为控制位(0=正常,1=控制消息)。 |
| 4 | Stream | 1 | 消息流编号(0-255)。用于对消息进行主要分类。 |
| 5 | Function | 1 | 消息功能编号(0-255)。与 Stream 共同构成 SxFy 格式。 |
| 6 | PType | 1 | 处理类型(Processing Type)。通常为 0。 |
| 7 | SType | 1 | 会话类型(Session Type)。0=数据消息,其他值用于会话控制。 |
| 8-9 | System Bytes | 2 | 系统字节。用于消息配对(请求/响应),通常由发送方生成唯一值。 |
测试要点: 在抓包分析时,优先检查 System Bytes 是否唯一且正确配对。重复的 System Bytes 是导致通信超时和消息丢失的常见原因。
2.2 数据项类型(Data Item Types)
SECS 消息体由数据项(Data Item)组成。每个数据项包含一个格式字节(Format Byte)、长度字节和实际数据。SECS/GEM 定义了丰富的数据类型以适应半导体设备的各种数据需求。
2.3 数据项类型详解
下表列出了 SECS 协议中所有标准数据项类型及其编码规则:
| 类型名称 | 格式代码(Hex) | 长度 | 描述与典型用途 |
|---|---|---|---|
| List | 0x01 | 可变 | 数据项容器,可嵌套包含其他数据项。用于结构化数据。 |
| ASCII | 0x41 | 可变 | 可打印 ASCII 字符串。用于设备 ID、状态文本、错误描述。 |
| Binary | 0x21 | 可变 | 原始字节数据。用于传输固件、配置块、非文本数据。 |
| Boolean | 0x25 | 1 字节 | 布尔值(0x00=False, 0x01=True)。用于开关状态、使能标志。 |
| U1 | 0xA1 | 1 字节 | 无符号 8 位整数(0 到 255)。用于小范围计数、状态码。 |
| U2 | 0xA2 | 2 字节 | 无符号 16 位整数(0 到 65535)。大端序。 |
| U4 | 0xA4 | 4 字节 | 无符号 32 位整数(0 到 4294967295)。大端序。 |
| I1 | 0xB1 | 1 字节 | 有符号 8 位整数(-128 到 127)。 |
| I2 | 0xB2 | 2 字节 | 有符号 16 位整数(-32768 到 32767)。大端序。 |
| I4 | 0xB4 | 4 字节 | 有符号 32 位整数(-2147483648 到 2147483647)。大端序。 |
| F4 | 0x84 | 4 字节 | 单精度浮点数(IEEE 754)。用于测量值、温度、压力。 |
| F8 | 0x88 | 8 字节 | 双精度浮点数(IEEE 754)。用于高精度计量数据。 |
故障排除提示: 数据项类型不匹配是 SECS 通信中最常见的错误之一。例如,主机期望一个 U2 类型的数据项,但设备发送了 I2 类型,会导致解析错误。测试时应使用协议分析器验证每个数据项的格式字节。
2.4 Stream 与 Function 概念
SECS 消息通过 Stream (S) 和 Function (F) 的组合来唯一标识消息的用途和方向。格式为 SxFy,其中 x 为 Stream 编号,y 为 Function 编号。
- Stream:消息的主要类别。例如,Stream 1 用于设备状态和控制,Stream 2 用于设备数据收集,Stream 6 用于报警管理。
- Function:在特定 Stream 下的具体操作。Function 编号的奇偶性表示消息方向:
- 奇数 Function:主设备(Host)向从设备(Equipment)发送的请求(Primary Message)。
- 偶数 Function:从设备向主设备发送的响应或事件通知(Secondary Message)。
2.5 常见 Stream 与 Function 速查表
以下是 SECS/GEM 协议中最常用的 Stream/Function 组合,测试和故障排除时应熟记:
| Stream | Function | 方向 | 名称 | 用途 |
|---|---|---|---|---|
| 1 | 1 | H→E | Are You There Request | 主机检查设备是否在线 |
| 1 | 2 | E→H | On Line Data | 设备响应在线状态 |
| 1 | 13 | H→E | Establish Communications Request | 建立通信会话 |
| 1 | 14 | E→H | Establish Communications Acknowledge | 确认通信建立 |
| 2 | 33 | H→E | Data Variable Get Request | 获取设备数据变量 |
| 2 | 34 | E→H | Data Variable Get Response | 返回数据变量值 |
| 6 | 11 | E→H | Event Report Send | 设备主动上报事件 |
| 6 | 12 | H→E | Event Report Acknowledge | 主机确认事件接收 |
常见陷阱: 不要混淆 Stream 和 Function 的编号。例如,S1F13 是建立通信请求,而 S13F1 是完全不同的消息(用于远程命令)。在测试脚本和日志分析中,务必确认 SxFy 的完整格式。
2.6 消息结构示例
以下是一个完整的 SECS 消息示例(S1F1 请求),展示消息头和消息体的实际编码:
消息头 (10 字节):
00 02 ; Length = 2 (消息体长度为 2 字节)
00 01 ; Device ID = 1
01 ; Stream = 1
01 ; Function = 1 (奇数,表示请求)
00 ; PType = 0
00 ; SType = 0 (数据消息)
12 34 ; System Bytes = 0x1234
消息体 (2 字节):
41 00 ; ASCII 数据项,长度为 0(空字符串)
解析结果: S1F1 (Are You There Request) 来自 Device ID 1,System Bytes=0x1234
测试实践: 使用 SECS 模拟器发送 S1F1 消息,并验证设备是否回复 S1F2。如果无响应,首先检查消息头中的 Device ID 和 System Bytes 是否正确。这是最基础的连通性测试。