探討研華32位DLL驅動程序
摘要:本文概述了研華32位DLL驅動程序的構成,并對利用驅動程序開發動態數據采集程序所涉及的部分概念和一些重要參數進行了詳細的分析,對利用32位驅動程序有實用價值。
本文引用地址:http://www.104case.com/article/149070.htm關鍵詞:32位DDL驅動程序動態數據采集
1引言
研華公司是臺灣和中國大陸工業電腦產品最大的供應廠商,其PCWeb-based數據采集和控制產品更是以優良的性價比獲得了眾多的客戶的青睞。32位DLL驅動程序是研華為諸如VC,VB,DELPHI,BorlandC++,C++Builder等高級語言提供的接口,通過這個驅動程序,編程人員可以方便的對硬件進行編程控制。該驅動程序覆蓋了每一款研華的數據采集卡以及MIC-2000、ADAM-4000和ADAM-5000系列模塊,應用極為廣泛,是編制數據采集程序的基礎。雖然該驅動程序的功能強大,但是研華公司為其提供的產品手冊對該驅動程序的講解卻不夠詳盡,讓使用者,有只能修改例子來達到目的的感覺,一些重要函數的參數設置缺乏相應說明。對其使用的概念有些解釋不夠清楚……。本文是在實際編寫動態數據采集程序中經驗的積累,對利用32位驅動程序有實用價值。
232位驅動程序概覽
32位驅動程序主要包括10類函數及其相應的數據結構,這些函數和數據結構在Adsapi32.lib中實現。這10類函數分別是:
DeviceFunctions設備函數
AnalogInputFunctionGroup模擬輸入函數組
AnalogOutputFunctionGroup模擬輸出函數組
DigitalInput/OutputFunctionGroup數字輸入/輸出函數組
CounterFunctionGroup計數器函數組
TemperatureMeasurementFunctionGroup溫度測量函數組
AlarmFunctionGroup報警函數組
PortFunctionGroup端口函數組
CommunicationFunctionGroup通信函數組
EventFunctionGroup事件函數組
可以把這10類函數分為兩個部分:設備函數部分(只包括第一類函數)和操作函數部分(包括第一類函數外的所有函數),設備函數部分負責獲取硬件特征和開關硬件。而操作函數部分則在硬件設備就緒以后,進行具體的采集、通信、輸出、報警等工作。具體工作結束后,調用設備函數關閉設備。這些函數的調用過程如圖1所示。

3動態數據采集程序的實現
用32位DLL驅動程序實現動態數據采集程序時,按觸發方式可以有中斷觸發,DMA觸發和看門狗觸發三種方式可選。DMA觸發方式下的編程難度較大,而看門狗觸發方式是PCL1800特有的觸發方式,所以中斷觸發方式是最常用的觸發方式。
在各種高級語言下,驅動程序提供的函數形式相同,所以此處只給出驅動程序函數的調用流程,在具體的某種高級語言下,只要按照流程圖就能實現動態數據采集。流程圖如下:



ADS_EVT_BUFCHANGE事件,該事件表示內部緩沖區已經半滿。可以將這部分數據傳輸到用戶緩沖區中。
DRV_FAIIntScanStart:開始中斷觸發方式的A/D轉換。
DRV_CheckEvent:檢查是否有設定的事件發生。
DRV_FAICheck:檢查A/D轉換的狀態。在本例中用于檢查究竟是內部緩沖區的前半部分滿了,還是后半部分滿了。
DRV_FAITransfer:將采集的數據從內部緩沖區傳輸到用戶緩沖區。
DRV_FAIStop:結束A/D轉換。
DRV_DeviceClse:關閉指定的數據采集板。
4動態采集程序涉及到驅動程序中部分概念的分析
4.1使用的緩沖區
在驅動程序進行A/D或D/A轉換時,最多可使用三種緩沖區:采集板上的FIFO緩沖區,計算機內存中的內部緩沖區和用戶緩沖區。
使用FIFO緩沖區可以達到更高的采集頻率,如PCL1800使用1K的FIFO緩沖區后,最高采樣頻率可達到330KHZ。但是有些型號的采集板不帶FIFO緩沖區。
內部緩沖區和用戶緩沖區是數據采集程序動態分配給驅動程序使用的兩塊內存區域。這二者的區別在于,內部緩沖區中存放的是RawData(原始數據),用戶緩沖區中存放的是電壓值。關于原始數據和電壓值的區別后面會有介紹。
中斷觸發方式的A/D轉換中這三種緩沖區的使用如圖3所示。

在使用DRV_FAIIntScanStart函數將采樣值放到內部緩沖區有兩種方式:有FIFO和無FIFO。沒有FIFO時,每完成一次A/D轉換就產生一個中斷,驅動程序響應中斷將這個采樣值傳到內部緩沖區中。有FIFO時,采樣值先放在FIFO中,當FIFO半滿或全滿時,才產生一個中斷,驅動程序響應中斷將FIFO中的數據傳送到內部緩沖區中,這是使用FIFO能提高采樣頻率的原因。
4.2雙緩沖區
在不了解數據采集的DMA觸發方式時,很容易把中斷觸發方式下,調用DRV_FAIIntScanStart函數時同時使用FIFO和內部緩沖區的方式認為是雙緩沖區工作方式,進而對PTFAICheck結構的ActiveBuf域產生誤解。實際上,雙緩沖區是指同時使用A、B兩個內部緩沖區。這是在DMA觸發方式下的特殊工作方式,由DRV_FAIDualDmaStart函數啟動。在中斷觸發方式下不能同時使用雙緩沖區的工作方式。
4.3循環(cycle0和非循環(no_cycle)
循環和非循環是指內部緩沖區的使用方式。
非循環方式下,內部緩沖區作為一個整體使用。在非循環方式下執行一次DRV_FAIIntScanStart函數只能進行有限次(1-65536)的A/D轉換,DRV_FAIIntScanStart函數執行過程中將所有數據都放到內部緩沖區;A/D轉換結束后,再用DRV_FAITransfer函數將數據傳送到用戶緩沖區中。
循環方式下,內部緩沖區分為兩個半區使用。執行一次DRV_FAI_IntScanStart函數可以進行無限次的A/D轉換,直到調用DRV_FAI_Stop函數。這種方式下有限的內部緩沖區不可能容納無限多的采集數據。因此,將內部緩沖區分成前后對等的兩個半區。當前半區填滿后產生一個ADS_EVT_BUFCHANGE事件,采集程序中的事件檢查循環捕獲這個事件,調用DRV_FAI_Transfer函數把數據傳送到用戶緩沖區;與此同時DRV_FAI_IntScanStart函數將新轉換的數據放到內部緩沖區的后半部分。當后半區填滿后再產生一個ADS_EVT_BUFCHANGE事件,并用DRVFAIIntScanStart函數將新轉換的數據放到數據傳輸完畢的前半緩沖區,如此循環。
c++相關文章:c++教程
評論