王笑怡,張 雷,張海濤
(1.中國電子科技集團公司第四十七研究所,沈陽110000;2.中國人民解放軍95979 部隊,山東新泰271207)
目前,在科研院校及企業的科研生產中大量使用程控儀器,但對儀器的使用普遍是各自獨立的工作,儀器間的協同工作完全依賴人工干預,沒有形成統一體,對儀器的應用開發仍處于初級階段[1]。在當前發展生產力、提升勞動效率的趨勢下,全球企業和科研單位掀起了自動化測試的浪潮[2],對程控儀器的進一步編程開發勢在必行。
在工控測試系統中使用到的程控儀器通常具有GPIB、LAN、USB、串口等硬件接口[3],支持用于儀器編程的標準I/O 函數庫,即VISA 庫[4]。計算機通過軟件編程調用VISA 庫函數與程控儀器進行通信,從而實現自動測量、數據存儲、匯總、分析等[5-6]。
VB 是一種應用廣泛的可視化編程語言,具有高效、快速、界面設計功能強大等特點[7],以其為開發平臺,可以快速地創建應用程序,縮短開發周期。在VB 開發環境下使用VISA 庫對程控儀器編程,通常使用自定義函數編程、ActiveX 控件和ActiveX EXE三種設計方法。
在此以一個應用實例為背景,闡述這三種設計方法的實現過程。本實例是在VB 中調用VISA 庫中的函數,對連接在USB 端口的KEYSIGHT 34470A數字多用表(以下簡稱程控儀器)進行編程控制,實現連接程控儀器、設置VDC 測量功能、讀取測量結果等功能。整體控制流程如圖1 所示,在“連接”按鈕的Click 事件中實現連接程控儀器并設置為VDC測量功能,在Timer1 控件的Timer 事件中讀取測量結果。

圖1 程序控制事件流程圖
自定義函數編程是將程控儀器的操作指令直接嵌入在程序函數中,通過調用函數實現對程控儀器的控制。主要實現方法是在自定義函數中調用VISA 庫函數,完成對程控儀器的控制,步驟如下:
1) 創建工程,添加窗體并按圖2 放置控件;

圖2 自定義函數編程方法窗體設計
2) 向工程中添加 VISA 模塊(VISA 函數庫);
3) 在窗體模塊中添加如下的自定義函數:


4) 在窗體模塊中“連接”按鈕的Click 事件中,調用Connect 函數連接程控儀器,調用SetFunction 函數設置程控儀器為VDC 測量功能;在定時器Timer事件中調用GetValue 函數讀取測量結果并顯示。
上述編程方法的實際工作界面與運行結果如圖3 所示。采用自定義函數編程方法,由于程控儀器的操作指令直接嵌入在程序函數中,代碼量較少,函數與客戶端處于同一個進程,使用同一個執行線程,訪問速度快捷[8]。但是,這種方法編寫的程序,不易移植或不能被其他程序調用,同時受VB 的進程/線程管理機制的限制,如果客戶端同時管理多個程控儀器時,處理不及時可能會出現線程阻塞現象,導致數據丟失。

圖3 基于自定義函數編程方法運行效果
利用VB,可以通過ActiveX 技術,把自有業務封裝后,再和一般的部件組合起來,編譯成.OCX 文件提供給其他應用程序使用。在提供對象時必須遵循ActiveX 的規范。其他應用程序使用 ActiveX 控件的方法,與使用標準內裝的控件完全一樣。在程序中加入ActiveX 控件后,它將成為開發和運行環境的一部分,并為應用程序提供新的功能。
通過創建自定義ActiveX 控件,將與程控儀器相關的業務(如調用VISA 庫函數實現對程控儀器的控制)封裝在控件內部,控件通過屬性、方法和事件實現對外接口。使用時將創建的ActiveX 控件加入到窗體中,在窗體模塊中通過設置屬性、調用方法和響應事件實現對程控儀器的控制。具體的實現方法如下:
1) 創建ActiveX 控件工程,按圖4 所示,控件界面窗體中放置Label 控件(用于簡單顯示);

