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