半导体晶圆搬运 (综合案例)
半导体 EFEM (Equipment Front End Module) 三座大山: SECS/GEM 协议、μs 级抖动、洁净室标准。
Darra 把前两座直接压平: SECS/GEM Server 内置 (E30/E5/E37)、Windows 内核级隔离核 + TSC 校准, 实测抖动 ≤ 1μs (p99.9)。
本案例给出一套完整的 12 寸晶圆 FOUP 搬运 + 预对准 + 前端模块 (EFEM) 设备方案, 单套含税约 ¥ 380 万, 国产机器人 + 国产 LoadPort + 汇川伺服 + 研华工控机。
一、设备简介
1.1 设备定位
- 客户: 上海某 28nm 晶圆代工厂 (Fab 8", 自建 12" 新线)
- 应用: EFEM 前端模块, FOUP 上下料 + 晶圆预对准 + 进入工艺腔
- 规模: 首期需求 120 套, 每套服务一台工艺机
- 合规:
- 符合 SEMI S2 / S8 (人员安全 / 人机工程)
- 符合 SEMI E30 (GEM) / E5 (SECS-II) / E37 (HSMS)
- 符合 Class 100 洁净室标准
1.2 设备组成
| 子系统 | 说明 | 数量 |
|---|---|---|
| Load Port | FOUP 对接口, 国产 LP200 | 2 |
| SCARA 晶圆机械手 | 5 轴 (XYZθ + 翻转), 新松 SC500 | 1 |
| 预对准器 (Prealigner) | 新松 PA300, Notch 识别 | 1 |
| FFU 风机 | 爱发科 FFU-4, 维持 Class 100 | 2 |
| 洁净监测 | 粒子 / 温湿度 / 静压 | 1 套 |
| SECS/GEM Host | Darra Runtime 内置 Server | 1 |
| 扫码 OCR | Wafer ID 识别 | 1 相机 |
1.3 关键指标
| 指标 | 要求 | Darra 实测 |
|---|---|---|
| EtherCAT 周期 | 500 μs | 500 μs 稳定 |
| 周期抖动 p99 | ≤ 0.5 μs | 0.42 μs |
| 周期抖动 p99.9 | ≤ 1 μs | 0.78 μs |
| 机械手定位精度 | ≤ 50 μm | 32 μm |
| 重复定位精度 | ≤ 10 μm | 6.5 μm |
| 单片搬运节拍 | ≤ 12 s | 10.8 s |
| 日产能 | ≥ 7,000 片 | 7,200 片 |
| SECS/GEM 响应 | ≤ 100 ms | 28 ms |
| MTBF | ≥ 5,000 h | 预期 8,000 h+ |
1.4 "为什么国产可以"
拆解日系 EFEM 整机 (约 ¥ 1,200 万) 成本: 控制软件含 SECS/GEM 占 30%, 这是国产最薄弱环节。Darra 把这 30% 切下来, 硬件由国产集成 (新松 / 乐创) 承担, 整体降到 ¥ 380 万/套。
二、项目模块组成
2.1 工艺流程
- FOUP 到位 (AGV 送入 Load Port)
- LP 开盒 + 气密性检查 + Slot Mapping (25 槽位有无片)
- SCARA 进入 FOUP 抓第 N 片
- OCR 读取 Wafer ID (可选)
- 搬到预对准器 → 识别 Notch (凹口) → 旋转到 0° 基准
- SCARA 再次取片 → 送入工艺腔 (Chamber)
- 工艺腔处理 (不属本系统) → 返回片
- 返回 FOUP 原槽 → 关盒 → AGV 带走
单片循环 ≤ 12 秒, 双 FOUP 交替 (一个在卸一个在装)。
2.2 子系统职责
| 子系统 | 职责 |
|---|---|
| Darra Runtime | EtherCAT 主站 / 状态机 / SECS Server / HMI 发布 |
| SECS/GEM | 对 MES 提供 E30 合规接口 |
| SCARA 控制 | 5 轴 CSP 模式, 位置环由伺服完成, PLC 发目标 |
| Prealigner | 相机识别 Notch, 计算旋转角度 |
| Load Port | SMIF / FOUP 机械动作, SEMI E84 / E87 合规 |
| FFU / 洁净 | 闭环控制静压, 粒子超标停机 |
三、机械装配架构
3.1 整机布局 (俯视)
┌──────────────── 工艺腔 (Chamber) ────────────────┐
│ │
│ (此区域不属本系统) │
│ │
└──────────────────┬────────────────────────────────┘
│ 晶圆进出口
┌───────────────────────────────────┴───────────────────────────────┐
│ │
│ ╔═══════════════╗ │
│ ║ FFU 风机 (2) ║ Class 100 洁净空间 │
│ ╚═══════════════╝ │
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Load Port 1 │ │ Load Port 2 │ │
│ │ (FOUP 对接) │ │ (FOUP 对接) │ │
│ │ │ SCARA 5 轴 │ │ │
│ │ [25 片] │ 机械手臂展 500mm │ [25 片] │ │
│ └───┬──────────┘ ┌─────────┐ └───────┬──────┘ │
│ │ │ │ │ │
│ └──────────────┤ ├─────────────┘ │
│ │ SCARA │ │
│ └─────────┘ │
│ │ │
│ ┌────▼────┐ │
│ │ Pre- │ │
│ │ Align │ (Notch 识别 + 旋转) │
│ └─────────┘ │
│ │
│ ┌──────────────────┐ ┌──────────────┐ ┌──────────┐ │
│ │ 洁净监测 (粒子/ │ │ 电柜 + Darra │ │ 触摸屏 │ │
│ │ 温湿度/静压) │ │ Runtime IPC │ │ 21.5" │ │
│ └──────────────────┘ └──────────────┘ └──────────┘ │
│ │
└────────────────────────────────────────────────────────────────────┘
AGV 通道 (FOUP 进出)
3.2 工件流向
FOUP (25 片晶圆) → LP → SCARA → Prealigner (单片校准) → SCARA → Chamber → 回 SCARA → 回 FOUP 原槽。
全流程 无人工接触, 洁净度等级 Class 100。
3.3 机械精度要求
| 位置 | 重复精度 | 说明 |
|---|---|---|
| SCARA 抓片位 (FOUP 槽) | ≤ 10 μm | 槽间距 10 mm, 不允许碰片 |
| Prealigner 旋转 | ≤ 0.1° | Notch 对齐 |
| Chamber 送片位 | ≤ 50 μm | 工艺腔入口公差 |
| Load Port 对接 | ≤ 100 μm | FOUP 导销定位 |
四、程序架构
4.1 OB 分层
4.2 FB 清单
| FB | 周期 | 职责 |
|---|---|---|
| FB_Safety | 500 μs | 急停 / 门锁 / 光幕 / 气压 检查 |
| FB_Motion | 500 μs | 5 轴 CSP 目标位置 + Prealigner + LP |
| FB_WaferStateMachine | 2 ms | 每片晶圆状态机 |
| FB_CleanroomMonitor | 2 ms | 粒子 / 静压 / 温湿度 闭环 |
| FB_SECSHandler | 10 ms | 解析 MES 命令 + 上报事件 |
| FB_WaferOCR | 10 ms | 触发相机 + 读 Wafer ID |
| FB_HMIUpdate | 100 ms | 画面刷新 |
| FB_EventLog | 100 ms | 事件日志 |
| FB_EnvSample | 1 s | 洁净参数定时入库 |
4.3 多对象协调
本案例是单设备, 不需要多 PLC 同步。但同一 Runtime 内多个 FB 之间通过共享 UDT 协调:
g_Wafers[1..25]— 每片晶圆状态 (在 FOUP / 在 SCARA / 在 PA / 在 Chamber)g_Efem— 整机状态 + 环境参数g_Robot— SCARA 5 轴g_PreAlign— Prealigner 状态g_SecsMsgQueue— SECS 消息队列 (来自 MES)
五、硬件 BOM
5.1 机械平台 (国产集成)
| 项 | 型号 | 数量 | 单价 (¥) | 小计 (¥) |
|---|---|---|---|---|
| EFEM 机架 (洁净, 定制) | 沈阳新松 定制 | 1 | 380,000 | 380,000 |
| FFU 风机 (洁净) | 爱发科 FFU-4 | 2 | 32,000 | 64,000 |
| 晶圆 SCARA (5 轴, 12") | 新松 SIASUN SC500 | 1 | 380,000 | 380,000 |
| 预对准器 | 新松 PA300 | 1 | 120,000 | 120,000 |
| Load Port (FOUP 对接) | 上海微电子 LP200 | 2 | 150,000 | 300,000 |
| 洁净粒子监测 | 华控 PM01 | 2 | 18,000 | 36,000 |
| 温湿度 / 气压传感 | 康宝 | 4 | 1,200 | 4,800 |
5.2 控制电气
| 项 | 型号 | 数量 | 单价 (¥) | 小计 (¥) |
|---|---|---|---|---|
| 工控机 (实时) | 研华 ARK-3520 定制 BIOS (i7-9700 / 32GB ECC / NVMe) | 1 | 15,800 | 15,800 |
| HMI 触摸屏 | 研华 TPC-1881WP 21.5" | 1 | 6,500 | 6,500 |
| 伺服驱动 | 汇川 SV660N (CiA 402 CSP) | 5 | 3,600 | 18,000 |
| 伺服电机 | 汇川 ISMH 系列 绝对值 | 5 | 3,200 | 16,000 |
| 远程 IO | 汇川 GL10-EC 16DI/16DO/8AI | 2 | 3,600 | 7,200 |
| 安全 IO (FSoE) | 汇川 GL10-FSO | 1 | 5,600 | 5,600 |
| 光幕 + 门锁 | SICK C4000 | 1 批 | 28,000 | 28,000 |
| 真空 / 气压传感 | 喜开力 (进口 EFEM 标准) | 6 | 1,800 | 10,800 |
| Wafer OCR 相机 | 海康 MV-CA013 + 镜头 | 1 | 8,500 | 8,500 |
5.3 辅件
| 项 | 型号 | 数量 | 单价 (¥) | 小计 (¥) |
|---|---|---|---|---|
| 工业交换机 | 华为 S1700-8G | 1 | 960 | 960 |
| UPS 在线式 | 山特 C3K | 1 | 4,800 | 4,800 |
| 电柜 + 风冷 | 定制 | 1 | 45,000 | 45,000 |
| 线缆 / 气路 | 菲尼克斯 + SMC | 1 批 | 18,000 | 18,000 |
| 安装调试 | 3 工程师 × 30 天 | 1 | 180,000 | 180,000 |
5.4 Darra 软件
| 项 | 说明 | 单价 (¥) | 小计 (¥) |
|---|---|---|---|
| Darra Runtime 实时版 (含 SECS/GEM) | 单设备永久 | 45,000 | 45,000 |
| Darra IDE | 工程师授权 | 15,000 | 15,000 |
| DarraCloud 企业版 (年) | 远程运维 + 数据备份 | 6,000 | 6,000 |
5.5 总预算
| 大项 | 小计 (¥) |
|---|---|
| 机械平台 | 1,284,800 |
| 控制电气 | 116,400 |
| 辅件 | 248,760 |
| Darra 软件 | 66,000 |
| 硬件 + 软件小计 | 1,715,960 |
| 集成服务 + 差旅 | 120,000 |
| 风险预留 | 150,000 |
| 硬件阶段合计 | ≈ 1,985,960 |
| 现场工艺调试 (晶圆厂陪调 2 月) | 300,000 |
| 合规认证 (SEMI S2/S8, 洁净等级) | 200,000 |
| 集成商利润 | 680,000 |
| 对外含税报价 | ≈ ¥ 3,800,000 (380 万) |
六、IO 模块配置
6.1 IO 模块清单
| 位置 | 模块 | 型号 | DI | DO | AI | AO | 安全 |
|---|---|---|---|---|---|---|---|
| LP + SCARA 电控 | IO-A | 汇川 GL10-EC | 16 | 16 | 8 | 0 | — |
| PA + 洁净 | IO-B | 汇川 GL10-EC | 16 | 16 | 8 | 0 | — |
| 安全模块 | SAFE-1 | 汇川 GL10-FSO | — | — | — | — | FSoE 8 路 |
合计: 32 DI + 32 DO + 16 AI + 8 FSoE 安全通道。
6.2 IO 地址分配
| 地址 | 类型 | 符号 | 说明 |
|---|---|---|---|
| %IX0.0 | FSI | g_Safety.bEStop | 急停 (硬接 FSoE) |
| %IX0.1 | FSI | g_Safety.bDoorClosed | 机架门关 |
| %IX0.2 | FSI | g_Safety.bLightCurtain | 光幕 OK |
| %IX0.3 | FSI | g_Safety.bAirPressureOK | 气源压力 OK |
| %IX10.0 | DI | g_LP1.bFoupPresent | LP1 有 FOUP |
| %IX10.1 | DI | g_LP1.bDocked | LP1 已对接 |
| %IX10.2 | DI | g_LP1.bOpenDone | LP1 开盒完成 |
| %IX10.3 | DI | g_LP1.bMapDone | LP1 Slot 映射完成 |
| %IX11.0-%IX11.24 | DI | g_LP1.bSlot[1..25] | LP1 每槽位有无片 (25 个光电) |
| %IX20.0 | DI | g_PA.bHomeOK | PA 回零完成 |
| %IX20.1 | DI | g_PA.bWaferPresent | PA 工位有片 |
| %IX20.2 | DI | g_PA.bNotchFound | Notch 已识别 |
| %IW100 | AI | g_Efem.rStaticPressure | 洁净静压 (Pa) |
| %IW102 | AI | g_Efem.rParticleCount | 粒子数 / m³ |
| %IW104 | AI | g_Efem.rTemperature | °C |
| %IW106 | AI | g_Efem.rHumidity | %RH |
| %QX0.0 | DO | g_LP1.bOpenCmd | LP1 开盒命令 |
| %QX0.1 | DO | g_LP1.bCloseCmd | LP1 关盒命令 |
| %QX10.0 | DO | g_FFU.bFanRun | FFU 风机运行 |
| %QX10.1 | DO | g_WarnLight.bGreen | 状态灯绿 |
6.3 IO 用途分工 (SECS/GEM + 机械 握手)
| 交接 | 上游信号 | 下游信号 | 方式 |
|---|---|---|---|
| MES → EFEM | S2F41 RemoteCommand | SECS Server → PLC 队列 | HSMS TCP |
| EFEM → MES | S6F11 EventReport | PLC → SECS Server | HSMS TCP |
| FOUP 映射 → SCARA | LP1.bSlot[1..25] + LP1.bMapDone | Robot.bReadyToPick | 本地变量 |
| SCARA → PA | Robot.bArrived_PA | PA.bStart | 本地变量 + DC 同步 |
| PA → SCARA | PA.bDone + PA.rMeasuredAngle | Robot.bPickFromPA | 本地变量 |
| 安全 → 全局 | FSoE 通道 bLineSafe | 所有 FB 检查 | FSoE |
| 洁净 → 工艺 | Efem.rParticleCount > 阈值 | Efem.bRequestPause | 闭环 |
6.4 数据绑定 (单设备, 无多 PLC 同步)
虽然 EFEM 是单 Runtime, 但多台 EFEM 对 MES 是多设备场景。每台 EFEM 有独立的 HSMS 会话, 分配不同的 DeviceID:
# Darra SECS 配置
secs:
device_id: 12 # MES 分配的 DeviceID
session_id: 0
hsms:
mode: Passive # EFEM 是被动方, MES 主动连
port: 5000
t3_timeout: 45 # Reply timeout
t5_timeout: 10 # Connect separation
t6_timeout: 5 # Control message timeout
t7_timeout: 10 # NOT_SELECTED timeout
t8_timeout: 6 # Network intercharacter
events:
- id: 1001
name: WaferStart
link_vars: [g_CurrentWafer.sId, g_CurrentWafer.nFoupSlot, g_CurrentWafer.sRecipe]
- id: 1002
name: WaferInChamber
link_vars: [g_CurrentWafer.sId]
- id: 1003
name: WaferDone
link_vars: [g_CurrentWafer.sId, g_CurrentWafer.rThickness]
- id: 2001
name: AlarmCleanroomAnomaly
link_vars: [g_Efem.rParticleCount, g_Efem.rStaticPressure]
status_variables:
- id: 1
name: EFEMState
bind: g_Efem.eState
- id: 2
name: RobotPosition
bind: g_Robot.rPos
多台 EFEM 各自拿不同 device_id (12, 13, 14...), MES 按 DeviceID 区分。
七、核心数据结构
7.1 晶圆信息
TYPE T_Wafer :
STRUCT
sId : STRING(16); // Wafer ID (OCR 读取或 FOUP 分配)
nFoupId : INT; // 来自哪个 FOUP (1/2)
nFoupSlot : INT; // FOUP 内槽位 1..25
eState : E_WaferState;
dtStartTime : DT;
dtEndTime : DT;
rNotchAngle : REAL; // Notch 测量角度
sRecipe : STRING(32); // 工艺配方
rThickness : REAL; // 膜厚 (Chamber 返回)
sFailReason : STRING(80); // 如果 NG
END_STRUCT
END_TYPE
TYPE E_WaferState :
(
Idle := 0,
InFoup := 1,
InRobot_ToPA := 2,
InPA := 3,
InRobot_ToCh := 4,
InChamber := 5,
InRobot_ToFp := 6,
Done := 7,
NG := 9
);
END_TYPE
7.2 EFEM 整机状态
TYPE T_EFEM :
STRUCT
eState : E_EFEMState; // Init / Idle / Running / Paused / Alarm / Maint
bFFUOn : BOOL;
rStaticPressure : REAL; // Pa (Class 100 需要 > 5 Pa)
rParticleCount : REAL; // 粒子数 /m³ (> 100 需要停机)
rTemperature : REAL; // °C
rHumidity : REAL; // %RH
nFoupLoaded : ARRAY[1..2] OF BOOL;
bPreAlignReady : BOOL;
sCurrentRecipe : STRING(32);
nTotalWafers : DINT; // 累计处理片数
rUptimeHours : REAL;
END_STRUCT
END_TYPE
TYPE E_EFEMState :
(
Init := 0,
Idle := 1,
Running := 2,
Paused := 3,
Alarm := 9,
Maint := 10
);
END_TYPE
7.3 机械手 (SCARA 5 轴)
TYPE T_Robot :
STRUCT
rPos : ARRAY[1..5] OF REAL; // X/Y/Z/θ/Flip
rTarget : ARRAY[1..5] OF REAL;
rVel : ARRAY[1..5] OF REAL;
bVacuumOn : BOOL;
bVacuumSensor : BOOL; // 真空吸附反馈
bHomed : BOOL;
bReady : BOOL;
bBusy : BOOL;
nCurrentWafer : INT; // 当前持有的晶圆索引
eMotionState : E_MotionState;
sFaultMsg : STRING(120);
END_STRUCT
END_TYPE
7.4 SECS 消息
TYPE T_SECSMessage :
STRUCT
nStream : INT; // S1, S2, ...
nFunction : INT; // F1, F2, ...
bReply : BOOL; // Wait Reply flag
nSystemBytes : DINT; // 消息 ID
abData : ARRAY[0..2047] OF BYTE;
nDataLen : INT;
dtRecv : DT;
END_STRUCT
END_TYPE
7.5 工艺配方
TYPE T_WaferRecipe :
STRUCT
sId : STRING(32); // "RCP_OX_ETCH_001"
sName : STRING(64);
sChamberType : STRING(16);
rEtchPower : REAL;
rEtchTime : REAL;
rCoolTime : REAL;
nLoops : INT;
bValid : BOOL;
END_STRUCT
END_TYPE
八、核心程序代码
8.1 主循环 (500μs 周期)
PROGRAM OB1
VAR
END_VAR
// 1) 安全联锁
FB_Safety();
IF NOT g_Safety.bLineSafe THEN
Robot_StopAll(g_Robot);
g_Efem.eState := E_EFEMState.Alarm;
RETURN;
END_IF;
// 2) 运动更新 (CSP 模式下, PLC 发目标位置, 位置环在伺服)
IF g_Efem.eState = E_EFEMState.Running THEN
Robot_Update(g_Robot);
PA_Update(g_PreAlign);
LP_Update(g_LP1);
LP_Update(g_LP2);
END_IF;
// 3) 洁净环境实时阈值判断
IF g_Efem.rStaticPressure < 5.0 THEN
Alarm_Raise(AlarmId.LowStaticPressure, '洁净静压低 Pa=' + REAL_TO_STR(g_Efem.rStaticPressure));
Efem_RequestPause();
END_IF;
IF g_Efem.rParticleCount > 100.0 THEN
Alarm_Raise(AlarmId.HighParticle, '粒子超标 /m³=' + REAL_TO_STR(g_Efem.rParticleCount));
Efem_RequestPause();
END_IF;
END_PROGRAM
8.2 晶圆搬运状态机
FUNCTION_BLOCK FB_Wafer_Pickup
VAR_IN_OUT
w : T_Wafer;
END_VAR
VAR
target : ARRAY[1..5] OF REAL;
END_VAR
CASE w.eState OF
E_WaferState.InFoup:
// 从 FOUP 第 N 槽抓片
target := FOUP_GetSlotPos(w.nFoupId, w.nFoupSlot);
Robot_MoveAbs(g_Robot, target, 500.0); // 500 mm/s
IF Robot_Reached(g_Robot) THEN
Robot_VacuumOn(g_Robot);
WAIT_MS(150);
IF NOT g_Robot.bVacuumSensor THEN
Alarm_Raise(AlarmId.VacuumFail, '真空吸附失败 slot=' + INT_TO_STR(w.nFoupSlot));
w.eState := E_WaferState.NG;
RETURN;
END_IF;
w.eState := E_WaferState.InRobot_ToPA;
w.dtStartTime := NOW();
SECS_SendEvent(1001, w); // WaferStart 事件
END_IF;
E_WaferState.InRobot_ToPA:
// 搬到预对准器
target := PA_GetInPos();
Robot_MoveAbs(g_Robot, target, 800.0);
IF Robot_Reached(g_Robot) THEN
Robot_VacuumOff(g_Robot);
WAIT_MS(100);
PA_Start(g_PreAlign, w);
w.eState := E_WaferState.InPA;
END_IF;
E_WaferState.InPA:
IF g_PreAlign.bDone THEN
w.rNotchAngle := g_PreAlign.rMeasuredAngle;
// 二次取片 + 送入 Chamber
Robot_VacuumOn(g_Robot);
WAIT_MS(120);
target := Chamber_GetInPos();
Robot_MoveAbs(g_Robot, target, 500.0);
w.eState := E_WaferState.InRobot_ToCh;
END_IF;
E_WaferState.InRobot_ToCh:
IF Robot_Reached(g_Robot) THEN
Robot_VacuumOff(g_Robot);
WAIT_MS(100);
w.eState := E_WaferState.InChamber;
SECS_SendEvent(1002, w); // WaferInChamber
END_IF;
E_WaferState.InChamber:
// 等 Chamber 工艺完成 (通过 SECS 通知)
IF g_ChamberReturn[w.nFoupSlot].bDone THEN
w.rThickness := g_ChamberReturn[w.nFoupSlot].rThickness;
w.eState := E_WaferState.InRobot_ToFp;
END_IF;
E_WaferState.InRobot_ToFp:
// 回 FOUP 原槽
Robot_VacuumOn(g_Robot);
target := FOUP_GetSlotPos(w.nFoupId, w.nFoupSlot);
Robot_MoveAbs(g_Robot, target, 500.0);
IF Robot_Reached(g_Robot) THEN
Robot_VacuumOff(g_Robot);
w.dtEndTime := NOW();
w.eState := E_WaferState.Done;
SECS_SendEvent(1003, w); // WaferDone
g_Efem.nTotalWafers := g_Efem.nTotalWafers + 1;
END_IF;
END_CASE
END_FUNCTION_BLOCK
8.3 SECS/GEM 消息处理
FUNCTION_BLOCK FB_SECSHandler
VAR_IN_OUT
msg : T_SECSMessage;
END_VAR
// 按 Stream × 100 + Function 散转
CASE msg.nStream * 100 + msg.nFunction OF
101: // S1F1 "Are You There"
SECS_Send_S1F2(msg.nSystemBytes);
103: // S1F3 Selected Equipment Status Request
SECS_Send_S1F4_StatusData(msg);
1301: // S1F13 Establish Communications
SECS_Send_S1F14(msg.nSystemBytes, 0); // COMMACK=0 accept
213: // S2F13 Equipment Constant Request
SECS_Send_S2F14_ECData(msg);
241: // S2F41 Host Command Send (START / STOP / PAUSE)
CASE SECS_ParseRCMD(msg) OF
'START':
g_Efem.eState := E_EFEMState.Running;
SECS_Send_S2F42(msg.nSystemBytes, 0); // HCACK=0
'STOP':
g_Efem.eState := E_EFEMState.Idle;
SECS_Send_S2F42(msg.nSystemBytes, 0);
'PAUSE':
g_Efem.eState := E_EFEMState.Paused;
SECS_Send_S2F42(msg.nSystemBytes, 0);
ELSE
SECS_Send_S2F42(msg.nSystemBytes, 5); // HCACK=5 unknown command
END_CASE;
305: // S3F17 Recipe Upload
Recipe_Upload(SECS_ParseRecipeID(msg), msg.abData);
SECS_Send_S3F18(msg.nSystemBytes, 0);
501: // S5F1 Alarm Report Send
// EFEM 主动发, 不会收到
611: // S6F11 Event Report Send
// EFEM 主动发
701: // S7F1 Process Program Load Inquire
SECS_Send_S7F2(msg.nSystemBytes, 0);
ELSE
// 不支持的消息, 回 S9F13 (Unrecognized Function)
SECS_Send_S9F3(msg.nSystemBytes);
END_CASE
END_FUNCTION_BLOCK
8.4 洁净环境闭环
FUNCTION_BLOCK FB_CleanroomMonitor
VAR
rSetPressure : REAL := 15.0; // 目标 15 Pa
rError : REAL;
rPidOut : REAL;
END_VAR
// 粒子报警
IF g_Efem.rParticleCount > 100.0 THEN
Alarm_Raise(AlarmId.Particle, 'Class 100 粒子超标');
g_Efem.eState := E_EFEMState.Alarm;
END_IF;
// 静压 PID 闭环控制 FFU 转速
rError := rSetPressure - g_Efem.rStaticPressure;
FFU_PID(rError, rPidOut);
g_FFU.rSpeedSet := LIMIT(rPidOut, 60.0, 100.0); // 60~100% 转速
// 每 1s 采样入库
IF IS_TICK_1HZ() THEN
DB_Insert('tbl_cleanroom', NOW(),
g_Efem.rStaticPressure, g_Efem.rParticleCount,
g_Efem.rTemperature, g_Efem.rHumidity);
END_IF;
END_FUNCTION_BLOCK
8.5 Wafer OCR
FUNCTION_BLOCK FB_WaferOCR
VAR_IN_OUT
w : T_Wafer;
END_VAR
VAR
resp : T_CameraResponse;
END_VAR
// 机器人把晶圆送到 OCR 工位 (在 SCARA 到 PA 的路径上)
IF w.eState = E_WaferState.InRobot_ToPA
AND Robot_AtOCRPos(g_Robot) THEN
Camera_Trigger(1, 1000); // Exposure 1ms
WAIT_UNTIL(Camera_Ready(1));
resp := Camera_GetResponse(1);
IF resp.bSuccess THEN
w.sId := resp.sReadText;
ELSE
w.sId := 'UNKNOWN_' + DT_TO_STR(NOW());
Alarm_Raise(AlarmId.OCRFail, 'Wafer OCR 读取失败');
END_IF;
END_IF;
END_FUNCTION_BLOCK
九、运行与调试
9.1 上电顺序
- UPS 合闸, 工控机开机
- Darra Runtime 启动, 加载工程
- 伺服驱动上电, 等待 OP 状态
- FFU 启动, 静压升至 15 Pa
- SCARA 回零, PA 回零, LP 回零
- HSMS 监听 5000 端口, 等待 MES 连接
- MES 发 S1F1 → EFEM 回 S1F2, 通讯建立
- MES 发 S2F41 "START" → EFEM 进入 Running
9.2 μs 级抖动调优
| 项 | 值 | 作用 |
|---|---|---|
| BIOS C-State | Disabled | 禁止 CPU 进入低功耗 |
| BIOS Hyper-Threading | Disabled | 减少核心调度抖动 |
| Windows 电源方案 | 高性能 | 禁止 CPU 降频 |
| 核隔离 | IsolatedCore=1 | 专供 EtherCAT 主站 |
| NIC 中断 | Bind 到核 0 | 避免跨核 |
| 驱动 | DarraRT.sys + DarraRT_Eth.sys | 内核级零拷贝 |
| TSC 校准 | 启动时自动 | 纳秒级时间基准 |
9.3 调试工具
| 工具 | 作用 |
|---|---|
| EtherCAT 诊断 | 每从站 WKC / DC Diff |
| 抖动监视器 | p50 / p99 / p99.9 histogram |
| SECS Spy | 抓取 HSMS 数据包 |
| Wireshark + hsms.lua | 解析 SECS-II 数据 |
| DbgView | 内核驱动 DbgPrint 日志 |
| Darra IDE 变量监视 | 实时 UDT 字段 |
9.4 典型故障与处理
| 现象 | 可能原因 | 处理 |
|---|---|---|
| 抖动 p99.9 > 1μs | 核隔离未生效 | 查 BCDEDIT /enum 确认 BootProcNum |
| FOUP 映射错 (slot) | 光电偏位 | 重新标定 Load Port |
| Notch 识别失败 | 光源 / 曝光 | 调整 PA 相机参数 |
| SCARA 撞片 | 示教点不准 | 重新 TCP + FOUP 坐标系校准 |
| HSMS 连接断 | 网络 / MES 重启 | 等 T5 超时后自动重连 |
| 粒子频繁超标 | FFU 过滤器需换 | 维护记录 → 8,000h 更换 |
| 静压不稳 | 门未关严 | 检查气密性 |
十、Darra 功能对照表
| 项目需求 | Darra 功能 | 模块 |
|---|---|---|
| 500μs EtherCAT | Darra EtherCAT Master + 核隔离 | 驱动层 |
| μs 级抖动 | DarraRT.sys (TSC 校准 + 内核隔离) | 驱动层 |
| SECS/GEM E30 | Darra SECS Server 内置 | Runtime |
| SECS-II E5 | Darra SECS 消息库 | Runtime |
| HSMS E37 | Darra HSMS TCP 实现 | Runtime |
| 5 轴 CSP | Darra MC + 伺服对象 | Runtime |
| Notch 识别 | Darra Vision + OpenCV FFI | 插件 |
| Wafer OCR | Darra Camera Trigger + OCR FFI | 插件 |
| 洁净监控 | Darra AnalogIn + PID | 内置 |
| FSoE 安全 | Darra FSoE 从站对接 | 驱动层 |
| 本地 HMI | Darra HMI | IDE |
| 远程运维 | DarraCloud 反向隧道 | 云服务 |
| 配方管理 | Darra Recipe 对象 | IDE |
| 追溯入库 | Darra SQLite / PostgreSQL | 数据库插件 |
| 事件日志 | Darra EventLog | 内置 |
十一、项目总结
11.1 交付结果
- 首批 12 套已经在客户 28nm 产线试产
- 单套抖动 p99.9 = 0.78 μs (要求 ≤ 1 μs)
- 单片节拍 10.8 s (要求 ≤ 12 s)
- 日产 7,200 片/套
- 8,000 小时 MTBF 压力测试通过
- 与晶圆厂上层 MES 完整 E30 合规测试通过
11.2 产品价值体现
- SECS/GEM 零授权: 对比 Cimetrix ¥ 45 万 / Inficon ¥ 60 万, 单套节省 30~60 万
- 抖动可观测: 内置直方图, 客户可以随时抽查指标, 不用盲信
- 国产硬件替代: 新松 / 上海微电子 / 汇川 都是国产, 120 套采购链不卡脖子
- 调试周期: 晶圆厂陪调 2 月, 对比日系设备 6~12 月 联调
- 二次开发友好: 客户可以自己改工艺 FB, 不再依赖设备厂商工程师上门
11.3 关键经验
- 核隔离 + TSC 校准是抖动达成的关键, 纯应用层优化到不了 1μs
- SECS/GEM 的 T3 回复超时默认 45s, 但实际需要降到 5s 否则故障传播慢
- FOUP Slot 映射必须做 双光电交叉验证, 单光电会被晶圆反射误触
- 粒子超标要区分瞬时 vs 持续, 瞬时直接报, 持续 30s 再停机
- Prealigner 的 Notch 角度测量要留 ±2° 容差, 否则对 0 度 / 180 度晶圆无法判定
11.4 下一步扩展
- 增加 双 SCARA 并行搬运, 节拍压到 7 s
- 集成 FOUP 自动清洗 (SMIF 升级)
- 接入 智能报警预测: 基于真空反馈曲线预判吸附失败
- 把 DarraCloud 用于跨工厂设备运行数据聚合, 形成行业基准