配方 DSL 参考

APS 配方语言是一种基于行的领域专用语言(DSL),用于自动化真空镀膜工艺。每一行包含一条命令及其参数,以空白字符分隔。除非由流程控制结构改变执行顺序,配方将自上而下顺序执行。

这与 Recipe Editor(配方编辑器) 语言面板中提供的参考内容相同。

语言基础

行格式

command arg1 arg2 ...    # 可选注释

每个非空行都会被解析为一个命令(第一个词),后跟零个或多个参数(标识符、数字或字符串)。注释以 #// 开头,一直延伸到行尾。空行和仅含注释的行会被忽略。

数据类型

类型示例说明
整数5-100有符号整数
浮点数0.05-3.141e-5支持小数与科学计数法
字符串"hello"双引号包裹;支持 \n\t\\\" 转义
布尔值truefalseopenclosedonoff别名会被替换:open/on → true,close/closed/off → false
标识符M1Ar1pm设备或传感器名称;可包含字母、数字、下划线和点

变量

变量用 var 声明,用 $ 前缀引用。变量名不区分大小写。

var flow_rate = 15
var gas Ar1
MFC $gas $flow_rate

内置系统变量:

  • $_i —— 当前循环迭代序号(从 0 开始),在 loop 块内自动设置
  • $pressure —— 当前系统压力(只读,来自传感器提供方)
  • $temperature —— 当前系统温度(只读)
  • $time —— 当前配方已运行时间(只读)

配方外壳

配方可选地用 begin / end 标记包裹。它们在执行时会被静默跳过,仅用于视觉上的清晰。

begin
    valve M1 open
    delay 5
    valve M1 close
end

流程控制命令

命令语法说明
beginbegin可选的配方开始标记,运行时无效果。
endend可选的配方结束标记,运行时无效果。
looploop count开始一个重复 count 次的循环块。count 可为整数字面量或 $variable。会将 $_i 设为当前从 0 开始的迭代序号。
endloopendloop结束循环块,必须与前面的 loop 配对。
ifif sensor_or_var op value条件分支。条件为真时执行随后的块。运算符:<>===<=>=!=。左侧可为传感器 ID 或 $variable;右侧可为数字、$variable 或布尔关键字。
elseelse前面 if 的可选备选分支。
endifendif结束 if/else 块,必须与前面的 if 配对。
labellabel name定义一个具名跳转目标。标签名在配方内必须唯一,运行时无效果。
gotogoto name无条件跳转到具名标签。目标必须存在于当前执行作用域内。
# 使用变量作为循环次数
var cycles = 3
loop $cycles
    MFC Ar1 15
    delay 5
    MFC Ar1 0
    delay 2
endloop

# 基于传感器读数的条件判断
if pm < 0.05
    valve M1 open
else
    valve M1 close
endif

# 标签与跳转
label retry
pwait pm 0.01 60
check pm < 0.05
goto retry

函数

函数可让你定义带参数、可复用的命令序列。

命令语法说明
functionfunction name(param1, param2, ...)开始一个具名函数定义。参数在调用时成为局部变量。
endfunctionendfunction结束函数定义,必须与前面的 function 配对。
namename arg1 arg2 ...调用先前定义的函数,将位置参数绑定到参数名。
function purge_gas(gas, flow, time)
    MFC $gas $flow
    delay $time
    MFC $gas 0
endfunction

# 调用函数
purge_gas Ar1 20 10
purge_gas N2 15 5

变量声明

命令语法说明
varvar name = valuevar name value声明或更新变量。= 号可省略。取值可为数字、字符串、布尔值(true/false)或标识符。
var target_pressure = 0.05
var gas_name Ar1
var use_bias = true

计时命令

