【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.pswp.cn/news/458690.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458690.shtml
英文地址,請注明出處:http://en.pswp.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…

ShellExecute使用詳解

有三個API函數可以運行可執行文件WinExec、ShellExecute和CreateProcess。 1.CreateProcess因為使用復雜&#xff0c;比較少用。 2.WinExec主要運行EXE文件。如&#xff1a;WinExec(Notepad.exe Readme.txt, SW_SHOW); 3.ShellExecute不僅可以運行EXE文件&#xff0c;也可以運行…

javascript筆記整理(對象基礎)

一、名詞解釋 1.基于對象&#xff08;一切皆對象&#xff0c;以對象的概念來編程&#xff09; 2.面向對象編程(Object Oriented Programming&#xff0c;OOP) A.對象(JavaScript 中的所有事物都是對象) B.對象的屬性和行為 屬性:用數據值來描述他的狀態 行為:用來改變對象行為的…

java的安裝和配置

JRE (JAVA Runtime Enviroment java運行環境),包括JVM(java虛擬機)和java程序所需的核心功能類庫&#xff0c;如果只是運行java程序&#xff0c;只需安裝JRE。 JDK &#xff08;Java Development Kit 開發工具包&#xff09;包括開發JAVA程序時所需的工具&#xff0c;包括JRE…

#if, #ifdef, #ifndef, #else, #elif, #endif的用法

#ifdef的用法 靈活使用#ifdef指示符&#xff0c;我們可以區隔一些與特定頭文件、程序庫和其他文件版本有關的代碼。 代碼舉例&#xff1a;新建define.cpp文件 &#xff03;include "iostream.h" int main() { #ifdef DEBUG cout<< "Beginning ex…

redhat 6.6 安裝 (LVM)

http://www.cnblogs.com/kerrycode/p/4341960.html轉載于:https://www.cnblogs.com/zengkefu/p/4954955.html

MFC對話框最小化到托盤

1、在資源中的Icon中導入一個自己喜歡的圖標&#xff0c;ID命名為IDR_MAINFRAME&#xff0c;將先前的IDR_MAINFRAME的圖標刪除掉&#xff1b; 2、在自己的Dialog頭文件中定義一個變量 NOTIFYICONDATA m_nid&#xff0c;關于該結構體的具體信息可以查閱MSDN&#xff1b; 3、添加…

Android acache讀后感

今天了解到了一個android輕量級的開源緩存框架,(github&#xff1a;https://github.com/yangfuhai/ASimpleCache),花了一點時間研究了一下源代碼&#xff0c;大概的思路就是每個緩存目錄對應一個Acache類&#xff0c;通過mInstanceMap關聯&#xff08;個人覺得這個主要是減少對…

continue break

塊作用域 一個塊或復合語句是用一對花括號&#xff08;"{}"&#xff09;括起來的任意數量的簡單的java語句。塊定義了變量的作用范圍。 1、嵌套塊是方法內的嵌套&#xff0c;不包括類的花括號。在嵌套塊內的 變量是不可以重復定義的。 2、不允許重復定義的是局部變…

GetVersionEx 獲取系統版本信息

轉自&#xff1a;http://blog.csdn.net/yyingwei/article/details/8286658 最近在windows 8上獲取系統版本信息需要調用系統API&#xff0c;于是用到了GetVersionEx。 首先看一看函數原型&#xff1a; [cpp] view plaincopy BOOL GetVersionEx(POSVERSIONINFO pVersionInformat…

popoverController(iPad)

一、設置尺寸 提示&#xff1a;不建議&#xff0c;像下面這樣吧popover的寬度和高度寫死。 1 //1.新建一個內容控制器2 YYMenuViewController *menuVc[[YYMenuViewController alloc]init];3 4 //2.新建一個popoverController&#xff0c;并設置其內容控制器5 s…

靜態成員變量和非靜態成員變量的對比

靜態成員變量和非靜態成員變量的對比 1、存儲的數據 靜態成員變量存儲的是所有對象共享的數據 非靜態成員變量存儲的是每個對象特有的數據 2、存儲位置 靜態成員變量是隨著類的加載在方法區的靜態區開辟內存了 非靜態成員變量是隨著對象的創建再堆中開辟內存 3、調用方式 靜態成…

c++的thread類(c++線程簡單用法)

最近看了一個Thread類&#xff08;忘記在哪里看的了&#xff09;&#xff0c;感覺不錯。 創建線程時線程對應的函數必須是類的靜態成員&#xff0c;由于靜態成員無法訪問類的非靜態成員&#xff0c;我從前都是把對象的指針作為參數傳遞給線程函數來避免這個問題&#xff0c;但是…

[LeetCode]Merge Sorted Array

題目描述:(鏈接) Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:You may assume that nums1 has enough space (size that is greater or equal to m n) to hold additional elements from nums2. The number of eleme…

[LeetCode]Integer to Roman

題目描述:(鏈接&#xff09; Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999. 解題思路&#xff1a; 1 class Solution {2 public:3 string intToRoman(int num) {4 vector<int> values{1000…

[c++]代理對象模式

代理對象 <code class"hljs cpp has-numbering" style"display: block; padding: 0px; box-sizing: border-box; font-family: Source Code Pro, monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius:…

this static 面向對象三大特點

面向對象三大特點&#xff1a;封裝、繼承、多態 封裝&#xff1a;只對外界提供有用的屬性和行為 this&#xff1a;是一個引用&#xff0c;總是指向當前對象 static 存放位置是方法區中的靜態區 static特點 static修飾的成員變量隨著類的加載就在靜態區中開辟內存 所…

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++代理 Surrogate

容器通常只能包含一種類型的對象&#xff0c;所以很難在容器中存儲對象本身。存儲指向對象的指針&#xff0c;雖然允許通過繼承來處理類型不同的問題&#xff08; 多態性 &#xff09;&#xff0c;但是也增加了內存分配的額外負擔。所以我們通過定義名為 代理 的對象來解決該問…