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