4. SECS-II 消息结构基础
SECS-II 是 SEMI 标准中定义的消息内容层,它规定了如何在 SECS-I 或 HSMS 传输的字节流中组织具体的数据。一条完整的 SECS-II 消息由消息头(Message Header)和消息体(Message Body / Item)两部分组成。消息头负责路由和识别,消息体承载实际的设备数据。
4.1 消息头格式(Message Header)
SECS-II 消息头长度为 10 个字节(在 SECS-I 中)或 16 个字节(在 HSMS 中)。以下以最常用的 HSMS 消息头为例,其核心字段包括:Device ID、Stream、Function、W-bit、System Bytes。
| 字节偏移 | 字段名称 | 长度(字节) | 说明 |
|---|---|---|---|
| 0-1 | Device ID | 2 | 设备标识符,用于区分同一链路上的不同设备(通常为 0)。 |
| 2-3 | Stream / Function | 2 | 高字节为 Stream(类别),低字节为 Function(具体命令)。 |
| 4 | W-bit + 保留位 | 1 | Bit7 为 W-bit(等待位),其余位保留。 |
| 5-7 | System Bytes | 3 | 系统字节,用于消息配对和超时管理。 |
| 8-9 | Header Byte 2 / 保留 | 2 | HSMS 专用,通常为 0x0000。 |
4.1.1 Device ID(设备标识)
Device ID 是一个 16 位的无符号整数,用于在 SECS 通信链路上唯一标识一个设备。在点对点连接中,Device ID 通常设置为 0。在多点连接中,每个设备拥有独立的 Device ID。消息发送方将目标设备的 Device ID 填入消息头。
4.1.2 Stream 和 Function(消息类型)
Stream 和 Function 共同构成 SECS-II 的消息类型编码,格式为 S<n>F<m>,其中 n 为 Stream 编号,m 为 Function 编号。
- Stream(流):表示消息的类别。例如 Stream 1 用于设备间基本通信,Stream 2 用于设备控制和状态,Stream 6 用于数据收集。
- Function(功能):表示该类别下的具体命令。例如 S1F1 是“Are You There”请求,S1F2 是“Are You There”回复。
4.1.3 W-bit(等待位)
W-bit 是消息头第 4 字节的最高位(Bit 7)。它指示发送方是否期望接收方回复一条应答消息。
- W-bit = 1:发送方要求接收方必须回复一条对应的 Secondary 消息。
- W-bit = 0:发送方不要求回复,消息为“发后即忘”类型。
W-bit 通常只在 Primary 消息(奇数 Function)中设置为 1。Secondary 消息(偶数 Function)的 W-bit 通常为 0。
4.1.4 System Bytes(系统字节)
System Bytes 是一个 24 位的无符号整数(3 字节),由消息发送方生成,用于唯一标识一次消息交换事务。接收方在回复消息时,必须将回复消息的 System Bytes 设置为与请求消息相同的值。这样发送方就能将回复与之前的请求配对。
4.2 消息体(Item)概念
消息体是 SECS-II 消息中承载实际数据的部分,由一系列 Item(数据项) 组成。Item 是 SECS-II 数据的基本单元,采用 TLV(Type-Length-Value) 格式编码。多个 Item 可以嵌套形成树形结构,用于表达复杂的数据集合。
4.2.1 Item 的 TLV 结构
每个 Item 由三部分组成:
- Type(类型):1 字节,标识数据类型(如 List、Binary、ASCII、U4 等)。
- Length(长度):1-3 字节,标识 Value 部分的字节数。
- Value(值):实际数据内容,长度由 Length 字段指定。
| Item 类型 | 格式码 | 说明 | 示例 |
|---|---|---|---|
| List | 0x00 | 包含子 Item 的容器 | L[3] 表示包含 3 个子 Item |
| Binary | 0x20 | 原始字节数据 | 0x01 0x02 0x03 |
| Boolean | 0x24 | 布尔值(TRUE/FALSE) | 0x01 表示 TRUE |
| ASCII | 0x40 | ASCII 字符串 | "Hello" |
| U4 | 0xA0 | 32 位无符号整数 | 0x00000064 = 100 |
| F8 | 0xE0 | 64 位浮点数 | 3.14159 |
4.2.2 Item 嵌套示例
以下是一个典型的 SECS-II 消息体结构,用于报告设备状态:
消息体(根 List):
L[3] -- 根 List,包含 3 个子 Item
+-- L[2] -- 子 List 1:设备 ID 和名称
| +-- U4: 1001 -- 设备 ID
| +-- A: "Etch1" -- 设备名称
+-- L[2] -- 子 List 2:状态和值
| +-- A: "TEMP" -- 状态名称
| +-- F8: 23.5 -- 温度值
+-- L[1] -- 子 List 3:时间戳
+-- A: "2025-01-15 10:30:00"
4.3 消息头与消息体的组合
一条完整的 SECS-II 消息是消息头和消息体的组合。消息头提供路由和控制信息,消息体提供具体数据。以下是一个实际消息示例:
消息头:
Device ID: 0x0000
Stream/Function: 0x0101 (S1F1 - Are You There)
W-bit: 1 (需要回复)
System Bytes: 0x000001
消息体:
L[0] -- 空 List,S1F1 不需要额外数据
4.4 本章小结
- SECS-II 消息由消息头和消息体组成。
- 消息头包含 Device ID、Stream/Function、W-bit、System Bytes 等关键字段。
- 消息体由 Item 组成,采用 TLV 格式编码,支持嵌套形成树形结构。
- 理解消息头和消息体的结构是解析和构造 SECS-II 消息的基础。