4. SCPI命令详解

SCPI(Standard Commands for Programmable Instruments)是一套面向可编程仪器的标准化命令语言。它把仪器功能抽象成树状命令体系,用统一的语法描述“设置参数”和“读取结果”两类操作。理解SCPI命令的分类、格式与语义,是设计仪器控制系统的基础。本节从命令分类入手,逐层拆解常用命令、公共命令、子系统命令,以及查询与设置命令的格式差异。

一、SCPI命令的四种基本类型

从控制系统的视角看,SCPI命令可按“作用范围”和“操作方向”划分为四类:

  • 常用命令(Common Commands):以星号“*”开头,如 *IDN?、*RST、*CLS。它们由IEEE 488.2定义,与仪器具体功能无关,用于识别、复位、状态清除和同步。
  • 子系统命令(Subsystem Commands):以功能模块名开头,如 MEASure、CONFigure、TRIGger、SOURce。它们构成仪器功能树,是控制仪器行为的核心。
  • 设置命令(Set Commands):不带问号,用于向仪器写入参数,如 VOLTage 2.5、FREQuency 1E6。
  • 查询命令(Query Commands):以问号“?”结尾,用于读取仪器状态或数据,如 VOLTage?、MEASure:VOLTage:DC?。

这四类命令并非互斥:子系统命令既可以是设置命令,也可以是查询命令;公共命令中也有查询形式。真正决定语义的是命令末尾是否带“?”以及参数是否存在。

二、命令格式:树状路径与参数语义

SCPI命令采用树状层次结构,用冒号“:”分隔层级。例如 MEASure:VOLTage:DC? 表示“测量子系统 → 电压功能 → 直流分量 → 查询”。命令关键字支持长短格式:大写字母为短格式,完整单词为长格式,如 MEAS 与 MEASure 等价。仪器通常不区分大小写,但推荐统一使用短格式以节省通信字节。

参数部分用空格与命令分隔,多个参数用逗号隔开。参数类型包括数值、布尔值、字符串和枚举值。例如:

VOLTage:DC 2.5          // 设置直流电压为2.5V
VOLTage:DC?             // 查询当前直流电压设置值
OUTPut:STATe ON         // 打开输出
TRIGger:SOURce EXT      // 触发源设为外部
SENSe:FUNCtion "VOLT:DC" // 选择直流电压测量功能

注意:设置命令通常不返回数据,查询命令必须返回数据。若对设置命令发送查询,或对查询命令发送设置参数,仪器会报错并可能进入错误队列。

核心规则:命令末尾的“?”是查询标志;带“?”的命令必须读取返回结果,否则会造成输出缓冲区堆积,影响后续命令同步。

三、公共命令与子系统命令的协作关系

公共命令负责“仪器级”管理,子系统命令负责“功能级”控制。典型控制流程是:先用 *IDN? 确认仪器身份,用 *RST 复位到已知状态,再用 *CLS 清除状态,然后通过子系统命令配置测量,最后用查询命令读取结果。下图展示了这一协作关系与命令树结构。

公共命令(IEEE 488.2) *IDN? 识别仪器 *RST 复位 *CLS 清除状态 *OPC? 操作完成同步 *ESR? 事件状态查询 *TRG 触发 子系统命令树(功能级) MEASure :VOLTage:DC? CONFigure :VOLTage:DC 10 TRIGger :SOURce EXT SOURce :VOLTage 2.5 SENSe :FUNCtion "VOLT:DC" 协作 设置命令(Set) 格式:命令 + 空格 + 参数 示例:VOLTage:DC 2.5 语义:写入仪器配置 返回:无(或仅状态) 注意:参数类型必须匹配 查询命令(Query) 格式:命令 + ? 示例:MEASure:VOLTage:DC? 语义:读取仪器状态/数据 返回:数值、字符串或枚举 注意:必须读取返回结果

四、典型场景:一次完整的直流电压测量

假设使用一台数字万用表测量直流电压,控制序列如下:

*IDN?                          // 返回厂商、型号、序列号、版本
*RST                           // 复位到出厂默认状态
*CLS                           // 清除状态寄存器
CONFigure:VOLTage:DC 10        // 配置直流电压量程10V
TRIGger:SOURce IMMediate       // 立即触发
SENSe:VOLTage:DC:NPLC 1        // 设置积分时间1个工频周期
READ?                          // 触发并读取测量值
*OPC?                          // 等待操作完成,返回1

这段序列体现了“公共命令管理状态、子系统命令配置功能、查询命令读取结果”的分工。其中 READ? 是复合命令,等价于“触发 + 读取”,而 *OPC? 用于同步,确保上位机不会在仪器未完成时发送下一条命令。

提示:在编写控制程序时,建议把“设置命令”和“查询命令”成对使用,例如先 VOLTage:DC 2.5 设置,再 VOLTage:DC? 回读确认。这样能及时发现参数被仪器截断或拒绝的情况。

五、常见误区与复盘

误区 现象 正确做法
查询命令后不读取返回 输出缓冲区堆积,后续命令超时 每次查询后必须读取,或使用 *CLS 清理
混淆长短格式 命令被仪器拒绝,报“未定义命令” 统一使用短格式,或确认仪器支持的长格式
参数类型不匹配 设置无效,仪器进入错误队列 查阅手册确认参数类型:数值、枚举或字符串
忽略单位与量纲 设置值被解释为基本单位,结果偏差 明确命令默认单位,必要时显式指定
未使用同步命令 读取到旧数据或空数据 使用 *OPC? 或 *WAI 同步

复盘上述误区可以发现,SCPI命令的“格式”与“语义”必须同时理解:格式决定命令能否被解析,语义决定命令是否产生预期行为。公共命令解决“仪器是否就绪”,子系统命令解决“功能如何配置”,查询与设置命令解决“数据如何流动”。三者配合,才能构建稳定、可复用的仪器控制系统。

注意:不同厂商对同一子系统命令的支持程度不同,例如 MEASure 与 CONFigure 在部分仪器上可能只实现其一。设计控制系统时,应先通过 *IDN? 识别型号,再按型号加载对应的命令映射表,避免硬编码命令导致兼容性问题。