【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目录下找到。

  加载这两个文件的具体方法如下:

1 #include "include//visa.h"                                //包含VISA头文件和库文件
2 #pragma comment(lib, "lib//msc//visa32.lib")

4.2连接设备

  点击图1中的“连接设备”按钮,将调用viOpen()函数打开特定资源的对话通道。若对话通道打开成功,则向仪器发送“*IDN?”命令读取设备信息。具体实现代码如下:

 1 /*
 2  * 函数功能 : 点击"连接设备"按钮时,该函数被调用
 3  * 备    注 :
 4  * 作    者 : 博客园 依旧淡然
 5  */
 6 void CGPIBDemoDlg::OnButtonOpenDevice()
 7 {
 8     viOpenDefaultRM(&m_ViSessionRM);
 9     if(VI_SUCCESS == viOpen(m_ViSessionRM, "GPIB0::1::INSTR", VI_NULL, VI_NULL, &m_ViSession))
10     {
11         char receiveBufferArrary[256] = {0};
12         viPrintf(m_ViSession, "*RST\n");                        //发送复位命令
13         viPrintf(m_ViSession, "*IDN?\n");                      //发送读取设备信息命令
14         viScanf(m_ViSession, "%t", &receiveBufferArrary);
15         m_IsConnected = true;
16         m_StaticDeviceState.Format("设备状态:已连接!");
17         m_StaticDeviceInfo.Format("设备信息:%s \n", receiveBufferArrary);
18         UpdateData(FALSE);
19     }
20     else
21     {
22         m_IsConnected = false;
23         MessageBox("连接设备失败!", "提示", MB_OK|MB_ICONWARNING);
24     }
25 }

  由图1可以看到,连接设备成功之后,获取的设备信息为“Keithley instruments, 2220G-30-1, 9010179, 1.16-1.04”。这四个字段分别代表制造商、产品标号、产品序列号以及软件版本号。

4.3设置电压电流

  2220G-30-1型号的双通道直流电源可以设置输出0-30V的直流电压以及0-1.5A的电流。下面的代码给出了设置通道1的电压和电流的方法:

 1 /*
 2  * 函数功能 : 点击"通道1设置"按钮时,该函数被调用
 3  * 备    注 :
 4  * 作    者 : 博客园 依旧淡然
 5  */
 6 void CGPIBDemoDlg::OnButtonChannel1Setting()
 7 {
 8     UpdateData(TRUE);
 9
10     if(!m_IsConnected)
11     {
12         MessageBox("请先连接设备!", "提示", MB_OK|MB_ICONWARNING);
13         return;
14     }
15
16     if(m_EditChannel1Voltage.IsEmpty())
17     {
18         MessageBox("输入电压不能为空!", "提示", MB_OK|MB_ICONWARNING);
19         return;
20     }
21
22     if(m_EditChannel1Current.IsEmpty())
23     {
24         MessageBox("输入电流不能为空", "提示", MB_OK|MB_ICONWARNING);
25         return;
26     }
27
28     viPrintf(m_ViSession, "INST:SEL CH1\n");                          //选择通道1
29     viPrintf(m_ViSession, "SOURCE:OUTP:ENAB ON\n");                    //使能输出
30     viPrintf(m_ViSession, "SOURCE:VOLT %sV\n", m_EditChannel1Voltage);         //设置输出电压
31     viPrintf(m_ViSession, "SOURCE:CURR %sA\n", m_EditChannel1Current);          //设置输出电流
32     viPrintf(m_ViSession, "SOURCE:OUTP ON\n");                         //输出
33 }
时间: 2024-10-12 23:52:37

【VC++技术杂谈005】如何与程控仪器通过GPIB接口进行通信的相关文章

【VC++技术杂谈003】打印技术之打印机状态监控

在上一篇博文中我主要介绍了如何获取以及设置系统的默认打印机,本文将介绍如何对打印机状态进行实时监控,记录下所打印的文档.打印的份数以及打印时间等打印信息. 1.打印机虚脱机技术 在正式介绍如何对打印机状态进行实时监控之前,我们有必要先了解一下打印机虚脱机技术. 独占设备是指在一个程序(作业.用户)的整个运行期间独占设备,直到该程序(作业.用户)完成.系统的独占设备是有限的(比如,一台计算机只能够连接一台打印机),往往不能够满足多进程的要求,会引起大量进程由于等待某些独占设备而阻塞.另一方面,申请

【VC++技术杂谈004】使用微软TTS语音引擎实现文本朗读

本文主要介绍如何使用微软TTS语音引擎实现文本朗读,以及生成wav格式的声音文件. 1.语音引擎及语音库的安装 TTS(Text-To-Speech)是指文本语音的简称,即通过TTS引擎把文本转化为语音输出. 微软TTS语音引擎提供了Windows Speech SDK开发包供编程者使用.Windows Speech SDK包含语音合成SS引擎和语音识别SR引擎两种,语音合成引擎用于将文字转换成语音输出,语音识别引擎用于识别语音命令. Windows Speech SDK可以在微软的官网上免费下

