3. SECS-II 消息结构:Stream 与 Function 的概念

SECS-II(SEMI E5)是 SEMI 标准中定义的消息内容层协议,它规定了在 HSMS 或 RS-232 等传输层之上,如何组织设备与主机之间交换的“消息内容”。SECS-II 的核心抽象是 Stream(流) 和 Function(功能),它们共同构成了消息的“类型标识”。

3.1 Stream 与 Function 的定义

  • Stream(流):表示消息所属的类别或领域。例如,Stream 1 通常用于设备状态与控制,Stream 2 用于设备数据与参数,Stream 6 用于事件通知。Stream 编号范围是 0–127,其中 0–63 为 SEMI 标准定义,64–127 为用户自定义。
  • Function(功能):表示在特定 Stream 下的具体操作或消息类型。例如,Function 1 通常是“请求(Request)”,Function 2 是“数据(Data)”,Function 11 是“事件通知(Event Notification)”。Function 编号范围是 0–255。

一个完整的 SECS-II 消息由 SxFy 格式标识,其中 x 是 Stream 编号,y 是 Function 编号。例如:

  • S1F1:Stream 1, Function 1 —— 通常是“Are You There”请求(设备状态查询)。
  • S1F2:Stream 1, Function 2 —— 通常是“Are You There”响应(设备状态回复)。
  • S6F11:Stream 6, Function 11 —— 通常是“Event Report”请求(事件报告)。
关键点:Stream 和 Function 的组合是唯一的消息标识符。主机和设备通过解析 SxFy 来理解消息的意图和上下文。

3.2 Message ID 与 WBit/EBit/DBit 标志位

每个 SECS-II 消息在消息头(Message Header)中包含一个 Message ID(也称为 System Bytes),用于唯一标识一次消息事务。此外,消息头中还包含三个重要的标志位:WBit、EBit 和 DBit,它们控制消息的行为和事务模式。

标志位 名称 含义 典型用途
WBit Wait Bit 指示发送方是否期望收到回复(Reply)。
WBit = 1:需要回复;WBit = 0:不需要回复。
用于区分“请求-响应”事务(WBit=1)与“单向消息”事务(WBit=0)。
EBit End Bit 指示当前消息是否为多块消息(Multi-block)的最后一块。
EBit = 1:最后一块;EBit = 0:还有后续块。
用于大消息的分块传输(Block Transfer)。
DBit Disconnect Bit 指示发送方是否请求断开连接(仅用于 HSMS 控制消息)。
DBit = 1:请求断开;DBit = 0:正常消息。
用于 HSMS 会话管理(如 Separate 请求)。
测试提示:在测试中,WBit 是最常被检查的标志位。如果主机发送 WBit=1 的消息但设备未回复,则会导致事务超时。反之,如果 WBit=0 但设备仍然回复,则可能引发协议错误。

3.3 消息头(Message Header)字节解析

SECS-II 消息头是固定长度的 10 字节 结构,位于每个消息的最前面。消息头包含了路由、标识和控制信息。以下是消息头的字节布局:

字节偏移 字段名称 长度(字节) 描述
0 Length Byte 0 (MSB) 1 消息体长度的高字节(大端序)。
1 Length Byte 1 (LSB) 1 消息体长度的低字节(大端序)。
2 Device ID (MSB) 1 设备 ID 的高字节(大端序)。
3 Device ID (LSB) + Flags 1 设备 ID 的低 7 位 + 最高位为 WBit。
4 Stream 1 Stream 编号(0–127)。
5 Function 1 Function 编号(0–255)。
6 EBit + Block Number (MSB) 1 最高位为 EBit,剩余 7 位为块号高字节。
7 Block Number (LSB) 1 块号低字节(大端序)。
8 System Bytes (MSB) 1 Message ID 的高字节(大端序)。
9 System Bytes (LSB) 1 Message ID 的低字节(大端序)。
常见解析错误:在测试中,经常发现设备 ID 与 WBit 共用一个字节(字节 3)。如果 WBit 被错误地置位或清零,可能导致设备 ID 解析错误,进而引发消息路由失败。务必使用位掩码(0x7F)提取设备 ID,使用 (byte & 0x80) 提取 WBit。

3.4 消息头解析示例

假设捕获到以下原始字节(十六进制):

00 1A 00 81 01 02 80 01 00 0F

逐字节解析:

  1. 字节 0–1 (Length):0x001A = 26 字节(消息体长度)。
  2. 字节 2–3 (Device ID + WBit):0x00 0x81 → 设备 ID = 0x01(低 7 位),WBit = 1(最高位为 1)。
  3. 字节 4 (Stream):0x01 → Stream 1。
  4. 字节 5 (Function):0x02 → Function 2。
  5. 字节 6–7 (EBit + Block Number):0x80 0x01 → EBit = 1(最高位),块号 = 0x0001。
  6. 字节 8–9 (System Bytes):0x00 0x0F → Message ID = 15。

因此,该消息为 S1F2(响应消息),WBit=1(需要回复),EBit=1(最后一块),Message ID=15。

3.5 SECS-II 消息结构总览图

下图展示了 SECS-II 消息的整体结构,包括消息头与消息体的关系,以及关键字段的位置:

SECS-II 消息结构总览 SECS-II 消息结构总览 消息头(Message Header)—— 10 字节 Length Device ID+W Stream Function EBit+Block# System ID 消息体(Message Body)—— 可变长度 包含 SECS-II 数据项(Item),如 ASCII、Binary、List 等 消息头中的 Length 字段指示消息体的字节数(不包含消息头自身) System Bytes 用于匹配请求与响应,构成一次完整的事务

3.6 事务与消息的关联

在 SECS/GEM 通信中,一次 事务(Transaction) 通常由一对请求-响应消息组成,通过相同的 System Bytes(Message ID) 关联。例如:

  • 主机发送 S1F1(请求),WBit=1,System Bytes=100。
  • 设备回复 S1F2(响应),System Bytes=100,完成一次事务。

如果 WBit=0,则发送方不期望回复,事务仅包含一条消息(单向)。

测试要点:在测试工具中,通常通过监控 System Bytes 来验证事务的完整性。如果请求的 System Bytes 与响应的 System Bytes 不匹配,则说明事务异常。

3.7 本章小结

  • Stream 与 Function 是 SECS-II 消息的类型标识,格式为 SxFy。
  • WBit 控制是否需要回复,EBit 控制多块传输,DBit 用于 HSMS 断开。
  • 消息头 是 10 字节的固定结构,包含长度、设备 ID、Stream、Function、块号、System Bytes 等关键字段。
  • System Bytes 是事务的唯一标识,用于匹配请求与响应。