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) | 设备向主机报告事件数据,如“晶圆完成”。 |
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 |
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 对接代码、解析设备事件、发送主机命令的基石。