楊 玫,孔 波,李 祁
LabWindows/CVI是 National Instruments公司開發的Measurement Studio軟件組中的一員。它是32位的面向計算機測控領域的虛擬儀器軟件開發平臺,可以在多操作系統下運行。LabWindows/CVI是以ANSI C為核心的交互式虛擬儀器開發環境,它將功能強大的 C語言與測控技術有機結合,具有靈活的交互式編程方法、豐富的控件和庫函數,為開發人員建立檢測系統、自動測量環境、數據采集系統和過程監控系統等提供了一個理想的軟件開發環境,是實現虛擬儀器及網絡化儀器的快速途徑。
但是,LabWindows/CVI在制作通用軟件功能,例如應用程序主界面等方面,跟 Visual Studio等集成開發環境相比,稍顯不盡如人意。因此測試系統的軟件開發通常采用高級語言結合專用測控軟件來開發。這里采用LabWindows/CVI開發具體的測控功能,而Visual Studio集成開發環境支持多種程序設計語言,如Visual Basic,Visual C++和Visual C#等,其中的C#在保持了C++強大功能的同時,添加了大量的高效代碼,是完全的面向對象編程語言,能夠提供更高的可靠性和安全性,這里選擇C#。
利用組件技術可以實現LabWindows/CVI與Visual C#的混合編程。一方面,利用 LabWindows/CVI中提供的ActiveX Server工具生成COM組件,在Visual Studio 2010中添加COM引用,Visual Studio 2010便可以訪問該COM組件。另一方面,在Visual Studio 2010中創建類庫項目生成動態鏈接庫DLL,LabWindows/CVI利用.NET Controller工具可以生成fp文件。
下面通過兩個實例說明LabWindows/CVI與Visual C#的混合編程過程。實例1利用LabWindows/CVI制作高斯噪聲發生器,然后在Visual Studio 2010中調用。實例2在Visual Studio 2010中生成訪問 Access的類庫,然后在LabWindows/CVI中調用。
LabWindows/CVI提供若干制作虛擬儀器的控件,例如Thermometer控件等,能夠輕松簡潔的制作出復雜的儀器界面,但是在制作通用程序界面時不夠美觀,可以利用LabWindows/CVI將虛擬儀器制作成COM組件,然后在其他開發環境例如Visual C#中調用。
選擇 Tools>>Create ActiveX Server…,啟動 Create ActiveX Server向導,開始配置工程,其中工程名為GaussAXS,工程類型為EXE,其他設置默認。工程配置結束生成 4個目標文件 GaussAXS.axs、GaussAXS_axs.c、GaussAXS_axs.h、GaussAXS_axs.idl,并包含進工程。其中GaussAXS_axs.c、GaussAXS_axs.h和GaussAXS_axs.idl3個文件由 CVI自動生成,不能添加、刪除和修改內容,目前均為空。
選擇 Tools→Edit ActiveX Server…,或雙擊 Gauss AXS.axs彈出Edit ActiveX Server對話框,設置接口和對象。本例比較簡單,設置一個接口 IGauss,包含一個方法MethodG;為 IGauss接口設置一個對象GaussAXSObj,本例未添加屬性。點擊Edit ActiveX Server對話框中的Save and Generate按鈕,自動生成代碼。
新建 GaussAXS.uir,制作高斯噪聲發生器的界面。新建GaussAXS.c文件,實現產生高斯噪聲數據等相關功能,包括實現WinMain主函數和回調函數等,并實現前述在接口IGauss中聲明的成員函數GaussAXSObjIGaussMethodG。其中 WinMain函數的模板和 GaussAXSObjIGaussMethodG的原型都在GaussAXS_axs.h中。
最后選擇Build>>Create Release Executable,在目錄下生成GaussAXS.exe,這就是Visual C#可以調用的。
新建一個Windows窗口應用程序,添加一個菜單項目“高斯噪聲發生器”,將CVI中生成的GaussAXS.exe拷貝過來,添加引用。這時對象在瀏覽器中會看到程序集Interop.GaussAXS下有命名空間GaussAXS,該命名空間包含接口GaussAXSObj、類GaussAXSObjClass和接口IGauss。
在文件中添加引用語句:using GaussAXS;
利用GaussAXSObj接口可以訪問:GaussAXSObj obj =new GaussAXSObj();
運行結果,如圖1所示:

