现有一个可编程仪器,它用scpi实现了某些功能,我现在想对这个仪器的scpi进行分析,想知道仪器的某个功能是调用了哪些scpi,请问下有什么好的办法吗?
SCPI简介
SCPI(Standard Commands for Programmable Instruments)是程控仪器(可编程仪器标准命令)。SCPI 是一种建立在现有标准IEEE488.1 和 IEEE 488.2 基础上,并遵循了IEEE754 标准中浮点运算规则、ISO646 信息交换7 位编码符号(相当于ASCll编程)等多种标准的标准化仪器编程语言。它采用一套树状分层结构的命令集,提出了一个具有普遍性的通用仪器模型,采用面向信号的测量;它的助记符产生规则简单、明确,且易于记忆。
總之,VISA提供一些可以直接操作硬件的函数,它是以DLL或Lib形式提供,在编程时必须包括visa.h和visa32.h,在程序代码中直接使用的是VISA库中的函数。SCPI是程控仪器标准命令,它是对器件的消息进行了标准化,也就是,只要做仪器器件(如示波器、台式万用表、频率计、矢量分析仪、电子负载、台式电源等),涉及到上位机通讯就得用SCPI。
SCPI语言简介
测试测量仪器应当遵守当前 SCPI语言版本的规则和约定(请参阅https://rfmw.em.keysight.com/bihelpfiles/aps/webhelp-mobile/cn/advanced/content/__H_SCPI%20Programming%20Reference/SYSTem_Subsystem.htm#SYSTem_VERSion )。
SCPI(可编程仪器的标准命令)是一种基于 ASCII 的仪器命令语言,供测试和测量仪器使用。SCPI 包含两种类型的命令,通用命令和子系统命令。
IEEE-488.2 通用命令
IEEE-488.2 标准定义了一组通用命令,可执行复位、自检以及状态操作等功能。通用命令总是以星号 ( * ) 开始,长度为 3 个字符,并可以包括一个或多个参数。命令关键字与第一个参数由空格分开。使用分号 (;) 可分隔多个命令,如下所示:
子系统命令
子系统命令执行特定的仪器功能。它们由按字母顺序排列的命令组成,这些命令扩展到分层结构中的根下一个或多个级别,也称为树系统。本结构中,相关命令归组于共用结点或根下,这样就形成了子系统。下面列出了 OUTPut 子系统的一部分,用以说明树系统。注意,为了便于清楚说明,某些 [可选] 命令也包括在内。
关键字
关键字,也称为标题,是仪器识别的说明。通用命令也是关键字。
OUTPut 是根关键字,DELay 是第二级别关键字,FALL 和 RISE 是第三级别关键字。冒号 ( :) 分隔关键字级别。
按照命令语法,大多数命令(和某些参数)以大小写字母混合的方式表示。大写字母表示命令的缩写。对于较短的程序行,可以发送缩写格式的命令。如果要获得较好的程序可读性,可以发送长格式的命令。
在上述示例中,OUTP 和 OUTPUT 都是可接受的格式。可以使用大写或小写字母。因此,OUTPUT、outp 和 Outp 都是可接受的。其他格式如 OUT 是无效的,并且会产生错误。
查询
在关键字后面加一个问号 (?) 可将其转变为查询(例如:VOLTage?、VOLTage:TRIGgered?)。如果查询包含参数,那么将查询指示器放置在最后关键字的末尾、参数的前面。在查询指示器和第一个参数之间插入一个空格。
您可以查询大多数参数的编程设定值。例如,您可以查询上次设置 OUTPut:DELay:FALL 的时间,方式是发送以下命令:
您也可以查询最小或最大允许下降时间,方式是发送以下命令:
在发送另一个命令至仪器之前,必须回读所有查询的结果。否则,将会发生查询已中断的错误并丢失未返回的数据。
命令分隔符和终止符
分隔符
冒号 ( :) 分隔关键字级别。必须使用空格将命令参数与其对应的关键字分隔开来。如果一个命令需要多个参数,则用一个逗号分隔相邻的参数。在以下示例中,必须使用逗号分隔可选的 startindex 和 points 参数。注意在 CURRent? 和第一个参数之间的空格。
分号 (;) 可用于分隔同一子系统中的命令。这样即可在同一消息字符串中发送多个子系统命令。例如,发送下列命令串:
与发送以下命令的作用相同:
注意,分号跟随在分层树结构的隐含路径后。在上例中,可选的:STATe 关键字必须跟随在 OUTput 关键字后,才能将命令解析器放置在层次结构的第二级别。这样可以在分号后使用 DELay 关键字,因为 DELay 是第二级别关键字。下一步,按 :RISE 关键字将命令解析器放置在层次结构的第三级别。这样可以在第二个分号后使用 FALL 关键字,因为 FALL 是第三级别关键字。
您也可以组合同一消息字符串中的不同子系统命令。在这种情况下,您必须使用冒号将命令解析器返回至根级才能访问另一个子系统。例如,您可以通过使用如下根说明符,清除输出保护并检查一条消息中的操作条件寄存器的状态:
注意,在分号之后使用冒号将命令解析器返回至根部。
终止符
发送到仪器的命令串必须以一个换行 (<NL>) 字符(ASCII 十进制数字 10)结尾。可以将 IEEE-488 EOI(结束或标识)结束或标识消息解释为 <NL> 字符,并用来代替 <NL> 字符终止命令串。一个回车符后跟一个换行符 (<CR><NL>) 也是可行的。命令串终止总是将当前的 SCPI 命令路径复位到根级。
语法惯例
尖括号 (< >) 表示必须给括号内的参数指定一个值。例如,在上述显示的 OUTPut:DELay 语法说明中,<值> 参数包含在尖括号内。方括号不会随命令串一起发送。您必须为该参数指定一个值(例如:“OUTP:DEL:FALL 0.1”),除非您选择语法中的另一个选项(例如:“OUTP:DEL:FALL MIN”)。
竖条 (|) 隔开给定命令字符串的多个参数选择。例如,在 OUTPut:INHibit 命令中的 LATChing|LIVE|OFF 指示您可以指定 “LATChing”、“LIVE”或“OFF”。条形图不随命令字符串发送。
方括号 ( [ ]) 中包含一些语法元素,例如节点和参数。这表示该元素可选且可以省略。方括号不会随命令串一起被发送。在一个可选参数的情况下,如果您没有为可选参数指定一个值,那么仪器将忽略该参数。在上述 FETCh:CURRent? 的示例中,可选的 <startindex> 和 <points> 参数可以返回从 startindex 开始阵列的数据,并包含数据点的指定数量。如果未指定这些参数,那么查询会返回所有阵列数据。
花括号 ( { } ) 指示可能被重复零次或多次的参数。专用于显示列表。当可能忽略或输入其他值一次或多次时,<值>{,<值>} 表示方式显示必须输入的第一个值。
参数类型
SCPI 语言定义了命令和查询所使用的几种数据格式。
数值参数
要求使用数值参数的命令,支持所有常用的十进制数字表示法,包括可选符号、小数点和科学记数法等。如果命令只接受某些特定值,仪器自将输入的数值参数四舍五入为可用接受的值。下面这条命令要求给数值参数设置电压值:
注意数值参数的特殊值(如 MINimum、MAXimum 和 INFinity)也是可接受的。不用选择特定的电压参数值,可以用 MIN 参数将电压设置为允许的最小值,或用 MAX 参数将电压设置为允许的最大值。
您也可以发送带有数字参数的工程单位后缀(例如,V 表示伏特,A 表示安培,W 表示瓦特)。所有参数值都使用基本单位。
离散参数
离散参数用于设置有限个参数值(例如,IMMediate、EXTernal 或 BUS)。就像命令关键字一样,它们也可以有短格式和长格式。可以使用大写或小写字母。查询响应始终返回全部为大写字母的短格式。对于显示屏设置,下面这条命令要求使用离散参数:
添加图片注释,不超过 140 字(可选)
布尔参数
布尔参数代表一个真或假的二进制条件。对于假条件,仪器将接受“OFF”或“0”。对于真条件,仪器将接受“ON”或“1”。当查询布尔设置时,仪器始终返回“0”或“1”。下面的命令要求使用布尔参数:
添加图片注释,不超过 140 字(可选)
ASCII 字符串参数
字符串参数实际上可包含所有 ASCII 字符集。字符串必须以配对的引号开始和结尾;可以用单引号或双引号。引号分隔符也可以作为字符串的一部分,只需键入两次并且不在中间添加任何字符。下面这个命令使用了字符串参数:
任意数据块程序或响应数据
指定长度数据块 <数据块> 可以将任何设备相关的数据作为 8 位二进制数据字节进行编程或返回。这对于传输大量数据或 8 位扩展 ASCII 代码特别有用。
设备清除
设备清除是一个 IEEE-488 低级的总线消息,可用于将仪器返回到响应状态。不同的编程语言和 IEEE-488 接口卡通过其特有的命令来提供对该功能的使用。当收到设备清除信息时,状态寄存器、错误队列以及所有配置状态都保持不变。
设备清除执行以下操作:
如果正在测量时,则其被终止。
仪器返回到触发空闲状态。
清除仪器的输入和输出缓冲区。
仪器准备好接受新的命令串。
注意:“中止”命令是终止仪器操作的建议方法。
典型命令处理时间
下表列出了多个类型的设置命令和响应查询的一些典型、平均命令处理时间。这可以帮助您确定一些常用 SCPI 命令对总测试时间的影响。所有的时间单位为毫秒。
设置命令(如 VOLT <n>)仅说明 IO 等待时间和命令处理时间,而不是完成操作的时间(如完成更改的输出电压或完成启动后的输出状态)。
从命令发送至仪器直到收到响应均属于查询命令时间。
了解 SCIP、直接 IO 和驱动程序在通信中的使用,以及如何在当前和未来的系统中最大限度地提高仪器互换和软件重用。
VISA仪器程控基础问答
1. Microsoft Visual Basic 工程项目,添加 VISA库到 VB 的工程项目。如何将Visual Basic 工程连接VISA库?
请参考如下步骤:
第一步:建立 Microsoft Visual Basic 工程项目,运行 Microsoft Visual Basic,选择建立新的 Standard EXE 工程项目。
第二步:添加 VISA 库到 VB 的工程项目,点击 VB 菜单 Project 的 Add Module 选项,选择已有的 Module 文件 visa32.bas。visa32.bas 的缺省安装路径为:C:\Program Files\IVI Foundation\VISA\WinNT\include,设置成功后,应在项目浏览栏中查看到该文件。这样,在工程文件链接时才能找到 visa32.dll 文件。
2. 如何设置是德VISA为电脑的默认的VISA?
此设置无法在Keysight Connection Expert里面完成。若Keysight Connection Expert已经安装,需要在控制面板中设置,若未安装,需要在安装过程中选custom而非Typical就能看到这个选项。
1. 如果Keysight IO Libraries 已经安装:控制面板->添加移除程序-> Keysight IO Libraries->修改
XP里添加移除程序是 Add/Remove Programs, 而Vista / 7里叫做Programs and Features。
2. 如果Keysight IO Libraries 还未安装,则正在安装是选custom而非Typical就能看到这个选项了。
3. 客户在编程时需要调用VISA库,哪里可以找到VISA库呢?
其实只要安装IO libraries后,VISA库已经在里面了。如果客户需要知道如何调用时,建议客户下载VISA user guide,里面有详细的介绍怎样用各种高级语言调用VISA库。
VISA提供一些可以直接操作硬件的函数,它是以DLL或Lib形式提供,在编程时必须包括visa.h和visa32.h, 你直接使用的是VISA库中的函数。
推薦应用指南: The Power Handbook