基于靜態(tài)鏈表SCPI解析系統(tǒng)設(shè)計(jì)
趙云
(桂林電器科學(xué)研究院有限公司 研發(fā)中心,廣西 桂林541004)
摘要針對(duì)傳統(tǒng)的SCPI解釋方式占用過(guò)多內(nèi)存,制約了在嵌入式系統(tǒng)上的應(yīng)用,文中設(shè)計(jì)了一種方便移植和擴(kuò)展的SCPI語(yǔ)言解析方法。該種方法用靜態(tài)鏈表的結(jié)構(gòu)來(lái)保存SCPI命令集,通過(guò)這種方法建立的SCPI解析模塊,占用內(nèi)存少,且方便移植和擴(kuò)展。利用文中方法設(shè)計(jì)的SCPI解析模塊可方便應(yīng)于各種智能程控儀器,并適用在嵌入式系統(tǒng)下工作。
關(guān)鍵詞SCPI;靜態(tài)鏈表;程控儀器
收稿日期:2015-04-22
作者簡(jiǎn)介:趙云(1982—),男,碩士,工程師。研究方向:嵌入式測(cè)控。E-mali:26532401@qq.com
doi:10.16180/j.cnki.issn1007-7820.2015.12.031
中圖分類(lèi)號(hào)TN314文獻(xiàn)標(biāo)識(shí)碼A
SCPI Parsing Based on Static Linked List
ZHAO Yun
(R & D Center,Guilin Electric Apparatus Research Institute Co.,Ltd.,Guilin 541004,China)
AbstractThis paper designs a convenient transplantation and extension of SCPI language parsing method.This method saves the SCPI command set with static chain table structure.The SCPI parsing module established by this method,enjoys little memory consumption and convenient transplant and extension.This method can be applied to various intelligent programmable instruments and work under the applicable in embedded systems.
KeywordsSCPI;static linked list;programmable instruments
SCPI(The Standard Commands for Programmable Instruments)是一種標(biāo)準(zhǔn)化的控制儀器語(yǔ)言,但傳統(tǒng)的SCPI解釋方式占用太多的內(nèi)存資源,制約了在嵌入式系統(tǒng)上的應(yīng)用。因此,減少SCPI解析系統(tǒng)占用的資源,是降低通用儀器實(shí)現(xiàn)智能化和可編程化成本的關(guān)鍵[1]。本文針對(duì)程控儀器的SCPI命令集,設(shè)計(jì)和研究了一種新的SCPI解釋方法,采用靜態(tài)鏈表方式來(lái)構(gòu)建SCPI命令樹(shù),減少了SCPI生成樹(shù)對(duì)系統(tǒng)內(nèi)存的占用,并提供了一種直觀的修改和擴(kuò)展SCPI命令集的設(shè)計(jì)方法。
1SCPI控制指令
SCPI基于IEEE488.2標(biāo)準(zhǔn),但不局限于GPIB接口,其也可用于RS232C等總線,在與通訊物理連接成硬件無(wú)關(guān)的高層次上定義的程控語(yǔ)言[2-3]??梢钥s短自動(dòng)測(cè)試設(shè)備程序開(kāi)發(fā)時(shí)間,保護(hù)設(shè)備制造者和使用者雙方的軟硬件投資,為一起控制和數(shù)據(jù)利用提供廣泛兼容的編碼環(huán)境。
2基于靜態(tài)鏈表SCPI解析器的設(shè)計(jì)
SCPI解析器的功能是對(duì)接收到的命令字符串進(jìn)行解析,將命令字符串翻譯成為儀器可以識(shí)別的代碼,一般分成兩部分[4-6]:(1)SCPI命令集的建立和儲(chǔ)存。(2)對(duì)輸入的命令字符串按照SCPI命令集進(jìn)行詞法分析和語(yǔ)法分析。根據(jù)SCPI命令的樹(shù)狀結(jié)構(gòu)特點(diǎn),一般的解析方法是使用將多叉樹(shù)轉(zhuǎn)換成二叉樹(shù)——兄弟孩子表示法,來(lái)存儲(chǔ)SCPI命令集。但基于二叉鏈表的解析方法占用內(nèi)存資源過(guò)大,在單片機(jī)上使用有限制。因此,本文設(shè)計(jì)了與二叉鏈表法不同的基于靜態(tài)鏈表的存儲(chǔ)結(jié)構(gòu)。由于靜態(tài)鏈表可保存到單片機(jī)的Flash Rom中,直接生成SCPI指令樹(shù),無(wú)需占用系統(tǒng)內(nèi)存,這種方法占用的資源較少,更適用于嵌入式智能儀表系統(tǒng)[7-9]。圖1為使用靜態(tài)鏈表構(gòu)建SCPI的命令樹(shù)。
圖1 命令樹(shù)使用靜態(tài)鏈表的存儲(chǔ)格式
2.1SCPI靜態(tài)鏈表命令樹(shù)的創(chuàng)建
由于SCPI的層次結(jié)構(gòu),每條樹(shù)枝實(shí)際上最終均有特定的終點(diǎn)。這里設(shè)計(jì)了一種兩層指令結(jié)構(gòu)模式,提高了各子模塊系統(tǒng)的獨(dú)立性。第一層是程序的程控命令/公共命令編號(hào),第二層是該類(lèi)指令的最終功能編號(hào)。這樣做的好處是,各個(gè)模塊之間的解析系統(tǒng)相對(duì)獨(dú)立,當(dāng)產(chǎn)品需求變化、要修改指令系統(tǒng)時(shí)方便維護(hù),可獨(dú)立只修改一個(gè)模塊的最終功命令編號(hào)且不影響其他模塊的原有功能。
將SCPI命令樹(shù)的樹(shù)型結(jié)構(gòu)轉(zhuǎn)換成為表格形式。按照上述分層編碼方式,將子系統(tǒng)表內(nèi)部的指令分為不同的兩層編碼。
經(jīng)過(guò)以上步驟,就實(shí)現(xiàn)了SCPI命令樹(shù)的構(gòu)建。這種樹(shù)的存儲(chǔ)方式是使用數(shù)組和靜態(tài)鏈表構(gòu)成的,可通過(guò)在聲明CODE關(guān)鍵字使代碼保存在單片機(jī)的代碼段中。
2.2SCPI具體解析流程
SCPI的具體解碼流程比較復(fù)雜,代碼過(guò)長(zhǎng)會(huì)影響閱讀性。在此對(duì)傳統(tǒng)的字符串比較法進(jìn)行了一些改進(jìn),將解析函數(shù)分成若干個(gè)子函數(shù)組成。
如圖2中SCPI解析函數(shù)的流程圖,解析函數(shù)使用輸入命令字符串作為輸入?yún)?shù),會(huì)創(chuàng)建一個(gè)的結(jié)構(gòu)體作為最終的解析解析結(jié)果。值得注意的是這個(gè)字符串參數(shù)只對(duì)首字符做了比較,根據(jù)公共指令和特殊指令對(duì)首字符標(biāo)志不同,就作為參數(shù)傳遞到公共命令解析函數(shù),或?qū)S妹罱馕龊瘮?shù)。
圖2 SCPI解析函數(shù)
公共命令的解析比較簡(jiǎn)單,而專(zhuān)用命令的解析函數(shù)是SCPI解析工作的重點(diǎn),其中特殊(專(zhuān)用)命令解析函數(shù)的解析思路如下:
(1)將沒(méi)有解析的字符串從左到右以冒號(hào)來(lái)分隔出第一段,剩下部分作為未解析字符串等待下一步分析。如果該字符串內(nèi)沒(méi)有冒號(hào),則這個(gè)字符串應(yīng)該視為一條終結(jié)的指令,用空格分解出來(lái)前面關(guān)鍵字部分,后半部分作參數(shù)字符串。
(2)取出該字段的關(guān)鍵字部分,代入該結(jié)點(diǎn)所在層次的關(guān)鍵字表查詢(xún)匹配,若找到匹配的關(guān)鍵字,將子系統(tǒng)編號(hào)保存到第一層結(jié)果,作為第一層子系統(tǒng)解析結(jié)果,且還要將該關(guān)鍵字的后繼表更新為下一次的查詢(xún)表。若沒(méi)有匹配的關(guān)鍵字,就返回出錯(cuò)的返回標(biāo)記。
(3)根據(jù)步驟(2)中返回的結(jié)果,若該字符串還有后繼的查詢(xún)表,將步驟(1)中用冒號(hào)拆分的未解析字符串拆分出關(guān)鍵字,代入該結(jié)點(diǎn)所在層次的關(guān)鍵字表查詢(xún)匹配,如果找到匹配的關(guān)鍵字,將關(guān)鍵字編號(hào)作為第二層子系統(tǒng)解析結(jié)果。并還要將該關(guān)鍵字的后繼表更新為下一次的查詢(xún)表,返回本次解析結(jié)果。若沒(méi)有匹配的關(guān)鍵字,則返回出錯(cuò)的返回標(biāo)記。
(4)根據(jù)(3)的解析結(jié)果,若后繼的查詢(xún)表不為空,則將鏈?zhǔn)浇馕鲆恢眻?zhí)行下去。不斷更新第二層的解析結(jié)果,和下一步的關(guān)鍵字查詢(xún)表。直到返回結(jié)果的后繼查詢(xún)表為空,則可以得到一個(gè)包含第一層的子系統(tǒng)號(hào),第二層的終結(jié)號(hào),以及剩余參數(shù)字符串的解析結(jié)果。
2.3SCPI專(zhuān)用指令的解析過(guò)程
專(zhuān)用指令的解析函數(shù)的設(shè)計(jì)具體實(shí)現(xiàn)比上述的思路要復(fù)雜,通過(guò)調(diào)用一個(gè)鏈?zhǔn)胶瘮?shù)來(lái)達(dá)到解析的目的,實(shí)現(xiàn)鏈表的查詢(xún)。SCPI鏈?zhǔn)浇馕龊瘮?shù)的流程圖如圖3所示,每次完成一次查詢(xún),取出對(duì)應(yīng)的編碼后,就更新一次當(dāng)前指向節(jié)點(diǎn)數(shù)組的指針。
以SCPI鏈?zhǔn)浇馕龊瘮?shù)為基礎(chǔ),可以方便地設(shè)計(jì)專(zhuān)用指令的函數(shù)解析函數(shù),專(zhuān)用指令也是用字符串作為參數(shù),第一步創(chuàng)建一個(gè)結(jié)構(gòu)體是作為解析結(jié)果的保存空間。這里通過(guò)反復(fù)調(diào)用鏈?zhǔn)浇馕龊瘮?shù)來(lái)達(dá)到解析結(jié)果,每次調(diào)用解析結(jié)果可得到字符串以冒號(hào)分段的關(guān)鍵字編碼。第一次調(diào)用鏈?zhǔn)浇馕龊瘮?shù)的解析結(jié)果就作為第一層命令編碼。后面調(diào)用鏈?zhǔn)浇馕龊瘮?shù)的解析結(jié)果就作為第二層命令編碼。要注意的是,這個(gè)電子負(fù)載的解析命令表不超過(guò)5層,所以這里將鏈?zhǔn)浇馕鰧酉拗茷?層。若經(jīng)過(guò)鏈?zhǔn)浇馕龊瘮?shù)以后,節(jié)點(diǎn)數(shù)組的指針為空,代表已到達(dá)最終解析目標(biāo)。
2.4參數(shù)字段的分析
經(jīng)過(guò)執(zhí)行SCPI解析函數(shù)后,最終可得到功能編號(hào)和參數(shù)字符串兩個(gè)結(jié)果。參數(shù)的分析工作主要是把分割出來(lái)的參數(shù)字符串解析成為對(duì)應(yīng)語(yǔ)義的數(shù)據(jù)類(lèi)型,對(duì)應(yīng)不同功能編號(hào)的參數(shù)要求是不同的。參數(shù)類(lèi)型是字符串型的參數(shù),就直接代入?yún)?shù)字符串;參數(shù)類(lèi)型是整形,就判斷參數(shù)字符串是否在‘0’~‘9’,將字符串轉(zhuǎn)換成為數(shù)值保存。若參數(shù)字符串可被解析為合法參數(shù),則下一步就可以執(zhí)行相應(yīng)的操作函數(shù),否則就返回參數(shù)錯(cuò)誤。
圖3 SCPI鏈?zhǔn)浇馕龊瘮?shù)
3SCPI解析測(cè)試
設(shè)計(jì)了一塊帶有液晶和單片機(jī)的SCPI解析板作為擴(kuò)展。將PC發(fā)送的串口字符在SCPI解析板上做解析,在液晶上顯示解析結(jié)果,并觀察負(fù)載模塊上的執(zhí)行結(jié)果。由PC端串口調(diào)試助手,發(fā)出SCPI指令,然后觀察解析模塊板塊上的液晶模塊反映的解析結(jié)果。由于公共指令較簡(jiǎn)單,這里主要測(cè)試特殊指令的解析結(jié)果。
串口助手發(fā)送測(cè)試命令“:CHAN:LOAD? MAX”。該語(yǔ)句屬于CHAN子系統(tǒng),第一層指令碼為1,第二層指令為1,參數(shù)字符段為MAX。解析結(jié)果如圖4所示,可在液晶上面顯示出來(lái)。
圖4 SCPI解析板的試驗(yàn)
分析顯示結(jié)果,對(duì)照指令樹(shù)的代碼截圖4“:CHAN” 為特殊指令,指令號(hào)(功能編號(hào))為1,后繼指針指向CHAN_TABLE子系統(tǒng)表,第一層指令n1=001,解析正確。
4結(jié)束語(yǔ)
針對(duì)嵌入式編程儀器的要求,研究了SCPI解析方法,解決了在嵌入式操作系統(tǒng)環(huán)境中設(shè)計(jì)SCPI解析模塊的問(wèn)題。分析了可編程電子負(fù)載的SCPI程控語(yǔ)言,提出一種基于靜態(tài)鏈表的SCPI語(yǔ)言解析方法,實(shí)現(xiàn)了RTX51環(huán)境下的SCPI語(yǔ)言解析模塊。避免了用二叉樹(shù)動(dòng)態(tài)鏈表的SCPI解析方式需要調(diào)用動(dòng)態(tài)內(nèi)存分配函數(shù),導(dǎo)致無(wú)法在RTX51和uC/OS-II下運(yùn)行的缺點(diǎn)。
參考文獻(xiàn)
[1]趙云.可編程電子負(fù)載的研究和設(shè)計(jì)[D].桂林:桂林電子科技大學(xué),2012.
[2]相艷.基于SCPI的數(shù)據(jù)采集單元設(shè)計(jì)[D].北京:北京化工大學(xué),2008.
[3]肖燕.用于驗(yàn)證SCPI翻譯模塊的GPIB接口設(shè)計(jì)[D].成都:西華大學(xué),2008
[4]趙云,郭慶,羅蘇笙,等.基于FPGA的多儀表合一的設(shè)計(jì)與實(shí)現(xiàn)[J].電子科技,2012,25(8):10-12,19.
[5]井濤,郭永瑞.一種實(shí)用的SCPI語(yǔ)法分析設(shè)計(jì)方法[J].國(guó)外電子測(cè)量技術(shù),2006,25(2):42-44.
[6]李博,趙建,時(shí)玉娟,等.基于Linux的SCPI命令解釋器的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)測(cè)量與控制,2008,16(7):1007-1010.
[7]李海龍,劉文文.基于VC++6.0的SCPI解釋器設(shè)計(jì)[J].電子設(shè)計(jì)工程,2012,20(4):94-96.
[8]唐琳,李智,許紅軍.VXI消息基模塊SCPI解釋器設(shè)計(jì)方法研究[J].桂林電子工業(yè)學(xué)院學(xué)報(bào),2000(1):91-95.
[9]陳艷芳.儀器接口平臺(tái)SCPI解析模塊設(shè)計(jì)[D].成都:西華大學(xué),2009.