流程管理-研华采集卡驱动程序工作原理及流程说明
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. 引言
研华公司是台湾和中国大陆工业电脑产品最大的供应厂商,其
PC&Web-based数据采集和控制产品更是以优良的性价比获得了众多的客户的青睐。32位DLL驱动程序是研华为诸如VC,VB,DELPHI,Borland C++,C++ Builder 等高级语言提供的接口,通过这个驱动程序,编程人员可以方便的对硬件进行编程控制。该驱动程序覆盖了每一款研华的数据采集卡以及MIC-2000、ADAM-4000和ADAM-5000系列模块,应用极为广泛,是编制数据采集程序的基础。本文是在实际编写动态数据采集程序中经验的积累,对利用32位驱动程序有实用价值。
2. 32位驱动程序概览
32位驱动程序主要包括10类函数及其相应的数据结构,这些函数和数据结构在Adsapi 32.lib中实现。这10类函数分别是:
Device Functions设备函数
Analog Input Function Group模拟输入函数组
Analog Output Function Group模拟输出函数组
Digital Input/Output Function Group数字输入/输出函数组
Counter Function Group计数器函数组
Temperature Measurement Function Group温度测量函数组
Alarm Function Group报警函数组
Port Function Group端口函数组
Communication Function Group通信函数组
Event Function Group事件函数组
可以把这10类函数分为两个部分:设备函数部分(只包括第一类函数)和操作函数部分(包括第一类函数外的所有函数),设备函数部分负责获取硬件特征和开关硬件。而操作函数部分则在硬件设备就绪以后,进行具体的采集、通信、输出、报警等工作。具体工作结束后,调用设备函数关闭设备。这些函数的调用过程如图1所示。
3. 动态数据采集程序的实现
用32位DLL驱动程序实现动态数据采集程序时,传输方式可以有中断传输,DMA传输和软件传输三种方式可选。软件传输速度最慢,DMA传输和中断传输方式是最常用的触发方式。这里主要介绍中断传输方式,但DMA传输方式和中断方
式在使用32位DLL驱动程序实现时流程基本一样,可以参考。
在各种高级语言下,驱动程序提供的函数形式相同,所以此处只给出驱动程序函数的调用流程,在具体的某种高级语言下,只要按照流程图就能实现动态数据采集。中断传输流程图如下:
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为采集板卡上自带的使用FIFO缓冲区可以达到更高的采集频率,如PCI-1710使用4K的FIFO缓冲区后,最高采样频率可达到100KHZ。但是有些型号的采集板不带FIFO缓冲区。
内部缓冲区和用户缓冲区是数据采集程序动态分配给驱动程序使用的两块内存区域。内部缓冲区主要由驱动程序使用,驱动程序从 板卡FIFO中或寄存器将数据通过中断方式或DMA方式传输到内部缓冲区。在例程中该BUFFER指针一般用hBuf命名.
如果是非循环采集,采样完设定好的数据个数后采集停止,驱动停止往内部缓冲区存放数据。如果循环采集,内部缓冲区会循环使用,用户需要在BUFFERCHANGE 事件用DRV_FAITransfer及时将数据取走,以免被新到的数据覆盖。可以放到用户缓冲区中,或者进行存到硬盘的其他数据操作。
用户缓冲区是用户自己用来存放数据的地方,例程中开辟的大小和内部缓冲区一致,这只是示例。 实际应用当中,用户可以根据需要开辟用户缓冲区的大小。例如开辟一个较大的用户缓冲区,在循环采集中将每次采集的数据依次存放其中。采集结束后统一处理。在例程中该BUFFER指针一般用hUserBuf命名,
这二者还有一个区别在于,内部缓冲区中存放的是Raw Data(原始数据),用户缓冲区中存放的可以是原始数据也可以是Float data电压值。通过ptFAITransfer.DataType 参数来确定转换时是原始数据还是电压值。关于原始数据和电压值的区别后面会有介绍。
中断触发方式的A/D转换中这三种缓冲区的使用如图3所示。
在使用DRV_FAIIntScanStart函数将采样值放到内部缓冲区有两种方式:有FIFO和无FIFO。没有FIFO时,每完成一次A/D转换就产生一个中断,驱动程序响应中断将这个采样值传到内部缓冲区中。有FIFO时,采样值先放在FIFO中,当FIFO半满或全满时,才产生一个中断,驱动程序响应中断将FIFO中的数据传送到内部缓冲区中,这是使用FIFO能提高采样频率的原因。
4.2 内部缓冲区的使用方式。
驱动程序在操作内部缓冲区时是将内部缓冲区分为上下两半缓冲区来分别操作。通过这样来保证高速连续采集时,数据不会丢失。在采集时驱动程序从板卡FIFO 或寄存器中将数据传输到内部缓冲区中,当内部缓冲区半满时驱动程序发出BufferChange事件。用户通过执行DRV_FAICheck函数返回的HalfReady
来判断是上半部分还是下半部分缓冲满了,然后执行DRV_FAITransfer来将相应的缓冲中的数据搬走。
在不了解数据采集的DMA触发方式时,很容易把中断触发方式下,调用DRV_FAIIntScanStart函数时同时使用FIFO和内部缓冲区的方式认为是双缓冲区工作方式,进而对PTFAICheck结构的ActiveBuf域产生误解。实际上,双缓冲区是指同时使用A、B两个内部缓冲区。这是PCL-1800卡在DMA触发方式下的特殊工作方式,由DRV_FAIDualDmaStart函数启动。只有PCL-1800卡支持双缓冲方式。在中断触发方式下不能同时使用双缓冲区的工作方式。所以我们一般使用时PT_FAITransfer. ActiveBuf=0 即单缓冲模式。
4.3 循环(cycle0和非循环(no_cycle)
循环和非循环是指内部缓冲区的使用方式。
非循环方式下,内部缓冲区作为一个整体使用。在非循环方式下执行一次