基于vs2017 Qt编写软件控制安捷伦信号源

本文介绍如何使用SCPI命令和VISA库实现对信号发生器的远程控制,包括连接设备、设置频率等功能,并提供了完整的编程示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 背景
暗室测试通过PC 软件直接控制信号源(信号发生器),不用手动操作。像这种标准控制仪器都有提供有PC接口,要完成信号源的控制我们需要了解两方面的知识:SPCI和VISA。

SPCI:SCPI(可编程仪器的标准命令)是一种基于 ASCII 的仪器命令语言,供测试和测量仪器使用,简单来说就是你发送给一个设备一串SCPI格式的字符串,它就能完成相应操作,这就是它们的通用语言。SCPI分为标准SCPI和扩展的SCPI,前者是各种设备通用的,如重置命令RST,后者是各个厂家各种设备自己扩展的命令。如果相应设备支持SCPI,在其操作手册中会对SCPI详细说明,一个简单的参考在这里,最好是查看需要控制的设备说明文档。
VISA:VISA(Virtual Instrument Software Architecture,简称为"Visa"),即虚拟仪器软件结构,是VXI plug&play联盟制定的I/O接口软件标准及其规范的总称。VISA提供用于仪器编程的标准I/O函数库,称为VISA库,计算机通过它来控制仪器。
VISA的适用和各种仪器接口通信,无论仪器使用的串口还是其他任何一种总线,诸如USB、GPIB、VXI、PXI和LXI等,都具有相同的操作函数,从而实现了控制操作上的统一。
这里我们使用Agilent的visa库。
二、 关于库文件和测试工具
1、我们可以去是德科技官网下载Agilent IO Library 或 是德科技仪器控制捆绑套件。
官网地址:https://www.keysight.com/cn/zh/home.html
捆绑套件下载:
https://www.keysight.com/cn/zh/lib/software-detail/computer-software/keysight-instrument-control-bundle-download-1184883.html
在这里插入图片描述
IO程序库套件:用于检测和链接仪器
Command Expert:用于构建仪器控制应用软件
BenchVue:无需编程即可用于查看和捕获仪器数据
2、仪器控制捆绑套件如下图所示
在这里插入图片描述
3、安装完毕后我们可以打开Keysight IO Librarise Suite测试设备通信是否正常,通信测试后在开始编程控制,如下图所示:
① 选择网口在这里插入图片描述
② 填写仪器ip地址,点击OK即可在这里插入图片描述
③ 连接成功后,会显示如下图信息(这里我没有连接)在这里插入图片描述
三、 开始编程,使用visa编程控制信号发生器(这里只实现了控制频率)
① 库文件
因为我之前已经安装了捆绑套件,所以visa库可以去安装目录下找,我这里的库文件路径是:
头文件:C:\Program Files\IVI Foundation\VISA\Win64\Include
在这里插入图片描述
库文件:C:\Program Files\IVI Foundation\VISA\Win64\Lib_x64\msc
在这里插入图片描述
② 关于visa接口
仪器控制,主要使用到的接口有:viOpen()、viWrite()、viRead()、viClose()。
③代码如下(我这里使用的信号源是:安捷伦 ESG E4438C)
.h文件

#pragma once

#include <QObject>
#include "visatype.h"
#include "visa.h"

class SGControl
{
public:
	SGControl();
	~SGControl();

public:
	/*连接设备*/
	bool connectDev();
	/*关闭设备*/
	bool closeDev();
	/*设置频率*/
	bool setFreq(int freqMHz);
	/*获取设备信息*/
	void getDevInfo(QString &text);

private:
	ViSession m_defaultRM;
	ViSession m_cmdSession;
};

.cpp文件

#include "SGControl.h"
#include <QByteArray>
#include <QDebug>
#include <QString>

SGControl::SGControl()
{

}

SGControl::~SGControl()
{

}

bool SGControl::connectDev()
{
	ViUInt32 retCount;

	//打开资源管理器
	viOpenDefaultRM(&m_defaultRM);

	//打开信号发生器
	if (VI_SUCCESS == viOpen(m_defaultRM, "TCPIP0::192.168.18.12::inst0::INSTR", VI_NULL, VI_NULL, &m_cmdSession))
	{
		return VI_TRUE;
	}
	else 
	{
		return VI_FALSE;
	}

	/*初始化设备*/
	viWrite(m_cmdSession, (ViConstBuf)"*RST\n", 6, &retCount);

	return true;
}

void  SGControl::getDevInfo(QString &text)
{
	ViUInt32 retCount;
	char buf[256] = { 0 };

	if (!connectDev()){
		return;
	}

	/*发送*IDN?命令,读取设备信息*/
	viWrite(m_cmdSession, (ViConstBuf)"*IDN?\n", 6, &retCount);
	/* 读取结果*/
	viRead(m_cmdSession, (ViBuf)buf, 200, &retCount);
	text = QString(buf);
	//qDebug() << buf;
	closeDev();
}

bool SGControl::closeDev()
{
	ViStatus status;

	status = viClose(m_defaultRM);
	if (status)
	{
		return VI_FALSE;
	}

	status = viClose(m_cmdSession);
	if (status)
	{
		return VI_FALSE;
	}

	return VI_TRUE;
}

bool SGControl::setFreq(int freqMHz)
{
	ViUInt32 retCount;
	ViStatus status;

	QString str = QString("FREQ:FIX %1MHz\n").arg(freqMHz);
	QByteArray byte = str.toLatin1();
	char *piostr = byte.data();
	status = viWrite(m_cmdSession,(ViConstBuf)piostr,strlen(piostr)+1, &retCount );
	if (status)
	{
		qDebug() << "viWrite: failed!";
		return false;
	}
	return true;
}

主界面.h文件

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_MainWindow.h"
#include "SGControl.h"

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = Q_NULLPTR);
	~MainWindow();

	void logger(const QString &log);

public Q_SLOTS:
	/*获取信号源参数*/
	void onGetSGParam();

private:
    Ui::MainWindowClass ui;

	SGControl m_signalCtl;
};

主界面cpp文件

#include "MainWindow.h"
#include <QPushButton>
#include <QDateTime>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

	QString devStr;
	m_signalCtl.getDevInfo(devStr);
	logger(devStr);

	connect(ui.send_Btn, &QPushButton::clicked, this, &MainWindow::onGetSGParam);
}

MainWindow::~MainWindow()
{
	m_signalCtl.closeDev();
}

void MainWindow::onGetSGParam()
{
	bool ret;
	QString freqStr = ui.freq_lineEdit->text();

	ret = m_signalCtl.connectDev();
	if (!ret)
	{
		logger(QString::fromLocal8Bit("设备连接失败!"));
	}
	ret = m_signalCtl.setFreq(freqStr.toInt());
	if (ret)
	{
		logger(QString::fromLocal8Bit("频率设置成功!"));
	}
	else
	{
		logger(QString::fromLocal8Bit("频率设置失败!"));
	}

	m_signalCtl.closeDev();
}

void MainWindow::logger(const QString &log)
{
	QString dateStr = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
	ui.textEdit->append(dateStr + " " + log);
}

界面呈现如下图所示,已经成功连接信号源:
在这里插入图片描述

完整代码CSDN地址:
https://download.csdn.net/download/jiangCsion/18837155

上述就是对信号源的控制软件的编写,已经调试通过,可以完全控制信号源。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跳跃的曲奇饼

你的鼓励是我创造更大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值