王笑怡,張 雷,張海濤
(1.中國(guó)電子科技集團(tuán)公司第四十七研究所,沈陽(yáng)110000;2.中國(guó)人民解放軍95979 部隊(duì),山東新泰271207)
目前,在科研院校及企業(yè)的科研生產(chǎn)中大量使用程控儀器,但對(duì)儀器的使用普遍是各自獨(dú)立的工作,儀器間的協(xié)同工作完全依賴(lài)人工干預(yù),沒(méi)有形成統(tǒng)一體,對(duì)儀器的應(yīng)用開(kāi)發(fā)仍處于初級(jí)階段[1]。在當(dāng)前發(fā)展生產(chǎn)力、提升勞動(dòng)效率的趨勢(shì)下,全球企業(yè)和科研單位掀起了自動(dòng)化測(cè)試的浪潮[2],對(duì)程控儀器的進(jìn)一步編程開(kāi)發(fā)勢(shì)在必行。
在工控測(cè)試系統(tǒng)中使用到的程控儀器通常具有GPIB、LAN、USB、串口等硬件接口[3],支持用于儀器編程的標(biāo)準(zhǔn)I/O 函數(shù)庫(kù),即VISA 庫(kù)[4]。計(jì)算機(jī)通過(guò)軟件編程調(diào)用VISA 庫(kù)函數(shù)與程控儀器進(jìn)行通信,從而實(shí)現(xiàn)自動(dòng)測(cè)量、數(shù)據(jù)存儲(chǔ)、匯總、分析等[5-6]。
VB 是一種應(yīng)用廣泛的可視化編程語(yǔ)言,具有高效、快速、界面設(shè)計(jì)功能強(qiáng)大等特點(diǎn)[7],以其為開(kāi)發(fā)平臺(tái),可以快速地創(chuàng)建應(yīng)用程序,縮短開(kāi)發(fā)周期。在VB 開(kāi)發(fā)環(huán)境下使用VISA 庫(kù)對(duì)程控儀器編程,通常使用自定義函數(shù)編程、ActiveX 控件和ActiveX EXE三種設(shè)計(jì)方法。
在此以一個(gè)應(yīng)用實(shí)例為背景,闡述這三種設(shè)計(jì)方法的實(shí)現(xiàn)過(guò)程。本實(shí)例是在VB 中調(diào)用VISA 庫(kù)中的函數(shù),對(duì)連接在USB 端口的KEYSIGHT 34470A數(shù)字多用表(以下簡(jiǎn)稱(chēng)程控儀器)進(jìn)行編程控制,實(shí)現(xiàn)連接程控儀器、設(shè)置VDC 測(cè)量功能、讀取測(cè)量結(jié)果等功能。整體控制流程如圖1 所示,在“連接”按鈕的Click 事件中實(shí)現(xiàn)連接程控儀器并設(shè)置為VDC測(cè)量功能,在Timer1 控件的Timer 事件中讀取測(cè)量結(jié)果。
圖1 程序控制事件流程圖
自定義函數(shù)編程是將程控儀器的操作指令直接嵌入在程序函數(shù)中,通過(guò)調(diào)用函數(shù)實(shí)現(xiàn)對(duì)程控儀器的控制。主要實(shí)現(xiàn)方法是在自定義函數(shù)中調(diào)用VISA 庫(kù)函數(shù),完成對(duì)程控儀器的控制,步驟如下:
1) 創(chuàng)建工程,添加窗體并按圖2 放置控件;
圖2 自定義函數(shù)編程方法窗體設(shè)計(jì)
2) 向工程中添加 VISA 模塊(VISA 函數(shù)庫(kù));
3) 在窗體模塊中添加如下的自定義函數(shù):
4) 在窗體模塊中“連接”按鈕的Click 事件中,調(diào)用Connect 函數(shù)連接程控儀器,調(diào)用SetFunction 函數(shù)設(shè)置程控儀器為VDC 測(cè)量功能;在定時(shí)器Timer事件中調(diào)用GetValue 函數(shù)讀取測(cè)量結(jié)果并顯示。
上述編程方法的實(shí)際工作界面與運(yùn)行結(jié)果如圖3 所示。采用自定義函數(shù)編程方法,由于程控儀器的操作指令直接嵌入在程序函數(shù)中,代碼量較少,函數(shù)與客戶(hù)端處于同一個(gè)進(jìn)程,使用同一個(gè)執(zhí)行線(xiàn)程,訪(fǎng)問(wèn)速度快捷[8]。但是,這種方法編寫(xiě)的程序,不易移植或不能被其他程序調(diào)用,同時(shí)受VB 的進(jìn)程/線(xiàn)程管理機(jī)制的限制,如果客戶(hù)端同時(shí)管理多個(gè)程控儀器時(shí),處理不及時(shí)可能會(huì)出現(xiàn)線(xiàn)程阻塞現(xiàn)象,導(dǎo)致數(shù)據(jù)丟失。
圖3 基于自定義函數(shù)編程方法運(yùn)行效果
利用VB,可以通過(guò)ActiveX 技術(shù),把自有業(yè)務(wù)封裝后,再和一般的部件組合起來(lái),編譯成.OCX 文件提供給其他應(yīng)用程序使用。在提供對(duì)象時(shí)必須遵循ActiveX 的規(guī)范。其他應(yīng)用程序使用 ActiveX 控件的方法,與使用標(biāo)準(zhǔn)內(nèi)裝的控件完全一樣。在程序中加入ActiveX 控件后,它將成為開(kāi)發(fā)和運(yùn)行環(huán)境的一部分,并為應(yīng)用程序提供新的功能。
通過(guò)創(chuàng)建自定義ActiveX 控件,將與程控儀器相關(guān)的業(yè)務(wù)(如調(diào)用VISA 庫(kù)函數(shù)實(shí)現(xiàn)對(duì)程控儀器的控制)封裝在控件內(nèi)部,控件通過(guò)屬性、方法和事件實(shí)現(xiàn)對(duì)外接口。使用時(shí)將創(chuàng)建的ActiveX 控件加入到窗體中,在窗體模塊中通過(guò)設(shè)置屬性、調(diào)用方法和響應(yīng)事件實(shí)現(xiàn)對(duì)程控儀器的控制。具體的實(shí)現(xiàn)方法如下:
1) 創(chuàng)建ActiveX 控件工程,按圖4 所示,控件界面窗體中放置Label 控件(用于簡(jiǎn)單顯示);
圖4 控件界面窗體
2) 向工程中添加VISA 模塊;
3) 用“ActiveX 控件接口向?qū)А睘榭丶砑覸ISA Address 屬性、Connect 方法、SetFunction 方法、Get Value 方法和Complete 事件。在Connect 方法和Set Function 方法函數(shù)中添加自定義函數(shù)編程方法中給出的代碼,在GetValue 方法函數(shù)返回前,使用Raise Event 語(yǔ)句引發(fā)Complete 事件。
GetValue 方法函數(shù)修改后代碼如下:
4) 添加工程,在新工程中添加窗體,按圖5 放置ActiveX 控件(控件名為uctKS34470A1)及其他控件;
圖5 ActiveX 控件編程方法窗體設(shè)計(jì)
5) 在窗體模塊中“連接”按鈕的Click 事件中,設(shè)置ActiveX 控件VISAAddress 屬性,調(diào)用Connect方法連接程控儀器,調(diào)用SetFunction 方法設(shè)置程控儀器為VDC 測(cè)量功能;在定時(shí)器Timer 事件中調(diào)用Get Value 方法讀取測(cè)量結(jié)果,在Complete 事件中顯示。
基于此編程方法的運(yùn)行效果如圖6 所示。采用ActiveX 控件方法,按照ActiveX 規(guī)則將可復(fù)用的軟件封裝在一個(gè)控件中,因此其他遵循ActiveX 規(guī)則的開(kāi)發(fā)工具,像Visual Basic 和Microsoft Visual C++之類(lèi)以及像Microsoft Office 之類(lèi)的最終用戶(hù)產(chǎn)品均可以使用這些文件[8],這是該方法的便利之處。然而在設(shè)計(jì)ActiveX 控件時(shí),需要對(duì)屬性值和控件初始狀態(tài)進(jìn)行維護(hù),因此需額外增加一定的程序代碼;同時(shí)ActiveX 控件仍然與客戶(hù)端使用同一進(jìn)程和執(zhí)行線(xiàn)程,同樣有線(xiàn)程阻塞的風(fēng)險(xiǎn)。
圖6 基于ActiveX 控件編程方法運(yùn)行效果
ActiveX EXE 編程方法也是基于ActiveX 技術(shù),只是將業(yè)務(wù)和部件編譯成.EXE 文件在后臺(tái)運(yùn)行,為其他應(yīng)用程序提供服務(wù)。它的具體實(shí)現(xiàn)方法為:
1) 創(chuàng)建ActiveX EXE 工程,工程描述為“KEYSI GHT 34470A Digit Multimeter Component”;
2) 向工程中添加VISA 模塊;
3) 用類(lèi)生成器使用工具添加VISAAddress 屬性、Connect 方法、SetFunction 方法、GetValue 方法和Complete 事件。相應(yīng)的代碼同ActiveX 控件編程方法中一致;
4) 編譯并運(yùn)行;
5) 新建工程,添加窗體,在窗體中按圖7 放置控件;
圖7 ActiveX EXE 編程方法窗體設(shè)計(jì)
6) 在“引用”窗口將ActiveX EXE 部件引入工程中,如圖8 所示;
圖8 引用ActiveX EXE 部件
7) 在窗體模塊的聲明部分定義類(lèi)變量:
Private WithEvents cKS34470A1 As clsKS34470A
并在窗體Load 事件中創(chuàng)建類(lèi):
Set cKS34470A1 = New clsKS34470A
8) 在窗體模塊中“連接”按鈕的Click 事件中,設(shè)置類(lèi)的VISAAddress 屬性,調(diào)用Connect 方法連接程控儀器,調(diào)用SetFunction 方法設(shè)置儀器為VDC測(cè)量功能;在定時(shí)器Timer 事件中調(diào)用GetValue 方法讀取測(cè)量結(jié)果,在Complete 事件中顯示。
基于此編程方法的運(yùn)行效果如圖9 所示。ActiveX EXE 編程方法具有與Active 控件編程相同的優(yōu)點(diǎn),除此外,ActiveX EXE 還可以在遠(yuǎn)程計(jì)算機(jī)上運(yùn)行,為多個(gè)應(yīng)用程序提供服務(wù)。ActiveX EXE 同樣需要一定量的代碼維護(hù)類(lèi)的創(chuàng)建和終止。另外,ActiveX EXE 使用自身的進(jìn)程,與客戶(hù)端進(jìn)程是分開(kāi)的,不會(huì)出現(xiàn)阻塞現(xiàn)象,但ActiveX EXE 與客戶(hù)端是進(jìn)程間通信,訪(fǎng)問(wèn)速度沒(méi)有進(jìn)程間通信快速。
圖9 基于ActiveX EXE 編程方法運(yùn)行效果
通過(guò)以上分析,對(duì)三種編程方法進(jìn)行匯總對(duì)比,其各自?xún)?yōu)缺點(diǎn)的最終對(duì)比情況歸納為表1。
表1 三種編程方法優(yōu)缺點(diǎn)對(duì)比
三種編程方法均能實(shí)現(xiàn)控制要求,各有特點(diǎn),設(shè)計(jì)時(shí)應(yīng)根據(jù)需求適當(dāng)選用。
實(shí)例中所述的三種設(shè)計(jì)方法皆是基于VB 的程控儀器編程的,對(duì)其各自的代碼量、可移植、線(xiàn)程阻塞和進(jìn)程使用幾個(gè)方面進(jìn)行了對(duì)比分析,其結(jié)論可為程序開(kāi)發(fā)者選擇合適的設(shè)計(jì)方法提供參考依據(jù)。采用這些編程方法研制的多種自動(dòng)化測(cè)試系統(tǒng),實(shí)現(xiàn)了在計(jì)算機(jī)控制下協(xié)同工作的設(shè)計(jì)要求,自動(dòng)化程度顯著提高,在實(shí)際應(yīng)用中運(yùn)行穩(wěn)定,切實(shí)提高了企業(yè)生產(chǎn)效率。