Qt 使用Visa库与数字仪器仪表TCP/IP通信(SCPI指令自动化测试)

标准数字仪器仪表可通过 GPIB, RS232, USB, LAN接口等与上位机数据通信和控制。如示波器、数字万用表、频率计、台式电源等。通过SCPI协议(字符串形式)与设备通信,串口,USB等接口可以直接用字符串通信,但是LAN通信不同于一般TCP/UDP用ip和端口通信,需要用Visa协议栈通信。Qt开发时只需要把visa动态库和头文件导入即可。

以普源的数字万用表DM3068为例,使用LAN口通信:

根据官方编程文档,通信协议如下:查询当前测量直流电压值发送字符串“:MEASure:VOLTage:DC?

1.获取visa.lib,可以安装 NI-MAX,毕竟调试也需要, 安装 NI-​VISA

2.安装完成后可以去安装目录下拷贝lib库到Qt目录下,需要的文件有:

2.1 C:\Program Files (x86)\IVI Foundation\VISA\WinNT\Include\visa.hvisatype.h

 2.2 C:\Program Files (x86)\IVI Foundation\VISA\WinNT\Lib_x64\msc\visa64.lib

 2.3 拷贝到Qt目录下

 2.4 Qt添加动态库和visa.h头文件

3.现在可以使用了,但是通信需要知道仪器的Ip地址字符串,可以使用安装的NI-MAX查看。打开MAX,连接网线,添加设备,添加仪器IP地址,

完成后会显示仪器名称, 

 把这个复制到Qt 测试程序: 发送测量当前输入的8V电压值.

static ViSession defaultRM;
static ViSession instr;
static ViUInt32 retCount;
static ViUInt32 writeCount;
static ViStatus status;
static unsigned char buffer[100];
static char stringinput[512];

#define DM3068IPSTR  "TCPIP0::192.168.1.30::inst0::INSTR"


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //串口检测线程
    spThread = new SerialPortThread();
    connect(spThread,&SerialPortThread::reflashSerialPort, this,&MainWindow::showSerialPort);
    spThread->start();

    status = viOpenDefaultRM(&defaultRM);
    if (status < VI_SUCCESS)
    {
        qDebug() << "Could not open a session to the VISA Resource Manager!\n";
    }

    status = viOpen(defaultRM, DM3068IPSTR, VI_NULL, VI_NULL, &instr);
    if (status < VI_SUCCESS)
    {
        qDebug() << "Cannot open a session to the device.\n";
        goto Close;
    }

     /* Set the timeout to 5 seconds (5000 milliseconds). */
    status = viSetAttribute(instr, VI_ATTR_TMO_VALUE, 5000);

    /* Set the baud rate to 4800 (default is 9600). */
    status = viSetAttribute(instr, VI_ATTR_ASRL_BAUD, 4800);

    /* Set the number of data bits contained in each frame (from 5 to 8).
     * The data bits for  each frame are located in the low-order bits of
     * every byte stored in memory.
     */
    status = viSetAttribute(instr, VI_ATTR_ASRL_DATA_BITS, 8);

    status = viSetAttribute(instr, VI_ATTR_ASRL_PARITY, VI_ASRL_PAR_NONE);

    status = viSetAttribute(instr, VI_ATTR_ASRL_STOP_BITS, VI_ASRL_STOP_ONE);

    status = viSetAttribute(instr, VI_ATTR_TERMCHAR_EN, VI_TRUE);

    /* Set the termination character to 0xA
     */
    status = viSetAttribute(instr, VI_ATTR_TERMCHAR, 0xA);


    strcpy(stringinput, ":MEASure:VOLTage:DC?\n");
    //strcpy(stringinput, "*IDN?\n");
    status = viWrite(instr, (ViBuf)stringinput, (ViUInt32)strlen(stringinput), &writeCount);
    if (status < VI_SUCCESS){
        qDebug() << "Error writing to the device.\n";
        goto Close;
    }

    status = viRead(instr, buffer, 100, &retCount);
    if (status < VI_SUCCESS){
        qDebug() << "Error reading a response from the device.\n";
    }else{
        qDebug() << "Data read:" << retCount << QString::fromLocal8Bit((char*)buffer,retCount);

        ui->textBrowser->setText(QString::fromLocal8Bit((char*)buffer,retCount));
    }

Close:
    status = viClose(instr);
    status = viClose(defaultRM);

}

结果如下:

也可以用NI-MAX调试,

  • 17
    点赞
  • 171
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
频谱仪自动化测试开发一般包括以下步骤: 1. 确定测试需求:根据具体的测试需求,确定需要测试的频谱仪功能和要测试的参数。 2. 确定通信协议:了解要测试的频谱仪的通信协议,一般是通过 TCP/IP 或者 GPIB 进行通信。 3. 编写测试程序:使用 C# 编程语言编写测试程序,通过网络或者 GPIB 接口与频谱仪进行通信,并发送 SCPI 指令,读取频谱仪返回的测试数据。 4. 处理测试数据:对测试数据进行处理和分析,包括数据的格式转换、绘制测试结果图形、保存测试数据等操作。 5. 编写异常处理程序:处理通信异常、测试异常等情况,保证测试程序的稳定性和可靠性。 在编写测试程序时,SCPI 指令是非常重要的。SCPI(Standard Commands for Programmable Instruments)是一种通用的标准化指令集,用于控制各种测试设备,包括频谱仪、示波器、信号发生器等。以下是一些常用的频谱仪 SCPI 指令示例: 1. 设置频率范围:"FREQ:STAR 100MHz; FREQ:STOP 1GHz" 2. 设置中心频率和带宽:"FREQ:CENT 500MHz; BAND 10kHz" 3. 设置扫描时间:"SWE:TIME 10ms" 4. 设置参考电平:"DISP:WIND:TRAC:Y:RLEV 0dBm" 5. 设置峰值检测模式:"CALC:MARK:MAX" 6. 读取频谱数据:"TRAC:DATA? TRACE1" 这些指令可以通过 C# 编程语言发送到频谱仪,然后读取频谱仪返回的测试数据。具体的指令格式和参数可以参考频谱仪的说明文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值