4. SECS-II 消息结构:Stream 与 Function 的核心概念
SECS-II(SECS-II 消息层)是 SEMI E5 标准定义的消息格式层,位于 SECS-I(传输层)之上。它规定了设备与主机之间交换的每一条消息的语义结构和数据编码方式。理解 SECS-II 是进行产线集成开发的基础,也是后续实现 GEM 状态机、报警、数据采集等功能的先决条件。
4.1 Stream 与 Function:消息的“地址”
每一条 SECS-II 消息都由一个 Stream(流) 和一个 Function(功能) 唯一标识。Stream 和 Function 共同构成了消息的“类型码”,类似于 HTTP 协议中的方法(GET/POST)和路径的组合。
- Stream (S):消息的类别,用 0–127 的整数表示。例如,Stream 1 用于设备状态与控制,Stream 2 用于设备数据与参数,Stream 6 用于数据收集与事件报告。
- Function (F):消息的具体操作,用 0–255 的整数表示。例如,Function 1 通常表示“请求”,Function 2 表示“确认响应”,Function 13 表示“建立通信请求”。
一条完整的消息标识格式为:S<n>F<m>,例如 S1F13(建立通信请求)、S6F11(事件报告数据)。
4.2 Message 分类:Primary 与 Secondary
SECS-II 消息按照通信的发起方向和响应关系,分为两大类:
| 分类 | 方向 | 描述 | 典型示例 |
|---|---|---|---|
| Primary Message | 发起方 → 接收方 | 主动发送的请求或通知消息,需要对方回复 | 主机发送 S1F13(建立通信请求)给设备 |
| Secondary Message | 接收方 → 发起方 | 对 Primary Message 的确认响应,携带结果或数据 | 设备回复 S1F14(建立通信确认)给主机 |
在产线集成中,主机通常作为 Primary 消息的发起方,设备作为 Secondary 消息的响应方。但设备也可以主动发送 Primary 消息(如报警通知 S5F1),此时主机需要回复 Secondary 消息(S5F2)。
4.3 Item 数据类型:消息的“原子”
SECS-II 消息的载荷(Body)由若干个 Item 组成。Item 是 SECS-II 数据的最小单元,每个 Item 包含一个数据类型、长度和值。SECS-II 定义了多种数据类型,用于表示设备的各种信息。
| 数据类型 | 缩写 | 格式码 | 描述 | 典型用途 |
|---|---|---|---|---|
| List | L | 0x00 | 有序的 Item 集合,可嵌套 | 消息体结构、参数组 |
| ASCII | A | 0x40 | 可打印的 ASCII 字符串 | 设备 ID、型号、状态文本 |
| Binary | B | 0x20 | 字节数组(0x00–0xFF) | 原始数据、状态位图 |
| Boolean | BOOLEAN | 0x24 | 布尔值(0x00=False, 0x01=True) | 开关状态、使能标志 |
| Unsigned 1-byte | U1 | 0x64 | 无符号 8 位整数(0–255) | 小范围计数器、状态码 |
| Unsigned 2-byte | U2 | 0x68 | 无符号 16 位整数(0–65535) | 设备参数、索引 |
| Unsigned 4-byte | U4 | 0x6C | 无符号 32 位整数(0–4294967295) | 时间戳、大范围计数器 |
| Signed 1-byte | I1 | 0x60 | 有符号 8 位整数(-128–127) | 偏差值、小范围有符号数据 |
| Signed 2-byte | I2 | 0x64 | 有符号 16 位整数(-32768–32767) | 温度、压力等测量值 |
| Signed 4-byte | I4 | 0x68 | 有符号 32 位整数(-2147483648–2147483647) | 累计产量、大范围测量值 |
| Floating 4-byte | F4 | 0x70 | 单精度浮点数(IEEE 754) | 工艺参数、精度要求高的数据 |
| Floating 8-byte | F8 | 0x74 | 双精度浮点数(IEEE 754) | 高精度测量数据 |
4.4 消息编码规则:从 Item 到字节流
SECS-II 消息在传输前需要编码为字节流。编码规则遵循 TLV(Type-Length-Value) 格式,每个 Item 的编码结构如下:
+----------------+----------------+----------------+
| 格式码 (1字节) | 长度码 (1-3字节)| 数据值 (N字节) |
+----------------+----------------+----------------+
| 0x6C (U4) | 0x04 | 0x00 0x00 0x0A 0x00 |
+----------------+----------------+----------------+
编码步骤:
- 格式码:标识数据类型(如 U4 为 0x6C)。
- 长度码:表示数据值的字节数。长度码本身可以是 1 字节(长度 ≤ 255)、2 字节(长度 ≤ 65535)或 3 字节(长度 ≤ 16777215),通过格式码的高位 bit 指示长度码的字节数。
- 数据值:按照数据类型的字节序(大端序,Big-Endian)编码。
对于 List 类型,其“数据值”部分包含的是子 Item 的编码序列,而不是原始数据。List 可以嵌套,形成复杂的消息结构。
0x6C 0x04 0x00 0x00 0x0A 0x00。其中 0x6C 是 U4 的格式码,0x04 表示后面有 4 字节数据,0x00000A00 是 2560 的大端序表示。
4.5 完整消息示例:S1F13 建立通信请求
下面是一个完整的 SECS-II 消息编码示例,展示如何将 S1F13(建立通信请求)消息编码为字节流:
消息:S1F13
方向:主机 → 设备
功能:请求建立通信会话
消息头(10 字节):
0x00 0x00 0x00 0x01 // 设备 ID(4 字节)
0x00 0x0D // Stream = 1, Function = 13(2 字节)
0x00 0x00 // 保留位(2 字节)
0x01 // 消息块标志(1 字节)
0x00 // 系统字节(1 字节,简化示例)
消息体(Item 编码):
0x6C 0x04 0x00 0x00 0x00 0x0A // U4 类型,值 = 10(通信超时时间)
完整字节流:
00 00 00 01 00 0D 00 00 01 00 6C 04 00 00 00 0A
4.6 本章小结
- Stream 与 Function 是 SECS-II 消息的唯一标识,S<n>F<m> 格式定义了消息的类别和操作。
- Primary 与 Secondary 消息构成请求-响应配对,奇数 Function 为 Primary,偶数 Function 为 Secondary。
- Item 数据类型 包括 List、ASCII、Binary、U1/U2/U4、I1/I2/I4、F4/F8 等,每种类型有固定的格式码和编码规则。
- TLV 编码 是 SECS-II 消息的基本编码方式,格式码 + 长度码 + 数据值构成每个 Item 的字节表示。
- 掌握 SECS-II 消息结构是后续实现 GEM 状态机、数据采集、报警管理等功能的基础。