一文搞懂:【VC++技术杂谈005】如何与程控仪器通过GPIB接口进行通信

简介: 一文搞懂:【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)//代码效果参考:http://hnjlyzjd.com/hw/wz_25472.html


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, //代码效果参考:http://hnjlyzjd.com/xl/wz_25470.html

"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 }


作者:依旧淡然


邮箱:menlsh@163.com


博客:


本文版权归作者所有,未经作者同意,严禁转载及用作商业传播,否则将追究法律责任。

相关文章
|
1月前
|
NoSQL 网络协议 Linux
Redis的实现一:c、c++的网络通信编程技术,先实现server和client的通信
本文介绍了使用C/C++进行网络通信编程的基础知识,包括创建socket、设置套接字选项、绑定地址、监听连接以及循环接受和处理客户端请求的基本步骤。
46 6
|
2月前
|
存储 算法 C++
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
文章详细探讨了C++中的泛型编程与STL技术,重点讲解了如何使用模板来创建通用的函数和类,以及模板在提高代码复用性和灵活性方面的作用。
50 2
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
|
1月前
|
网络协议 Linux 网络性能优化
Linux C/C++之TCP / UDP通信
这篇文章详细介绍了Linux下C/C++语言实现TCP和UDP通信的方法,包括网络基础、通信模型、编程示例以及TCP和UDP的优缺点比较。
36 0
Linux C/C++之TCP / UDP通信
|
5月前
|
存储 分布式数据库 API
技术好文:VisualC++查看文件被哪个进程占用
技术好文:VisualC++查看文件被哪个进程占用
|
1月前
|
C++
【C++】实现日期类相关接口(三)
【C++】实现日期类相关接口
|
1月前
|
C++
【C++】实现日期类相关接口(二)
【C++】实现日期类相关接口
|
1月前
|
C++
【C++】实现日期类相关接口(一)
【C++】实现日期类相关接口
|
2月前
|
BI 定位技术 C++
超级好用的C++实用库之地理相关接口
超级好用的C++实用库之地理相关接口
36 0
|
3月前
|
人工智能 Anolis
聚焦C++20 最新标准!技术 Workshop 精彩亮点一览 | 2024 龙蜥大会
多场技术 Workshop、多位领域专家亲自授课,分享独家洞察与宝贵经验。
|
3月前
|
算法 C# 开发工具
《黑神话:悟空》背后的编程语言揭秘——超越C++的多元技术融合
【8月更文挑战第27天】在游戏开发领域,一款游戏的成功往往离不开其背后强大的技术支持和编程语言的精妙运用。《黑神话:悟空》作为备受瞩目的国产单机动作游戏,其开发过程不仅涉及了多种编程语言,更是一次技术创新的集中展现。然而,当我们深入探讨其开发语言时,会发现它并非仅依赖于单一的C++,而是融合了多种编程语言的优势,共同铸就了这款游戏的辉煌。
253 0