圖1 Visual C#調用LabWindows/CVI生成的COM組件
LabWindows/CVI的標準函數庫沒有提供訪問數據庫的函數,也沒有在工具包中包含數據庫的驅動器。如果要在LabWindows/CVI開發環境下訪問數據庫,則需要安裝LabWindows SQL工具包,它是用于數據庫訪問的附加工具包,內部集成了一系列的高級功能模塊,封裝了大多數的數據庫操作。用戶可以使用 LabWindows SQL工具包在LabWindows/CVI中支持ODBC的本地或遠程數據庫,例如Microsoft Access,Microsoft SQL Server和Oracle等。
這里利用LabWindows/CVI提供的Create .NET Controller工具,結合.NET技術來實現對數據庫的訪問。首先在Visual Studio中設計開發一個訪問數據庫的動態鏈接庫,再在LabWindows/CVI中使用動態鏈接庫文件生成fp文件。這里以Access數據庫為例,數據庫文件為test.mdb,其中包含數據表tuser,其結構,如表1所示:

表1 數據表tuser
在 Microsoft Visual Studio 2010中創建類庫項目ClassLibDB,將系統自動生成的 Class1.cs文件重命名為AccessDB.cs,其中包含訪問 Access數據庫的類 AccessDB的定義,類AccessDB包含成員函數GetRecord和Close,調試并最終生成ClassLibDB.dll文件。
在LabWindows/CVI 8.5中創建User Interface Application類型的工程 DataBaseApp,在系統自動生成的DataBase.uir中制作登陸界面。
將前述生成的ClassLibDB.dll文件拷貝到DataBaseApp工程下,創建test.mdb數據庫,設置密碼為123,創建數據表tuser并插入至少1條記錄,這里插入記錄:1,admin,123456。
選擇 Tool>>Create .NET Controller,在彈出的 Create LabWindows/CVI .NET Controller對話框中,選擇 Specify Assembly by Path,設置Assembly Path為ClassLibDB.dll,設置Target Instrument為AccessDB.fp,選中Add Instrument to Project,點擊 OK 后,系統自動生成 AccessDB.fp、AccessDB.h和 AccessDB.c,并將 AccessDB.fp包含進DataBaseApp工程。
為登錄按鈕編寫回調函數,重要代碼如下:

運行結果,如圖2所示:

圖2 LabWindows/CVI調用Visual C#生成的DLL文件
這里為了方便查看鍵盤輸入情況,密碼框采用的是文本框,可以通過調用函數 PasswordCtrl_ConvertFromString將文本框轉換為密碼框。
本文介紹了LabWindows/CVI和Visual C#混合編程的方法,根據兩種開發工具的優缺點,利用Visual C#廣泛的適用性結合 LabWindows/CVI對測控數據強大的分析處理能力和它簡單直觀的儀器面板設計。實踐證明這種方法是完全可行的。
[1]孫曉云等.基于 LabWindows/CVI的虛擬儀器設計與應用(第2版)[M].北京:電子工業出版社, 2010.
[2]李寧,雷志軍,陳偉.Visual C#+Oracle數據庫系統開發全程導引與實戰精研[M].北京:電子工業出版社,2008:1-25.
[3]張鵬.基于LabWindows/CVI的MDB數據庫設計,[J]計算機與現代化,2009(2): 89-90.
[4]楊玫,劉瑜,張燕紅.ActiveX技術在LabWindows/CVI中的應用,[J]電腦編程技巧與維護,2012(12)