基于最优解空间树的SCPI解析器设计

2014-04-29 18:29于鲁波
电子世界 2014年19期

于鲁波

【摘要】提出一种基于解空间树的通用SCP I命令解析器实现方案。先将SCPI命令集标识成一棵解空间树,给树中每个节点赋予不同的属性。进行命令解析时,采用贪心算法,搜索解空间树的路径,寻找最优的匹配解。试验证明针对SCPI规范的各种等效变种命令,该算法具有非常好的普适性。

【关键词】SCPI命令;解空间树;贪心算法;SCPI解析器

1.引言

SCPI( Standard Commands for Programmable Instruments)是一种标准化的程控仪器编程语言,采用标准语法格式描述仪器功能,为所有仪器仪表提供了一个广泛兼容的编程和数据使用环境。SCPI命令具有纵向兼容性,横向兼容性和功能兼容性,最大限度的保证了SCPI命令在控制仪器中的灵活性。根据SCPI99[1]规范,SCPI指令同时具有长命令名和短命令名,命令中某些节点可以作为缺省节点忽略,导致SCPI命令使用灵活,会产生大量的变形等效命令。如何将这些等效命令编译成同一条执行指令是SCPI解析器设计的一个难点。

目前常见的SCPI解析器,如文献[2]将SCPI指令提前写入应用程序,如果修改SCPI指令或者将SCPI解析器移植到其他程序,就需要重新修改程序,使用不灵活。文献[3]虽然提出用XML文件描述SCPI指令,但是在描述SCPI指令的时候,没有充分发挥XML的自描述性和树形结构,因而无法识别全部的等效命令。本文将解空间树这一技术引入到SCPI解析器设计,通过设计相应的贪心算法,解决了SCPI的等效命令问题。

本文结构如下,第2节介绍SCPI语法和解空间树的基本概念与模型;第3节提出基于解空间树的SCPI解析器生成算法;第4节最后介绍研究意义和进一步的研究方向。

2.SCPI语法与解空间树

2.1 SCPI语法简介

SCPI是一个基于标准IEEE488.2建立的,适合所有仪器的命令集。其主要目的是为了使相同功能具有相同的程控命令,以实现程控命令的通用性。整个SCPI命令可以分为两个部分:一部分IEEE488.2公用命令,以“* ”开头,要求仪器必须执行;另一部分SCPI仪器特定控制命令。特定命令是以树型结构组织的字符串集,以“:”开头, 节点之间也是以“:”间隔。每个节点的字符串都有长格式和短格式两种写法, 而且根据仪器需要, 部分命令还会有独立的后缀。对于缺省节点,还可以省略。SCPI命令使用一个相似于文件系统的结构,这种命令结构被称为命令树。最靠近顶端的命令称为根命令,其次为第一级命令,第二级命令等。因而,对于一条特定的SCPI命令必须根据一个特定的路径才能到达下一层命令。

2.2 解空间树

解空间树又称为状态树。 它是一棵树,在这棵树中,包含着问题的所有解。对于给定的问题,如何在解空间树上寻找问题的最优或者次优解,一般需要用到贪心算法作为空间树回朔的依据。解空间树的解是一条从根节点到问题解叶节点的路径。SCPI命令本身以命令树的形式存在,因而,给定一条SCPI命令字符串,能否完全在命令树上找到其对应的解路径,成为解析SCPI命令的关键。在本文中,将XML文件引入到SCPI解析中,采用XML描述系统的SCPI命令集。解析该XML文件,在计算机内存中形成一棵解空间树。对于从程控端收到的SCPI指令,通过搜索该解空间树,判断接收到的SCPI命令是否合法。对于合法的SCPI指令编译其执行码,执行SCPI命令。不合法的SCPI命令则返回相应的编译错误。

3.SCPI解空间树算法实现

3.1 SCPI命令配置文件

通过编写不同的SCPI命令脚本可以生成不同的SCPI指令集。SCPI命令脚本采用XML描述SCPI指令,不同命令节点分配不同的属性。这样一棵命令树就形成了一个解空间,通过搜索解空间树,来解释不同的命令。SCPI命令配置文件部分如图1所示。

图1 SCPI命令配置脚本

3.2 脚本节点属性

SCPI命令配置脚本采用XML语言描述。由于XML具有非常突出的自描述性,为动态配置SCPI指令集提供了方便。

配置脚本根节点为“scpi”,子命令节点全部为“cmd”。根节点仅有一个“version”属性,表示此SCPI配置脚本当前的版本号,用于向上兼容SCPI解析器引擎。“cmd”节点有5种节点属性,具体如下:

