在工控測試系統中,經常需要使用到各類程控儀器,這些程控儀器通常具有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 }