于魯波
【摘要】提出一種基于解空間樹的通用SCP I命令解析器實(shí)現(xiàn)方案。先將SCPI命令集標(biāo)識(shí)成一棵解空間樹,給樹中每個(gè)節(jié)點(diǎn)賦予不同的屬性。進(jìn)行命令解析時(shí),采用貪心算法,搜索解空間樹的路徑,尋找最優(yōu)的匹配解。試驗(yàn)證明針對(duì)SCPI規(guī)范的各種等效變種命令,該算法具有非常好的普適性。
【關(guān)鍵詞】SCPI命令;解空間樹;貪心算法;SCPI解析器
1.引言
SCPI( Standard Commands for Programmable Instruments)是一種標(biāo)準(zhǔn)化的程控儀器編程語言,采用標(biāo)準(zhǔn)語法格式描述儀器功能,為所有儀器儀表提供了一個(gè)廣泛兼容的編程和數(shù)據(jù)使用環(huán)境。SCPI命令具有縱向兼容性,橫向兼容性和功能兼容性,最大限度的保證了SCPI命令在控制儀器中的靈活性。根據(jù)SCPI99[1]規(guī)范,SCPI指令同時(shí)具有長命令名和短命令名,命令中某些節(jié)點(diǎn)可以作為缺省節(jié)點(diǎn)忽略,導(dǎo)致SCPI命令使用靈活,會(huì)產(chǎn)生大量的變形等效命令。如何將這些等效命令編譯成同一條執(zhí)行指令是SCPI解析器設(shè)計(jì)的一個(gè)難點(diǎn)。
目前常見的SCPI解析器,如文獻(xiàn)[2]將SCPI指令提前寫入應(yīng)用程序,如果修改SCPI指令或者將SCPI解析器移植到其他程序,就需要重新修改程序,使用不靈活。文獻(xiàn)[3]雖然提出用XML文件描述SCPI指令,但是在描述SCPI指令的時(shí)候,沒有充分發(fā)揮XML的自描述性和樹形結(jié)構(gòu),因而無法識(shí)別全部的等效命令。本文將解空間樹這一技術(shù)引入到SCPI解析器設(shè)計(jì),通過設(shè)計(jì)相應(yīng)的貪心算法,解決了SCPI的等效命令問題。
本文結(jié)構(gòu)如下,第2節(jié)介紹SCPI語法和解空間樹的基本概念與模型;第3節(jié)提出基于解空間樹的SCPI解析器生成算法;第4節(jié)最后介紹研究意義和進(jìn)一步的研究方向。
2.SCPI語法與解空間樹
2.1 SCPI語法簡介
SCPI是一個(gè)基于標(biāo)準(zhǔn)IEEE488.2建立的,適合所有儀器的命令集。其主要目的是為了使相同功能具有相同的程控命令,以實(shí)現(xiàn)程控命令的通用性。整個(gè)SCPI命令可以分為兩個(gè)部分:一部分IEEE488.2公用命令,以“* ”開頭,要求儀器必須執(zhí)行;另一部分SCPI儀器特定控制命令。特定命令是以樹型結(jié)構(gòu)組織的字符串集,以“:”開頭, 節(jié)點(diǎn)之間也是以“:”間隔。每個(gè)節(jié)點(diǎn)的字符串都有長格式和短格式兩種寫法, 而且根據(jù)儀器需要, 部分命令還會(huì)有獨(dú)立的后綴。對(duì)于缺省節(jié)點(diǎn),還可以省略。SCPI命令使用一個(gè)相似于文件系統(tǒng)的結(jié)構(gòu),這種命令結(jié)構(gòu)被稱為命令樹。最靠近頂端的命令稱為根命令,其次為第一級(jí)命令,第二級(jí)命令等。因而,對(duì)于一條特定的SCPI命令必須根據(jù)一個(gè)特定的路徑才能到達(dá)下一層命令。
2.2 解空間樹
解空間樹又稱為狀態(tài)樹。 它是一棵樹,在這棵樹中,包含著問題的所有解。對(duì)于給定的問題,如何在解空間樹上尋找問題的最優(yōu)或者次優(yōu)解,一般需要用到貪心算法作為空間樹回朔的依據(jù)。解空間樹的解是一條從根節(jié)點(diǎn)到問題解葉節(jié)點(diǎn)的路徑。SCPI命令本身以命令樹的形式存在,因而,給定一條SCPI命令字符串,能否完全在命令樹上找到其對(duì)應(yīng)的解路徑,成為解析SCPI命令的關(guān)鍵。在本文中,將XML文件引入到SCPI解析中,采用XML描述系統(tǒng)的SCPI命令集。解析該XML文件,在計(jì)算機(jī)內(nèi)存中形成一棵解空間樹。對(duì)于從程控端收到的SCPI指令,通過搜索該解空間樹,判斷接收到的SCPI命令是否合法。對(duì)于合法的SCPI指令編譯其執(zhí)行碼,執(zhí)行SCPI命令。不合法的SCPI命令則返回相應(yīng)的編譯錯(cuò)誤。
3.SCPI解空間樹算法實(shí)現(xiàn)
3.1 SCPI命令配置文件
通過編寫不同的SCPI命令腳本可以生成不同的SCPI指令集。SCPI命令腳本采用XML描述SCPI指令,不同命令節(jié)點(diǎn)分配不同的屬性。這樣一棵命令樹就形成了一個(gè)解空間,通過搜索解空間樹,來解釋不同的命令。SCPI命令配置文件部分如圖1所示。
圖1 SCPI命令配置腳本
3.2 腳本節(jié)點(diǎn)屬性
SCPI命令配置腳本采用XML語言描述。由于XML具有非常突出的自描述性,為動(dòng)態(tài)配置SCPI指令集提供了方便。
配置腳本根節(jié)點(diǎn)為“scpi”,子命令節(jié)點(diǎn)全部為“cmd”。根節(jié)點(diǎn)僅有一個(gè)“version”屬性,表示此SCPI配置腳本當(dāng)前的版本號(hào),用于向上兼容SCPI解析器引擎?!癱md”節(jié)點(diǎn)有5種節(jié)點(diǎn)屬性,具體如下:
1)name:SCPI命令符。配合cmd節(jié)點(diǎn)層次,用于區(qū)分不同的SCPI命令。
2)type:SCPI命令類型。命令符在SCPI命令串中是否為缺省節(jié)點(diǎn)。取值為“mandatory”,該命令符不可省略節(jié)點(diǎn);取值“optional”,可以省略節(jié)點(diǎn)。按照SCPI規(guī)范,處于同一層的SCPI命令符有且僅有一個(gè)節(jié)點(diǎn)可以作為默認(rèn)節(jié)點(diǎn)。如果同一層出現(xiàn)多個(gè)默認(rèn)節(jié)點(diǎn),應(yīng)當(dāng)給出編譯錯(cuò)誤。
3)canQuery:該SCPI命令是否支持詢問。取值“true”,可以詢問;取值“false”不可以詢問。該屬性省略時(shí),默認(rèn)為該命令不可詢問。
4)argsType:該SCPI命令所帶參數(shù)類型。用于檢驗(yàn)接收到的SCPI命令是否符合標(biāo)準(zhǔn)規(guī)范。該節(jié)點(diǎn)取值類型與SCPI-99命令規(guī)范取值一致。該屬性僅在SCPI葉節(jié)點(diǎn)有效。
5)code:SCPI葉節(jié)點(diǎn)命令編譯執(zhí)行代碼。該屬性僅在葉節(jié)點(diǎn)命令有效。對(duì)于等價(jià)的SCPI命令會(huì)編譯出同一個(gè)執(zhí)行代碼。
該腳本文件被解析器解釋成一棵解空間樹,如圖2所示。圖中“[]”內(nèi)的命令符表示該節(jié)點(diǎn)是缺省節(jié)點(diǎn),可以省略。
圖2 SCPI命令解空間樹
在該命令樹中,一級(jí)節(jié)點(diǎn)MEASure的子節(jié)點(diǎn)SCALar、VOLTage均為可省略節(jié)點(diǎn)。一級(jí)節(jié)點(diǎn)SOURce是可省略節(jié)點(diǎn)。
3.3 算法實(shí)現(xiàn)
SCPI解釋器工作流程分兩個(gè)階段。第一階段詞法分析。該階段會(huì)分析收到的SCPI命令字符串,并按照SCPI-99規(guī)范對(duì)命令進(jìn)行語法檢查,如發(fā)現(xiàn)語法錯(cuò)誤則返回錯(cuò)誤代碼;否則將命令字符串按照SCPI語法規(guī)則分割成命令符集合和參數(shù)集合。第二階段搜索解空間樹。根據(jù)第一階段得到的命令字符集和參數(shù)集合,搜索解空間樹,編譯出指令碼。流程如圖3所示:
圖3 SCPI命令解析流程
貪心算法:如果解空間樹某一層沒有對(duì)應(yīng)的節(jié)點(diǎn)命令,且該層有可省略節(jié)點(diǎn),則遞進(jìn)到該省略節(jié)點(diǎn)的子節(jié)點(diǎn)繼續(xù)搜索,否則回溯到解空間樹上一層節(jié)點(diǎn)。
按照SCPI-99規(guī)范,以圖2解空間樹構(gòu)建的SCPI命令集,如下命令為等效命令,SCPI解析器需要編譯出同一條執(zhí)行代碼。
:MEASure:SCALar:VOLTage:FREQuency? (1)
:MEASure:VOLTage:FREQuency? (2)
:MEASure:SCALar:FREQuency? (3)
:MEASure:FREQuency? (4)
:MEA:SCAL:VOLT:FREQ? ? ? ? ? (5)
根據(jù)算法的貪心策略,命令(1)通過搜索解空間樹,可以立即成功返回。命令(2)在搜索解空間樹到SCALar層時(shí),無法匹配命令,但是該節(jié)點(diǎn)為可省略節(jié)點(diǎn),繼續(xù)搜索其子節(jié)點(diǎn)。在SCALar的子節(jié)點(diǎn)匹配命令,成功完成命令樹搜索返回。同樣命令(3)在匹配VOLTage節(jié)點(diǎn)時(shí)失敗。但是該節(jié)點(diǎn)為可省略節(jié)點(diǎn),繼續(xù)搜索其子節(jié)點(diǎn),在VOLTage的子節(jié)點(diǎn)匹配命令,成功完成命令樹搜索返回。命令(4)在搜索到SCALar節(jié)點(diǎn)匹配失敗,但是該節(jié)點(diǎn)為可省略節(jié)點(diǎn),按照貪心算法的策略,遞歸到該節(jié)點(diǎn)的子節(jié)點(diǎn)VOLTage。在VOLTage節(jié)點(diǎn)匹配失敗,但是該節(jié)點(diǎn)為可省略節(jié)點(diǎn),遞歸到該節(jié)點(diǎn)的子節(jié)點(diǎn)FREQuency,匹配成功返回。命令(5)為SCPI短命令格式,SCPI詞法分析器會(huì)自動(dòng)辨認(rèn)長短命令,匹配該命令。所以該命令也會(huì)成功返回。以上命令都會(huì)編譯唯一解代碼code=”0x010001”。命令執(zhí)行器將該代碼,交給儀器的Excutor。不同儀器的Excutor對(duì)該代碼執(zhí)行儀器特定的操作,完成SCPI指令的執(zhí)行。
4.結(jié)論
本文設(shè)計(jì)的SCPI解析器有兩個(gè)特點(diǎn):1)采用XML語言將SCPI指令描述成解空間樹;2)設(shè)計(jì)了一個(gè)基于最優(yōu)解的貪心算法。對(duì)于給定的SCPI命令串通過搜索解空間樹,來判斷給定的SCPI命令串是否合法。該設(shè)計(jì)有如下優(yōu)點(diǎn):1)通過書寫不同的XML腳本可以生成不同的SCPI命令集,無需修改修改SCPI解析引擎,就可以部署到不同的儀器上。2)解決了SCPI的等效命令問題。所有符合規(guī)范的SCPI等效命令都可以編譯成同一條執(zhí)行代碼。因而本文設(shè)計(jì)的SCPI解析引擎具有通用性、普適性,非常適合程控儀器的SCPI命令內(nèi)置執(zhí)行引擎。
參考文獻(xiàn)
[1]Standard Commands for Programmable Instruments(SCPI).Consortiums SCPI standard[J].May,1999(6).
[2]于紅雨,李智,劉暢.函數(shù)/任意波形發(fā)生器SCPI解釋器設(shè)計(jì)與實(shí)現(xiàn)[J].國外電子測(cè)量技術(shù),2009(4):70-73.
[3]孟德偉,唐承苗,秦開宇.基于XML的通用SCPI命令解析器設(shè)計(jì)[J].儀器儀表用戶,2010(17):76-78.