基于HP-VISA庫(kù)的VXI總線(xiàn)測(cè)試應(yīng)用編程
5.屬性
屬性(Attribute)是與會(huì)話(huà)或資源相關(guān)的,可以通過(guò)查詢(xún)或設(shè)備屬性的值來(lái)獲取或改變會(huì)話(huà)、資源的狀態(tài)(某些屬性是只讀的,另有一些屬性則是可讀寫(xiě)的)。屬性可分為以下幾類(lèi):
?、儋Y源屬性
包括與資源的制造商及VISA庫(kù)版本有關(guān)的信息,以及資源管理會(huì)話(huà)的狀態(tài)。
②一般儀器屬性
與會(huì)話(huà)相關(guān)的,主要用于確定諸如超時(shí)設(shè)置、緩沖區(qū)是否清除、接口類(lèi)型等信息。
?、厶囟ń涌陬?lèi)型相關(guān)的屬性
包括與VXI、GPIB、ASRL、GPIB-VXI等接口類(lèi)型相關(guān)儀器的狀態(tài)信息。
?、苁录傩?
這是一些只讀的屬性,可以查詢(xún)?nèi)绠?dāng)前允許的事件、觸發(fā)線(xiàn)設(shè)置等信息。
6.事件及句柄
事件指需要應(yīng)用程序進(jìn)行處理的一些情況,一般有三類(lèi):服務(wù)請(qǐng)求(SRQs)、中斷及硬件觸發(fā)器(Trigger)。事件只有在被設(shè)置為允許狀態(tài)后才能被接收和處理。
這可以通過(guò)兩種方式完成:
①首先裝載一個(gè)事件句柄(ViInstallHandler函數(shù)),設(shè)置事件為允許狀態(tài)(ViEnableEvent)。這樣,當(dāng)指定的事件發(fā)生后,就可以轉(zhuǎn)到事件句柄回調(diào)函數(shù)中進(jìn)行處理(通常是提供一些提示信息)。
?、谟肰iEnableEvent函數(shù)設(shè)置事件為允許,然后在程序中適當(dāng)?shù)牡胤秸{(diào)用ViWaitOnEvent函數(shù)以等待事件的發(fā)生,這將暫停程序的執(zhí)行過(guò)程直到事件發(fā)生并被處理或超時(shí)。(這兩種方法在同一個(gè)會(huì)話(huà)中也不能并用)。
另外,在事件響應(yīng)完之后,設(shè)置為允許的事件應(yīng)在適當(dāng)?shù)牡胤街匦抡{(diào)為禁止,并卸載事件句柄(ViUNInstallHandler函數(shù)和ViDisableEvent函數(shù))。
7.出錯(cuò)處理
在程序中考慮對(duì)出錯(cuò)的處理是一種好的編程風(fēng)格。VISA庫(kù)對(duì)此也提供了支持。一般可以在每一個(gè)VISA庫(kù)函數(shù)的調(diào)用后通過(guò)檢查返回值(與VI-Success常量比較)來(lái)判別是否有錯(cuò)誤發(fā)生。同樣,這里也需要定義相應(yīng)的錯(cuò)誤句柄回調(diào)函數(shù),完成對(duì)錯(cuò)誤的處理(如顯示提示信息、關(guān)閉會(huì)話(huà)、退出應(yīng)用等)。
8.鎖機(jī)制
在VISA庫(kù)編程中,可以同時(shí)對(duì)同一個(gè)設(shè)備保持多個(gè)會(huì)話(huà),同樣,多個(gè)應(yīng)用也可以通過(guò)不同的會(huì)話(huà)對(duì)同一個(gè)設(shè)備或資源訪問(wèn)。在某些情況下,這將帶來(lái)問(wèn)題(與數(shù)據(jù)庫(kù)中的并發(fā)操作以及完整性概念相似)。這樣,可能某一應(yīng)用在訪問(wèn)資源時(shí)就希望能限制其它應(yīng)用對(duì)這一資源的訪問(wèn)。這時(shí),就需要用到加/解鎖函數(shù)調(diào)用。
ViLock函數(shù):對(duì)資源加鎖,可以有兩種類(lèi)型的鎖:排他鎖與共享鎖。
ViUnLock函數(shù):解鎖。
9.對(duì)VXI設(shè)備編程
VISA庫(kù)中對(duì)VXI儀器模塊的應(yīng)用開(kāi)發(fā)提供了豐富的函數(shù),并可以支持VXI、GPIB及GPIB-VXI三種接口類(lèi)型。
VXI儀器模塊可分類(lèi)為兩種:消息基設(shè)備和寄存器基設(shè)備。前者擁有自己的處理器,因而可以直接解釋并執(zhí)行SCPI命令,在VISA庫(kù)函數(shù)調(diào)用中,這只需把SCPI命令字串作為相應(yīng)的調(diào)用參數(shù)即可。同時(shí),VISA庫(kù)中還提供了直接對(duì)其寄存器操作的函數(shù)。后者則沒(méi)有自己的處理器,因而不能解釋SCPI命令。
VISA庫(kù)中為VXI儀器模塊提供了兩級(jí)內(nèi)存操作函數(shù)接口:
?、俑呒?jí)內(nèi)存函數(shù)
它屏蔽了低層的內(nèi)存映射及寄存器訪問(wèn)機(jī)制,向用戶(hù)提供了簡(jiǎn)單易用的函數(shù)調(diào)用接口,從而可以方便地訪問(wèn)VXI接口上指定的內(nèi)存空間。
ViInxx函數(shù):讀入指定內(nèi)存空間的值
ViOutxx函數(shù):向指定內(nèi)存空間輸出值
ViMoveInxx函數(shù):對(duì)指定內(nèi)存處成塊數(shù)據(jù)的讀入
ViMoveOutxx函數(shù):向內(nèi)存輸出成塊數(shù)據(jù)
xx分別對(duì)應(yīng)8、16或32位數(shù)據(jù),相應(yīng)為8、16、32。
②低級(jí)內(nèi)存函數(shù)
高級(jí)內(nèi)存函數(shù)簡(jiǎn)單易用,但其缺陷在于速度上的損失(內(nèi)部的地址映射及寄存器訪問(wèn)帶來(lái)的影響),因而在某些對(duì)速度有較高要求的場(chǎng)合,還需使用VISA庫(kù)中的低層內(nèi)存函數(shù)。
ViMapAddress函數(shù):完成內(nèi)存空間的映射
ViPeekxx函數(shù):讀入寄存器內(nèi)容
ViPokexx函數(shù):向寄存器中寫(xiě)入
ViUnMapAddress函數(shù):釋放內(nèi)存映射
xx同樣代表8、16或32位后綴。
10.應(yīng)用示例
前面幾小節(jié)中分別討論了基于HP-VISA庫(kù)的VXI總線(xiàn)測(cè)試應(yīng)用開(kāi)發(fā)中的一些細(xì)節(jié),下面,通過(guò)給出一個(gè)具體的程序?qū)嵗M(jìn)一步說(shuō)明:
//示例程序example.c源代碼清單
#include<visa.h> //包含VISA庫(kù)頭文件
#include<stdio.h>
voidmainO
{
ViSessiondefaultRm,Vi; //定義保存會(huì)話(huà)句柄的變量
doubleres;
doublelist【2】=(1,0.001);
ViOpenDefaultRM(defaultRM);//打開(kāi)缺省資源管理器會(huì)話(huà)
//打開(kāi)儀器會(huì)話(huà)(接口類(lèi)型為VXIO,邏輯地址24)
ViOpen(defaultRM,“VXIO∶∶22∶∶INSTR”,VI-NULL,VI-NULL,Vi);
//設(shè)置對(duì)會(huì)話(huà)的獨(dú)占鎖
ViLock(Vi,VI-EXCLUSIVE-LOCK,2000,VI-NULL,VI-NULL);
/*下面一段代碼為格式化I/O函數(shù)演示*/
ViPrintf(Vi,“*RST\n”);//利用格式化I/O函數(shù),初始化儀器
ViPrintf(Vi,“CALC∶DBM∶REF50\n”);//利用格式化I/O函數(shù)向儀器發(fā)送命令,
VIPrintf(Vi,“MEAS∶VOLT∶AC?%,2f\n”,list);//本例為進(jìn)行直流電壓測(cè)量
ViScanf(Vi,“%lf”,res);//利用格式化I/O函數(shù)讀出測(cè)量結(jié)果
printf(“MeasurementResults:%lf\n”,res);
c++相關(guān)文章:c++教程
評(píng)論