C++上位机与安捷伦agilent示波器的通讯

Step1:配置VISA协议。

VISA协议是Agilent IO Libraries的一部分, 主要包含一个虚拟仪器软件架构VISA (一个比较通用的工业仪器软件架构) 和标准控制库SICL.我理解前者相当一个底层架构,后者相当于一个指令集.先配置好VISA,然后通过SICL指令集发命令。

直接上例子,简单明了。agilent示波器可以直接用VISA,所以只要在C++项目里进行配置。

首先在C++里配置VISA的库,这里会比较麻烦,需要去网站找下资源和说明。先在库函数里加上VISA的路径如下图,还要在链接器里的附加依赖项加上visa64.lib。

加库函数

在link的附加依赖项里添加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"""(设置存储路径),

貌似无效。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。