李海龍,劉文文
(合肥工業(yè)大學(xué) 儀器儀表學(xué)院,安徽 合肥 230009)
基于VC++6.0的SCPI解釋器設(shè)計(jì)
李海龍,劉文文
(合肥工業(yè)大學(xué) 儀器儀表學(xué)院,安徽 合肥 230009)
SCPI是現(xiàn)代可程控儀器的一種采用樹狀分層結(jié)構(gòu)的標(biāo)準(zhǔn)命令集,被廣泛的應(yīng)用于各種智能儀器的控制和測(cè)試中。根據(jù)SCPI樹形結(jié)構(gòu)的特點(diǎn),使用VC++中的ODBC技術(shù),創(chuàng)建并查詢SCPI命令集的數(shù)據(jù)庫,使用VC++中的CTreeCtrl控件,生成SCPI的命令樹,方便得到SCPI命令的完整路徑,同時(shí)完成了SCPI命令集解釋器的設(shè)計(jì)。
SCPI;樹狀分層結(jié)構(gòu);命令樹;ODBC;CTreeCtrl控件;解釋器
1990年4 月,由HP、Tek等9家知名的儀器制造商組成的聯(lián)合體,一致同意發(fā)表了建立在IEE488.2基礎(chǔ)上的可程控儀器的標(biāo)準(zhǔn)程控命令(Standard Commands for Programmable Instruments,SCPI),并在同年發(fā)布了它的第一標(biāo)準(zhǔn)文本SCPI Rev.1990.0[1-4]。
SCPI是建立在以IEEE488.1和IEEE488.2標(biāo)準(zhǔn)為基礎(chǔ),以ASCII字符組成的標(biāo)準(zhǔn)儀器命令語言,它采用的是樹形分層結(jié)構(gòu)的命令集,助記符的規(guī)則簡(jiǎn)單且易于記憶。該語言為所有儀器提供了相互兼容的編程和使用環(huán)境,通過采用標(biāo)準(zhǔn)化的編程信息、儀器相應(yīng)和數(shù)據(jù)格式來保證編程環(huán)境的兼容性,提高了編程的效率,可以用于GPIB、USB等各種類型接口之間的通信。目前國內(nèi)外的儀器都是根據(jù)這個(gè)標(biāo)準(zhǔn)進(jìn)行設(shè)計(jì)和制造。
對(duì)于整個(gè)SCPI命令可以分為兩個(gè)部分:一部分是IEEE488.2公用命令,要求儀器必須執(zhí)行,這部分與測(cè)量無關(guān),只是用來控制重設(shè)、自我測(cè)試和狀態(tài)的操作;另一部分是SCPI儀器特定控制命令,其又可進(jìn)一步分為一組測(cè)量命令和23個(gè)命令子系統(tǒng)。
對(duì)于公用命令,一般都是以“*”開頭且僅有一層,用來執(zhí)行所有有標(biāo)準(zhǔn)IEEE488.2界面的儀器的共同功能。如*RST、*CLR等。
SCPI儀器特定控制命令分為命令和查詢兩種格式,用來從事測(cè)量、讀取資料以及通過查詢來獲取儀器的設(shè)置或狀態(tài)等功能。SCPI命令采用樹形結(jié)構(gòu)的指令系統(tǒng),稱為SCPI命令樹,包括校準(zhǔn)子系統(tǒng)、檢測(cè)子系統(tǒng)和測(cè)試子系統(tǒng)等23個(gè)子系統(tǒng),每個(gè)命令樹系統(tǒng)由一個(gè)根命令和一個(gè)或者數(shù)個(gè)層次命令構(gòu)成[4-5]。命令樹形結(jié)構(gòu)如圖1所示。

