Qt程控提高篇

Qt程控提高篇 #

操作系统: Windows 7 IDE:Qt Creator 4.14.0 Visa版本: 17.5 通信方式: LAN

在开发之前请确保已配置visa开发环境,参考 Visa开发环境搭建

关于Qt程控的配置参考 Qt程控基础篇的第一步。

本例程设置了一个按钮和一个文本框,当点击按钮后,文本框中依次输出:S12幅度迹线的标准差、S12相位迹线的标准差、S21幅度迹线的标准差、S21相位迹线的标准差。下面具体介绍整个实现过程。

第一步:设计界面 #

这里只设置了一个简单的按钮和文本框:

图-设计的界面图

第二步:编写程序 #

在mainwindow.cpp文件中输入以下代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "visa.h"//导入visa库的头文件

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

MainWindow::~MainWindow()
{
    delete ui;
}

ViSession defaultRM;//VISA资源管理器
ViSession vi;//资源对话通道标识符(句柄)
ViChar buff[256];//指令存储字符串
ViChar buff1[256];//指令存储字符串
ViUInt32 retCnt;//32位无符号整型

void MainWindow::on_pushButton_clicked()
{
    viOpenDefaultRM(&defaultRM);//打开VISA资源管理器句柄
    
    // viOpen(defaultRM, "TCPIP0::172.16.1.201::inst0::INSTR",0,2000, &vi);// 打开VXI-11接口的仪器句柄
    // viOpen(defaultRM, "GPIB0::16::INSTR",0,2000, &vi);// 打开GPIB接口的仪器句柄
    // viOpen(defaultRM, "USB0::0x0525::0x1000::ZKC00523::INSTR",0,2000, &vi);// 打开USB接口的仪器句柄
    viOpen(defaultRM, "TCPIP0::127.0.0.1::5025::SOCKET",0,2000, &vi);// 打开网络接口的仪器句柄
    
    viSetAttribute(vi, VI_ATTR_TERMCHAR, '\n');//设置结束符为\n。
    viSetAttribute(vi, VI_ATTR_TERMCHAR_EN, VI_TRUE);//启用结束符。VI_ATTR_TERMCHAR_EN为是否允许终止符
    viSetAttribute(vi, VI_ATTR_TMO_VALUE, 5000);//超时设置为5秒。VI_ATTR_TMO_VALUE为超时值

    sprintf(buff," *RST\n"); // 复位指令
    viWrite(vi, (ViBuf) buff,strlen(buff), &retCnt);
    sprintf(buff,":SENS:BWID 1KHZ\n"); // 设置中频带宽为1KHZ
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    sprintf(buff,":SENS:FREQ:CENT 10000000\n"); //  键入中心频率
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);

    /*测量S12幅度迹线的标准差*/
    sprintf(buff,":DISP:WIND:TRAC1:DEL\n");//删除轨迹1
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    sprintf(buff,":CALCulate1:PARameter:DEF 'CH1',S12\n");//在通道1上创建测量名称为'CH1',测量参数为S12的测量。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    sprintf(buff,":DISP:WIND:TRAC1:FEED 'CH1'\n");//创建轨迹1并将其与测量名称为'CH1'的测量相关联,之后在窗口1中显示。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    sprintf(buff,":CALCulate1:PARameter:SEL 'CH1'\n");//设置名称为'CH1'的测量为通道1的当前选择测量。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    sprintf(buff,":CALCulate1:FORMat MLOGarithmic\n");//设置通道1当前选择轨迹的显示格式为对数幅度。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    sprintf(buff,":CALCulate1:FUNCtion:STAT:STAT ON\n");//显示通道1轨迹统计。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    sprintf(buff,":CALCulate1:FUNCtion:TYPE STDEV\n");//设置通道1轨迹统计返回数据的类型为标准偏差。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    QThread::msleep(1000);//延时,给分析仪足够的时间进行计算
    sprintf(buff,":CALCulate1:FUNCtion:DATA?\n");//返回通道1轨迹统计返回数据的数值
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    viRead(vi, (ViBuf) buff1, 256, &retCnt);
    QString str1=buff1;

    /*测量S12相位迹线的标准差*/
    sprintf(buff,":CALCulate1:PARameter:DEF 'CH2',S12\n");//在通道1上创建测量名称为'CH2',测量参数为S12的测量。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    sprintf(buff,":DISP:WIND:TRAC2:FEED 'CH2'\n");//创建轨迹2并将其与测量名称为'CH2'的测量相关联,之后在窗口1中显示。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    sprintf(buff,":CALCulate1:PARameter:SEL 'CH2'\n");//设置名称为'CH2'的测量为通道1的当前选择测量。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    sprintf(buff,":CALCulate1:FORMat PHASe\n");//设置通道1当前选择轨迹的显示格式为相位幅度。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    sprintf(buff,":CALCulate1:FUNCtion:STAT:STAT ON\n");//显示通道1轨迹统计。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    sprintf(buff,":CALCulate1:FUNCtion:TYPE STDEV\n");//设置通道1轨迹统计返回数据的类型为标准偏差。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    QThread::msleep(1000);//延时,给分析仪足够的时间进行计算
    sprintf(buff,":CALCulate1:FUNCtion:DATA?\n");//返回通道1轨迹统计返回数据的数值
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    viRead(vi, (ViBuf) buff1, 256, &retCnt);
    QString str2=buff1;

    /*测量S21幅度迹线的标准差*/
    sprintf(buff,":CALCulate1:PARameter:DEF 'CH3',S21\n");//在通道1上创建测量名称为'CH3',测量参数为S21的测量。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    sprintf(buff,":DISP:WIND:TRAC3:FEED 'CH3'\n");//创建轨迹3并将其与测量名称为'CH3'的测量相关联,之后在窗口1中显示。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    sprintf(buff,":CALCulate1:PARameter:SEL 'CH3'\n");//设置名称为'CH3'的测量为通道1的当前选择测量。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    sprintf(buff,":CALCulate1:FORMat MLOGarithmic\n");//设置通道1当前选择轨迹的显示格式为对数幅度。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    sprintf(buff,":CALCulate1:FUNCtion:STAT:STAT ON\n");//显示通道1轨迹统计。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    sprintf(buff,":CALCulate1:FUNCtion:TYPE STDEV\n");//设置通道1轨迹统计返回数据的类型为标准偏差。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    QThread::msleep(1000);//延时,给分析仪足够的时间进行计算
    sprintf(buff,":CALCulate1:FUNCtion:DATA?\n");//返回通道1轨迹统计返回数据的数值
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    viRead(vi, (ViBuf) buff1, 256, &retCnt);
    QString str3=buff1;

    /*测量S21相位迹线的标准差*/
    sprintf(buff,":CALCulate1:PARameter:DEF 'CH4',S21\n");//在通道1上创建测量名称为'CH4',测量参数为S21的测量。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    sprintf(buff,":DISP:WIND:TRAC4:FEED 'CH4'\n");//创建轨迹4并将其与测量名称为'CH4'的测量相关联,之后在窗口1中显示。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    sprintf(buff,":CALCulate1:PARameter:SEL 'CH4'\n");//设置名称为'CH4'的测量为通道1的当前选择测量。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    sprintf(buff,":CALCulate1:FORMat PHASe\n");//设置通道1当前选择轨迹的显示格式为相位幅度。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    sprintf(buff,":CALCulate1:FUNCtion:STAT:STAT ON\n");//显示通道1轨迹统计。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    sprintf(buff,":CALCulate1:FUNCtion:TYPE STDEV\n");//设置通道1轨迹统计返回数据的类型为标准偏差。
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    QThread::msleep(1000);//延时,给分析仪足够的时间进行计算
    sprintf(buff,":CALCulate1:FUNCtion:DATA?\n");//返回通道1轨迹统计返回数据的数值
    viWrite(vi, (ViBuf) buff, strlen(buff), &retCnt);
    viRead(vi, (ViBuf)buff1, 256, &retCnt);
    QString str4=buff1;
    ui->textEdit->setText(str1+str2+str3+str4);//在textEdit中显示查询到的标准差

    viClose(vi);//关闭仪器
    viClose(defaultRM);//关闭VISA资源管理器

}

第三步:运行程序 #

注意:运行时要保证打开了矢量网络分析仪。为了给分析仪足够的时间进行计算,在查询每一个数据的时候都进行了延时,所以要等待几秒钟后才能在文本框中得到输出的数据。

运行程序,点击按钮后输出:

图-运行程序后输出图

此时矢量网络分析仪的界面:

图-矢量网络分析仪界面图