Metadata-Version: 2.4
Name: SecsGemPro
Version: 1.0.2
Summary: secs/gem
Author: LiuWei
Author-email: 183074632@qq.com
Requires-Python: >=3.11,<3.13
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Requires-Dist: python-dateutil (>=2.9.0.post0,<3.0.0)
Description-Content-Type: text/markdown

# SecsGemPro

[![Python](https://img.shields.io/badge/Python-3.11%2B-blue.svg)](https://www.python.org/)
[![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)

**SecsGemPro** 是一个纯 Python 实现的 SECS/GEM 通信协议库，专为半导体制造行业设计。它完整实现了 SEMI E5 (SECS-II)、SEMI E30 (GEM) 和 SEMI E37 (HSMS) 标准，使工厂主机系统与生产设备之间能够进行标准化通信。
## 📋 目录

- [简介](#简介)
- [协议标准参考](#协议标准参考)
- [核心特性](#核心特性)
- [项目架构](#项目架构)
- [安装](#安装)
- [快速开始](#快速开始)
- [架构设计](#架构设计)
  - [分层模型](#分层模型)
  - [状态机](#状态机)
  - [事件系统](#事件系统)
- [模块说明](#模块说明)
  - [Common 层](#common-公共基础层)
  - [HSMS 层](#hsms-高速消息传输层)
  - [SECS 层](#secs-secs-ii-消息层)
  - [GEM 层](#gem-设备模型层)
- [设备能力 (Capabilities)](#设备能力-capabilities)
- [API 参考](#api-参考)
- [支持的 Stream/Function](#支持的-streamfunction)
  - [符号约定](#符号约定)
  - [S00 — Abort Transaction](#s00--abort-transaction中止事务)
  - [S01 — Equipment Status](#s01--equipment-status设备状态)
  - [S02 — Equipment Constants and Reports](#s02--equipment-constants-and-reports设备常量与报告)
  - [S03 — Material/Recipe Status](#s03--materialrecipe-status物料配方状态)
  - [S05 — Exception/Alarm Reporting](#s05--exceptionalarm-reporting异常告警报告)
  - [S06 — Data Collection](#s06--data-collection数据采集)
  - [S07 — Process Program Management](#s07--process-program-management工艺程序管理)
  - [S09 — System Errors](#s09--system-errors系统错误)
  - [S10 — Terminal Messages](#s10--terminal-messages终端消息)
  - [S12 — Wafer Map](#s12--wafer-map晶圆映射)
  - [S14 — Recipe Management](#s14--recipe-management配方管理)
  - [ACK 值参考](#ack-值参考)
  - [汇总统计](#汇总统计)
- [开发计划](#开发计划)
- [许可证](#许可证)

---
## 简介

SECS/GEM (SEMI Equipment Communications Standard / Generic Equipment Model) 是半导体设备与工厂主机系统之间的标准通信协议，广泛应用于晶圆制造、封装测试等半导体生产环节。

SecsGemPro 提供了：
- **HSMS (High-Speed SECS Message Services)**：基于 TCP/IP 的高速消息传输层
- **SECS-II**：消息编码/解码，完整的 Stream/Function 消息定义
- **GEM**：完整的 GEM 设备模型实现，支持 Host 端和 Equipment 端

## 协议标准参考

SecsGemPro 实现了 SEMI（国际半导体产业协会）发布的以下核心通信标准：

### SEMI E5 — SECS-II 消息协议 (Message Content)

> **Equipment Communications Standard 2 — Message Content**

SECS-II 定义了半导体设备与主机之间消息的**编码格式**和**内容结构**。这是 SECS/GEM 协议栈的消息层，规定了：

| 概念 | 说明 |
|------|------|
| **Stream** | 消息分类（如 S01 设备状态、S05 告警报告），共 14 个 Stream |
| **Function** | Stream 下的具体操作（如 S01F01 在线探测、S05F03 启用告警） |
| **Data Item** | 消息中的数据结构单元（如 ALID 告警ID、CEID 收集事件ID） |
| **SECS-II 数据类型** | 22 种基础变量类型，包括 List、Binary、Boolean、U1/U2/U4/U8、I1/I2/I4/I8、F4/F8、A(ASCII)、JIS-8 等 |

本项目实现了 134 个 Stream/Function 消息定义和 130+ 个数据项，覆盖 SEMI E5 的 §6.1–§6.14 全部主要章节。

### SEMI E37 — HSMS 传输层协议 (Transport Layer)

> **High-Speed SECS Message Services — Generic Services**

HSMS 定义了基于 **TCP/IP 网络**的 SECS-II 消息传输标准，取代了早期的 RS-232（SECS-I）串口通信方式。这是 SECS/GEM 协议栈的传输层，核心功能包括：

| 特性 | 说明 |
|------|------|
| **连接模式** | Active（主动连接）与 Passive（被动监听）两种 TCP 连接模式 |
| **控制消息** | Select / Deselect（建立/断开 HSMS 会话）、Linktest（心跳检测）、Separate（断开连接）、Reject（拒绝连接） |
| **连接状态机** | NOT_CONNECTED → CONNECTED_NOT_SELECTED → CONNECTED_SELECTED 三级状态管理 |
| **会话复用** | 通过 Session ID 区分同一 TCP 连接上的不同会话 |
| **多块传输** | 支持大数据量的分块发送/接收 |

本项目完整实现了 HSMS 的连接管理、控制消息交换、心跳保活和多块传输机制。

### SEMI E30 — GEM 设备模型 (Generic Equipment Model)

> **Generic Model for Communications and Control of Manufacturing Equipment**

GEM 建立在 SECS-II 和 HSMS 之上，定义了半导体生产设备的**标准化行为模型**，确保来自不同厂商的设备与工厂主机系统（MES/EAP）能够互操作。GEM 定义了：

| 能力模块 | 说明 | 相关 SF |
|---------|------|--------|
| **通信状态管理** | Communicate / Not-Communicate 状态机，控制通信的建立和终止 | S01F13–S01F14 |
| **设备控制状态** | ONLINE/OFFLINE + LOCAL/REMOTE 组合状态，控制设备操作权限 | S01F15–S01F18 |
| **告警管理** | 告警的触发、上报、启用/禁用状态管理 | S05F1–S05F8 |
| **收集事件** | 定义事件 → 链接报告 → 触发上报，实现设备状态变化的异步通知 | S02F33–S02F38, S06F11–S06F16 |
| **设备常量** | 存储在设备上的只读/可写配置参数 | S02F13–S02F16, S02F29–S02F30 |
| **状态变量** | 设备运行时的实时状态数据 | S01F3–S01F4, S01F11–S01F12 |
| **数据值/数据集合** | 与收集事件关联的结构化数据采集 | S06F1–S06F8 |
| **远程控制** | 主机向设备发送 START/STOP 等远程命令 | S02F41–S02F42 |
| **工艺程序管理** | 工艺程序的加载、上传、删除、格式化 | S07F1–S07F26 |
| **终端消息** | 操作员终端的文本信息交互 | S10F1–S10F4 |

本项目通过 Capability（能力混入）模式完整实现了 GEM 的 8 大核心能力模块。

### SEMI E39 — 对象服务 (Object Services)

> **Object Services Standard — Concepts, Behavior, and Services**

SEMI E39 定义了一套通用的对象属性访问服务，用于对设备上的对象（如配方、晶圆映射等）进行**读取（GetAttr）**和**修改（SetAttr）**操作。本项目在 S14 Stream 中实现了 E39 的对象服务接口：

- **S14F01 / S14F03** — GetAttr/SetAttr 请求（含 OBJSPEC、OBJTYPE、OBJID 和属性过滤）
- **S14F02 / S14F04** — GetAttr/SetAttr 数据回复（含 OBJACK 确认码和错误信息）

### SEMI E87 — 载具管理 (Carrier Management)

> **Specification for Carrier Management (CMS)**

SEMI E87 定义了半导体工厂中**载具（Carrier）**的管理规范，包括晶圆载具、料盒等物料的传送、追踪和控制。本项目的 S03 Stream 实现了 E87 的核心消息交互：

- **S03F17** — 载具操作请求（Carrier Action Request），指定载具 ID、操作类型、端口号和自定义属性
- **S03F18** — 载具操作确认（Carrier Action Acknowledge），返回操作接受状态和错误信息

### 标准与项目分层对应
```mermaid
sequenceDiagram 
    participant GEM as GEM 应用层<br/>E30/E39/E87 
    participant SECS as SECS-II 消息层<br/>E5 
    participant HSMS as HSMS 传输层<br/>E37
    
Note over GEM: 状态机 + 8 个 Capability 
Note over SECS: 134 SF 消息 + 130+ Data Items 
Note over HSMS: TCP 连接 + 控制消息
GEM->>SECS: 消息编码 
Note right of GEM: 将 GEM 语义<br/>编码为 SECS-II 格式 
SECS->>HSMS: TCP/IP 传输 
Note right of SECS: 封装为 HSMS 报文<br/>通过 TCP 发送
HSMS-->>SECS: TCP/IP 接收 
Note left of HSMS: 接收 TCP 数据<br/>解包 HSMS 报文 
SECS-->>GEM: 消息解码 
Note left of SECS: 解析 SECS-II 格式<br/>还原 GEM 语义
```
### 其他相关 SEMI 标准

| 标准 | 名称 | 说明 | 本项目支持 |
|------|------|------|-----------|
| **SEMI E5** | SECS-II Message Content | SECS-II 消息编码与内容 | ✅ 134 个 SF |
| **SEMI E30** | GEM — Generic Equipment Model | 设备通用通信与控制模型 | ✅ 8 个 Capability |
| **SEMI E37** | HSMS — Generic Services | 高速 SECS 消息传输服务 | ✅ 完整实现 |
| **SEMI E37.1** | HSMS-SS — Single Session | HSMS 单会话模式 | ✅ 默认支持 |
| **SEMI E39** | Object Services | 对象属性访问服务 | ✅ S14F1-F4 |
| **SEMI E87** | Carrier Management (CMS) | 载具管理规范 | ✅ S03F17-F18 |
| **SEMI E40** | Process Job Management | 工艺作业管理 | — 计划中 |
| **SEMI E90** | Substrate Tracking | 基板追踪 | — 计划中 |
| **SEMI E94** | Control Job Management | 控制作业管理 | — 计划中 |

## 核心特性

- ✅ **完整的 HSMS 实现**：支持 Active/Passive 连接模式，Select/Deselect/Linktest/Separate/Reject 控制消息
- ✅ **丰富的 SECS-II 消息**：内置 140+ 个 Stream/Function 消息定义，覆盖 S1-S14
- ✅ **GEM 设备模型**：完整实现 SEMI E30 GEM 标准
- ✅ **双端支持**：同时支持 Host（主机）端和 Equipment（设备）端开发
- ✅ **状态机驱动**：基于有限状态机（FSM）的通信状态管理和控制状态管理
- ✅ **事件系统**：灵活的事件回调机制，轻松响应连接、消息、告警等事件
- ✅ **能力（Capability）混入模式**：设备功能模块化，可按需组合
- ✅ **TCP 双模式**：内置 TCP 客户端和服务器实现
- ✅ **线程安全**：多线程架构确保并发通信的可靠性
- ✅ **编码支持**：支持 JIS X 0201 字符编码

## 项目架构

## 安装

### 环境要求

- Python >= 3.11, < 3.13
- Poetry

### 通过 Poetry 安装（推荐）
#### 克隆项目
```shell
git clone https://gitee.com/w_liu/SecsGemPro.git 
```
#### 进入项目目录
```shell
cd SecsGemPro
```
#### 使用 Poetry 创建虚拟环境并安装依赖
```shell
poetry install
```
## 快速开始

### 1. Equipment 端（设备被动端）

创建一个 GEM 设备端，监听连接并响应主机请求，通讯上后主动给 host 发送 s1f13 消息：

```python
from secsgem.common import DeviceType
from secsgem.gem import GemEquipmentHandler
from secsgem.hsms import HsmsSettings, HsmsConnectMode


class EquipmentExample(GemEquipmentHandler):
    """设备端 passive 服务示例."""
    hsms_settings = HsmsSettings(
        address="127.0.0.1", port=5000,
        connect_mode=HsmsConnectMode.PASSIVE, device_type=DeviceType.EQUIPMENT
    )
    def __init__(self):
        super().__init__(self.hsms_settings)
        self.enable()  # 启动设备端 passive 服务


if __name__ == '__main__':
    EquipmentExample()
```
### 2. Host 端（主机主动端）

创建一个 GEM 主机端，主动连接设备，如果连接上 Passive 服务会主动发送 s1f13 消息：
```python
from secsgem.common import DeviceType
from secsgem.gem import GemHostHandler
from secsgem.hsms import HsmsSettings, HsmsConnectMode


class HostExample(GemHostHandler):
    """Host Active 示例."""
    hsms_settings = HsmsSettings(
        address="127.0.0.1", port=5000,
        connect_mode=HsmsConnectMode.ACTIVE, device_type=DeviceType.HOST
    )
    def __init__(self):
        super().__init__(self.hsms_settings)
        self.enable()


if __name__ == '__main__':
    HostExample()
```
## 架构设计

### 分层模型

SecsGemPro 采用严格的分层架构，每层职责明确：
```mermaid
sequenceDiagram 
    participant Common as Common 公共基础层 
    participant HSMS as HSMS 传输层 - SEMI E37 
    participant SECS as SECS-II 消息层 - SEMI E5 
    participant GEM as GEM 应用层 - SEMI E30
Note over Common: Protocol / Settings<br/>StateMachine / EventProducer<br/>TcpClient/Server
Note over HSMS: HsmsProtocol<br/>ConnectionStateMachine
Note over SECS: SecsHandler / StreamsFunctions<br/>DataItemBase
Note over GEM: GemHandler / GemHostHandler<br/>GemEquipmentHandler + 8 Capability

Common->>HSMS: 继承 Protocol + StateMachine
Note right of Common: HsmsProto → Protocol<br/>ConnSM → StateMachine
HSMS->>SECS: 协议依赖
Note right of HSMS: SecsHandler → HsmsProto
SECS->>SECS: SF 回调注册
Note right of SECS: SecsHandler → SF 140+
SECS->>GEM: Handler 继承
Note right of SECS: GemHandler → SecsHandler
GEM->>GEM: 端类型派生
Note right of GEM: GemHost / GemEquip<br/>→ GemHandler
```
### 状态机

SecsGemPro 使用层次化状态机来管理复杂的协议状态：

**HSMS 连接状态机** — 管理 TCP 连接和 HSMS 选择状态：
```mermaid
stateDiagram-v2 
[*] --> NOT_CONNECTED 
NOT_CONNECTED --> CONNECTED_NOT_SELECTED : connect 
CONNECTED_NOT_SELECTED --> CONNECTED_SELECTED : select 
CONNECTED_SELECTED --> CONNECTED_NOT_SELECTED : deselect 
CONNECTED_NOT_SELECTED --> NOT_CONNECTED : disconnect 
CONNECTED_SELECTED --> NOT_CONNECTED : disconnect
```


**GEM 通信状态机** — 管理 GEM 层的通信建立流程：
```mermaid
stateDiagram-v2 
[*] --> DISABLED 
DISABLED --> NOT_COMMUNICATING : enable 
NOT_COMMUNICATING --> WAIT_CRA : select 
WAIT_CRA --> COMMUNICATING : s1f14received ✅ 
WAIT_CRA --> WAIT_DELAY : communicationreqfail ⏳ 
WAIT_DELAY --> WAIT_CRA : delayexpired 🔄 
COMMUNICATING --> NOT_COMMUNICATING : communicationfail ❌ 
NOT_COMMUNICATING --> DISABLED : disable 
COMMUNICATING --> DISABLED : disable
```
**设备控制状态机** — 管理设备的在线/离线/本地/远程控制状态：
```mermaid
stateDiagram-v2 
[*] --> EQUIPMENT_OFFLINE 
EQUIPMENT_OFFLINE --> ATTEMPT_ONLINE : switch_online 
ATTEMPT_ONLINE --> HOST_OFFLINE : attempt_online_fail 
ATTEMPT_ONLINE --> ONLINE : online_ok 
HOST_OFFLINE --> ONLINE : online_ok 
ONLINE --> ONLINE_LOCAL : local 
ONLINE --> ONLINE_REMOTE : remote 
ONLINE_LOCAL --> ONLINE_REMOTE : remote 
ONLINE_REMOTE --> ONLINE_LOCAL : local
```

### HSMS 控制消息流程
```mermaid
sequenceDiagram 
participant Active as Active端 (Host) 
participant Passive as Passive端 (Equipment)
Active->>Passive: TCP 连接建立 ✅
Active->>Passive: Select.req
Note right of Active: 请求建立HSMS会话
Passive->>Active: Select.rsp
Note left of Passive: 同意建立会话
Note over Active,Passive: 🔗 进入 SELECTED 状态

loop 链路保活
    Active->>Passive: Linktest.req
    Passive->>Active: Linktest.rsp
    Note over Active,Passive: 心跳检测，确认链路存活
end

Note over Active,Passive: 💬 SECS-II 消息交互...

Active->>Passive: Separate.req
Note right of Active: 主动请求断开HSMS会话<br/>释放通信资源
Note over Active,Passive: 🔓 断开 HSMS 会话
```
### 事件系统

项目内置灵活的事件发布/订阅机制，支持以下核心事件：

| 事件名称 | 触发时机 | 适用层 |
|---------|---------|-------|
| `connected` | TCP 连接建立 | HSMS |
| `disconnected` | TCP 连接断开 | HSMS |
| `communicating` | 通信建立完成 | HSMS/GEM |
| `message_received` | 收到消息 | 所有层 |
| `handler_communicating` | 处理器通信就绪 | GEM |
| `alarm_received` | 收到告警通知 | GEM Host |
| `collection_event_received` | 收到收集事件报告 | GEM Host |
| `terminal_received` | 收到终端消息 | GEM Host |

## 模块说明

### Common (公共基础层)

提供整个协议栈的基础抽象和工具类：

- **Settings** — 抽象配置类，定义设备类型、超时、会话 ID 等通用参数
- **Protocol** — 抽象协议类，定义消息收发、响应队列、系统计数器等核心机制
- **Connection** — 抽象连接类，封装底层 TCP 连接的生命周期管理
- **StateMachine** — 通用有限状态机框架，支持层次化状态、状态进入/离开事件
- **EventProducer** — 事件发布/订阅系统，支持注册回调函数和目标对象
- **TcpClientConnection** — TCP 客户端连接实现
- **TcpServerConnection** — TCP 服务器连接实现（支持多客户端）
- **ByteQueue** — 线程安全的字节缓冲队列
- **ProtocolDispatcher** — 协议调度器，管理收发线程
- **Message/Block** — 消息和数据块的数据模型

### HSMS (高速消息传输层)

基于 SEMI E37 标准的 HSMS 协议实现：

- **HsmsProtocol** — HSMS 协议核心实现，处理 Select/Deselect/Linktest/Separate/Reject 控制流程
- **HsmsSettings** — HSMS 专用配置（IP、端口、连接模式、Session ID）
- **HsmsConnectMode** — 连接模式枚举（Active/Passive）
- **HsmsMessage/HsmsBlock** — HSMS 消息和数据块格式
- **ConnectionStateMachine** — HSMS 连接状态机（NOT_CONNECTED → CONNECTED_NOT_SELECTED → CONNECTED_SELECTED）

### SECS (SECS-II 消息层)

基于 SEMI E5 标准的 SECS-II 实现：

- **SecsHandler** — SECS 消息处理器，管理 Stream/Function 回调分发
- **StreamsFunctions** — 函数注册表，动态查找 Stream/Function 对应的消息类
- **SecsStreamFunction** — 所有 SECS-II 函数的基类，提供编码/解码能力
- **DataItemBase** — 数据项基类，定义了数据格式和值约束
- **130+ Data Items** — 完整的 SECS-II 数据项定义（如 ALID, CEID, PPID, RCMD 等）
- **22 种变量类型** — 支持 SECS-II 的所有数据类型


### GEM (设备模型层)

基于 SEMI E30 标准的 GEM 实现：

- **GemHandler** — GEM 基础处理器，继承自 SecsHandler，添加 GEM 通信状态管理
- **GemEquipmentHandler** — Equipment 端完整实现，通过多重继承组合 8 种设备能力
- **GemHostHandler** — Host 端实现，提供远程命令发送、收集事件订阅等功能

## 设备能力 (Capabilities)

GemEquipmentHandler 通过多重继承（Mixin 模式）组合以下 8 种 GEM 能力：

| 能力模块 | 功能 | 相关 Stream/Function |
|---------|------|---------------------|
| **AlarmCapability** | 告警管理（设置/清除/启用/禁用告警） | S5F1-S5F8 |
| **ClockCapability** | 时钟同步（获取/设置设备时间） | S2F17-S2F18 |
| **CollectionEventCapability** | 收集事件管理（定义报告/链接/启用事件） | S2F33-S2F38, S6F11-S6F16 |
| **DataValueCapability** | 数据值管理（读取/写入设备数据值） | S6F1-S6F6 |
| **EquipmentConstantsCapability** | 设备常量管理（读取/设置设备常量） | S2F13-S2F16, S2F29-S2F30 |
| **RemoteControlCapability** | 远程控制（START/STOP/工艺程序管理等） | S2F41-S2F42, S7F1-S7F26 |
| **StateModelsCapability** | 设备状态模型管理（ONLINE/OFFLINE/LOCAL/REMOTE） | S1F15-S1F18 |
| **StatusDataCollectionCapability** | 状态数据采集（读取设备状态变量） | S1F3-S1F4, S1F11-S1F12 |

## API 参考

### 核心配置类

#### HsmsSettings

HSMS 连接配置类：

| 参数 | 类型 | 默认值 | 描述 |
|------|------|--------|------|
| `address` | str | `"127.0.0.1"` | IP 地址 |
| `port` | int | `5000` | TCP 端口 |
| `connect_mode` | HsmsConnectMode | `ACTIVE` | 连接模式 |
| `device_type` | DeviceType | `HOST` | 设备类型 |
| `session_id` | int | `0` | 会话 ID |
| `establish_communication_timeout` | int | `10` | 通信建立超时（秒） |

### Equipment 端 API

#### GemEquipmentHandler

| 方法 | 描述 |
|------|------|
| `enable()` | 启动设备端服务 |
| `disable()` | 停止设备端服务 |
| `waitfor_communicating(timeout)` | 等待通信建立 |
| `set_alarm(alid)` | 设置告警 |
| `clear_alarm(alid)` | 清除告警 |
| `trigger_collection_events(ceids)` | 触发收集事件 |
| `on_commack_requested()` | 连接确认回调（可重写） |

### Host 端 API

#### GemHostHandler

| 方法 | 描述 |
|------|------|
| `enable()` | 启动主机连接 |
| `disable()` | 断开主机连接 |
| `waitfor_communicating(timeout)` | 等待通信建立 |
| `are_you_there()` | 发送 S01F01 探测请求 |
| `list_svs(svs)` | 查询设备状态变量列表 |
| `request_svs(svs)` | 获取设备状态变量值 |
| `request_sv(sv_id)` | 获取单个状态变量值 |
| `list_ecs(ecs)` | 查询设备常量列表 |
| `request_ecs(ecs)` | 获取设备常量值 |
| `request_ec(ec_id)` | 获取单个设备常量值 |
| `set_ecs(ecs)` | 设置设备常量值 |
| `set_ec(ec_id, value)` | 设置单个设备常量值 |
| `send_remote_command(rcmd, params)` | 发送远程命令 |
| `send_process_program(ppid, ppbody)` | 发送工艺程序 |
| `request_process_program(ppid)` | 请求工艺程序 |
| `get_process_program_list()` | 获取工艺程序列表 |
| `delete_process_programs(ppids)` | 删除工艺程序 |
| `subscribe_collection_event(ceid, dvs, report_id)` | 订阅收集事件 |
| `clear_collection_events()` | 清除所有收集事件订阅 |
| `enable_alarm(alid)` | 启用告警 |
| `disable_alarm(alid)` | 禁用告警 |
| `list_alarms(alids)` | 列出告警 |
| `list_enabled_alarms()` | 列出已启用的告警 |
| `go_online()` | 将设备设置为在线状态 |
| `go_offline()` | 将设备设置为离线状态 |
| `send_equipment_terminal(terminal_id, text)` | 发送终端消息到设备 |

### 通用 API (SecsHandler)

| 方法 | 描述 |
|------|------|
| `register_stream_function(stream, function, callback)` | 注册自定义 Stream/Function 回调 |
| `unregister_stream_function(stream, function)` | 注销 Stream/Function 回调 |
| `stream_function(stream, function)` | 获取 Stream/Function 消息类 |
| `disable_ceids()` | 禁用所有收集事件 |
| `disable_ceid_reports()` | 禁用所有收集事件报告 |


## 支持的 Stream/Function

SecsGemPro 大部分 SECS-II Stream/Function 消息定义，基于 **SEMI E5 (SECS-II)** 标准。每个消息类均继承自 `SecsStreamFunction`，通过 `_stream` 和 `_function` 属性标识，`_data_format` 定义数据格式。

### 符号约定

- **W** = 需要回复（`_is_reply_required = True`）
- **(W)** = 可选回复（`_has_reply = True, _is_reply_required = False`）
- **MB** = 支持多块传输（`_is_multi_block = True`）
- **E↔H** = Equipment 与 Host 双向均可发送
- **E→H** = Equipment 端发送到 Host 端
- **H→E** = Host 端发送到 Equipment 端

---

### S00 — Abort Transaction（中止事务）

**规范**: SEMI E5 Section 6.1

| SF | 类名 | 描述 | 格式 | 回复 | 方向 |
|----|------|------|------|------|------|
| S00F00 | SecsS00F00 | 中止事务 (Abort Transaction) | Header only | — | E↔H |

---

### S01 — Equipment Status（设备状态）

**规范**: SEMI E5 Section 6.2

| SF | 类名 | 描述 | 格式 | 回复 | 方向 |
|----|------|------|------|------|------|
| S01F00 | SecsS01F00 | 中止 Stream 1 事务 | Header only | — | E↔H |
| S01F01 | SecsS01F01 | 在线探测请求 (Are You Online) | Header only | W | H→E |
| S01F02 | SecsS01F02 | 在线数据 (On Line Data) | `[MDLN, SOFTREV]` (E→H), `[]` (H→E) | — | E↔H |
| S01F03 | SecsS01F03 | 选中设备状态请求 (Selected Status Request) | `[SVID, ...]` | W | H→E |
| S01F04 | SecsS01F04 | 选中设备状态数据 (Selected Status Data) | `[SV, ...]` | — | MB | E→H |
| S01F11 | SecsS01F11 | 状态变量名称列表请求 (SV Namelist Request) | `[SVID, ...]` | W | H→E |
| S01F12 | SecsS01F12 | 状态变量名称列表回复 (SV Namelist Reply) | `[{SVID, SVNAME, UNITS}, ...]` | — | MB | E→H |
| S01F13 | SecsS01F13 | 建立通信请求 (Establish Communication) | `[MDLN, SOFTREV]` (E→H), `[]` (H→E) | W | E↔H |
| S01F14 | SecsS01F14 | 建立通信确认 (Communication Acknowledge) | `{COMMACK, [MDLN, SOFTREV]}` | — | E↔H |
| S01F15 | SecsS01F15 | 请求离线 (Request Offline) | Header only | W | H→E |
| S01F16 | SecsS01F16 | 离线确认 (Offline Acknowledge) | `OFLACK: B[1]` | — | E→H |
| S01F17 | SecsS01F17 | 请求在线 (Request Online) | Header only | W | H→E |
| S01F18 | SecsS01F18 | 在线确认 (Online Acknowledge) | `ONLACK: B[1]` | — | E→H |
| S01F21 | SecsS01F21 | 数据变量名称列表请求 (DV Namelist Request) | `[VID, ...]` | W | H→E |
| S01F22 | SecsS01F22 | 数据变量名称列表 (DV Namelist) | `[{VID, DVVALNAME, UNITS}, ...]` | — | E→H |
| S01F23 | SecsS01F23 | 收集事件名称列表请求 (CE Namelist Request) | `[CEID, ...]` | W | H→E |
| S01F24 | SecsS01F24 | 收集事件名称列表 (CE Namelist) | `[{CEID, CENAME, [VID, ...]}, ...]` | — | E→H |

---

### S02 — Equipment Constants and Reports（设备常量与报告）

**规范**: SEMI E5 Section 6.3

| SF | 类名 | 描述 | 格式 | 回复 | 方向 |
|----|------|------|------|------|------|
| S02F00 | SecsS02F00 | 中止 Stream 2 事务 | Header only | — | E↔H |
| S02F13 | SecsS02F13 | 设备常量请求 (EC Request) | `[ECID, ...]` | W | H→E |
| S02F14 | SecsS02F14 | 设备常量数据 (EC Data) | `[ECV, ...]` | — | MB | E→H |
| S02F15 | SecsS02F15 | 设置设备常量发送 (New EC Send) | `[{ECID, ECV}, ...]` | W | H→E |
| S02F16 | SecsS02F16 | 设置设备常量确认 (New EC Acknowledge) | `EAC: B[1]` | — | E→H |
| S02F17 | SecsS02F17 | 日期时间请求 (Date & Time Request) | Header only | W | H→E |
| S02F18 | SecsS02F18 | 日期时间数据 (Date & Time Data) | `TIME: A[32]` | — | E→H |
| S02F21 | SecsS02F21 | 远程命令发送 (Remote Command Send) | `RCMD: U1/I1/A` | (W) | H→E |
| S02F22 | SecsS02F22 | 远程命令确认 (Remote Command Acknowledge) | `CMDA: U1/I1` | — | E→H |
| S02F23 | SecsS02F23 | 轨迹初始化 (Trace Initialize) | `{TRID, DSPER, TOTSMP, REPGSZ, [SVID, ...]}` | W | MB | H→E |
| S02F24 | SecsS02F24 | 轨迹初始化确认 (Trace Init Acknowledge) | `TIAACK: B[1]` | — | E→H |
| S02F25 | SecsS02F25 | 环回诊断请求 (Loopback Request) | `ABS: B` | W | H→E |
| S02F26 | SecsS02F26 | 环回诊断数据 (Loopback Data) | `ABS: B` | — | E→H |
| S02F29 | SecsS02F29 | 设备常量名称列表请求 (EC Namelist Request) | `[ECID, ...]` | W | H→E |
| S02F30 | SecsS02F30 | 设备常量名称列表 (EC Namelist) | `[{ECID, ECNAME, ECMIN, ECMAX, ECDEF, UNITS}, ...]` | — | MB | E→H |
| S02F31 | SecsS02F31 | 设置日期时间请求 (Set Time Request) | `TIME: A[32]` | W | H→E |
| S02F32 | SecsS02F32 | 设置日期时间确认 (Set Time Acknowledge) | `TIACK: B[1]` | — | E→H |
| S02F33 | SecsS02F33 | 定义报告 (Define Report) | `{DATAID, [{RPTID, [VID, ...]}, ...]}` | W | MB | H→E |
| S02F34 | SecsS02F34 | 定义报告确认 (Define Report Acknowledge) | `DRACK: B[1]` | — | E→H |
| S02F35 | SecsS02F35 | 链接事件报告 (Link Event Report) | `{DATAID, [{CEID, [RPTID, ...]}, ...]}` | W | MB | H→E |
| S02F36 | SecsS02F36 | 链接事件报告确认 (Link Report Acknowledge) | `LRACK: B[1]` | — | E→H |
| S02F37 | SecsS02F37 | 启用/禁用事件报告 (En/Disable Event Report) | `{CEED: BOOLEAN, [CEID, ...]}` | W | H→E |
| S02F38 | SecsS02F38 | 启用/禁用事件报告确认 (Event Report Acknowledge) | `ERACK: B[1]` | — | E→H |
| S02F41 | SecsS02F41 | 主机命令发送 (Host Command Send) | `{RCMD, [{CPNAME, CPVAL}, ...]}` | W | H→E |
| S02F42 | SecsS02F42 | 主机命令确认 (Host Command Acknowledge) | `{HCACK: B[1], [{CPNAME, CPACK: B[1]}, ...]}` | — | E→H |
| S02F43 | SecsS02F43 | 重置假脱机发送 (Reset Spooling Send) | `[{STRID: U1, [FCNID: U1, ...]}, ...]` | W | H→E |
| S02F44 | SecsS02F44 | 重置假脱机确认 (Reset Spooling Acknowledge) | `{RSPACK: B[1], [{STRID, STRACK: B[1], [FCNID, ...]}, ...]}` | — | E→H |
| S02F45 | SecsS02F45 | 定义变量限制属性 (Define Variable Limits) | `{DATAID, [{VID, [{LIMITID, [UPPERDB, LOWERDB]}, ...]}, ...]}` | W | MB | H→E |
| S02F46 | SecsS02F46 | 定义变量限制属性确认 (Limit Attributes Acknowledge) | `{VLAACK: B[1], [{VID, LVACK: B[1], [LIMITID, LIMITACK: B[1]]}, ...]}` | — | E→H |
| S02F47 | SecsS02F47 | 变量限制属性请求 (Limit Attribute Request) | `[VID, ...]` | W | H→E |
| S02F48 | SecsS02F48 | 变量限制属性数据 (Limit Attribute Data) | `[{VID, {UNITS, LIMITMIN, LIMITMAX, [{LIMITID, UPPERDB, LOWERDB}, ...]}}, ...]` | — | E→H |
| S02F49 | SecsS02F49 | 增强远程命令 (Enhanced Remote Command) | `{DATAID, OBJSPEC, RCMD, [{CPNAME, CEPVAL}, ...]}` | — | MB | H→E |
| S02F50 | SecsS02F50 | 增强远程命令确认 (Enhanced Remote Command ACK) | `{HCACK: B[1], [{CPNAME, CPACK: B[1]}, ...]}` | — | E→H |

---

### S03 — Material/Recipe Status（物料/配方状态）

**规范**: SEMI E5 Section 6.4

| SF | 类名 | 描述 | 格式 | 回复 | 方向 |
|----|------|------|------|------|------|
| S03F17 | SecsS03F17 | 载具操作请求 (Carrier Action Request) | `{DATAID, CARRIERACTION, CARRIERID, PTN, [{CATTRID, CATTRDATA}, ...]}` | W | MB | H→E |
| S03F18 | SecsS03F18 | 载具操作确认 (Carrier Action Acknowledge) | `{CAACK: B[1], [{ERRCODE, ERRTEXT}, ...]}` | — | E→H |

---

### S05 — Exception/Alarm Reporting（异常/告警报告）

**规范**: SEMI E5 Section 6.5

| SF | 类名 | 描述 | 格式 | 回复 | 方向 |
|----|------|------|------|------|------|
| S05F00 | SecsS05F00 | 中止 Stream 5 事务 | Header only | — | E↔H |
| S05F01 | SecsS05F01 | 告警报告发送 (Alarm Report Send) | `{ALCD: B[1], ALID, ALTX: A[120]}` | (W) | E→H |
| S05F02 | SecsS05F02 | 告警报告确认 (Alarm Report Acknowledge) | `ACKC5: B[1]` | — | H→E |
| S05F03 | SecsS05F03 | 启用/禁用告警发送 (En/Disable Alarm Send) | `{ALED: B[1], ALID}` | (W) | H→E |
| S05F04 | SecsS05F04 | 启用/禁用告警确认 (En/Disable Alarm Acknowledge) | `ACKC5: B[1]` | — | E→H |
| S05F05 | SecsS05F05 | 列出告警请求 (List Alarms Request) | `[ALID, ...]` | W | H→E |
| S05F06 | SecsS05F06 | 列出告警数据 (List Alarms Data) | `[{ALCD: B[1], ALID, ALTX: A[120]}, ...]` | — | MB | E→H |
| S05F07 | SecsS05F07 | 列出已启用告警请求 (List Enabled Alarms Request) | Header only | W | H→E |
| S05F08 | SecsS05F08 | 列出已启用告警数据 (List Enabled Alarms Data) | `[{ALCD: B[1], ALID, ALTX: A[120]}, ...]` | — | MB | E→H |
| S05F09 | SecsS05F09 | 异常发布通知 (Exception Post Notify) | `{TIMESTAMP: A, EXID: A[20], EXTYPE: A, EXMESSAGE: A, [EXRECVRA: A[40], ...]}` | (W) | E→H |
| S05F10 | SecsS05F10 | 异常发布确认 (Exception Post Confirm) | Header only | — | H→E |
| S05F11 | SecsS05F11 | 异常清除通知 (Exception Clear Notify) | `{TIMESTAMP: A, EXID: A[20], EXTYPE: A, EXMESSAGE: A}` | (W) | E→H |
| S05F12 | SecsS05F12 | 异常清除确认 (Exception Clear Confirm) | Header only | — | H→E |
| S05F13 | SecsS05F13 | 异常恢复请求 (Exception Recover Request) | `{EXID: A[20], EXRECVRA: A[40]}` | W | H→E |
| S05F14 | SecsS05F14 | 异常恢复确认 (Exception Recover Acknowledge) | `{EXID: A[20], {ACKA: BOOLEAN, {ERRCODE, ERRTEXT: A[120]}}}` | — | E→H |
| S05F15 | SecsS05F15 | 异常恢复完成通知 (Exception Recover Complete) | `{TIMESTAMP: A, EXID: A[20], {ACKA: BOOLEAN, {ERRCODE, ERRTEXT: A[120]}}}` | (W) | E→H |
| S05F16 | SecsS05F16 | 异常恢复完成确认 (Exception Recover Complete ACK) | Header only | — | H→E |
| S05F17 | SecsS05F17 | 异常恢复中止请求 (Exception Recover Abort) | `EXID: A[20]` | W | H→E |
| S05F18 | SecsS05F18 | 异常恢复中止确认 (Exception Recover Abort ACK) | `{EXID: A[20], {ACKA: BOOLEAN, {ERRCODE, ERRTEXT: A[120]}}}` | — | E→H |

---

### S06 — Data Collection（数据采集）

**规范**: SEMI E5 Section 6.6

| SF | 类名 | 描述 | 格式 | 回复 | 方向 |
|----|------|------|------|------|------|
| S06F00 | SecsS06F00 | 中止 Stream 6 事务 | Header only | — | E↔H |
| S06F01 | SecsS06F01 | 轨迹数据发送 (Trace Data Send) | `{TRID, SMPLN, STIME, [SV, ...]}` | (W) | MB | E→H |
| S06F02 | SecsS06F02 | 轨迹数据确认 (Trace Data Acknowledge) | `ACKC6: B[1]` | — | H→E |
| S06F05 | SecsS06F05 | 多块数据查询 (Multi Block Data Inquiry) | `{DATAID, DATALENGTH}` | W | E→H |
| S06F06 | SecsS06F06 | 多块数据授权 (Multi Block Data Grant) | `GRANT6: B[1]` | — | H→E |
| S06F07 | SecsS06F07 | 数据传输请求 (Data Transfer Request) | `DATAID` | W | E→H |
| S06F08 | SecsS06F08 | 数据传输数据 (Data Transfer Data) | `{DATAID, CEID, [{DSID, [{DVNAME, DVVAL}, ...]}, ...]}` | — | MB | E→H |
| S06F11 | SecsS06F11 | 事件报告发送 (Event Report) | `{DATAID, CEID, [{RPTID, [V, ...]}, ...]}` | W | MB | E→H |
| S06F12 | SecsS06F12 | 事件报告确认 (Event Report Acknowledge) | `ACKC6: B[1]` | — | H→E |
| S06F15 | SecsS06F15 | 事件报告请求 (Event Report Request) | `CEID` | W | H→E |
| S06F16 | SecsS06F16 | 事件报告数据 (Event Report Data) | `{DATAID, CEID, [{RPTID, [V, ...]}, ...]}` | — | MB | E→H |
| S06F19 | SecsS06F19 | 单独报告请求 (Individual Report Request) | `RPTID` | W | H→E |
| S06F20 | SecsS06F20 | 单独报告数据 (Individual Report Data) | `[V, ...]` | — | MB | E→H |
| S06F21 | SecsS06F21 | 带注释单独报告请求 (Annotated Report Request) | `RPTID` | W | H→E |
| S06F22 | SecsS06F22 | 带注释单独报告数据 (Annotated Report Data) | `[{VID, V}, ...]` | — | MB | E→H |
| S06F23 | SecsS06F23 | 请求假脱机数据 (Request Spooled Data) | `RSDC: U1[1]` | W | H→E |
| S06F24 | SecsS06F24 | 请求假脱机数据确认 (Spooled Data Acknowledge) | `RSDA: B[1]` | — | E→H |

---

### S07 — Process Program Management（工艺程序管理）

**规范**: SEMI E5 Section 6.7

| SF | 类名 | 描述 | 格式 | 回复 | 方向 |
|----|------|------|------|------|------|
| S07F00 | SecsS07F00 | 中止 Stream 7 事务 | Header only | — | E↔H |
| S07F01 | SecsS07F01 | 工艺程序加载询问 (PP Load Inquire) | `{PPID: A/B[120], LENGTH}` | W | E↔H |
| S07F02 | SecsS07F02 | 工艺程序加载授权 (PP Load Grant) | `PPGNT: B[1]` | — | E↔H |
| S07F03 | SecsS07F03 | 工艺程序发送 (PP Send) | `{PPID: A/B[120], PPBODY}` | W | MB | E↔H |
| S07F04 | SecsS07F04 | 工艺程序确认 (PP Acknowledge) | `ACKC7: B[1]` | — | E↔H |
| S07F05 | SecsS07F05 | 工艺程序请求 (PP Request) | `PPID: A/B[120]` | W | E↔H |
| S07F06 | SecsS07F06 | 工艺程序数据 (PP Data) | `{PPID: A/B[120], PPBODY}` | — | MB | E↔H |
| S07F17 | SecsS07F17 | 删除工艺程序发送 (Delete PP Send) | `[PPID: A/B[120], ...]` | W | H→E |
| S07F18 | SecsS07F18 | 删除工艺程序确认 (Delete PP Acknowledge) | `ACKC7: B[1]` | — | E→H |
| S07F19 | SecsS07F19 | 当前工艺程序请求 (Current PP Request) | Header only | W | H→E |
| S07F20 | SecsS07F20 | 当前工艺程序数据 (Current PP Data) | `[PPID: A/B[120], ...]` | — | MB | E→H |
| S07F23 | SecsS07F23 | 格式化工艺程序发送 (Format PP Send) | `{PPID, MDLN, SOFTREV, [{CCODE, [PPARM, ...]}, ...]}` | W | MB | E↔H |
| S07F24 | SecsS07F24 | 格式化工艺程序确认 (Format PP Acknowledge) | `ACKC7: B[1]` | — | E↔H |
| S07F25 | SecsS07F25 | 格式化工艺程序请求 (Format PP Request) | `PPID: A/B[120]` | W | E↔H |
| S07F26 | SecsS07F26 | 格式化工艺程序数据 (Format PP Data) | `{PPID, MDLN, SOFTREV, [{CCODE, [PPARM, ...]}, ...]}` | W | MB | E↔H |

---

### S09 — System Errors（系统错误）

**规范**: SEMI E5 Section 6.9

| SF | 类名 | 描述 | 格式 | 回复 | 方向 |
|----|------|------|------|------|------|
| S09F00 | SecsS09F00 | 中止 Stream 9 事务 | Header only | — | E↔H |
| S09F01 | SecsS09F01 | 未识别的设备 ID (Unrecognized Device ID) | `MHEAD: B[10]` | — | E→H |
| S09F03 | SecsS09F03 | 未识别的 Stream 类型 (Unrecognized Stream Type) | `MHEAD: B[10]` | — | E→H |
| S09F05 | SecsS09F05 | 未识别的 Function 类型 (Unrecognized Function) | `MHEAD: B[10]` | — | E→H |
| S09F07 | SecsS09F07 | 非法数据 (Illegal Data) | `MHEAD: B[10]` | — | E→H |
| S09F09 | SecsS09F09 | 事务计时器超时 (Transaction Timer Timeout) | `SHEAD: B[10]` | — | E→H |
| S09F11 | SecsS09F11 | 数据过长 (Data Too Long) | `MHEAD: B[10]` | — | E→H |
| S09F13 | SecsS09F13 | 会话超时 (Conversation Timeout) | `{MEXP: A[6], EDID}` | — | E→H |

---

### S10 — Terminal Messages（终端消息）

**规范**: SEMI E5 Section 6.10

| SF | 类名 | 描述 | 格式 | 回复 | 方向 |
|----|------|------|------|------|------|
| S10F00 | SecsS10F00 | 中止 Stream 10 事务 | Header only | — | E↔H |
| S10F01 | SecsS10F01 | 终端请求 (Terminal Request) | `{TID: B[1], TEXT}` | (W) | E→H |
| S10F02 | SecsS10F02 | 终端请求确认 (Terminal Acknowledge) | `ACKC10: B[1]` | — | H→E |
| S10F03 | SecsS10F03 | 终端单次显示 (Terminal Display) | `{TID: B[1], TEXT}` | (W) | H→E |
| S10F04 | SecsS10F04 | 终端显示确认 (Terminal Display Acknowledge) | `ACKC10: B[1]` | — | E→H |

---

### S12 — Wafer Map（晶圆映射）

**规范**: SEMI E5 Section 6.12

| SF | 类名 | 描述 | 格式 | 回复 | 方向 |
|----|------|------|------|------|------|
| S12F00 | SecsS12F00 | 中止 Stream 12 事务 | Header only | — | E↔H |
| S12F01 | SecsS12F01 | 映射设置数据发送 (Map Setup Data Send) | `{MID, IDTYP, FNLOC, FFROT, ORLOC, RPSEL, [REFP], DUTMS, XDIES, YDIES, ROWCT, COLCT, NULBC, PRDCT, PRAXI}` | W | E→H |
| S12F02 | SecsS12F02 | 映射设置数据确认 (Map Setup Ack) | `SDACK: B[1]` | — | H→E |
| S12F03 | SecsS12F03 | 映射设置数据请求 (Map Setup Request) | `{MID, IDTYP, MAPFT, FNLOC, FFROT, ORLOC, PRAXI, BCEQU, NULBC}` | W | E→H |
| S12F04 | SecsS12F04 | 映射设置数据 (Map Setup Data) | `{MID, IDTYP, FNLOC, ORLOC, RPSEL, [REFP], DUTMS, XDIES, YDIES, ROWCT, COLCT, PRDCT, BCEQU, NULBC, MLCL}` | — | H→E |
| S12F05 | SecsS12F05 | 映射传输询问 (Map Transmit Inquire) | `{MID, IDTYP, MAPFT: B[1], MLCL}` | W | E→H |
| S12F06 | SecsS12F06 | 映射传输授权 (Map Transmit Grant) | `GRNT1: B[1]` | — | H→E |
| S12F07 | SecsS12F07 | 映射数据类型 1 发送 (Map Type1 Send) | `{MID, IDTYP, [{RSINF: I[3], BINLT}, ...]}` | W | MB | E→H |
| S12F08 | SecsS12F08 | 映射数据类型 1 确认 (Map Type1 Ack) | `MDACK: B[1]` | — | H→E |
| S12F09 | SecsS12F09 | 映射数据类型 2 发送 (Map Type2 Send) | `{MID, IDTYP, STRP: I[2], BINLT}` | W | MB | E→H |
| S12F10 | SecsS12F10 | 映射数据类型 2 确认 (Map Type2 Ack) | `MDACK: B[1]` | — | H→E |
| S12F11 | SecsS12F11 | 映射数据类型 3 发送 (Map Type3 Send) | `{MID, IDTYP, [{XYPOS: I[2], BINLT}, ...]}` | W | MB | E→H |
| S12F12 | SecsS12F12 | 映射数据类型 3 确认 (Map Type3 Ack) | `MDACK: B[1]` | — | H→E |
| S12F13 | SecsS12F13 | 映射数据类型 1 请求 (Map Type1 Request) | `{MID, IDTYP}` | W | E→H |
| S12F14 | SecsS12F14 | 映射数据类型 1 数据 (Map Type1 Data) | `{MID, IDTYP, [{RSINF: I[3], BINLT}, ...]}` | — | MB | H→E |
| S12F15 | SecsS12F15 | 映射数据类型 2 请求 (Map Type2 Request) | `{MID, IDTYP}` | W | E→H |
| S12F16 | SecsS12F16 | 映射数据类型 2 数据 (Map Type2 Data) | `{MID, IDTYP, STRP: I[2], BINLT}` | — | MB | H→E |
| S12F17 | SecsS12F17 | 映射数据类型 3 请求 (Map Type3 Request) | `{MID, IDTYP, SDBIN: B[1]}` | W | E→H |
| S12F18 | SecsS12F18 | 映射数据类型 3 数据 (Map Type3 Data) | `{MID, IDTYP, [{XYPOS: I[2], BINLT}, ...]}` | — | MB | H→E |
| S12F19 | SecsS12F19 | 映射错误报告发送 (Map Error Report) | `{MAPER: B[1], DATLC: U1}` | — | E↔H |

---

### S14 — Recipe Management（配方管理）

**规范**: SEMI E5 Section 6.14 / SEMI E39

| SF | 类名 | 描述 | 格式 | 回复 | 方向 |
|----|------|------|------|------|------|
| S14F00 | SecsS14F00 | 中止 Stream 14 事务 | Header only | — | E↔H |
| S14F01 | SecsS14F01 | 获取属性请求 (GetAttr Request) | `{OBJSPEC, OBJTYPE, [OBJID, ...], [{ATTRID, ATTRDATA, ATTRRELN}, ...], [ATTRID, ...]}` | W | E↔H |
| S14F02 | SecsS14F02 | 获取属性数据 (GetAttr Data) | `{[{OBJID, [{ATTRID, ATTRDATA}, ...]}, ...], {OBJACK, [{ERRCODE, ERRTEXT}, ...]}}` | — | MB | E↔H |
| S14F03 | SecsS14F03 | 设置属性请求 (SetAttr Request) | `{OBJSPEC, OBJTYPE, [OBJID, ...], [{ATTRID, ATTRDATA}, ...]}` | W | E↔H |
| S14F04 | SecsS14F04 | 设置属性数据 (SetAttr Data) | `{[{OBJID, [{ATTRID, ATTRDATA}, ...]}, ...], {OBJACK, [{ERRCODE, ERRTEXT}, ...]}}` | — | MB | E↔H |

---

### ACK 值参考

以下是各 Stream/Function 回复中使用的 ACK 数据项的具体值定义。

#### S01F14 — COMMACK（建立通信确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `COMMACK.ACCEPTED` | 接受 |
| 1 | `COMMACK.DENIED` | 拒绝，请重试 |
| 2-63 | — | 保留 |

#### S01F16 — OFLACK（离线确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `OFLACK.ACK` | 离线确认 |
| 1-63 | — | 保留 |

#### S01F18 — ONLACK（在线确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `ONLACK.ACCEPTED` | 在线接受 |
| 1 | `ONLACK.NOT_ALLOWED` | 在线不被允许 |
| 2 | `ONLACK.ALREADY_ON` | 已经在线 |
| 3-63 | — | 保留 |

#### S02F16 — EAC（设备常量确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `EAC.ACK` | 确认 |
| 1 | `EAC.INVALID_CONSTANT` | 拒绝，常量不存在 |
| 2 | `EAC.BUSY` | 拒绝，设备忙 |
| 3 | `EAC.OUT_OF_RANGE` | 拒绝，常量值超出范围 |
| 4-63 | — | 保留，设备特定 |

#### S02F22 — CMDA（远程命令确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `CMDA.DONE` | 已完成/已执行 |
| 1 | `CMDA.COMMAND_UNKNOWN` | 命令不存在 |
| 2 | `CMDA.NOT_NOW` | 当前无法执行 |
| 3-63 | — | 保留，设备特定错误 |

#### S02F24 — TIAACK（轨迹初始化确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `TIAACK.OK` | 正常 |
| 1 | `TIAACK.SVID_EXCEEDED` | SVID 数量超出限制 |
| 2 | `TIAACK.TRACES_DENIED` | 不允许更多轨迹 |
| 3 | `TIAACK.INVALID_PERIOD` | 无效的采样周期 |
| 4 | `TIAACK.SVID_UNKNOWN` | 未知的 SVID |
| 5 | `TIAACK.REPGSZ_INVALID` | 无效的 REPGSZ |
| 6-63 | — | 保留 |

#### S02F32 — TIACK（时间设置确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `TIACK.ACK` | 时间设置成功 |
| 1 | `TIACK.TIME_SET_FAIL` | 时间设置失败 |

#### S02F34 — DRACK（定义报告确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `DRACK.ACK` | 确认 |
| 1 | `DRACK.INSUFFICIENT_SPACE` | 拒绝，空间不足 |
| 2 | `DRACK.INVALID_FORMAT` | 拒绝，格式无效 |
| 3 | `DRACK.RPTID_REDEFINED` | 拒绝，RPTID 已定义 |
| 4 | `DRACK.VID_UNKNOWN` | 拒绝，VID 不存在 |
| 5-63 | — | 保留，其他错误 |

#### S02F36 — LRACK（链接事件报告确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `LRACK.ACK` | 确认 |
| 1 | `LRACK.INSUFFICIENT_SPACE` | 拒绝，空间不足 |
| 2 | `LRACK.INVALID_FORMAT` | 拒绝，格式无效 |
| 3 | `LRACK.CEID_LINKED` | 拒绝，CEID 已链接 |
| 4 | `LRACK.CEID_UNKNOWN` | 拒绝，CEID 不存在 |
| 5 | `LRACK.RPTID_UNKNOWN` | 拒绝，RPTID 不存在 |
| 6-63 | — | 保留，其他错误 |

#### S02F38 — ERACK（启用/禁用事件报告确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `ERACK.ACCEPTED` | 接受 |
| 1 | `ERACK.CEID_UNKNOWN` | 拒绝，CEID 不存在 |
| 2-63 | — | 保留 |

#### S02F42 / S02F50 — HCACK（主机命令确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `HCACK.ACK` | 确认 |
| 1 | `HCACK.INVALID_COMMAND` | 拒绝，无效命令 |
| 2 | `HCACK.CANT_PERFORM_NOW` | 拒绝，当前无法执行 |
| 3 | `HCACK.PARAMETER_INVALID` | 拒绝，参数无效 |
| 4 | `HCACK.ACK_FINISH_LATER` | 确认，稍后完成 |
| 5 | `HCACK.ALREADY_IN_CONDITION` | 拒绝，已处于该状态 |
| 6 | `HCACK.NO_OBJECT` | 无此对象 |
| 7-63 | — | 保留 |

#### S02F42 / S02F50 — CPACK（命令参数确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 1 | `CPACK.PARAMETER_UNKNOWN` | 参数名未知 |
| 2 | `CPACK.CPVAL_ILLEGAL_VALUE` | CPVAL 值非法 |
| 3 | `CPACK.CPVAL_ILLEGAL_FORMAT` | CPVAL 格式非法 |
| 4-63 | — | 保留 |

#### S02F44 — RSPACK（重置假脱机确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `RSPACK.ACK` | 确认，假脱机设置已接受 |
| 1 | `RSPACK.REJECTED` | 假脱机设置被拒绝 |
| 2-63 | — | 保留 |

#### S02F44 — STRACK（假脱机 Stream 确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 1 | `STRACK.NOT_ALLOWED` | 该 Stream 不允许假脱机 |
| 2 | `STRACK.STREAM_UNKNOWN` | Stream 未知 |
| 3 | `STRACK.FUNCTION_UNKNOWN` | 该 Stream 的 Function 未知 |
| 4 | `STRACK.SECONDARY` | 该 Stream 的次要 Function |

#### S02F46 — VLAACK（变量限制属性确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `VLAACK.ACK` | 确认，命令将执行 |
| 1 | `VLAACK.LIMIT_DEF_ERROR` | 限制属性定义错误 |
| 2 | `VLAACK.NOT_NOW` | 当前无法执行 |
| 3-63 | — | 保留，设备特定错误 |

#### S02F46 — LVACK（变量限制确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `LVACK.OK` | 正常 |
| 1 | `LVACK.VARIABLE_UNKNOWN` | 变量不存在 |
| 2 | `LVACK.NO_LIMITS` | 变量无限制 |
| 3 | `LVACK.DUPLICATE_VARIABLE` | 变量重复 |
| 4 | `LVACK.LIMIT_ERROR` | 限制值错误 |
| 5-63 | — | 保留 |

#### S02F46 — LIMITACK（限制属性确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `LIMITACK.OK` | 正常 |
| 1 | `LIMITACK.LIMITID_UNKNOWN` | LIMITID 不存在 |
| 2 | `LIMITACK.UPPERDB_MORE_LIMITMAX` | UPPERDB > LIMITMAX |
| 3 | `LIMITACK.LOWERDB_LESS_LIMITMIN` | LOWERDB < LIMITMIN |
| 4 | `LIMITACK.UPPERDB_LESS_LOWERDB` | UPPERDB < LOWERDB |
| 5 | `LIMITACK.ILLEGAL_FORMAT` | UPPER/LOWERDB 格式非法 |
| 6 | `LIMITACK.ASCII_ILLEGAL` | ASCII 值非法 |
| 7 | `LIMITACK.DUPLICATE` | 重复的限制定义 |
| 8-63 | — | 保留，设备特定错误 |

#### S03F18 — CAACK（载具操作确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `CAACK.ACCEPTED` | 接受 |

#### S05F02 / S05F04 — ACKC5（Stream 5 确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `ACKC5.ACCEPTED` | 接受 |
| 1-63 | `ACKC5.ERROR` | 错误 |

#### S05F14 / S05F15 / S05F18 — ACKA（请求成功标记）

| 值 | 含义 |
|----|------|
| `True` | 成功 |
| `False` | 失败 |

#### S06F02 / S06F12 — ACKC6（Stream 6 确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `ACKC6.ACCEPTED` | 接受 |
| 1-63 | `ACKC6.ERROR` | 错误 |

#### S06F06 — GRANT6（多块数据授权码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `GRANT6.GRANTED` | 授权 |
| 1 | `GRANT6.BUSY` | 忙 |
| 2 | `GRANT6.NOT_INTERESTED` | 不感兴趣 |
| 3-63 | — | 其他错误 |

#### S06F23 — RSDC（请求假脱机数据命令）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `RSDC.TRANSMIT` | 传输假脱机消息 |
| 1 | `RSDC.PURGE` | 清除假脱机消息 |
| 2-63 | — | 保留 |

#### S06F24 — RSDA（请求假脱机数据确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `RSDA.ACK` | 确认 |
| 1 | `RSDA.DENIED_BUSY` | 拒绝，忙，请稍后重试 |
| 2 | `RSDA.DENIED_NO_DATA` | 拒绝，假脱机数据不存在 |
| 3-63 | — | 保留 |

#### S07F02 — PPGNT（工艺程序授权码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `PPGNT.OK` | 确认 |
| 1 | `PPGNT.ALREADY_HAVE` | 已拥有 |
| 2 | `PPGNT.NO_SPACE` | 空间不足 |
| 3 | `PPGNT.INVALID_PPID` | PPID 无效 |
| 4 | `PPGNT.BUSY` | 忙，请稍后重试 |
| 5 | `PPGNT.WILL_NOT_ACCEPT` | 不会接受 |
| 6-63 | — | 保留，其他错误 |

#### S07F04 / S07F18 / S07F24 — ACKC7（Stream 7 确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `ACKC7.ACCEPTED` | 接受 |
| 1 | `ACKC7.NO_PERMISSION` | 无权限 |
| 2 | `ACKC7.LENGTH_ERROR` | 长度错误 |
| 3 | `ACKC7.MATRIX_OVERFLOW` | 矩阵溢出 |
| 4 | `ACKC7.PPID_NOT_FOUND` | PPID 未找到 |
| 5 | `ACKC7.MODE_UNSUPPORTED` | 模式不支持 |
| 6 | `ACKC7.PERFORMED_LATER` | 稍后执行 |
| 7-63 | — | 保留 |

#### S10F02 / S10F04 — ACKC10（终端确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `ACKC10.ACCEPTED` | 接受 |
| 1 | `ACKC10.NOT_DISPLAYED` | 不会显示 |
| 2 | `ACKC10.TERMINAL_NOT_AVAILABLE` | 终端不可用 |
| 3-63 | — | 其他错误 |

#### S12F02 — SDACK（映射设置确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `SDACK.ACK` | 已接收数据 |
| 1-63 | — | 错误 |

#### S12F06 — GRNT1（映射传输授权码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `GRNT1.ACK` | 确认 |
| 1 | `GRNT1.BUSY` | 忙，请重试 |
| 2 | `GRNT1.NO_SPACE` | 空间不足 |
| 3 | `GRNT1.MAP_TOO_LARGE` | 映射过大 |
| 4 | `GRNT1.DUPLICATE_ID` | ID 重复 |
| 5 | `GRNT1.MATERIALID_UNKNOWN` | 物料 ID 未找到 |
| 6 | `GRNT1.UNKNOWN_MAP_FORMAT` | 未知映射格式 |
| 7-63 | — | 保留，错误 |

#### S12F08 / S12F10 / S12F12 — MDACK（映射数据确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `MDACK.ACK` | 映射已接收 |
| 1 | `MDACK.FORMAT_ERROR` | 格式错误 |
| 2 | `MDACK.UNKNOWN_ID` | ID 不匹配 |
| 3 | `MDACK.ABORT_MAP` | 中止/丢弃映射 |
| 4-63 | — | 保留，错误 |

#### S14F02 / S14F04 — OBJACK（对象确认码）

| 值 | 常量 | 含义 |
|----|------|------|
| 0 | `OBJACK.SUCCESSFUL` | 成功 |
| 1 | `OBJACK.ERROR` | 错误 |
| 2-63 | — | 保留 |

---

### 汇总统计

| Stream | 功能范围 | 规范 | SF 数量 |
|--------|---------|------|---------|
| S00 | Abort Transaction | SEMI E5 §6.1 | 1 |
| S01 | Equipment Status | SEMI E5 §6.2 | 18 |
| S02 | Equipment Constants and Reports | SEMI E5 §6.3 | 30 |
| S03 | Material/Recipe Status | SEMI E5 §6.4 | 2 |
| S05 | Exception/Alarm Reporting | SEMI E5 §6.5 | 18 |
| S06 | Data Collection | SEMI E5 §6.6 | 16 |
| S07 | Process Program Management | SEMI E5 §6.7 | 14 |
| S09 | System Errors | SEMI E5 §6.9 | 8 |
| S10 | Terminal Messages | SEMI E5 §6.10 | 4 |
| S12 | Wafer Map | SEMI E5 §6.12 | 19 |
| S14 | Recipe Management | SEMI E5 §6.14 / E39 | 4 |
| **合计** | | | **134** |


## 开发计划
- [ ] 支持更多 GEM 高级特性（Trace Data、Spooling 等）

## 许可证

本项目基于 MIT 许可证开源。

---


