在工控測試系統中,常常須要使用到各種程控儀器,這些程控儀器一般具備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簡介spa
SCPI是可編程儀器標準命令(Standard Commands for Programmable Instruments)的簡稱。操作系統
SCPI規定了在控制器到儀器和儀器到控制器之間的信息交換層消息的構造和內容,於是使得在垂直層面上,同一類型的儀器命令集類似;在水平層面上,不一樣類型儀器之間,同種功能的SCPI命令也一致。code
SCPI命令分爲儀器公用命令和儀器特定控制命令兩部分。公用命令用於控制儀器的某些基本功能操做,其句法和語義遵循IEEE488.2規定。儀器特定控制命令是指每一個程控儀器完成自身命令操做的特定命令。orm
詳細的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 }