3. SECS-II 消息结构:Stream 与 Function 定义、Message 分类、Item 数据类型

SECS-II(SECS-2)是 SEMI E5 标准定义的消息层协议,它规定了在 SECS-I 或 HSMS 传输层之上,如何组织设备与主机之间交换的正式消息。理解 SECS-II 的消息结构是开发 MES 对接接口的基础,它决定了消息的“语法”和“词汇”。

核心概念: SECS-II 消息由 Stream (流) 和 Function (功能) 唯一标识,消息体由 Item (数据项) 按树形结构组成。掌握这三者,就等于掌握了 SECS/GEM 通信的“字母表”和“语法规则”。

3.1 Stream 与 Function:消息的“地址”

每一条 SECS-II 消息都由一个 Stream (S) 和一个 Function (F) 编号唯一确定,格式为 SxFy。例如,S1F13 代表 Stream 1, Function 13。

  • Stream (流):定义消息的类别或功能域。例如,Stream 1 用于设备控制与状态,Stream 2 用于设备数据收集,Stream 5 用于报警管理。
  • Function (功能):在特定 Stream 下,定义具体的操作。例如,在 Stream 1 中,F13 是“建立通信请求”,F14 是“建立通信确认”。
  • Primary (主消息) 与 Secondary (副消息):Function 编号的奇偶性决定了消息的方向。
    • 奇数 Function (F1, F3, F5...):表示 Primary Message,通常由请求方(如主机或设备)主动发起。
    • 偶数 Function (F2, F4, F6...):表示 Secondary Message,是对上一个 Primary Message 的回复或确认。
工程经验: 在编写 MES 对接代码时,通常需要维护一个 SxFy 到处理函数的映射表。例如,收到 S1F13 后,自动调用 handle_S1F13() 函数。这种设计模式可以极大地提高代码的可维护性。

常用 Stream 与 Function 示例

消息 ID 方向 名称 描述
S1F13 Host → Eqp Establish Communications Request (CR) 主机请求与设备建立通信会话。
S1F14 Eqp → Host Establish Communications Acknowledge (CA) 设备对 S1F13 的确认,包含通信能力信息。
S2F41 Host → Eqp Host Command Send (HCS) 主机向设备发送远程命令,如“开始加工”。
S5F1 Eqp → Host Alarm Report Send (ARS) 设备向主机报告报警事件。
S6F11 Eqp → Host Event Report Send (ERS) 设备向主机报告事件数据,如“晶圆完成”。
SECS-II 消息分类:Stream & Function 方向 Host (主机) Equipment (设备) S1F13 (Primary) S1F14 (Secondary) Primary (奇数 Function, 请求) Secondary (偶数 Function, 回复) 消息体 (Body)

3.2 Message 分类:Primary 与 Secondary

SECS-II 消息的交互遵循严格的“请求-响应”模式。这种分类方式确保了通信的可靠性和顺序性。

  • Primary Message (主消息):
    • 由通信的任何一方(通常是主机,但设备也可以主动发起,如报警)发送。
    • Function 编号为奇数。
    • 期望收到一个对应的 Secondary Message 作为回复。
  • Secondary Message (副消息):
    • 只能作为对特定 Primary Message 的回复发送。
    • Function 编号为偶数,且与对应的 Primary Message 的 Function 编号相差 1。
    • 包含请求的结果或确认信息。
常见陷阱: 在实现 MES 客户端时,必须确保在收到 Primary Message 后,在超时时间内发送正确的 Secondary Message。如果设备发送了 S5F1 (报警),主机未回复 S5F2,设备可能会认为通信异常并断开连接。

3.3 Item 数据类型:消息的“词汇”

SECS-II 消息的载荷(Body)由 Item (数据项) 组成。Item 是 SECS-II 中最基本的数据单元,它采用 TLV (Type-Length-Value) 格式进行编码。Item 可以嵌套,形成复杂的树形数据结构。

Item 的 TLV 结构

字段 长度 描述
Type (类型) 1 字节 标识数据类型,如 List、Binary、ASCII、U4 等。
Length (长度) 1-3 字节 标识 Value 字段的字节数。长度编码方式取决于数据格式。
Value (值) 可变 实际的数据内容。

常用 Item 数据类型

类型名称 格式码 描述 示例
List 0x00 包含多个子 Item 的容器,本身没有 Value,只有 Length 表示子 Item 的数量。 [Item1, Item2, ...]
Binary 0x10 未解释的字节序列。 0x01 0x02 0xFF
Boolean 0x14 布尔值,通常 0x00 表示 False,非 0x00 表示 True。 0x01 (True)
ASCII 0x20 可打印的 ASCII 字符串。 "Hello"
U2 (Unsigned 2-byte) 0x68 无符号 16 位整数。 12345
U4 (Unsigned 4-byte) 0x70 无符号 32 位整数。 987654321
F4 (Floating 4-byte) 0x90 单精度浮点数 (IEEE 754)。 3.14159
SECS-II Item 数据结构:TLV 与嵌套 Root List (L, n=3) Item 1: ASCII Item 2: List (n=2) Item 3: U4 Sub-Item 1: Binary Sub-Item 2: Boolean TLV 编码示例: Item 1 (ASCII): Type=0x20 | Length=0x05 | Value="Hello"

3.4 消息结构实战:解析 S1F13 示例

让我们通过一个实际的例子来串联以上概念。以下是主机发送的 S1F13 (建立通信请求) 消息的 SECS-II 结构。

# S1F13 消息的 SECS-II 结构 (Python 伪代码表示)
# Stream = 1, Function = 13 (Primary)
# 消息体是一个 List,包含 2 个 Item

message_body = [
    Item(ASCII, "MDLN"),      # Item 1: 设备型号 ID
    Item(ASCII, "REV1.0")     # Item 2: 软件版本号
]

# 实际编码后的字节流 (十六进制)
# 0x00 0x02          # List, 包含 2 个 Item
#   0x20 0x04 0x4D 0x44 0x4C 0x4E   # ASCII, 长度4, "MDLN"
#   0x20 0x06 0x52 0x45 0x56 0x31 0x2E 0x30  # ASCII, 长度6, "REV1.0"
Python 解析技巧: 使用 secsgem 或 pysecs 等库可以自动处理 TLV 编码和解码。但在调试或处理非标准消息时,理解原始字节流结构至关重要。例如,你可以通过 struct.unpack('>H', data[1:3]) 来手动解析一个 U2 类型的值。

3.5 本章小结

  • SxFy 是 SECS-II 消息的唯一标识,Stream 定义类别,Function 定义操作。
  • 奇数 Function 为 Primary (请求),偶数 Function 为 Secondary (回复),两者成对出现。
  • Item 是消息体的基本单元,采用 TLV (Type-Length-Value) 格式编码。
  • List 类型允许 Item 嵌套,形成复杂的树形数据结构,用于表达设备配置、批次信息等复杂对象。
  • 掌握这些基础结构,是后续编写 MES 对接代码、解析设备事件、发送主机命令的基石。