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