1 前言
現代電子和計算機技術的發展為信息的轉換與處理提供了極其完善的手段,使檢測與控制技術發展到了新的階段,數據采集卡的應用就是其中的一項重要內容。目前,Windows正以其良好的圖形用戶界面、靈活簡單的操作贏得了廣泛的用戶。在工業控制系統的開發中,越來越多的用戶也要求控制系統提供Windows風格的友好界面。C++Builder是Borland(Inprise)公司開發的Windows下可視化的C++編程環境,它常被簡稱為BCB或CB。BCB不僅功能強大,而且學習簡單、使用方便,但它不具備直接對硬件I/O地址進行讀寫的能力,需要調用DLL函數實現對I/O端口的訪問和控制,PCL
2 PCL
研華PCL
外部信號(數字量、模擬量) |
|
PCL |
|
計算機 |
圖1 PCL
圖2 實踐應用原理圖
3.1 DLL技術
對PCL
(1)利用“研華”光盤中附帶的GeniDAQ Development開發環境,這是研華針對PCL系列板提供的標準開發環境,其優點是針對性強,缺點是不是通用的開發環境,程序移植性較差;
(2)由用戶自行開發針對底層硬件的驅動程序,這種方法靈活性最大,代碼執行效率也高,可以充分發揮硬件的性能,但是要求開發者具有相當高的計算機軟、硬件水平;
(3)采用通用的開發環境(Visual C++、Delphi、C++Builder等),調用“研華”提供的標準動態鏈接庫文件和第三方制作的ActiveX控件,采用這種方法可以在一定程度上降低程序開發的難度,在提供較好靈活性的同時,提供相對于第一種方法更好的移植性。因此,在實際中多采用第三種方法進行軟件開發。
動態鏈接庫(Dynamic Link Library,簡稱DLL)是一種基于Windows的程序模塊。之所以稱之為“動態”,是因為它們在運行期間被裝入和鏈接到應用程序的,而不是在編譯期間。DLL中只包含供應用程序運行時裝入該DLL的有關信息,并非是源代碼的復制,因此在Windows中使用DLL可以使多個應用程序之間共享代碼和源程序,從而提高運行效率。下面對幾個關鍵的DLL函數作簡單說明。
(1)DRV_DeviceOpen( ):該函數必須最先被調用,它加載一個設備驅動程序到內存,并確定設備的類型,完成對設備的初始化,使設備做好I/O的準備工作,同時返回一個函數值,若設備驅動成功則返回非“0”的設備句柄,否則返回“0”。
(2)DRV_DeviceClose( ):該函數是關閉由DRV_DeviceOpen( )函數打開的設備,它的函數參數是由DRV_DeviceOpen( )函數返回的設備句柄,若設備關閉成功則返回非“0”,否則返回“0”。
(3)DRV_DeviceGetFeatures( ):該函數從由DRV_DeviceOpen( )函數打開的設備中獲取相關的硬件信息;同時返回一個函數值,若操作成功則返回非“0”值,否則返回“0”。
(4)DRV_AIVoltageIn( ):外部模擬量信號首先在PCL
(5)DRV_AOVoltageOut( ):該函數的作用是輸出模擬量值到PCL
(6)DRV_DioReadPortByte( )和DRV_DioWritePortByte( ):這兩個函數的作用是幫助計算機與外部設備通過PCL
3.2 I/O基地址的設置
PCL
表1 PCL
3.3
為簡明起見,筆者用一個實例闡述PCL
(1)按照用戶手冊,根據實際需要完成PCL
創建一個C++Builder工程,并根據實際需要進行窗體的設計,筆者設計的窗體外觀如下:
數字量的輸入共有16路(即16位數字量),分為兩個字節,低八位記為通道0,高八位記為通道1,而“輸入通道顯示”可以清楚的指示出是哪一路是高電平或低電平,“掃描時間”用來更改數字量輸入的刷新時間;數字量的輸出同樣分為通道0和通道1;模擬量最多有16路單通道信號輸入,電壓范圍可由軟件設定為±5V、±2.5V、±1.25V、±0.625V,在“輸入數據”欄顯示外部輸入的電壓值;模擬量的輸出只有兩個通道,在“手動輸出”欄可以任意設定輸出的電壓值(不超過額定輸出電壓),“自動輸出”是指把外部輸入的電壓值直接輸出。
(2)在Unit1.h頭文件中定義一些公有變量,代碼如下:
PT_DioReadPortByte ptDioReadPortByte; //數字量輸入數據結構體
PT_DioWritePortByte ptDioWritePortByte; //數字量輸出數據結構體
PT_AIVoltageIn ptAIVoltageIn; //模擬量輸入經A/D后的數據
PT_AIGetConfig ptAIGetConfig; //模擬量輸入數據結構體
PT_AOVoltageOut ptAOVoltageOut; //模擬量輸出數據結構體
(3)程序源代碼的編制如下:
void __fastcall TForm1::Button1Click(TObject *Sender) //選擇板卡
{… …
DRV_DeviceOpen(0, &hDH);
… … }
//數字量的輸入和輸出
void __fastcall TForm1::TimInTimer(TObject *Sender)
{ ptDioReadPortByte.port =ComboBox1->Text.ToInt() ;
… …
DRV_DioWritePortByte(hDH,(LPT_DioWritePortByte)&ptDioWritePortByte);
… … }
//模擬量輸入
void __fastcall TForm1::TimAInTimer(TObject *Sender) //模擬量輸入掃描循環
{ gwChannel=ComboBox3->Text .ToInt();
ptAIVoltageIn.TrigMode = 0; // 觸發方式 軟件/內部觸發
… …}
//模擬量輸出
void __fastcall TForm1::TimAOutTimer(TObject *Sender)
{ ptAOVoltageOut.chan = ComboBox5->Text .ToInt() ;
ptAOVoltageOut.OutputValue = fVoltage;
DRV_AOVoltageOut(hDH,(LPT_AOVoltageOut)&ptAOVoltageOut);}
//程序退出
void __fastcall TForm1::ExitClick(TObject *Sender)
{ … …
DRV_DeviceClose((LONG far *)&hDH);
Close(); }
說明:因限于篇幅,上述程序設計只列出部分關鍵代碼。
4 結束語
本文充分利用臺灣研華公司提供的動態鏈接庫文件,結合C++Builder可視化的編程環境,在充分發揮PCL
參考文獻:
[1]PCL
[2]郭文夷,等。C++ Builder 6.0 程序設計[M]。西安:西安電子科技大學出版社,2004。