【VC++技术杂谈005】如何与程控仪器通过GPIB接口进行通信
在工控测试系统中,经常需要使用到各类程控仪器,这些程控仪器通常具有GPIB、LAN、USB等硬件接口,计算机通过这些接口能够与其通信,从而实现自动测量、数据采集、数据分析和数据处理等操作。本文主要介绍如何与程控仪器通过GPIB接口进行通信。
1.GPIB简介
GPIB是通用总线(General Purpose Interface Bus)的简称。
GPIB一共由24根线组成,其中8根数据线DB0-DB7,3根握手线(NRFD、DAV、NDAC),5根总线控制线(ATN、SRQ、IFC、REN、EOI),8根地线。
GPIB是异步数据传输方式的双向总线,总线上的信息按位(bit)并行、字节(byte)串行的方式进行传送。
详细的GPIB硬件接口介绍请查阅相关资料,这里就不详述了。
2.SCPI简介
SCPI是可编程仪器标准命令(Standard Commands for Programmable Instruments)的简称。
SCPI规定了在控制器到仪器和仪器到控制器之间的信息交换层消息的构造和内容,因而使得在垂直层面上,同一类型的仪器命令集相似;在水平层面上,不同类型仪器之间,同种功能的SCPI命令也一致。
SCPI命令分为仪器公用命令和仪器特定控制命令两部分。公用命令用于控制仪器的某些基本功能操作,其句法和语义遵循IEEE488.2规定。仪器特定控制命令是指每个程控仪器完成自身命令操作的特定命令。
详细的SCPI命令语法请查阅相关资料,这里就不详述了。
3.VISA简介
VISA是虚拟仪器软件架构(Virtual Instrument Software)的简称。
VISA提供了用于仪器编程的标准I/O函数库,称为VISA库。VISA库提供了统一的设备资源管理、操作和使用机制,它独立于硬件设备、接口、操作系统和编程语言,具有与硬件结构无关的特点。它将用于每个仪器硬件总线类型的更低层次的驱动程序抽象化,并提供一个单一的API实现与仪器的通信,而不必考虑具体的总线接口。
常用的VISA API有如下一些:
(1)ViStatus viOpenDefaultRM(ViPSession vi); //打开缺省资源管理器资源对话通道
(2)ViStatus viOpen(ViSession sesn, ViRsrc name, ViAccessMode mode, ViUInt32 timeout, ViPSession vi); //打开特定资源的对话通道
(3)ViStatus viClose(ViObject vi); //关闭特定资源的对话通道
(4)ViStatus viPrintf(ViSession vi, ViString writeFmt, ...); //按设定格式向仪器写数据
(5)ViStatus viScanf(ViSession vi, ViString readFmt, ...); //按设定格式从仪器读取数据
(6)ViStatus viRead(ViSession vi, ViPBuf buf, ViUInt32 cnt, ViPUInt32 retCnt); //从仪器同步读取数据
(7)ViStatus viWrite(ViSession vi, ViBuf buf, ViUInt32 cnt, ViPUInt32 retCnt); //向仪器同步写入数据
(8)ViStatus viClear(ViSession vi); //清除数据
4.编程示例
下面的代码示例了如何通过GPIB接口对2220G-30-1型号的双通道直流电源进行控制。程序运行效果如图1所示。

