【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 }
复制代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

标题在上边框中的html(fieldset标签)

<fieldset> <legend>标题</legend> 内容 </fieldset> 转载于:https://www.cnblogs.com/lswbk/p/4952820.html

移除项目中的CocoaPods

在项目中移除CocoaPods cocoaPods虽然很方便&#xff0c;但是我是真心的不喜欢用它&#xff0c;总是出错如果你觉得CocoaPods让你的项目出现了问题&#xff0c;不好用甚至是恶心&#xff0c;想将其从项目中彻底移除&#xff0c;也有方法&#xff1a; 1.删除工程文件夹下的Podf…

popoverController(iPad)

一、设置尺寸 提示&#xff1a;不建议&#xff0c;像下面这样吧popover的宽度和高度写死。 1 //1.新建一个内容控制器2 YYMenuViewController *menuVc[[YYMenuViewController alloc]init];3 4 //2.新建一个popoverController&#xff0c;并设置其内容控制器5 s…

fastQC

Fastqc用途 FastQC aims to provide a simple way to do some quality control checks on raw sequence data coming from high throughput sequencing pipelines. It provides a modular set of analyses which you can use to give a quick impression of whether your data …

C++ Handle(句柄) part1

本文是我学习C&#xff0b;&#xff0b;沉思录第6章的笔记 本文主要讲述了Handle类的概念&#xff0c;定义方法以及写时复制技术。 在前文(Surrogate代理类)的讲解中我们了解到了代理的实现方法. 代理类有很多好处,但是麻烦的是每次都得进行复制.如果该类是经常使用并且member很…

Swift调用Objective C的FrameWork

很多Github的库经过很多年的发展&#xff0c;源码都是OC写的&#xff0c;&#xff0c;所以&#xff0c;用Swift调用OC的库就是开发中难免遇到的的一个问题&#xff0c;本文以AFNetworking为例&#xff0c;讲解如何跨语言调用。 第一步 创建一个空的工程 注意&#xff0c;语言选…

显式(静态)调用: LIB + DLL + .H

1、编程时用ad.h,ad.lib,放在项目当前目录里2、在头文件中加入#include "ad.h"3、在Project Setting–>Link–>Object/library modules加入ad.lib执行时将ad.dll跟你的程序放在同一目录。 就可以直接调用dll中的函数了 当前目录 转载于:https://www.cnblogs.co…

接入支付宝出现交易订单处理失败,请稍后再试(ALI64)的错误

上次在接入支付宝的时候就碰到了交易订单处理失败&#xff0c;请稍后再试&#xff08;ALI64&#xff09;这样的错误&#xff0c;后来经过排查和总结&#xff0c;一般来讲这种问题都是公钥和私钥没有正确配置造成的。支付宝这边为了保证数据在传输时不被篡改&#xff0c;使用了r…

支付宝集成交互流程

交互流程 功能流程 流程说明&#xff08;以Android平台为例&#xff09;&#xff1a; 第4步&#xff1a;调用支付接口&#xff1a;此消息就是本接口所描述的开发包提供的支付对象PayTask&#xff0c;将商户签名后的订单信息传进pay方法唤起支付宝收银台&#xff0c;订单格式具体…

VxLAN基础

转自&#xff1a;http://blog.csdn.net/freezgw1985/article/details/16354897 一 . 为什么需要Vxlan1. vlan的数量限制4096个vlan远不能满足大规模云计算数据中心的需求2. 物理网络基础设施的限制基于IP子网的区域划分限制了需要二层网络连通性的应用负载的部署3. TOR交换机MA…

C语言程序代码优化

我认为一个好的用于科学计算的程序代码应该&#xff1a;算法漂亮精妙&#xff0c;程序简洁易懂&#xff0c;运算快速&#xff0c;节省内存。这里有的地方是矛盾的&#xff0c;比如简洁vs易懂&#xff0c;时间vs空间&#xff0c;找个平衡吧。目前来看时间要比空间宝贵一些。写程…

如何在苹果官网下载旧版本的Xcode 方法

1 在百度里输入“苹果开发者中心“&#xff0c;进入以下页面。点击页面中的“Member Center" 2 出现登录界面。这是需要苹果开发者帐号的&#xff0c;没有帐号的可以选择“Create Apple ID”进行注册。已经注册的选择“Sign In"登录 3 页面跳转后&#xff0c;选择…

【转】android多分辨率适配

前一阶段开发android项目&#xff0c;由于客户要求进行多分辨率适配&#xff0c;能够支持国内主流的分辨率手机。因此经过了几次开发走了很多弯路&#xff0c;目前刚刚领略了android多分辨率适配的一些方法。 先介绍一下所走的弯路&#xff0c;由于android的布局文件存放在res的…

Java线程池介绍

根据摩尔定律&#xff08;Moore’s law&#xff09;&#xff0c;集成电路晶体管的数量差不多每两年就会翻一倍。但是晶体管数量指数级的增长不一定会导致 CPU 性能的指数级增长。处理器制造商花了很多年来提高时钟频率和指令并行。在新一代的处理器上&#xff0c;单线程程序的执…

cocoa pods的安装与我遇到的问题

1.打开终端 终端输入 ruby -v 查看ruby的版本 打印代码&#xff1a; ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin15] 2. 更换ruby镜像 终端输入如下命令&#xff08;把Ruby镜像指向taobao&#xff0c;避免被墙&#xff0c;你懂得&#xff09; a.移…

Implicit declaration of function 'NSFileTypeForHFSTypeCode' is invalid in C99

一般出现该问题是因为通过C调用了unix/linux 底层接口&#xff0c;所以需要调整c语言的编译选项&#xff0c;设置方法见下图&#xff1a;(根据实际情况选择相应的编译选项)

DebugView 调试入门

参考链接&#xff1a;http://blog.csdn.net/jiankunking/article/details/44984487 软件下载地址&#xff1a;点击打开链接 debugview 可以捕获程序中由TRACE(debug版本)和OutputDebugString输出的信息。支持Debug、Release模式编译的程序&#xff08;即该软件捕获的是exe直接运…

DebugView使用笔记

1. 什么是DebugView? 它是Sysinternals公司的系列调试工具。可以捕获程序中由TRACE()和OutputDebugString输出的信息。 2. C需要完成哪些工作呢&#xff1f; 将打印的信息用OutputDebugString输出&#xff0c;示例&#xff1a; [cpp] view plaincopy #include "stdio.h&q…

QT之深入理解QThread

QT之深入理解QThread 理解QThread之前需要了解下QThread类&#xff0c;QThread拥有的资源如下&#xff08;摘录于QT 5.1 帮助文档&#xff09;&#xff1a;在以上资源中&#xff0c;本文重点关注槽&#xff1a;start()&#xff1b;信号&#xff1a;started()、finished()&#…

springMVC数据封装成POJO

springMVC把前台的数据封装为POJO与struts2的封装形式不同。struts2需要在控制器声明需封装的POJO&#xff0c;而springMVC不需要任何准备工作&#xff0c;只需在相应的方法的参数中加上需封装的POJO&#xff0c;当用户提交表单时&#xff0c;springMVC会根据表单中dom元素的na…