1)name:SCPI命令符。配合cmd节点层次,用于区分不同的SCPI命令。

2)type:SCPI命令类型。命令符在SCPI命令串中是否为缺省节点。取值为“mandatory”,该命令符不可省略节点;取值“optional”,可以省略节点。按照SCPI规范,处于同一层的SCPI命令符有且仅有一个节点可以作为默认节点。如果同一层出现多个默认节点,应当给出编译错误。

3)canQuery:该SCPI命令是否支持询问。取值“true”,可以询问;取值“false”不可以询问。该属性省略时,默认为该命令不可询问。

4)argsType:该SCPI命令所带参数类型。用于检验接收到的SCPI命令是否符合标准规范。该节点取值类型与SCPI-99命令规范取值一致。该属性仅在SCPI叶节点有效。

5)code:SCPI叶节点命令编译执行代码。该属性仅在叶节点命令有效。对于等价的SCPI命令会编译出同一个执行代码。

该脚本文件被解析器解释成一棵解空间树,如图2所示。图中“[]”内的命令符表示该节点是缺省节点,可以省略。

图2 SCPI命令解空间树

在该命令树中,一级节点MEASure的子节点SCALar、VOLTage均为可省略节点。一级节点SOURce是可省略节点。

3.3 算法实现

SCPI解释器工作流程分两个阶段。第一阶段词法分析。该阶段会分析收到的SCPI命令字符串,并按照SCPI-99规范对命令进行语法检查,如发现语法错误则返回错误代码;否则将命令字符串按照SCPI语法规则分割成命令符集合和参数集合。第二阶段搜索解空间树。根据第一阶段得到的命令字符集和参数集合,搜索解空间树,编译出指令码。流程如图3所示:

图3 SCPI命令解析流程

贪心算法:如果解空间树某一层没有对应的节点命令,且该层有可省略节点,则递进到该省略节点的子节点继续搜索,否则回溯到解空间树上一层节点。

按照SCPI-99规范,以图2解空间树构建的SCPI命令集,如下命令为等效命令,SCPI解析器需要编译出同一条执行代码。

:MEASure:SCALar:VOLTage:FREQuency? (1)

:MEASure:VOLTage:FREQuency? (2)

:MEASure:SCALar:FREQuency? (3)

:MEASure:FREQuency? (4)

:MEA:SCAL:VOLT:FREQ?         (5)

根据算法的贪心策略,命令(1)通过搜索解空间树,可以立即成功返回。命令(2)在搜索解空间树到SCALar层时,无法匹配命令,但是该节点为可省略节点,继续搜索其子节点。在SCALar的子节点匹配命令,成功完成命令树搜索返回。同样命令(3)在匹配VOLTage节点时失败。但是该节点为可省略节点,继续搜索其子节点,在VOLTage的子节点匹配命令,成功完成命令树搜索返回。命令(4)在搜索到SCALar节点匹配失败,但是该节点为可省略节点,按照贪心算法的策略,递归到该节点的子节点VOLTage。在VOLTage节点匹配失败,但是该节点为可省略节点,递归到该节点的子节点FREQuency,匹配成功返回。命令(5)为SCPI短命令格式,SCPI词法分析器会自动辨认长短命令,匹配该命令。所以该命令也会成功返回。以上命令都会编译唯一解代码code=”0x010001”。命令执行器将该代码,交给仪器的Excutor。不同仪器的Excutor对该代码执行仪器特定的操作,完成SCPI指令的执行。

4.结论

本文设计的SCPI解析器有两个特点:1)采用XML语言将SCPI指令描述成解空间树;2)设计了一个基于最优解的贪心算法。对于给定的SCPI命令串通过搜索解空间树,来判断给定的SCPI命令串是否合法。该设计有如下优点:1)通过书写不同的XML脚本可以生成不同的SCPI命令集,无需修改修改SCPI解析引擎,就可以部署到不同的仪器上。2)解决了SCPI的等效命令问题。所有符合规范的SCPI等效命令都可以编译成同一条执行代码。因而本文设计的SCPI解析引擎具有通用性、普适性,非常适合程控仪器的SCPI命令内置执行引擎。

参考文献

[1]Standard Commands for Programmable Instruments(SCPI).Consortiums SCPI standard[J].May,1999(6).

[2]于红雨,李智,刘畅.函数/任意波形发生器SCPI解释器设计与实现[J].国外电子测量技术,2009(4):70-73.

[3]孟德伟,唐承苗,秦开宇.基于XML的通用SCPI命令解析器设计[J].仪器仪表用户,2010(17):76-78.