張 喆,鄭 賓
(中北大學(xué) 電子測試技術(shù)國家重點(diǎn)實(shí)驗(yàn)室,太原 030051)
在測試數(shù)據(jù)獲取方面,通用測試系統(tǒng)平臺(tái)前端會(huì)使用多種類型傳感器,通過矩陣開關(guān)與后級(jí)數(shù)據(jù)采集系統(tǒng)相連;在數(shù)據(jù)采集系統(tǒng)中會(huì)相應(yīng)使用多種類型的信號(hào)調(diào)理電路及數(shù)據(jù)采集板卡;同時(shí),所有的測試系統(tǒng)都需要使用多種類型的高精度分立儀器測試產(chǎn)品的性能或?yàn)闇y試對(duì)象提供電源、激勵(lì)等信號(hào);在某些測試中,會(huì)使用各種總線與被測對(duì)象或分立儀器完成通訊功能;為完善測試功能,某些測試方法需要使用嵌入式技術(shù)等等。獲得測試數(shù)據(jù)后要對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)、分析、輸出等管理。
以上所敘述的諸多應(yīng)用是無法只使用一種或兩種開發(fā)語言就能完成的。例如最為廣泛使用的開發(fā)語言是VC++,但在數(shù)據(jù)采集卡操作、分立儀器控制、界面美化、開發(fā)工作強(qiáng)度等方面其性能遠(yuǎn)不如基于標(biāo)準(zhǔn)C的LabWindows/CVI,但是LabWindows/CVI無法調(diào)用使用VC++編寫的動(dòng)態(tài)鏈接庫。又如NI公司出品的、可以由上位機(jī)直接操作的FPGA板卡只能使用LabVIEW開發(fā)。再如C/C++、LabVIEW等傳統(tǒng)編寫虛擬儀器所使用的語言,其數(shù)據(jù)處理能力都十分有限,這時(shí)如果調(diào)用MATLAB中的函數(shù)處理采集到的數(shù)據(jù)就會(huì)使得整個(gè)測試系統(tǒng)具有較廣的適用范圍。因此,在通用自動(dòng)測試系統(tǒng)平臺(tái)的開發(fā)中,多語言混合編程是無法回避的問題。
目前使用最廣泛的Windows操作系統(tǒng)為多語言混合編程提供了多種解決方案。普遍適用的有動(dòng)態(tài)鏈接庫技術(shù),COM組件技術(shù)。
動(dòng)態(tài)鏈接庫DLL(Dynamic Link Library)是一種基于Windows的程序模塊,它提供了一種方法,使進(jìn)程可以調(diào)用不屬于其可執(zhí)行代碼的函數(shù)。當(dāng)一個(gè)函數(shù)被導(dǎo)出時(shí),它被加入到動(dòng)態(tài)鏈接庫所包含的一個(gè)表中[1]。此表包含了所有導(dǎo)出函數(shù)的位置,可以用來查找和調(diào)用這些函數(shù),而調(diào)用DLL的應(yīng)用程序本身并不包含這些函數(shù)的執(zhí)行代碼[2]。
COM組件技術(shù)不依賴特定的語言。COM標(biāo)準(zhǔn)采用的是二進(jìn)制代碼級(jí)的標(biāo)準(zhǔn),COM對(duì)象把OOP語言中的對(duì)象封裝起來,并提供一致的接口,使得它可以被各種不同的語言所使用,COM的語言無關(guān)性實(shí)際上為跨語言合作開發(fā)提供了統(tǒng)一標(biāo)準(zhǔn),差不多每種語言在實(shí)現(xiàn)時(shí)都提供了對(duì) COM的支持,如 Visual C/C++、Visual Basic、Visual C++、Delphi、C++ Builder 等都支持 COM 組件的開發(fā)和使用[3]。
這兩種技術(shù)雖然功能強(qiáng)大,但也都有自己的技術(shù)缺陷。DLL的主要缺點(diǎn)有:(1)若多DLL文件中函數(shù)名稱相同將引起軟件沖突;(2) 各編譯器對(duì)C++函數(shù)的名稱修飾可能不兼容;(3)DLL與可執(zhí)行文件存在依賴關(guān)系。雖然DLL技術(shù)的缺點(diǎn)就是COM組件技術(shù)的優(yōu)點(diǎn)[4],但COM組件的開發(fā)要求測試系統(tǒng)開發(fā)人員具有較高的計(jì)算機(jī)軟硬件運(yùn)行原理的理論基礎(chǔ),同時(shí)需要再學(xué)習(xí)新的開發(fā)工具。因此,良好的通用自動(dòng)測試系統(tǒng)平臺(tái)中多語言混合編程的解決方案應(yīng)兼具DLL技術(shù)的易用性和COM組件技術(shù)的靈活性,同時(shí)要考慮是否適用于測試領(lǐng)域,要做到綜合而不龐雜。
通過對(duì)傳統(tǒng)多語言很合編程解決方案和國外先進(jìn)自動(dòng)測試系統(tǒng)的研究,可以看到一類測試系統(tǒng)管理軟件能夠很好地融合DLL技術(shù)及COM組件技術(shù),同時(shí)解決了大型測試系統(tǒng)的程序模塊化管理的問題。這其中又以美國羅馬之星中所使用的NI TestStand應(yīng)用最為廣泛。
NI TestStand是NI公司發(fā)布的一款測試管理軟件。它為測試開發(fā)和執(zhí)行提供了一個(gè)核心的框架省去了通常的測試執(zhí)行的開發(fā)任務(wù)[5]。
通常的測試執(zhí)行的開發(fā)任務(wù)。強(qiáng)模塊化的TestStand架構(gòu)主要由以下組件組成:TestStand引擎、序列編輯器、操作界面和組件適配器,如圖1所示。
圖1 NI TestStand架構(gòu)
在TestStand架構(gòu)中,TestStand適配器模塊的功能就是連接引擎和外部測試程序開發(fā)環(huán)境,當(dāng)調(diào)用外部代碼時(shí),TestStand使用適配器模塊測定代碼模塊的類型、調(diào)用協(xié)議、參數(shù)列表和如何傳遞參數(shù)。通過模塊適配器,TestStand與所有主流測試編程環(huán)境兼容,如LabVIEW、LabWindows/CVI、Measurement Studio組件和微軟Visual Basic和Visual C++等。它還能調(diào)用任何編譯過的動(dòng)態(tài)鏈接庫(DLLs)、ActiveX自動(dòng)化服務(wù)器和可執(zhí)行文件,甚至傳統(tǒng)開發(fā)語言如HTBasic、ATLAS、HP_VEE 等[6]。
在TestStand適配器模塊中擁有3種權(quán)限等級(jí)的變量:局部變量(Local Variable,在同一序列文件中保存、傳遞數(shù)據(jù))、全局變量(Global Variable,在同一工程下的不同序列文件間保存、傳遞數(shù)據(jù))和工作站變量(Station Global Variable,在同一工作主機(jī)下不同工程間保存、傳遞數(shù)據(jù))。它們是在不同語言間傳遞數(shù)據(jù)的中介。以局部變量為例,TestStand的工作方式如圖2所示。在TestStand引擎下可以掛接多個(gè)序列,每個(gè)序列由多個(gè)步驟組成,而單個(gè)序列中使用不同語言的不同步驟間數(shù)據(jù)交換的中介就是在序列編輯器中某一提前定義好的TestStand局部變量。
圖2 TestStand在同一序列多語言不同測試步驟間傳遞數(shù)據(jù)的原理
TestStand繼承、整合了傳統(tǒng)解決方案的特點(diǎn):(1) 適應(yīng)性強(qiáng),TestStand與各種開發(fā)平臺(tái)能夠?qū)崿F(xiàn)無縫連接;(2) 測試系統(tǒng)軟件的可擴(kuò)展和可維護(hù)性強(qiáng),軟件架構(gòu)一旦建立,將各測試步驟的接口進(jìn)行定義,后期維護(hù)人員可以參照標(biāo)準(zhǔn)進(jìn)行擴(kuò)展或維護(hù);(3) 可實(shí)現(xiàn)快速二次開發(fā),測試程序的架構(gòu)一旦建立,對(duì)其進(jìn)行二次開發(fā)時(shí),只需更改相關(guān)測試步驟、生成新的動(dòng)態(tài)鏈接庫、掛接到原有程序上,無需重新編譯打包。
在此基礎(chǔ)上,相對(duì)于傳統(tǒng)解決方案,NI TestStand在測試領(lǐng)域進(jìn)行了擴(kuò)展,它具有以下4點(diǎn)突出優(yōu)勢:
(1) TestStand很好的融合了ActiveX技術(shù)(ActiveX技術(shù)是基于COM組件技術(shù)的)和DLL技術(shù),并且它不僅入門簡單、操作簡易、開放性好,這使得測試人員在需要混合編程時(shí)上手更快從而更能專注于測試本身。
(2) TestStand這一軟件的設(shè)計(jì)思路決定了它最擅長的是測試流程管理,所以在很好解決多語言混合編程的基礎(chǔ)上不會(huì)使得測試系統(tǒng)過于龐雜難以管理。
(3)繼承性好,在開發(fā)大型綜合測試系統(tǒng)時(shí),原本不屬于TestStand架構(gòu)的專項(xiàng)測試系統(tǒng)中的測試方法只需經(jīng)過簡單修改即可移植到新系統(tǒng)中。
(4) 在生產(chǎn)線上,TestStand的并行測試能力可運(yùn)行批測試(即測量一種PCB)或異步測試(即同時(shí)對(duì)一種被測器件測量不同的功能)。線程優(yōu)先功能使處理能力得到優(yōu)化,并且可同時(shí)執(zhí)行多種過程。
在實(shí)際應(yīng)用中,一個(gè)測試項(xiàng)目首先被分割為若干個(gè)測試步驟。然后可以采用兩種方式開發(fā)測試代碼:一種方式是每個(gè)步驟都采用恰當(dāng)?shù)拈_發(fā)平臺(tái)和語言編寫,而后生成動(dòng)態(tài)鏈接庫形式的模塊組件;除此之外,TestStand的適配器模塊可以打開指定的應(yīng)用程序開發(fā)環(huán)境(ADE),在其中為代碼模塊創(chuàng)建新的源代碼,然后在該開發(fā)環(huán)境中指示新創(chuàng)建的代碼,即通過TestStand的模板按步驟生成測試所需的代碼。前一種方法是目前普遍使用的方法,適用于多人合作開發(fā)同一測試系統(tǒng)軟件,這樣每人都可以適用自己擅長的語言編寫相應(yīng)步驟,然后生成各自的動(dòng)態(tài)鏈接庫掛接在主程序上編輯成一個(gè)測試序列文件,通過事先設(shè)計(jì)好的接口和全局變量完成數(shù)據(jù)交換;后一種方法適用于掌握多語言編程技術(shù)的人員實(shí)現(xiàn)快速開發(fā)。無論使用哪種方式編輯測試步驟,最終進(jìn)行測試時(shí),只需運(yùn)行一個(gè)序列文件,TestStand引擎就會(huì)按流程通過每個(gè)步驟的所涉及的接口適配器調(diào)用相應(yīng)外部代碼來完成測試任務(wù)。值得一提的是,TestStand的代碼生成模板和測試步驟模板都是可編輯的,這大大增加了測試程序編寫的靈活性。
以某圖像式直線運(yùn)動(dòng)物體運(yùn)動(dòng)參數(shù)測試系統(tǒng)為例,其系統(tǒng)構(gòu)成如圖3所示。當(dāng)激光光幕投射到運(yùn)動(dòng)物體上時(shí),粘貼在運(yùn)動(dòng)物體上的原向反射片將返回其中一部分激光,這反映在高速相機(jī)采集到的圖像上是一個(gè)光斑。最后在計(jì)算機(jī)中使用MATLAB處理采集到的圖像從而分析出運(yùn)動(dòng)物體的運(yùn)動(dòng)參數(shù)。
圖3 某圖像式運(yùn)動(dòng)物體運(yùn)動(dòng)參數(shù)測試系統(tǒng)構(gòu)成圖
該測試系統(tǒng)軟件開始運(yùn)行首先執(zhí)行硬件自檢,讀取相機(jī)和數(shù)采卡的運(yùn)行狀態(tài)。自檢通過后對(duì)相機(jī)、數(shù)采卡、軟件界面初始化并打開MATLAB后將其最小化。此時(shí)可以在系統(tǒng)校準(zhǔn)后配置數(shù)據(jù)采集參數(shù)并采集數(shù)據(jù),也可以導(dǎo)入原始圖像進(jìn)行數(shù)據(jù)處理。當(dāng)所有操作都完成后,釋放掉所用資源并退出。原軟件主體采用LabWindows/CVI開發(fā),數(shù)據(jù)采集部分因接口問題需要使用VC++編寫,數(shù)據(jù)處理使用MATLAB所提供的函數(shù)。在原有架構(gòu)中,主程序通過調(diào)用VC++編譯生成的可執(zhí)行文件完成數(shù)據(jù)采集和即時(shí)回顯數(shù)據(jù),若想對(duì)數(shù)據(jù)進(jìn)行高級(jí)處理,需要先將數(shù)據(jù)存儲(chǔ)在硬盤上,然后CVI編寫的主程序下通過ActiveX控件技術(shù)調(diào)用MATLAB中函數(shù)完成處理。
這樣的架構(gòu)雖然能夠完成測試任務(wù),卻存在3個(gè)問題:(1)主程序與數(shù)據(jù)采集程序完全是兩個(gè)獨(dú)立的程序,這樣一方面VC++編寫的程序界面十分不美觀,更重要的是數(shù)據(jù)的交換十分不方便——這是編寫軟件時(shí)比較忌諱的;(2)通過ActiveX控件技術(shù)調(diào)用MATLAB函數(shù),這種方法需要MATLAB運(yùn)行環(huán)境,這也就是開機(jī)初始化時(shí)需要打開MATLAB并將其最小化的原因;(3)縱觀整個(gè)程序,僅主程序就有幾千行,程序結(jié)構(gòu)不清晰,即程序易讀性差、可擴(kuò)展性差,使得該軟件的修改或二次開發(fā)都十分困難。
使用NI TestStand軟件即可解決以上問題。基于TestStand的該測試系統(tǒng)架構(gòu)如圖4所示。
圖4 基于TestStand的圖像式運(yùn)動(dòng)物體運(yùn)動(dòng)參數(shù)測試系統(tǒng)架構(gòu)
主程序使用LabWindows/CVI編寫,數(shù)據(jù)采集程序使用VC++編寫。具體步驟為:首先考察整理出整個(gè)測試系統(tǒng)中作為不同函數(shù)間數(shù)據(jù)交換的變量,并在TestStand下創(chuàng)建相應(yīng)的局部變量或全局變量。然后將已有的函數(shù)按功能分割成多個(gè)分立程序,確保這些程序能夠獨(dú)立完成某一功能,如相機(jī)配置、相機(jī)初始化等,再將能夠?qū)崿F(xiàn)功能的主要函數(shù)導(dǎo)出到動(dòng)態(tài)鏈接庫中。最后將各個(gè)分立的測試 步驟掛接到一個(gè)序列里,并將各函數(shù)接口中的變量與之前在TestStand中創(chuàng)建的變量對(duì)應(yīng)起來。
主程序調(diào)用MATLAB函數(shù)的方法不再調(diào)用可執(zhí)行文件,變更為LabWindows/CVI通過TestStand的C/C++接口適配器調(diào)用在MATLAB環(huán)境下生成的COM組件。具體方法為:使用MATLAB的Deployment Tool構(gòu)建Generic COM Component類型的工程,然后在該工程中添加新類(Class),再將含有圖像處理算法的M文件加入該類中,隨后在MATLAB命令框中輸入面mbuild_-setup,根據(jù)提示選擇VC編譯器,注意該命令中間“_”為空格,最后在Deployment Tool的Action中選擇Add MCR后生成多個(gè)文件,其中DLL文件可由TestStand調(diào)用,可執(zhí)行文件用于在未安裝MATLAB的環(huán)境中注冊該COM組件。該方法不需要MATLAB運(yùn)行環(huán)境,降低了資源開銷,增加了程序的靈活性[7]。
經(jīng)過上述操作后將多個(gè)分立的程序組裝成一個(gè)大系統(tǒng)。在用戶界面和一般測試步驟的編輯方面發(fā)揮LabWindows/CVI界面美觀、編輯簡易等優(yōu)勢,在數(shù)據(jù)的采集、處理方面使用VC++輔助開發(fā),運(yùn)用NI TestStand來傳遞變量、指針使得各語言所開發(fā)的功能無縫連接起來,數(shù)據(jù)處理方面發(fā)揮MATLAB在計(jì)算、分析上的優(yōu)勢。從整體來看,各個(gè)步驟采用分部開發(fā)、統(tǒng)一掛接的方式,結(jié)構(gòu)清晰、定位迅速。在局部修改或者二次開發(fā)時(shí),只需要修改相應(yīng)部分,重新生成動(dòng)態(tài)鏈接庫、掛接到主程序上。事實(shí)上,由于各個(gè)部分彼此獨(dú)立,只需做少許修改即可移植到類似的測試系統(tǒng)中,避免直接復(fù)制修改代碼所導(dǎo)致的代碼風(fēng)格混亂、函數(shù)或參數(shù)沖突。
以上所舉實(shí)例例雖稱不上“通用”的“平臺(tái)”,卻已經(jīng)可以說明使用NI TestStand架構(gòu)在解決測試領(lǐng)域多語言混合編程問題中的的優(yōu)越性,管中窺豹,可見一斑。因此,在通用自動(dòng)測試系統(tǒng)平臺(tái)中應(yīng)用NI TestStand是可行的,先進(jìn)的和有意義的!從另一方面講,使用TestStand能夠在測試領(lǐng)域解決混合編程問題的同時(shí)兼顧改進(jìn)測試系統(tǒng)整體軟件架構(gòu)。
目前,測試系統(tǒng)無論硬件還是軟件,其發(fā)展趨勢都是綜合化、模塊化。即盡可能在一個(gè)測試系統(tǒng)中包含更多的測試項(xiàng)目,并且每個(gè)測試系統(tǒng)都細(xì)化為多種模塊,通過模塊間的組合實(shí)現(xiàn)不同的功能,在功能需要調(diào)整時(shí)能夠快速完成配置,穩(wěn)定高效的完成測試任務(wù)。與此同時(shí)要降低開發(fā)總體成本,縮短開發(fā)、升級(jí)時(shí)間[8]。從這幾點(diǎn)需求來看,測試管理軟件的出現(xiàn)順應(yīng)了時(shí)代潮流,有必要引入國內(nèi),應(yīng)用于通用自動(dòng)測試系統(tǒng)中。
這種解決方案不足的是測試管理軟件價(jià)格都比較昂貴并且成熟的產(chǎn)品均非我國自主研發(fā)。因此,希望有能力的科研單位早日研發(fā)出屬于我國自主知識(shí)產(chǎn)權(quán)的測試管理軟件,使我國國防事業(yè)邁上一個(gè)新的臺(tái)階!
[1]耿娟.DLL在LabWindows/CVI的虛擬儀器中的應(yīng)用[J].微計(jì)算機(jī)及信息,2006,22(22):115-116.
[2]郭雅萌.LabWindows/CVI與PCI數(shù)據(jù)采集卡通信技術(shù)研究[J].電子測量技術(shù),2007,30(5):78-79.
[3]郭雅萌.基于COM組件的通用故障診斷專家系統(tǒng)開發(fā)[J].微計(jì)算機(jī)信息,2006,22(2):190-191.
[4]劉曉剛.COM技術(shù)在畢業(yè)設(shè)計(jì)中的應(yīng)用[J].武漢科技學(xué)院學(xué)報(bào),2005,18(11):118-119.
[5]王學(xué)奇.開放性測試軟件體系結(jié)構(gòu)研究[J].微計(jì)算機(jī)信息,2005,21(10):145-146.
[6]謝立鵬.應(yīng)答器測試關(guān)鍵技術(shù)與測試管理系統(tǒng)的研究[D].北京:北京交通大學(xué),2008.
[7]宋廣東.基于COM組件的VB與MATLAB混合編程實(shí)現(xiàn)振動(dòng)信號(hào)處理[J].山東科學(xué),2010,23(1):33-34.
[8]王石記.新一代綜合自動(dòng)測試標(biāo)準(zhǔn)體系研究[J].計(jì)算機(jī)測量與控制,2011,19(4):33-34:749-775.