3. SCPI命令与仪器编程模型

SCPI(Standard Commands for Programmable Instruments,可编程仪器标准命令)是构建测试自动化脚本的语言基础。它把不同厂商、不同型号仪器的控制方式统一到一套可读、可组合、可移植的命令体系上。理解SCPI,不只是记住几个命令,而是理解“命令如何被解析、状态如何被反馈、同步如何被保证”这一整套编程模型。

一、SCPI的语法结构:树状命令与参数

SCPI命令采用树状层级结构,每一层用冒号分隔。以Keysight示波器为例,测量频率的命令写作 :MEASure:FREQuency?。其中 :MEASure 是根节点,:FREQuency 是子节点,问号表示这是一条查询命令。SCPI规定命令关键字可以缩写,规则是:如果关键字长度超过4个字母,则前4个字母为必需部分,其余可省略。因此 :MEASure 可写作 :MEAS,:FREQuency 可写作 :FREQ。大小写混写只是提示缩写边界,仪器解析时不区分大小写。

命令分为两类:设置命令(无问号)和查询命令(带问号)。设置命令改变仪器状态,如 :VOLTage:RANGe 5 把电压量程设为5 V;查询命令返回数据,如 :VOLTage:RANGe? 返回当前量程。参数之间用逗号分隔,多个命令可用分号连接,例如 :VOLTage:RANGe 5;:CURRent:RANGe 0.1。若分号后省略根节点,则沿用上一条命令的路径,如 :VOLTage:RANGe 5;:OFFSet 0.5 实际表示 :VOLTage:RANGe 5;:VOLTage:OFFSet 0.5。

二、常用命令集与编程模型

在直流电源、数字万用表、示波器等仪器上,最常用的SCPI命令可归为几类:配置类(:SOURce:VOLTage、:SENSe:FUNCtion)、测量类(:MEASure:VOLTage:DC?)、触发类(:TRIGger:SOURce、:INITiate)、状态类(*IDN?、*OPC?、*RST)。其中带星号的为IEEE 488.2通用命令,所有SCPI仪器都必须支持。

编程模型的核心是“命令—响应”配对。每条查询命令都会在输出缓冲区中放入一条响应,若脚本连续发送多条查询而不读取,缓冲区会溢出并导致超时。因此,正确的做法是“发一条查询,读一条响应”,或使用 *OPC? 等待操作完成。例如设置电压后立即测量,若仪器尚未稳定,读数会偏离预期,此时应使用 *OPC? 同步。

三、状态寄存器与同步机制

SCPI定义了一套状态报告模型,包括状态字节寄存器(Status Byte Register)、标准事件状态寄存器(Standard Event Status Register)和服务请求使能寄存器(Service Request Enable Register)。状态字节的bit 5(ESB)表示标准事件寄存器有事件,bit 6(MSS)表示仪器请求服务。通过 *ESE 和 *SRE 可以设置使能位,通过 *STB? 和 *ESR? 读取状态。

同步机制主要有三种:一是 *OPC?,它等待所有挂起操作完成后再返回1;二是 *WAI,它让仪器等待所有未完成操作结束后再执行后续命令;三是服务请求(SRQ),仪器在满足条件时主动通知控制器。在自动化脚本中,*OPC? 最常用,因为它简单且可靠。

SCPI命令解析与状态同步模型 控制器(PC) 发送命令 / 读取响应 SCPI解析器 树状路径匹配 缩写展开 / 参数校验 仪器功能模块 电源 / 万用表 / 示波器 执行设置或测量 命令字符串 执行 响应数据 查询结果 状态寄存器与同步机制 状态字节寄存器 bit5 ESB / bit6 MSS 标准事件寄存器 *ESR? 读取 使能寄存器 *ESE / *SRE 设置 三种同步方式对比 *OPC? 等待所有操作完成 *WAI 阻塞后续命令 SRQ 服务请求 仪器主动通知

四、实际仪器操作示例

以Keysight E36312A直流电源为例,完成“设置5 V输出并确认稳定”的任务。脚本流程如下:先发送 *RST 复位,再发送 :VOLTage 5 设置电压,接着发送 :OUTPut ON 开启输出,最后发送 *OPC? 等待稳定。若返回1,说明操作完成;若超时,则检查连接或量程设置。

*RST
:VOLTage 5
:OUTPut ON
*OPC?
:MEASure:VOLTage?

假设仪器返回 5.001,说明输出电压在5 V附近,误差在允许范围内。若返回 0.000,则可能是输出未开启或负载未连接。此时应检查 :OUTPut:STATe? 的返回值,若为0则重新发送 :OUTPut ON。

五、常见问题与排查

初学者常遇到三类问题:一是命令拼写错误导致 -113 Undefined header,此时应检查命令树路径和缩写规则;二是查询后未读取响应导致超时,应确保每条查询都有对应的读取操作;三是未使用 *OPC? 导致测量值不稳定,应在设置后加入同步等待。建议在脚本中加入 :SYSTem:ERRor? 查询,及时捕获错误码。

提示:在编写SCPI脚本时,建议先使用Keysight Connection Expert或NI MAX的交互式命令窗口逐条验证命令,确认无误后再写入自动化脚本。这样能快速定位是命令语法问题还是同步问题。
注意:不同仪器对同一功能的命令路径可能略有差异,例如有的电源用 :VOLTage,有的用 :SOURce:VOLTage。编写通用脚本时,应通过 *IDN? 识别仪器型号,再选择对应的命令集。

掌握SCPI语法、状态寄存器和同步机制后,就能编写出稳定、可复现的仪器控制脚本。下一阶段将把这些命令封装为可复用的函数,并接入自动化测试框架。