【VC++技术杂谈006】截取电脑桌面并将其保存为bmp图片

本文主要介绍如何截取电脑桌面并将其保存为bmp图片. 1. Bmp图像文件组成 Bmp是Windows操作系统中的标准图像文件格式. Bmp图像文件由四部分组成: (1)位图头文件数据结构,包含Bmp图像文件的类型.文件大小等信息. (2)位图信息数据结构,包含Bmp图像的宽.高.压缩类型等信息. (3)颜色表,该部分可选,有些位图需要,有些位图(如24位真彩色位图)不需要. (4)位图数据. 1.1位图头文件数据结构 位图头文件数据结构包含Bmp图像文件的类型.文件大小等信息,占用14个字节.

【VC++技术杂谈001】音频技术之调节音量及设置静音

本文主要介绍如何使用混音器Mixer API函数实现系统音量调节,以及设置静音. 1.混音器的作用及结构 1.1混音器的作用 声卡(音频卡)是计算机进行声音处理的适配器,具有三个基本功能: (1)音乐合成发音功能 (2)混音器(Mixer)功能和数字声音效果处理器(DSP)功能 (3)模拟声音信号的输入和输出功能 混音器的作用是将来自音乐合成器.CD-ROM.话筒输入(MIC)等不同来源的声音组合在一起再输出. 1.2混音器的结构 混音器由多个目的单元(Destination)组成,如回放(Pl

【VC++技术杂谈007】使用GDI+进行图片格式转换

本文主要介绍如何使用GDI+对图片进行格式转换,可以转换的图片格式为bmp.jpg.png. 1.加载GDI+库 GDI+是GDI图形库的一个增强版本,提供了一系列Visual C++ API.为了使用GDI+,需要在工程中包含“GdiPlus.h”头文件,并加载“gdiplus.lib”库文件. 具体实现方法为,下载GDI+库,将下载得到的Gdiplus文件夹放到工程中.Gdiplus文件夹中应当包含有“GdiPlus.h”等一系列头文件.Gdiplus.lib库文件和Gdiplus.dll动

WebGIS开发技术杂谈

WebGIS项目的开发主要是B/S架构.最流行的是客户端javascript,服务器端java. 另外还有flex客户端. 客户端主要完成用户交互.向服务器端发送请求并传参以及组织显示服务器端返回的结果等.  服务器端则完成数据库增删查改.业务功能等. 服务器端最底层是数据层,完成对数据的增删查改.常用的数据库有oracle.mysql等.最基本的方法是, java语言使用jdbc,组织相应的sql语句实现数据库操作.   更便捷的方法是使用第三方框架,如hibernate. hibernate

技术杂谈 之 室内导航

这两年AI很火热,各种无人驾驶.机器人.无人机层出不穷,新零售也是AI的一个很热的方向.AI与新零售的结合现在也有不少案例了,比如京东X无人超市.超嗨的智能购物车等等.在大型百货商场或者超市,有一个很典型的场景就是室内导航,比如查询一个你不知道具体位置的品牌店铺.寻找一个不知道摆放在哪的商品.本篇就粗略的介绍一下这种室内导航所涉及的技术. 背景 在说室内导航之前,先来聊聊室外导航技术那些事.室外的导航现在已经用的很广泛了,各种汽车导航.XX地图.位置共享服务等等.主要使用的技术就是GNSS,Gl

架构设计杂谈005——架构分类

架构分类-1 没有统一的标准有按实现层次划分的.有按关注方向划分的.有按软工阶段划分的.有按视图类型划分的.有按技术实现风格划分的--等等,当然有很多是交叉重叠的 按实现层次划分●移动架构●前端架构●系统架构(应用架构,技术架构)●平台架构●应用集成架构●数据库架构●存储架构●网络架构-- 架构分类-2 按关注方向划分●业务架构●应用架构●技术架构●开发架构●数据库架构●存储架构●安全架构●部署架构●开放架构(OpenAPI架构)-- 架构分类-3 按软工阶段划分●解决方案架构●业务架构●系统架

【ALB技术笔记】基于多线程方式的串行通信接口数据接收案例

基于多线程方式的串行通信接口数据接收案例 广东职业技术技术学院  欧浩源 1.案例背景 在本博客的<[CC2530入门教程-06]CC2530的ADC工作原理与应用>中实现了电压数据采集的程序设计,传感器模块以每1秒发送一帧数据的形式通过串口向上位机发送电压数据.其数据帧由4个字节组成:一个帧头和一个帧尾,中间两个字节为电压数据,其格式如下: 帧头(0xAF)    电压数据高8位    电压数据低8位    帧尾(0xFA) 在篇博文中,将讲述如何通过多线程的方式,从串口接收传感器发送过来的