新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于HP-VISA庫(kù)的VXI總線(xiàn)測(cè)試應(yīng)用編程

基于HP-VISA庫(kù)的VXI總線(xiàn)測(cè)試應(yīng)用編程

作者: 時(shí)間:2013-03-30 來(lái)源:網(wǎng)絡(luò) 收藏

  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)的屬性
  包括與、GPIB、ASRL、GPIB-等接口類(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ì)設(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é)中分別討論了基于的VXI應(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)論


相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