1. SECS-II 协议概述:SECS-II 在 SECS/GEM 协议栈中的位置、消息类型与功能
SECS-II(SEMI Equipment Communications Standard Part 2)是 SECS/GEM 协议栈中定义消息内容与语义的核心层。它规定了设备与主机之间交换的每条消息的结构、编码规则、数据类型以及事务处理机制。理解 SECS-II 的位置与功能,是进行协议栈移植和消息事务处理的基础。
1.1 SECS-II 在协议栈中的位置
SECS/GEM 协议栈采用分层架构,从物理介质到应用语义逐层封装。SECS-II 位于传输层(HSMS/SECS-I)之上、应用层(GEM)之下,承担着“消息格式化与语义解释”的桥梁作用。
| 层级 | 协议/标准 | 主要职责 | 典型数据单元 |
|---|---|---|---|
| 应用层 | GEM (E30, E37, E39...) | 定义设备行为模型、状态机、报警、远程控制等语义 | GEM 状态、集合、事件通知 |
| 表示层 | SECS-II (E5) | 消息结构、数据类型、编码、事务处理 | SECS-II Message (Stream/Function) |
| 传输层 | HSMS (E37) / SECS-I (E4) | 连接管理、消息分帧、可靠传输、重传机制 | HSMS Message / SECS-I Block |
| 物理层 | TCP/IP / RS-232 | 比特流传输、电气特性 | TCP Segment / Serial Frame |
从移植角度看,SECS-II 层是协议栈中最复杂、最易出错的部分。它不依赖底层传输介质(TCP 或串口),但必须严格遵循 SEMI E5 标准中的消息编码规则和事务处理规则。
1.2 SECS-II 消息类型与功能
SECS-II 消息由 Stream(流)和 Function(功能)两个维度唯一标识,格式为 S<n>F<m>,例如 S1F1、S6F11。Stream 表示消息的类别,Function 表示该类别下的具体操作。
1.2.1 Stream 分类
SEMI E5 标准定义了 0~255 个 Stream,其中 0~127 为标准 Stream,128~255 为用户自定义 Stream。以下是常用的标准 Stream:
| Stream | 名称 | 功能描述 | 典型消息 |
|---|---|---|---|
| S1 | 设备通信控制 | 建立/断开连接、设备状态查询、通信超时管理 | S1F1 (Are You There), S1F13 (Establish Communications Request) |
| S2 | 设备控制与诊断 | 设备参数读写、远程命令、诊断数据获取 | S2F17 (Remote Command), S2F41 (Host Command Send) |
| S5 | 报警管理 | 报警上报、报警列表查询、报警使能/禁用 | S5F1 (Alarm Report), S5F3 (Enable/Disable Alarm) |
| S6 | 数据收集与事件 | 事件通知、数据变量上报、跟踪数据收集 | S6F11 (Event Report), S6F15 (Data Report) |
| S7 | 设备标识与配方 | 设备 ID、配方管理、物料跟踪 | S7F1 (Equipment ID), S7F19 (Current Recipe Request) |
| S10 | 终端服务 | 终端显示消息、操作员交互 | S10F1 (Terminal Display), S10F3 (Terminal Request) |
1.2.2 Function 方向与事务类型
每个 Function 编号的奇偶性决定了消息的方向和事务角色:
- 奇数 Function(F1, F3, F5...):Primary Message(主消息),由发起方发送,用于发起一个事务。
- 偶数 Function(F2, F4, F6...):Secondary Message(次消息),由响应方发送,用于回复对应的 Primary 消息。
例如:
S1F1(Primary):主机发送“Are You There”查询设备是否在线。S1F2(Secondary):设备回复“Yes, I am here”并携带设备状态信息。
1.3 SECS-II 消息结构
一条完整的 SECS-II 消息由消息头(Message Header)和消息体(Message Body)组成。消息体包含一个或多个数据项(Data Item),每个数据项由数据项头(Item Header)和数据内容(Data Content)构成。
SECS-II Message
├── Message Header (10 bytes)
│ ├── Device ID (2 bytes) // 设备标识
│ ├── Stream (1 byte) // 流号
│ ├── Function (1 byte) // 功能号
│ ├── W-bit (1 bit) // 等待位(是否需要回复)
│ ├── System Bytes (4 bytes) // 系统字节(事务ID)
│ └── Reserved (2 bytes) // 保留
│
└── Message Body (可变长度)
├── Data Item 1
│ ├── Item Header (2-4 bytes)
│ │ ├── Item Format Code (1 byte) // 数据类型编码
│ │ └── Item Length (1-3 bytes) // 数据长度
│ └── Item Data (N bytes)
├── Data Item 2
│ └── ...
└── Data Item N
1.4 数据类型与编码
SECS-II 定义了丰富的数据类型(Format Code),用于表示整数、浮点数、字符串、列表等。在协议栈移植中,数据类型编解码是核心工作之一。
| Format Code | 类型名称 | 字节长度 | 说明 |
|---|---|---|---|
0x00 |
LIST | 可变 | 列表,包含多个子数据项 |
0x10 |
BIN | 1~N | 二进制数据 |
0x20 |
BOOLEAN | 1 | 布尔值(0x00=False, 0x01=True) |
0x30 |
ASCII | 1~N | ASCII 字符串 |
0x40 |
INT8 | 1 | 有符号 8 位整数 |
0x50 |
INT16 | 2 | 有符号 16 位整数(大端序) |
0x60 |
INT32 | 4 | 有符号 32 位整数(大端序) |
0x70 |
INT64 | 8 | 有符号 64 位整数(大端序) |
0x80 |
UINT8 | 1 | 无符号 8 位整数 |
0x90 |
UINT16 | 2 | 无符号 16 位整数(大端序) |
0xA0 |
UINT32 | 4 | 无符号 32 位整数(大端序) |
0xB0 |
UINT64 | 8 | 无符号 64 位整数(大端序) |
0xC0 |
FLOAT4 | 4 | 单精度浮点数(IEEE 754) |
0xD0 |
FLOAT8 | 8 | 双精度浮点数(IEEE 754) |
- 字节序:SECS-II 所有多字节整数和浮点数均使用大端序(Big-Endian)。在 x86 平台移植时,必须进行字节序转换。
- LIST 嵌套:LIST 可以嵌套任意层数,编解码器必须支持递归解析。
- 长度编码:数据项长度字段支持 1~3 字节变长编码,需要根据第一个字节的高位判断长度格式。
1.5 事务处理机制
SECS-II 的事务处理基于请求-响应模型,由 System Bytes(系统字节)唯一标识一个事务。关键规则如下:
- 事务发起:发送 Primary 消息时,分配一个唯一的 System Bytes 值(通常为递增计数器)。
- 事务匹配:接收方在回复 Secondary 消息时,必须原样复制 Primary 消息中的 System Bytes。
- W-bit(等待位):如果 W-bit = 1,表示发送方期望收到回复;如果 W-bit = 0,表示不需要回复(单方向消息)。
- 超时处理:发送方在发送 W-bit=1 的消息后,启动 T3 定时器(Reply Timeout),如果在规定时间内未收到回复,则触发超时重传或错误处理。