2. SCPI协议基础

SCPI(Standard Commands for Programmable Instruments,可编程仪器标准命令)是仪器控制领域最广泛使用的命令语言标准。它并不规定仪器必须实现哪些功能,而是规定“当仪器要实现某个功能时,命令应该怎么写、怎么解析、怎么响应”。理解SCPI的起源、它与IEEE 488.2的层次关系,以及命令分类与语法规则,是设计稳定仪器控制系统的前提。

一、起源与发展:从各自为政到统一命令集

20世纪80年代,GPIB(IEEE 488)总线已经解决了“仪器如何物理连接”的问题,但每台仪器使用厂商私有的命令集。同一功能在不同品牌仪器上可能是 RANGE 2、VOLT:RANG 2 或 SET RANGE 2,导致测试程序难以复用。1987年前后,惠普等厂商推动形成TMSL(Test and Measurement Systems Language),后由SCPI联盟发展为SCPI标准,1990年发布首个版本,1999年形成SCPI-99规范。

SCPI的核心思想是“面向信号路径而非面向仪器面板”。命令按测量功能(如电压、频率、时间)组织成树状层次,而不是按仪器型号组织。这样,不同厂商的同类仪器只要遵循SCPI,就能用相似命令完成相似操作。

二、与IEEE 488.2的关系:语法基础与命令标准的分层

IEEE 488.2是SCPI的语法基础。它规定了仪器消息的通用语法、状态报告模型、通用命令(如 *IDN?、*RST、*OPC?)以及数据格式。SCPI则在此基础上,进一步规定了仪器功能相关的命令树、助记符、参数类型和响应格式。

可以这样理解:IEEE 488.2解决“消息怎么写才合法”,SCPI解决“某类仪器功能应该用什么命令表达”。因此,一台符合SCPI的仪器必然符合IEEE 488.2的语法要求;但符合IEEE 488.2的仪器不一定支持SCPI命令树。

SCPI 与 IEEE 488.2 的分层关系 物理与传输层 GPIB (IEEE 488.1) / VXI / PXI / LAN / USB / RS-232 负责电气、连接、字节传输 IEEE 488.2 语法与通用命令层 消息语法 · 数据格式 · 状态报告 · 通用命令 *IDN? *RST *OPC? *CLS *ESE *SRE *STB? 解决“消息怎么写才合法” SCPI 命令树与功能命令层 按信号路径组织:MEASure / CONFigure / SENSe / SOURce / TRIGger / STATus 示例:MEAS:VOLT:DC? · CONF:FREQ · SOUR:VOLT 2.5 · TRIG:SOUR BUS 统一助记符 · 参数类型 · 响应格式 · 状态模型 解决“功能命令怎么写” 符合 SCPI 的仪器必然符合 IEEE 488.2;反之不一定成立

三、命令分类:通用命令与功能命令

SCPI命令可分为两大类。第一类是IEEE 488.2定义的通用命令,以星号 * 开头,如 *IDN?、*RST、*OPC?,用于识别、复位、同步和状态查询。第二类是SCPI功能命令,按仪器功能组织成树状结构,如 MEASure、CONFigure、SENSe、SOURce、TRIGger、STATus 等子系统。

功能命令又可分为设置命令和查询命令。设置命令不带问号,用于改变仪器状态;查询命令带问号,用于读取数据或状态。例如 SOUR:VOLT 2.5 设置输出电压,SOUR:VOLT? 查询当前电压设置值。

命令类型 示例 作用 是否带问号
通用命令 *IDN?、*RST 识别、复位、同步、状态 查询带,设置不带
功能设置命令 CONF:VOLT:DC 配置测量功能 否
功能查询命令 MEAS:VOLT:DC? 触发测量并返回结果 是
状态命令 STAT:OPER:COND? 读取操作状态寄存器 是

四、语法规则:助记符、层次与参数

SCPI命令采用树状层次结构,用冒号 : 分隔不同层级。命令助记符有长形式和短形式,短形式通常为长形式的前四个字符(如 MEASure 的短形式为 MEAS),大小写不敏感。命令与参数之间用空格分隔,多个参数用逗号分隔。

MEASure:VOLTage:DC? 10,0.001
|------ 长形式 ------|  |-- 参数 --|
MEAS:VOLT:DC? 10,0.001
|-- 短形式 --|

CONFigure:VOLTage:DC 10
SOURce:VOLTage 2.5
TRIGger:SOURce BUS
*IDN?
*OPC?

需要特别注意:查询命令必须带问号,否则仪器不会返回数据;设置命令不能带问号,否则会被当作查询处理。此外,SCPI命令树中同一层的命令可以省略上层路径,但省略后必须从当前路径继续解析,容易造成歧义,因此建议在程序中始终使用完整路径。

实用建议:在编写仪器控制程序时,优先使用SCPI短形式以减少通信数据量,但在代码注释中保留长形式以提高可读性。对于关键命令,建议先用 *IDN? 确认仪器身份,再用 *RST 复位到已知状态。

五、案例与场景:用SCPI完成一次直流电压测量

假设使用一台支持SCPI的数字万用表,通过GPIB或LAN连接。典型命令序列如下:

*RST
*CLS
CONF:VOLT:DC 10
SENS:VOLT:DC:NPLC 1
TRIG:SOUR BUS
INIT
*TRG
FETC:VOLT:DC?
*OPC?

这段序列先复位并清除状态,然后配置直流电压测量、设置积分时间、选择总线触发、启动测量、触发一次、读取结果,最后用 *OPC? 确认操作完成。整个过程体现了SCPI“配置—触发—读取”的典型数据流。

六、常见误区与复盘

  • 误区一:把SCPI当成IEEE 488.2。两者是分层关系,SCPI建立在IEEE 488.2语法之上,但增加了功能命令树。
  • 误区二:查询命令忘记问号。如写成 MEAS:VOLT:DC 而不是 MEAS:VOLT:DC?,仪器不会返回数据,程序会超时。
  • 误区三:忽略命令树路径。省略上层路径可能导致仪器解析到错误节点,建议使用完整路径。
  • 误区四:不检查状态寄存器。仅发送命令而不读取 *STB? 或 STAT:OPER:COND?,可能掩盖仪器错误。

排障提示:如果仪器无响应,先检查命令是否以换行符结尾,再检查查询命令是否带问号,最后用 *IDN? 确认通信链路正常。SCPI命令通常以 \n 或 \r\n 作为终止符,不同传输层要求可能不同。

掌握SCPI的起源、与IEEE 488.2的分层关系、命令分类和语法规则,是后续设计仪器控制系统的基石。只有先保证命令格式正确、层次清晰、状态可控,才能进一步讨论多仪器协同、异步触发和自动化测试流程。