Step1:配置VISA协议。
VISA协议是Agilent IO Libraries的一部分, 主要包含一个虚拟仪器软件架构VISA (一个比较通用的工业仪器软件架构) 和标准控制库SICL.我理解前者相当一个底层架构,后者相当于一个指令集.先配置好VISA,然后通过SICL指令集发命令。
直接上例子,简单明了。agilent示波器可以直接用VISA,所以只要在C++项目里进行配置。
首先在C++里配置VISA的库,这里会比较麻烦,需要去网站找下资源和说明。先在库函数里加上VISA的路径如下图,还要在链接器里的附加依赖项加上visa64.lib。
值得一提的是,在配置库函数时,发现库里还包括了NI的库,说明VISA协议也适用于NI仪器。
然后,在c++文件里include "visa.h" 文件,这样就可以使用VISA库了。库里面有很多VISA的数据类型和函数,大多以vi开头,比如ViSession,vistate, viPrintf, viScanf。后两者是最重要的函数,用来向示波器读写命令。比如viPrintf(vi, message); vi是程序里连接示波器的句柄的地址,message是需要发送给示波器的SCIP指令集里的字符串。
之后,在示波器的帮助文件里找到一个地址,名为"USB0::0x0957::0x900B::MY52090114::0::INSTR"。将其宏定义在C++里,
#define VISA_ADDRESS "USB0::0x0957::0x900B::MY52090114::0::INSTR"
用来识别机器。连接方式有好几种,我们选择的是usb端口,所以需要用这个address,其他还有用IP地址等。
Step2: 写代码
在agilent的programme reference帮助文件里可以查询所有的命令集,用来做各种远程操作,我是直接把示波器里的help拷贝出来啦。
我的主要方法是参考aglient的C例程,直接代码复用,非常方便。比如查询仪器是否error的函数代码如下,其中有些QT界面的代码请忽略:
void VISA_Control::check_instrument_errors()
{
char str_err_val[255] = { 0 };
char str_out[800] = "";
err = viQueryf(vi, ":SYSTem:ERRor? STRing\n", "%t", str_err_val);
if (err != VI_SUCCESS) QMessageBox::warning(pParent, "QueryStringFail", "check_instrument_errors");
while (strncmp(str_err_val, "0,", 2) != 0)
{
strcat(str_out, ", ");
strcat(str_out, str_err_val);
err = viQueryf(vi, ":SYSTem:ERRor? STRing\n", "%t", str_err_val);
if (err != VI_SUCCESS) QMessageBox::warning(pParent, "QueryStringFail", "check_instrument_errors");
}
if (strcmp(str_out, "") != 0)
{
err = viFlush(vi, VI_READ_BUF);
if (err != VI_SUCCESS) QMessageBox::warning(pParent, "QueryStringFail", "check_instrument_errors");
err = viFlush(vi, VI_WRITE_BUF);
if (err != VI_SUCCESS) QMessageBox::warning(pParent, "QueryStringFail", "check_instrument_errors");
}
}
利用visa库,我们写了一个VISA_Control.cpp的自用库函数,将功能进一步集成,用来在以后的程序中调用。
Step3: 有些BUG
用C++里的visa函数连接示波器后,示波器的面板按键经常就无法使用。但有时又可以,挺麻烦的。。。因为有些东西的调节程控并不方便,比如信号窗格,时间窗格等。
help例程里操作的存储的指令(writeString 貌似是一些其他平台的语法,只看引号里的内容即可),如
myScope.WriteString ":DISK:CDIRECTORY ""C:\Document and Settings\All Users\Shared Documents\Infiniium\Data"""(设置存储路径),
貌似无效。