圖4 控件界面窗體
2) 向工程中添加VISA 模塊;
3) 用“ActiveX 控件接口向導”為控件添加VISA Address 屬性、Connect 方法、SetFunction 方法、Get Value 方法和Complete 事件。在Connect 方法和Set Function 方法函數中添加自定義函數編程方法中給出的代碼,在GetValue 方法函數返回前,使用Raise Event 語句引發Complete 事件。
GetValue 方法函數修改后代碼如下:

4) 添加工程,在新工程中添加窗體,按圖5 放置ActiveX 控件(控件名為uctKS34470A1)及其他控件;

圖5 ActiveX 控件編程方法窗體設計
5) 在窗體模塊中“連接”按鈕的Click 事件中,設置ActiveX 控件VISAAddress 屬性,調用Connect方法連接程控儀器,調用SetFunction 方法設置程控儀器為VDC 測量功能;在定時器Timer 事件中調用Get Value 方法讀取測量結果,在Complete 事件中顯示。
基于此編程方法的運行效果如圖6 所示。采用ActiveX 控件方法,按照ActiveX 規則將可復用的軟件封裝在一個控件中,因此其他遵循ActiveX 規則的開發工具,像Visual Basic 和Microsoft Visual C++之類以及像Microsoft Office 之類的最終用戶產品均可以使用這些文件[8],這是該方法的便利之處。然而在設計ActiveX 控件時,需要對屬性值和控件初始狀態進行維護,因此需額外增加一定的程序代碼;同時ActiveX 控件仍然與客戶端使用同一進程和執行線程,同樣有線程阻塞的風險。

圖6 基于ActiveX 控件編程方法運行效果
ActiveX EXE 編程方法也是基于ActiveX 技術,只是將業務和部件編譯成.EXE 文件在后臺運行,為其他應用程序提供服務。它的具體實現方法為:
1) 創建ActiveX EXE 工程,工程描述為“KEYSI GHT 34470A Digit Multimeter Component”;
2) 向工程中添加VISA 模塊;
3) 用類生成器使用工具添加VISAAddress 屬性、Connect 方法、SetFunction 方法、GetValue 方法和Complete 事件。相應的代碼同ActiveX 控件編程方法中一致;
4) 編譯并運行;
5) 新建工程,添加窗體,在窗體中按圖7 放置控件;

圖7 ActiveX EXE 編程方法窗體設計
6) 在“引用”窗口將ActiveX EXE 部件引入工程中,如圖8 所示;

圖8 引用ActiveX EXE 部件
7) 在窗體模塊的聲明部分定義類變量:
Private WithEvents cKS34470A1 As clsKS34470A
并在窗體Load 事件中創建類:
Set cKS34470A1 = New clsKS34470A
8) 在窗體模塊中“連接”按鈕的Click 事件中,設置類的VISAAddress 屬性,調用Connect 方法連接程控儀器,調用SetFunction 方法設置儀器為VDC測量功能;在定時器Timer 事件中調用GetValue 方法讀取測量結果,在Complete 事件中顯示。
基于此編程方法的運行效果如圖9 所示。ActiveX EXE 編程方法具有與Active 控件編程相同的優點,除此外,ActiveX EXE 還可以在遠程計算機上運行,為多個應用程序提供服務。ActiveX EXE 同樣需要一定量的代碼維護類的創建和終止。另外,ActiveX EXE 使用自身的進程,與客戶端進程是分開的,不會出現阻塞現象,但ActiveX EXE 與客戶端是進程間通信,訪問速度沒有進程間通信快速。

圖9 基于ActiveX EXE 編程方法運行效果
通過以上分析,對三種編程方法進行匯總對比,其各自優缺點的最終對比情況歸納為表1。

表1 三種編程方法優缺點對比
三種編程方法均能實現控制要求,各有特點,設計時應根據需求適當選用。
實例中所述的三種設計方法皆是基于VB 的程控儀器編程的,對其各自的代碼量、可移植、線程阻塞和進程使用幾個方面進行了對比分析,其結論可為程序開發者選擇合適的設計方法提供參考依據。采用這些編程方法研制的多種自動化測試系統,實現了在計算機控制下協同工作的設計要求,自動化程度顯著提高,在實際應用中運行穩定,切實提高了企業生產效率。