命令语法参数说明
delaydelay secondsseconds —— 整数,等待时长暂停配方执行指定的秒数。
waitwait secondsseconds —— 整数,等待时长delay 的别名,暂停执行给定时间。
pwaitpwait sensor target timeoutsensor —— 传感器 ID;target —— 浮点数,目标压力;timeout —— 整数,最长等待秒数等待传感器读数下降到 target 或以下,或直到 timeout 秒耗尽。用于抽真空压力等待。
pressurepressure sensor target timeout(同 pwaitpwait 的别名,行为相同。
checkcheck sensor condition valuesensor —— 传感器 ID;condition —— 比较运算符;value —— 浮点数,阈值读取当前传感器值并与阈值比较。若条件不满足则抛出错误(即时检查,不等待)。
delay 10                  # 等待 10 秒
pwait pm 0.05 60          # 等待压力 < 0.05,超时 60 秒
pressure pl 0.01 120      # 同 pwait,使用不同传感器
check pm < 0.1            # 断言压力低于 0.1

设备命令

阀门控制

语法参数说明
valve id actionid —— 阀门名称(如 M1、V2、V6);action —— openclose(也接受 true/false打开或关闭阀门。
valve M1 open
valve V6 close

MFC(质量流量控制器)

语法参数说明
MFC id setpointid —— MFC 名称(如 Ar1、N2);setpoint —— 浮点数,流量(sccm,0 表示关闭)将质量流量控制器设为给定流量。
MFC Ar1 15
MFC Ar1 0        # 关闭气体流量

泵控制

语法参数说明
pump id actionid —— 泵名称;action —— onoff(也接受 true/false开启或关闭真空泵。
pump TP1 on
pump TP1 off

平移台定位

语法参数说明
stage id positionid —— 平移台名称(如 VS);position —— 浮点数,目标位置(mm)将直线平移台移动到指定位置。
stage VS -10

偏压 / 电源

语法参数说明
bias id mode valueid —— 电源名称;mode —— 工作模式(如 voltage、current);value —— 浮点数,设定值以指定模式和数值配置偏压电源。

挡板控制

语法参数说明
shutter id positionid —— 挡板/驱动名称;position —— openclose打开或关闭镀膜挡板。

样品架(基片旋转)

语法参数说明
holder id actionid —— 样品架驱动名称;action —— onoff启动或停止样品架旋转。

旋转

语法参数说明
rotation action [speed]action —— onoffspeed —— 可选浮点数,旋转速度控制基片旋转。开启时可提供可选的速度参数。
rotation on 5.0
rotation off

复合命令

复合命令是将多个设备动作组合为单个步骤的高级操作。它们通常作为运行时从 DLL 加载的外部执行器(worker)操作定义。

命令语法说明
warmupwarmup device time power运行靶材预热例程:以指定功率为设备供电给定时间。
scanscan device start end step将某设备参数从 startstep 为增量扫描到 end
depositdeposit device thickness time在指定靶源上运行定时沉积,目标为给定厚度和时长。
setset device param value将任意设备参数设为某值,用于通用设备配置。

操作员交互

命令语法说明
messagemessage text...向操作员显示一个带指定文本的模态对话框。配方执行暂停,直到操作员点击 OK 确认。适用于人工干预步骤。
message "装入基片并关闭腔门"
message 检查冷却水流量

命令大小写

命令名称不区分大小写MFCmfcMfc 完全等价。设备与传感器 ID 会与硬件配置进行匹配,通常也不区分大小写。变量名同样不区分大小写。

取值替换

命令被分派到硬件层之前,某些关键字取值会被自动替换:

配方中写法替换后取值
opentrue
close / closedfalse
ontrue
offfalse

嵌套规则

  • loopiffunction 块最多可嵌套 8 层(最大嵌套深度)。
  • function 定义不能出现在 loop 块内部。
  • goto 目标必须位于当前执行作用域内 —— 不能跳入或跳出循环、函数或条件块。
  • 每个 if 最多只能有一个 else 分支。
  • 所有块结构都必须正确闭合:loop/endloopif/endiffunction/endfunction

校验

配方校验器在执行前进行五个阶段的检查:

  1. 分词 —— 确保文本可被解析为有效的词法单元。
  2. 结构 —— 校验块成对匹配(loop/endloop、if/endif、function/endfunction),检查嵌套深度,校验标签唯一性,并确认 goto 目标存在。
  3. 命令 —— 检查命令名称已识别且具备所需的最少参数数量。
  4. 变量 —— 确认所有 $variable 引用要么以 var 声明,要么是函数参数,要么是已知系统变量。
  5. 设备 —— 校验硬件命令(valve、mfc、pump、stage、sensor、power)中使用的设备名称在硬件配置中存在。

完整示例

begin
    # 声明变量
    var base_pressure = 0.05
    var sputter_time = 30

    # 抽真空
    pump TP1 on
    pwait pm $base_pressure 120

    # 通气
    valve M1 open
    valve V2 open
    MFC Ar1 15
    delay 10

    # 确认压力已稳定
    check pm < 0.1

    # 旋转下沉积
    rotation on 3.0
    shutter S1 open

    loop 3
        MFC Ar1 20
        delay $sputter_time
        MFC Ar1 10
        delay 5
    endloop

    # 关机序列
    shutter S1 close
    rotation off
    MFC Ar1 0
    valve V2 close
    valve M1 close
    pump TP1 off

    message "工艺完成 —— 可以卸载"
end