图1 GPIB示例运行效果
4.1加载VISA库的头文件和库文件
为了在工程项目中使用VISA API函数对程控仪器进行控制,需要加载VISA库的头文件visa.h和库文件visa32.lib。这两个文件可以在安装GPIB驱动后,在“C:\Program Files\IVI Foundation\VISA\WinNT”目录下的include和lib目录下找到。
加载这两个文件的具体方法如下:
#include "include//visa.h" //包含VISA头文件和库文件
#pragma comment(lib, "lib//msc//visa32.lib")
4.2连接设备
点击图1中的“连接设备”按钮,将调用viOpen()函数打开特定资源的对话通道。若对话通道打开成功,则向仪器发送“*IDN?”命令读取设备信息。具体实现代码如下:
/*
* 函数功能 : 点击"连接设备"按钮时,该函数被调用
* 备 注 :
* 作 者 : 博客园 依旧淡然
*/
void CGPIBDemoDlg::OnButtonOpenDevice()
{
viOpenDefaultRM(&m_ViSessionRM);
if(VI_SUCCESS == viOpen(m_ViSessionRM, "GPIB0::1::INSTR", VI_NULL, VI_NULL, &m_ViSession))
{
char receiveBufferArrary[] = {};
viPrintf(m_ViSession, "*RST\n"); //发送复位命令
viPrintf(m_ViSession, "*IDN?\n"); //发送读取设备信息命令
viScanf(m_ViSession, "%t", &receiveBufferArrary);
m_IsConnected = true;
m_StaticDeviceState.Format("设备状态:已连接!");
m_StaticDeviceInfo.Format("设备信息:%s \n", receiveBufferArrary);
UpdateData(FALSE);
}
else
{
m_IsConnected = false;
MessageBox("连接设备失败!", "提示", MB_OK|MB_ICONWARNING);
}
}
由图1可以看到,连接设备成功之后,获取的设备信息为“Keithley instruments, 2220G-30-1, 9010179, 1.16-1.04”。这四个字段分别代表制造商、产品标号、产品序列号以及软件版本号。
4.3设置电压电流
2220G-30-1型号的双通道直流电源可以设置输出0-30V的直流电压以及0-1.5A的电流。下面的代码给出了设置通道1的电压和电流的方法:
/*
* 函数功能 : 点击"通道1设置"按钮时,该函数被调用
* 备 注 :
* 作 者 : 博客园 依旧淡然
*/
void CGPIBDemoDlg::OnButtonChannel1Setting()
{
UpdateData(TRUE); if(!m_IsConnected)
{
MessageBox("请先连接设备!", "提示", MB_OK|MB_ICONWARNING);
return;
} if(m_EditChannel1Voltage.IsEmpty())
{
MessageBox("输入电压不能为空!", "提示", MB_OK|MB_ICONWARNING);
return;
} if(m_EditChannel1Current.IsEmpty())
{
MessageBox("输入电流不能为空", "提示", MB_OK|MB_ICONWARNING);
return;
} viPrintf(m_ViSession, "INST:SEL CH1\n"); //选择通道1
viPrintf(m_ViSession, "SOURCE:OUTP:ENAB ON\n"); //使能输出
viPrintf(m_ViSession, "SOURCE:VOLT %sV\n", m_EditChannel1Voltage); //设置输出电压
viPrintf(m_ViSession, "SOURCE:CURR %sA\n", m_EditChannel1Current); //设置输出电流
viPrintf(m_ViSession, "SOURCE:OUTP ON\n"); //输出
}
【VC++技术杂谈005】如何与程控仪器通过GPIB接口进行通信的更多相关文章
- 【VC++技术杂谈004】使用微软TTS语音引擎实现文本朗读
本文主要介绍如何使用微软TTS语音引擎实现文本朗读,以及生成wav格式的声音文件. 1.语音引擎及语音库的安装 TTS(Text-To-Speech)是指文本语音的简称,即通过TTS引擎把文本转化为语 ...
- 【VC++技术杂谈003】打印技术之打印机状态监控
在上一篇博文中我主要介绍了如何获取以及设置系统的默认打印机,本文将介绍如何对打印机状态进行实时监控,记录下所打印的文档.打印的份数以及打印时间等打印信息. 1.打印机虚脱机技术 在正式介绍如何对打印机 ...
- 【VC++技术杂谈008】使用zlib解压zip压缩文件
最近因为项目的需要,要对zip压缩文件进行批量解压.在网上查阅了相关的资料后,最终使用zlib开源库实现了该功能.本文将对zlib开源库进行简单介绍,并给出一个使用zlib开源库对zip压缩文件进行解 ...
- 【VC++技术杂谈007】使用GDI+进行图片格式转换
本文主要介绍如何使用GDI+对图片进行格式转换,可以转换的图片格式为bmp.jpg.png. 1.加载GDI+库 GDI+是GDI图形库的一个增强版本,提供了一系列Visual C++ API.为了使 ...
- 【VC++技术杂谈006】截取电脑桌面并将其保存为bmp图片
本文主要介绍如何截取电脑桌面并将其保存为bmp图片. 1. Bmp图像文件组成 Bmp是Windows操作系统中的标准图像文件格式. Bmp图像文件由四部分组成: (1)位图头文件数据结构,包含Bmp ...
- 【VC++技术杂谈002】打印技术之获取及设置系统默认打印机
本文主要介绍如何获取以及设置系统的默认打印机. 1.获取系统中的所有打印机 获取系统中的所有打印机可以使用EnumPrinters()函数,该函数可以枚举全部的本地.网络打印机信息.其函数原型为: B ...
- 【VC++技术杂谈001】音频技术之调节音量及设置静音
本文主要介绍如何使用混音器Mixer API函数实现系统音量调节,以及设置静音. 1.混音器的作用及结构 1.1混音器的作用 声卡(音频卡)是计算机进行声音处理的适配器,具有三个基本功能: (1)音乐 ...
- 向技术领先的华为说No,就是对国家的通信前景说No!
历史已经证明了,任何一项可以加速人员.物资.能源.金钱.信息迁移的技术,都会让社会原有的生产力成倍地增长.中国在互联网.移动互联网保持令整个世界震惊的飞速发展,以BAT为首的诸多商业帝国建立,还有人们 ...
- 【转载】MIMO技术杂谈(一):鱼与熊掌能否兼得?--浅谈分集与复用的权衡
原文链接(向作者致敬):http://www.txrjy.com/thread-667901-1-1.html 无线通信世界在过去的几十年中的发展简直是爆发式的,MIMO(多发多收)技术的出现更是 ...
随机推荐
- HashMap源码阅读笔记(基于jdk1.8)
1.HashMap概述: HashMap是基于Map接口的一个非同步实现,此实现提供key-value形式的数据映射,支持null值. HashMap的常量和重要变量如下: DEFAULT_INITI ...
- java后台获取Access_token的工具方法
本方法主要通过java后台控制来获取Access_token,需要你已经知道自己的ID跟密码 因为微信的权限设置大概每天可以获取两千条,每条有效时间为2小时 /** * 输入自己的id跟密码,获取微信 ...
- pwnable.kr的passcode
前段时间找到一个练习pwn的网站,pwnable.kr 这里记录其中的passcode的做题过程,给自己加深印象. 废话不多说了,看一下题目, 看到题目,就ssh连接进去,就看到三个文件如下 看了一下 ...
- C#ListBox对Item进行重绘,包括颜色
别的不多说了,上代码,直接看 首先设置这行,或者属性窗口设置,这样才可以启动手动绘制,参数有三个 Normal: 自动绘制 OwnerDrawFixed:手动绘制,但间距相同 OwnerDrawVar ...
- 浅谈CSS hack(浏览器兼容)
今天简单写一点关于浏览器兼容的处理方法,虽然百度上已经有很多,但是我还是要写! 先看一个图 这个图描述了2016年1月至8月网民们所使用的浏览器市场份额(来源:http://tongji.baidu. ...
- java复习集合类之List接口
List 为有序可重复列表 实现List接口的类主要是ArrayList 下面为ArrayList的测试代码 import java.util.ArrayList; public class demo ...
- 最大流-最小割 MAXFLOW-MINCUT ISAP
简单的叙述就不必了. 对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边. 反向边的正确性: 我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明. 但事实上,我们不难理 ...
- 如何在Windows上从源码编译Chromium (CEF3) 加入mp3支持
一.什么是CEF CEF即Chromium Embeded Framework,由谷歌的开源浏览器项目Chromium扩展而来,可方便地嵌入其它程序中以得到浏览器功能. CEF包括CEF1和CEF3两 ...
- 【ORACLE】ORA-12537 问题整理
ORA-12537主要是ORALCE 监听问题,今天帮同事处理问题时,他问道一种情况,开始连接很正常,后续多次出现ORA-12537问题 简单整理了下 一般请况下 1-检查数据库服务器是否没有启动监听 ...
- js学习笔记之标准库
在全局函数中,this等于window 在函数被作为某个对象的方法调用时,this等于那个对象. 数组的函数: 检测:Array.isArray() 转换:toString(),toLocalStr ...