圖1 SCPI命令結(jié)構(gòu)Fig.1 Structure of SCPI
儀器特定控制命令格式為:關(guān)鍵字<參數(shù)>:關(guān)鍵字<參數(shù)>:……<參數(shù)>,<參數(shù)>……
冒號(hào)(:)的使用方法:冒號(hào)位于命令關(guān)鍵字的第一個(gè)字符前面,表示接下來的命令是根命令;位于兩個(gè)命令之間時(shí)表示當(dāng)前層次向下移動(dòng)一個(gè)層次。
分號(hào)(;)的使用方法:用來分離同一個(gè)命令字符串中的兩個(gè)命令,但不改變目前指定的路徑。
進(jìn)入暖箱的新生兒需要全程監(jiān)護(hù),醫(yī)護(hù)人員會(huì)定時(shí)查體、喂奶、換尿布、觀察寶寶的皮膚顏色、原始反射和生命體征等,及時(shí)調(diào)節(jié)暖箱的溫度和濕度,避免暖箱溫度失控,影響寶寶的身體健康。
逗號(hào)(,)的使用方法:如果一個(gè)命令需要一個(gè)以上參數(shù)時(shí),參數(shù)之間用逗號(hào)分開。
空格的使用方法:分隔關(guān)鍵字和參數(shù)。
“?”命令的使用方法:以問號(hào)結(jié)束的是查詢命令,可以指定儀器發(fā)送反應(yīng)信息,查詢的傳回值為測(cè)量值或儀器內(nèi)部的設(shè)置值。
由于SCPI為樹形結(jié)構(gòu),因此只有指定完整的路徑才能執(zhí)行較低層次的個(gè)別命令。根據(jù)圖1的SCPI樹形結(jié)構(gòu)可以得到如下指定命令的完整路徑:
:SENse:FREQuency:VOLTage:RANGe<參數(shù)值>
對(duì)于早期的儀器并不支持SCPI命令集。因此需要設(shè)計(jì)一種命令解釋器,能夠根據(jù)用戶輸入的SCPI命令查詢到程控儀器內(nèi)置的與SCPI命令相對(duì)應(yīng)且儀器可以識(shí)別的命令,從而完成SCPI命令的解釋過程。
在ODBC體系下,要訪問某種數(shù)據(jù)庫,用戶只需借助操作系統(tǒng)提供的ODBC管理工具軟件,在應(yīng)用程序的運(yùn)行平臺(tái)安裝相應(yīng)的ODBC數(shù)據(jù)庫驅(qū)動(dòng)程序,按照“開始-控制面板-數(shù)據(jù)源”,打開“ODBC數(shù)據(jù)源管理器”,建立一個(gè)ODBC數(shù)據(jù)源的對(duì)象,然后用戶就可以通過該數(shù)據(jù)源來訪問相應(yīng)的數(shù)據(jù)庫。
要訪問我們創(chuàng)建的數(shù)據(jù)庫,第一步就是從應(yīng)用程序連接到數(shù)據(jù)庫。首先使用VC++6.0創(chuàng)建一個(gè)基于對(duì)話框的工程,在工程中添加一個(gè)新類CRecord,其基類是CRecordset,出現(xiàn)如下對(duì)話框,選擇創(chuàng)建的SCPI數(shù)據(jù)源,這樣就相當(dāng)于把創(chuàng)建的數(shù)據(jù)庫與應(yīng)用程序連接在一起,之后就可以對(duì)數(shù)據(jù)庫進(jìn)行操作[6]。
CRecordset類封裝了對(duì)數(shù)據(jù)庫進(jìn)行各種操作的成員函數(shù),可以滿足我們的需求。使用派生類CRecord的對(duì)象record,對(duì)數(shù)據(jù)庫進(jìn)行動(dòng)態(tài)查詢,動(dòng)態(tài)表示的信息有如下一些:
1)記錄集中的字段數(shù)目 (即列的數(shù)目) short nFields=record.GetODBCFieldCount();//獲取記錄集的列值
2)創(chuàng)建命令樹 VC++中樹形控件常常用來顯示和組織樹、索引項(xiàng)等具有多層次關(guān)系的結(jié)構(gòu)[5]。在BOOL CTestDlg::OnInitDialog()中調(diào)用 NewTree()函數(shù),其作用是將數(shù)據(jù)庫中查詢到得SCPI每個(gè)節(jié)點(diǎn)按照其結(jié)構(gòu)方式存放在m_tree控件上相應(yīng)的項(xiàng)中 (m_tree是一個(gè)與CTreeCtrl控件相關(guān)聯(lián)的變量),構(gòu)成樹形層次結(jié)構(gòu)。

3)依次查詢字段值 由于SCPI命令在數(shù)據(jù)庫中的格式為字符串,因此給Edite控件關(guān)聯(lián)一個(gè)CString變量m_cmd,用于存放輸入的子命令。

4)遍歷命令樹 在確定輸入的子命令查找成功之后,使用遞歸方法遍歷樹形結(jié)構(gòu),將存在的命令項(xiàng)的HTREEITEM(即句柄值)轉(zhuǎn)化為DWORD形式存放在Item[N]數(shù)組中,實(shí)現(xiàn)了對(duì)SCPI中重復(fù)命令的查詢[7]。
5)創(chuàng)建完整路徑 由于得到的是子命令的句柄值,因此可以通過CTreeCtrl控件的GetParentItem () 函數(shù)和GetItemText(),依次得到子命令的父節(jié)點(diǎn)和父節(jié)點(diǎn)上字符串的內(nèi)容,通過字符串的相加即可得到子命令的完整路徑。

圖2 命令查詢Fig.2 Command query

