SCPI是基于ASCII文本的标准化命令语言,用于控制测试测量仪器,它使用类英语语法,可读性强,提供跨厂商的仪器控制兼容性,简化自动化测试系统开发。
SCPI(Standard Commands for Programmable Instruments,可编程仪器标准命令)是一种基于ASCII文本的标准化语言,用于控制各种测试和测量仪器(如示波器、信号发生器、电源、万用表等),它建立在IEEE 488.2标准之上,提供了一套统一的语法和命令结构,使得不同厂商的仪器能够使用相似甚至相同的命令进行控制,极大地简化了自动化测试系统的开发和维护。
SCPI命令的核心结构
编写SCPI命令的关键在于理解其层次化的树状结构,命令由一系列关键字组成,这些关键字通过冒号 () 连接,形成一个从通用到具体的路径,命令通常以根级关键字开始,然后逐级深入到特定的子系统或功能。
-
根级关键字 (Root Level Keywords):
- 这是命令树的起点,代表仪器的主要功能模块。
SYSTem
,CONFigure
,MEASure
,SENSe
(常与测量相关),SOURce
(常与信号产生相关),CALCulate
,DISPlay
,TRIGger
,STATus
, (IEEE 488.2公用命令) 等。- 示例:
SYSTem:ERRor?
(查询系统错误)
-
子系统关键字 (Subsystem Keywords):
- 位于根级关键字之后,进一步细化功能。
- 可以有多个层级,用冒号分隔。
- 示例:
SENSe:FREQuency
(进入频率测量相关设置),SOURce:VOLTage:LEVel:IMMediate:AMPLitude
(设置源电压的即时幅度值)。
-
命令动词 (Command Verbs):
- 位于命令路径的末尾,指定要执行的操作。
- 最常见的命令动词是:
- (查询 Query): 用于向仪器请求信息,查询命令通常以问号结尾。重要:查询命令不会改变仪器的设置状态。
- 示例:
MEASure:VOLTage:DC?
(查询直流电压测量值)
- 示例:
<无后缀>
或 特定设置动词 (设置 Set): 用于配置仪器的参数,设置命令没有问号。- 示例:
SOURce:VOLTage:LEVel:IMMediate:AMPLitude 5.0
(将源电压的即时幅度设置为5.0伏)
- 示例:
- 其他动词:如
INITiate
(启动测量),ABORt
(中止操作),FETCh?
(获取已触发但未读取的测量结果) 等,这些动词通常作为命令路径的一部分或单独使用。
- (查询 Query): 用于向仪器请求信息,查询命令通常以问号结尾。重要:查询命令不会改变仪器的设置状态。
-
参数 (Parameters):
- 设置命令通常需要跟随一个或多个参数,用于指定具体的值、选项或范围。
- 参数可以是:
- 数值 (Numeric): 如
0
,5E-3
(0.0015),MAX
(最大值),MIN
(最小值),DEF
(默认值)。 - 离散值 (Discrete): 预定义的字符串或枚举值,如
ON
,OFF
,AC
,DC
,AUTO
,MANual
,POSitive
,NEGative
。 - 布尔值 (Boolean):
0
(OFF) 或1
(ON)。 - 字符串 (String): 通常用引号括起来,如
"CH1"
,"MyWaveform"
。
- 数值 (Numeric): 如
- 示例:
TRIGger:SOURce CH1
(设置触发源为通道1 –CH1
是离散参数),DISPlay:WAVeform:Y:RANGe 0.1
(设置波形显示的Y轴范围为0.1V/div –1
是数值参数)。
编写SCPI命令的步骤与规则
-
查阅仪器手册: 这是最重要的一步!每个仪器的SCPI命令集都是其编程手册的核心部分,手册会详细列出所有支持的根级关键字、子系统、命令动词、参数及其语法、取值范围和单位。永远以仪器手册为准。
-
确定操作目标: 明确你想让仪器做什么(设置参数?启动测量?读取数据?查询状态?)。
-
构建命令路径:
- 从最通用的功能(根级关键字)开始。
- 使用冒号 () 逐级深入到具体的功能(子系统关键字)。
- 在路径末尾添加命令动词 ( 用于查询,无后缀用于设置,或其他特定动词)。
- 对于设置命令,在命令后添加空格,然后输入所需的参数。
-
遵循语法规则:
- 关键字缩写 (Short Form/Long Form): SCPI命令关键字通常有长格式(完整拼写)和短格式(唯一缩写),手册会标明短格式(通常是前4个字母,如
FREQ
代表FREQuency
)。短格式和长格式在功能上是等效的,使用短格式可以提高代码效率。关键:确保缩写是唯一的。CONF
可能是CONFigure
的缩写,但如果手册中还有CONNect
,则CONF
可能就不唯一,需要更长的缩写或使用长格式,手册会明确指定有效的短格式。 - 大小写不敏感 (Case Insensitivity): SCPI标准规定命令关键字和参数(除字符串外)是大小写不敏感的。
MEAS:VOLT:DC?
,meas:volt:dc?
,Meas:Volt:Dc?
通常效果相同。最佳实践:为了代码清晰和一致性,建议统一使用大写或手册中示例的格式。 - 空格 (Spaces):
- 命令关键字之间(冒号前后)不能有空格。
SENSe:FREQuency
正确,SENSe : FREQuency
错误。 - 命令动词(如 )前不能有空格。
- 设置命令的参数必须与命令动词之间用空格分隔。
VOLT 5.0
正确,VOLT5.0
错误。 - 多个参数之间通常用逗号 () 分隔(如果命令支持多个参数)。
TRIG:DELAY 0.001, 0.01
(假设设置延迟时间和范围)。
- 命令关键字之间(冒号前后)不能有空格。
- 参数格式:
- 数值参数:遵循常规数字表示法(整数、小数、科学计数法),注意单位,手册会指定默认单位(如V, A, s, Hz),有时可能需要显式指定单位(取决于仪器)。
- 离散参数:严格使用手册中定义的字符串(如
ON
,OFF
,EXT
),大小写通常不敏感,但建议按手册示例使用。 - 字符串参数:通常需要用双引号 () 括起来,特别是当字符串包含空格或特殊字符时。
MMEM:STOR:WAV "C:\data\wave1.csv"
,手册会说明何时需要引号。
- 查询命令 (): 查询命令仅用于获取信息,不会改变仪器状态,它们总是以问号结尾,查询的响应格式(数值、字符串、多个值等)由手册定义。
- 关键字缩写 (Short Form/Long Form): SCPI命令关键字通常有长格式(完整拼写)和短格式(唯一缩写),手册会标明短格式(通常是前4个字母,如
SCPI命令编写示例
假设我们有一台示波器,目标是:
-
设置通道1的垂直刻度为100mV/div:
- 目标:设置 (Set)
- 功能模块:通道1 (
CHANnel1
或CH1
) 的垂直 (VERTical
) 刻度 (SCALe
) - 命令路径:
CH1:SCALe
- 参数:
1
(因为100mV = 0.1V,假设单位是V/div) - 完整命令:
CH1:SCALe 0.1
(或使用短格式CH1:SCAL 0.1
,如果手册允许)
-
查询通道1当前的垂直偏置(Offset)值:
- 目标:查询 (Query)
- 功能模块:通道1 (
CH1
) 的垂直 (VERTical
) 偏置 (OFFSet
) - 命令路径:
CH1:OFFSet
- 命令动词:
- 完整命令:
CH1:OFFSet?
(或CH1:OFFS?
)
-
设置触发源为通道2,触发电平为1.5V:
- 目标:设置 (Set)
- 功能模块:触发 (
TRIGger
) 源 (SOURce
) - 命令路径:
TRIGger:SOURce
- 参数:
CH2
(离散值) - 命令1:
TRIGger:SOURce CH2
- 功能模块:触发 (
TRIGger
) 电平 (LEVel
) - 命令路径:
TRIGger:LEVel
- 参数:
5
(数值,单位V) - 命令2:
TRIGger:LEVel 1.5
- (注意:有时电平设置可能需要在特定源下,如
TRIGger:LEVel CH2, 1.5
,需看手册)
-
进行一次即时电压测量并读取结果:
- 目标:启动测量并读取
- 方法1 (常用):
- 启动测量:
MEASure:VOLTage:DC? CH1
(这条命令会启动一次测量并等待完成,然后返回结果,它结合了初始化、等待和读取。)
- 启动测量:
- 方法2 (更精细控制):
- 配置测量:
CONFigure:VOLTage:DC CH1
(配置为测量CH1的直流电压) - 启动测量:
INITiate
(开始采集数据) - 等待完成/触发: (可能需要等待或检查状态)
- 读取结果:
FETCh:VOLTage:DC?
(获取已配置测量的结果)
- 配置测量:
SCPI命令设计原则 (理解这些有助于编写和阅读命令)
- 树状结构: 命令组织成层次化的树,反映仪器的功能组织。
- 模块化: 相似的仪器功能使用相似的命令结构(如
SENSe
用于测量输入,SOURce
用于信号输出)。 - 一致性: 相同概念的参数使用相同的关键字(如
FREQuency
,VOLTage
,LEVel
,RANGe
,STATe
)。 - 可读性: 长格式命令具有较好的自描述性。
- 正交性: 命令应尽可能独立,一个命令的设置不影响其他无关命令的设置(尽管实际仪器内部状态可能有依赖)。
最佳实践与注意事项
- 手册至上: 反复强调,仪器编程手册是编写SCPI命令的唯一权威来源,不同厂商、不同型号的仪器,其支持的SCPI命令集、参数范围、行为细节都可能存在差异,不要假设一个命令在所有仪器上都以完全相同的方式工作。
- 使用短格式: 在确认唯一性的前提下,使用短格式命令可以提高程序执行效率和代码简洁性。
- 处理查询响应: 程序必须能够正确解析仪器对查询命令 () 的响应,响应可能是单个数值、多个数值(用逗号分隔)、字符串或状态代码,手册会定义响应的格式。
- 错误处理: 务必在程序中加入SCPI错误查询 (
SYSTem:ERRor?
) 机制,每次发送命令序列后(尤其是设置命令后),查询错误队列可以捕获语法错误、参数超限、执行失败等问题。 - 状态报告: 利用
STATus
子系统命令(如STATus:OPERation:CONDition?
,STATus:QUEStionable:EVENt?
)来监控仪器的操作状态和可疑条件(如过载、校准警告)。 - *公用命令 (`` commands):** 掌握常用的IEEE 488.2公用命令,如:
*IDN?
(查询仪器标识 – Instrument IDentification)*RST
(ReSeT 仪器到默认状态)*CLS
(CLear Status 清除状态寄存器和错误队列)*ESE
(Event Status Enable) /*ESR?
(Event Status Register)*SRE
(Service Request Enable) /*STB?
(STatus Byte)*OPC?
(Operation Complete? 用于同步)*WAI
(WAIt 等待所有操作完成)
- 同步操作: 对于需要等待仪器完成操作的情况(如触发采集、完成测量、保存数据),使用
*OPC?
,*WAI
或状态轮询机制进行同步,确保在读取结果前操作已完成。 - 测试与验证: 在集成到大型自动化系统之前,务必使用仪器前面板、仪器自带的控制软件(如NI MAX, Keysight Connection Expert)或简单的脚本(如Python with PyVISA)对编写的SCPI命令序列进行充分测试和验证。
编写SCPI命令的核心在于理解其树状结构(根级关键字->子系统->命令动词)和语法规则(冒号分隔、空格使用、参数格式、查询)。最关键的资源是您所使用的特定仪器的编程手册。 通过遵循手册、理解SCPI设计原则并实施最佳实践(如错误处理、状态监控、同步),您可以有效地编写出可靠、高效的SCPI命令来控制您的测试测量仪器,构建强大的自动化测试系统,实践和查阅手册是掌握SCPI的不二法门。
引用说明:
- 基于IEEE Std 488.2-1992 (IEEE Standard Codes, Formats, Protocols, and Common Commands) 和 SCPI-1999 (Standard Commands for Programmable Instruments) 标准中定义的SCPI核心概念和原则。
- 具体的SCPI命令集实现、支持的子系统、参数范围和行为细节,请务必参考您所使用的具体仪器的官方编程手册,不同厂商和型号的仪器手册是编写针对该仪器SCPI命令的最终权威依据。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/5881.html