4. SECS-II 消息结构基础

SECS-II 是 SEMI 标准中定义的消息内容层,它规定了如何在 SECS-I 或 HSMS 传输的字节流中组织具体的数据。一条完整的 SECS-II 消息由消息头(Message Header)和消息体(Message Body / Item)两部分组成。消息头负责路由和识别,消息体承载实际的设备数据。

核心要点:SECS-II 消息 = 固定长度的消息头 + 可变长度的消息体(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。
记忆口诀:“设备流功能,等待系统配”。Device ID 决定设备,Stream/Function 决定消息类型,W-bit 决定是否需要回复,System Bytes 决定消息配对。

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”回复。
注意:Function 编号的奇偶性有特殊含义:奇数 Function(如 F1、F3)通常为主叫方(Primary)消息,偶数 Function(如 F2、F4)通常为应答方(Secondary)消息。W-bit 与 Function 奇偶性共同决定消息的回复机制。

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 设置为与请求消息相同的值。这样发送方就能将回复与之前的请求配对。

实践建议:System Bytes 通常使用递增计数器生成,确保在短时间内不重复。超时重传时,System Bytes 应保持不变,以便接收方识别重复消息。
SECS-II 消息头结构(HSMS 10 字节) Device ID 2 字节 Stream / Function 2 字节 W-bit 1 字节 System Bytes 3 字节 保留 / HSMS 2 字节 字段说明: • Device ID:设备标识,通常为 0 • Stream/Function:消息类型,如 S1F1(Are You There) • W-bit:等待位,1 表示需要回复,0 表示无需回复 • 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
关键理解:SECS-II 的消息体本质上是一棵 Item 树。根节点通常是一个 List,其子 Item 可以是基本数据类型,也可以是嵌套的 List。这种结构使得 SECS-II 能够表达任意复杂度的设备数据。

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"
SECS-II 消息体 Item 树形结构 根 List (L[3]) 子 List 1 (L[2]) 子 List 2 (L[2]) 子 List 3 (L[1]) U4: 1001 A: "Etch1" A: "TEMP" F8: 23.5 A: "2025-01-15 10:30:00" Item 树结构说明: • 根节点为 List,包含 3 个子 List • 叶子节点为基本数据类型(U4、A、F8),承载实际数据值

4.3 消息头与消息体的组合

一条完整的 SECS-II 消息是消息头和消息体的组合。消息头提供路由和控制信息,消息体提供具体数据。以下是一个实际消息示例:

消息头:
  Device ID:      0x0000
  Stream/Function: 0x0101 (S1F1 - Are You There)
  W-bit:          1 (需要回复)
  System Bytes:   0x000001

消息体:
  L[0]  -- 空 List,S1F1 不需要额外数据
实际应用:在设备通信中,主机发送 S1F1(Are You There)消息给设备,W-bit 设置为 1。设备收到后,必须回复 S1F2(Are You There Reply),并将 System Bytes 设置为 0x000001,以便主机识别这是对 S1F1 的回复。

4.4 本章小结

  • SECS-II 消息由消息头和消息体组成。
  • 消息头包含 Device ID、Stream/Function、W-bit、System Bytes 等关键字段。
  • 消息体由 Item 组成,采用 TLV 格式编码,支持嵌套形成树形结构。
  • 理解消息头和消息体的结构是解析和构造 SECS-II 消息的基础。