一、VISA儀器編程的簡介
基於NI-VISA/VISA32(Virtual Instrument Software Architecture)的儀器編程,支持RS232、USB、GPIB及LAN通信的SCPI儀器編程。
- RS232
支持常見的RS232串口編程,一般地址爲“ASRL1::INSTR”。
- USB
支持常見的USB接口編程,一般地址類似爲“USB0::0x2A8D::0x0101::MY57501899::INSTR”。
- GPIB
支持常見的USB接口編程
一般地址類似爲“GPIB0::0x2A8D::0x0101::MY57501899::INSTR” 。
- LAN
支持常見的USB接口編程,一般地址類似爲“TCPIP0::34465A-01899::inst0::INSTR”或“TCPIP0::192.168.0.26::INSTR”
二、相關概念介紹
- SCPI指令
Standard Commands for Programmable Instruments的縮寫,即程控儀器(可編程儀器)標準命令集。SCPI 是一種建立在現有標準IEEE488.1 和 IEEE 488.2 基礎上,並遵循了IEEE754 標準中浮點運算規則、ISO646 信息交換7 位編碼符號(相當於ASCll編程)等多種標準的標準化儀器編程語言。它採用一套樹狀分層結構的命令集,提出了一個具有普遍性的通用儀器模型,採用面向信號的測量;它的助記符產生規則簡單、明確,且易於記憶。
- VISA編程接口
NI-VISA(Virtual Instrument Software Architec-ture,以下簡稱爲“VISA”)是美國國家儀器NI(NationalInstrument)公司開發的一種用來與各種儀器總線進行通信的高級應用編程接口。VISA總線I/O軟件是一個綜合軟件包,不受平臺、總線和環境的限制,可用來對USB、GPIB、串口、VXI、PXI和以太網系統進行配置、編程和調試。VISA是虛擬儀器系統I/ O接口軟件。基於自底向上結構模型的VISA創造了一個統一形式的I/ O控制函數集。一方面,對初學者或是簡單任務的設計者來說,VISA提供了簡單易用的控制函數集,在應用形式上相當簡單;另一方面,對複雜系統的組建者來說,VISA提供了非常強大的儀器控制功能與資源管理。
- SCPI與VISA區別
SCPI是程控儀器標準命令,它是對器件的消息進行了標準化,也就是,只要做儀器器件,你就得用SCPI,相當於彙編語言命令(不一定恰當),VISA提供一些可以直接操作硬件的函數,它是以DLL或Lib形式提供,在編程時必須包括visa.h和visa32.h,你直接使用的是VISA庫中的函數,SCPI命令又是通過VISA函數Viprintf函數發送出去的,書上講的太抽象了,不理解。
三、VISA儀器編程驅動模型
四、VISA編程舉例
如何在VS2010中使用visa庫
1、首先在計算機上安裝NI提供的驅動庫,然後在計算機上找到相應的庫文件和頭文件。
文件目錄:C:\Program Files (x86)\IVI Foundation\VISA\WinNT
其中lib文件在: lib\msc\visa32.lib 和ivi.lib
頭文件在: include
2、添加庫到工程
直接將庫文件和對應的頭文件複製到了工程目錄下,然後在工程中添加了對lib庫的引用,vs2010中引用visa庫操作如下:
A、 菜單 項目—> 屬性—>配置屬性–>鏈接器—->輸入—附加依賴項, 加入庫名,如: visa32.lib;
或是在cpp源文件中用代碼#pragma comment(lib,”visa32.lib”)代替. 此時再編譯會提示錯誤:fatal error LNK1104: 無法打開文件“my_API.lib” , 原因應該是編譯器不知道去哪裏找我們的這個庫,下面就來解決。
B、 然後給項目添加庫文件路徑,添加附加庫路徑:
“項目—>屬性—>配置屬性—>連接器–>常規–>附加庫目錄” 點右邊的向下箭頭,這裏添加 我們的庫所在的路徑. F:\my_program\meiyong\PPPP_Decode_ETIM;或 ../../PPPP_Decode_ETIM, 而且經試驗測試是以項目文件.vcxproj 所在目錄爲當前目錄,當前以當前目錄這個方式設置更好了.這樣就好了。
3、在工程中使用visa庫
下面的代碼中是在VS2010中通過調用visa庫發送*IDN?來查詢儀器的ID
#include "visa/include/visa.h"
#include "visa/include/ivi.h"
#pragma comment(lib,"visa32.lib")
#pragma comment(lib,"ivi.lib")
/*----------------------------------------------------------------------------*/
/* 宏定義聲明 */
/*----------------------------------------------------------------------------*/
#define MAX_SCPI_LENGTH 255 // 最大的SCPI命令
#define DEFAULT_TIMEOUT 5000 // 超時:5000ms
int main(void)
{
ViStatus nReturnStatus = 0; // 保存返回數值
ViSession rmSession = 0,pnInstrHandle;
ViUInt32 retCnt = 0;
ViByte wrtBuf[MAX_SCPI_LENGTH]; // 寫緩衝區
ViByte rdBuf[MAX_SCPI_LENGTH]; // 讀緩衝區
int Return_Count;
nReturnStatus = viOpenDefaultRM (&rmSession);
nReturnStatus = viOpen (rmSession, "TCPIP0::172.141.114.6::5001::SOCKET", VI_NULL, VI_NULL, &pnInstrHandle);
/*- Configure VISA Formatted I/O ----------------------------------------*/
nReturnStatus = viSetAttribute (pnInstrHandle, VI_ATTR_TMO_VALUE, DEFAULT_TIMEOUT); // 設置超時
nReturnStatus = viSetAttribute (pnInstrHandle, VI_ATTR_SUPPRESS_END_EN, VI_FALSE); // 不發送終止符
nReturnStatus = viSetAttribute (pnInstrHandle, VI_ATTR_SEND_END_EN, VI_FALSE); // 不接收終止符
nReturnStatus = viQueryf (pnInstrHandle, "*IDN?\n", "%s", rdBuf);
viClose (pnInstrHandle);
viClose (rmSession);
return 0;
}
五、VISA編程接口的測試,以串口RS232舉例,其他接口類似。
1、硬件連接 將一臺PC模擬成RS232標準設備,另一臺PC使用VISA庫封裝進行通信訪問
生成的軟件如下(源碼上傳的github和SVN),測試界面
RS232標準設備接收到的指令如下:
參考鏈接
https://en.wikipedia.org/wiki/Virtual_instrument_software_architecture