圖3 完全路徑Fig.3 Full path
對(duì)于每個(gè)完整路徑的SCPI子命令來說,都有與其相對(duì)應(yīng)的程控儀器的控制命令,因此可以通過每個(gè)SCPI子命令唯一的ID值與程控儀器的控制命令相關(guān)聯(lián)起來。同樣通過上述方法,將程控儀器的控制命令集數(shù)據(jù)庫添加至工程中,點(diǎn)擊SCPI子命令即可得到其ID值,通過SCPI子命令的ID值查找到與其對(duì)應(yīng)程控儀器可識(shí)別的控制命令,即完成了SCPI命令的解釋過程。如圖4所示。

圖4 解釋效果Fig.4 Effect of interpret
SCPI在現(xiàn)代測(cè)量控制領(lǐng)域[8]的應(yīng)用十分廣泛,為了加強(qiáng)對(duì)命令集的管理,對(duì)于SCPI命令集的存儲(chǔ)結(jié)構(gòu)和子命令的查詢是十分重要的。本文設(shè)計(jì)并實(shí)現(xiàn)了對(duì)輸入的SCPI命令的判斷和查詢,得到了輸入的SCPI子命令的完整路徑,并完成了對(duì)SCPI命令的解釋,方便了命令的發(fā)送和對(duì)可程控儀器的操作。
[1]陳艷芬,楊景常,張吉濤.PC機(jī)遠(yuǎn)程控制儀器的SCPI解析模塊設(shè)計(jì)[J].微計(jì)算機(jī)信息,2008(11):143-145.
CHEN Yan-fen,YANG Jing-chang,ZHANG Ji-tao.The design of SCPI parser module between PC and remote control instruments[J].Control&Automation,2008(11):143-145.
[2]奚全生.可編程儀器標(biāo)準(zhǔn)命令(SCPI)介紹[J].計(jì)算機(jī)自動(dòng)測(cè)量與控制,1994(1):22-31.
XI Quan-sheng.Instroduction of SCPI[J].Computer Automated Measurement&Control,1994(1):22-31.
[3]朱興邦,李兵.IEEE488與SCPI解釋[J].儀器儀表標(biāo)準(zhǔn)化與計(jì)量,2007(1):15-16.
ZHU Xing-bang,LI Bing.The explanation of IEEE488 and SCPI[J].Instrument Standardization&Metrology,2007 (1):15-16.
[4]于紅雨,李智,劉暢.函數(shù)/任意波形發(fā)生器SCPI解釋器設(shè)計(jì)與實(shí)現(xiàn)[J].國外電子測(cè)量技術(shù),2009(4):70-73.
YU Hong-yu,LI Zhi,LIU Chang.Research and implementation of SCPI interpreter for function/arbitrary waveform generator[J].Foreign Electronic Measurement Technology,2009(4):70-73.
[5]杜秀偉,王前程.SCPI語言解析器的設(shè)計(jì)與實(shí)現(xiàn)[J].電子質(zhì)量,2008(8):23-25.
DU Xiu-wei,WANG Qian-cheng.Design and implementation of SCPI parser[J].Electron Quality,2008(8):23-25.
[6]徐華中,馮紅梅.VC-MFC ODBC的數(shù)據(jù)庫系統(tǒng)開發(fā)[J].武漢理工大學(xué)學(xué)報(bào),2004(6):25-27.
XU Hua-zhong,F(xiàn)ENG Hong-mei.Database system development of VC-MFC ODBC[J].Journal of WUT:Information&Management Engineering,2004(6):25-27.
[7]陳慧南.數(shù)據(jù)結(jié)構(gòu)-C語言描述[M].西安:西安電子科技大學(xué)出版社,2009.
[8]李軍浩,胡泉偉,吳磊,等.極化/去極化電流測(cè)試技術(shù)的仿真研究[J].陜西電力,2011(4):1-5.
LI Jun-hao,HU Quan-wei,WU Lei,et al.Simulation study of polarization and depolarization current measurements technology[J].Shaanxi Electric Power,2011(4):1-5.
Design of SCPI interpreter based on VC++6.0
LI Hai-long,LIU Wen-wen
(School of Instrument Science,Hefei University of Technology,Hefei230009,China)
SCPI is the new instrument command language for controlling instruments with tree structure,has been wildly used in controling and testing of intelligent instruments.Based on the structural characteristics of SCPI,used ODBC technology in VC++,create and query the database of SCPI,used CTreeCtrl control,build the command tree of SCPI and get the full path of SCPI easily,complete the design of SCPI interpreter.
SCPI; tree structure; command tree; ODBC; CTreeCtrl control; interpreter
TH89
A
1674-6236(2012)04-0094-03
2011-12-20 稿件編號(hào):201112115
李海龍(1986—),男,陜西渭南人,碩士研究生。研究方向:精密測(cè)試技術(shù)及儀器。