DAS-1802HC高性能数据采集卡及其DMA编程
赵从毅 吴征
【摘要】简述了美国吉时利(Keithley)公司的DAS-1802HC数据采集卡的性能及其Windows 95下的VB驱动程序DriverLINX/VB,并结合实例,介绍了该卡在DMA传输方式下的编程方法。
关键词:数据采集,驱动程序,直接存储器存取
The DAS-1802HC High-performence Data-acquisition Board and Its DMA Programming
Abstract:Major features of the DAS-1802HC data acquisition board of Keithley Instruments Inc. of USA and its VB driver DriverLINX/VB in Windows 95 are briefly introduced.Its programming method in DMA mode with an example is also introduced.
Key words:data acquisition,driver,DMA
要构成一个高速实时数据采集系统,必须选择高性能的数据采集产品。DAS-1802HC数据采集卡(以下简称数采卡)是美国Keithley公司DAS-1800数采卡系列中的一个产品。该卡具有高速、多通道、多种触发方式等特点,并配有功能强大的驱动程序DriverLINX/VB,特别适于高速、多通道的实时数据采集。在宝钢2030冷连轧机大电机故障诊断专家系统中,使用该卡完成64个通道的实时数据采集任务,取得了非常满意的效果。本文对DAS-1802 HC数采卡的性能及其驱动程序DriverLINX/VB作一个简要介绍,并结合笔者使用经验,介绍该卡在DMA(direct memory access,直接存储器存取)传输方式下的编程方法。
1 DAS-1802HC数采卡的主要性能[1]
① 64路单端/32路双端模拟量输入;2路模拟量输出;4路/8路数字量输入/输出;
② 最大采样速率333 Ksamples/s;12位分辨率;ISA总线;
③ 64路通道/增益队列,各通道增益可单独设置为1/2/4/8;
④ 1 K字FIFO缓冲器,双通道DMA;
⑤ 外/内触发;模拟/数字触发;预触发(Pre-Trigger)/后触发(Post-Trigger)/全触发(About-Trigger);
⑥ 丰富的驱动程序,以支持不同的开发平台(C/C+ +、VB、LabVIEW、TestPoint等);
⑦ 除基地址用DIP开关设置外,单端/双端、单极性/双极性、DMA通道号等均用软件设置。
2 驱动程序DriverLINX/VB[2,3]
DriverLINX/VB是Keithley公司的数据采集板卡在Windows 95下的VB驱动程序(用于DAS-1800系列的产品序号是DLINX-18VB),系Keithley公司的OEM产品,由美国SST公司开发。该软件是Keithley公司向用户推荐使用的驱动程序。在该软件的强大功能支持下,用户能非常容易地在Windows 95下用VB开发自己的应用程序。该软件与硬件、操作系统及用户应用程序之间的关系如图1所示。
图1 驱动程序框图
DriverLINX/VB是一个独立于硬件的通用产品,它支持在一台计算机中多块多类型数采卡的并发操作,为用户提供的API可以完成100多个前台或后台的数据采集服务。
在DriverLINX/VB中,面向应用程序开发的有3个部分:SR控件和LDD控件(均为ActiveX控件)、一个或多个与硬件有关的DLL库和几个后缀名为Bas的模块。 用户在设计或运行时,可通过设置SR和LDD控件的属性来说明需执行的数据采集任务;DLL库提供了 DriverLINX/VB驱动数采卡的接口;模块定义了 DriverLINX/VB API的子程序声明、符号常量和错误代码。
在高速实时数据采集系统中,数据从数采卡传输至内存通常采用的是DMA方式,若数据量大且连续,则使用双DMA缓冲区技术来保证数据高速、可靠地传输。所谓双DMA缓冲区技术,指的是在内存中分配两个DMA缓冲区,卡上的数据通过DMA方式轮流地传送到两个缓冲区中,并在一个缓冲区填满后通知应用程序,将该缓冲区中的数据转移到VB数组中。DriverLINX/VB对DMA方式强有力的支持,为双DMA缓冲区技术的使用奠定了基础。其主要表现在:
① DriverLINX/VB带有一个虚拟设备驱动器——DriverLINX VxD,通过VxD,DriverLINX/VB在Windows 95管理的内存中开辟出一个或数个在物理上连续的只由DriverLINX/VB管理的数据块,用作DMA缓冲区,缓冲区的数目和大小均可由用户在控制面板中设定,DriverLINX VxD协同卡上的FIFO缓冲器,将卡上数据高速、可靠地轮流传送到各DMA缓冲区中。
② 由于DMA缓冲区由DriverLINX/VB管理,用户的VB程序无法直接读取,因此,DriverLINX/VB还提供了相应的API函数,用户程序可通过API调用将DMA缓冲区中的数据转移到用户程序的VB数组中,以供用户程序使用。
③ 为保证用户程序能及时地从DMA缓冲区中转移数据,DriverLINX/VB还提供了相应的VB事件,在DMA缓冲区数据填满时,DriverLINX/VB通过SR控件使该事件得到触发,以通知用户程序转移数据。
3 DAS-1802HC卡的DMA编程
在DriverLINX/VB软件安装后,用户程序首先要载入DLCODES.BAS、DLVBLIB.BAS、DRVLNXVB.BAS和OEMCODES.BAS这4个模块,并在合适的窗体中载入SR和LDD控件。
在DMA编程之前,用户程序首先要初始化DAS-1802HC卡,若用户定义SR和LDD控件的名称分别为SR-AI和LDD-AI,则初始化程序如下:
Sub Init_SR_AI()
SR-AI.Req-DLL-name=“KMB1800.DLL” '调用与DAS-1802HC卡对应的DLL库
LDD-ff-AI.Req-DLL-name=SR-AI.Req-DLL-name
SR-AI.Req-subsystem=DL-DEVICE '指向卡上的各种数采任务
SR-AI.Req-mode=DL-OTHER '停止各种数采任务
SR-AI.Req-_op=DL-_INITIALIZE '各种数采任务初始化
SR-AI.Refresh '刷新后,执行初始化程序
If SR-AI.Res-result<>DL-NoErr Then '检查初始化结果
SR-AI.Req-op=DL-MESSAGEBOX '显示出错信息
SR-AI.Refresh '刷新后,执行出错程序
End If
End Sub
程序中的“各种数采任务”指的是模拟量输入、模拟量输出、数字量输入、数字量输出和定时/计数任务。
DMA编程,主要包括参数设定、分配DMA缓冲区和数据从DMA缓冲区转移到VB数组几个部分,下面以宝钢课题为例说明编程方法。该课题要求采集64路信号,通道总采样速率为100 kHz,使用卡上定时器作为主时钟,连续采样。程序如下:
.Sub Start-SR-AI() '启动数采卡硬件
SR-AI.Req-subsystem=DL-AI '模拟量输入
SR-AI.Req-mode=DL-DMA 'DMA传输方式
SR-AI.Req-op=DL-START '启动数据采集
'——定时器设置——
SR-AI.Evt-Tim-type=DL-RATEEVENT '周期循环采样
SR-AI.Evt-Tim-rateChannel=DL-DEFAULTTIMER '使用卡上定时器
SR-AI.Evt-Tim-rateMode=DL-RATEGEN '由硬件定时器产生等间隔采样
SR-AI.Evt-Tim-rateClock=DL-INTERNAL '卡上定时器作为数采主时钟源
'设置时钟周期=10 μs
SR-AI.Evt-Tim-ratePeriod=DLSecs2Tics(SR-AI,SR-AI.Evt-Tim-rateChannel,(1/100 000))
SR-AI.Evt-Tim-rateGate=DL-DISABLED '禁止定时器选通(定时器启动后一直有效)
'——设置启停方式——
SR-AI.Evt-Str-type=DL-COMMAND '软件命令方式启动
SR-AI.Evt-Stp-type=DL-COMMAND '软件命令方式停止
'——DMA缓冲区设置——
SR-AI.Sel-buf-N=2 '双DMA缓冲区
SR-AI.Sel-buf-notify=DL-NOTIFY 'DMA缓冲区填满时,触发一个事件
SR-AI.Sel-buf-size=DLSamples2Bytes(SR-AI,0,32 000) '一个DMA缓冲区的容量=32 000个采样数据,并将采样的数据量转换成字节数
SR-AI.Sel-chan-format=DL-tNATIVE 'DMA缓冲区的数据格式设为数采卡预定义格式(双字节整型数)
'——通道参数设定——
SR-AI.Sel-chan-N=2 '通道的定义次数(启始/结束通道各定义一次)
SR-AI.Sel-chan-start=0 '从0通道开始
SR-AI.Sel-chan-startGainCode=DLGain2Code(SR-AI,-1) '双极性,统一增益(±10 V)
SR-AI.Sel-chan-stop=63 '到63通道结束
SR-AI.Sel-chan-stopGainCode=DLGain2Code(SR-AI,-1) '双极性,统一增益(±10V)
SR-AI.Refresh '刷新后,设置有效,并启动采样
'——检查启动结果——
If SR-AI.Res-result <> DL-NoErr Then
SR-AI.Req-op=DL-MESSAGEBOX '显示出错信息
SR-AI.Refresh '刷新后,执行出错程序
End If
End Sub
上段程序中,将DAS-1802HC卡设置成软件命令启停方式,使数采卡启动后,将一直工作到有停止命令为止,这就实施了连续采样。
当DMA缓冲区数据填满时,DriverLINX/VB会通过SR-AI控件触发一个名为SR-AI-BufferFilled的VB事件,在响应该事件的VB程序中,调用API函数VBArrayBufferConvert(),将DMA缓冲区中的数据转移至VB程序定义的数组VBDataArray()中。代码如下:
Temp=SR-AI.VBArrayBufferConvert(bufIndex,0,32 000,VBDataArray(), DL-tINTEGER,0,0)
参数1:指明当前一组数据在哪个DMA缓冲区中;
参数2:从DMA缓冲区的起始位置读取数据;
参数3:从DMA缓冲区读取32 000个采样数据;
参数4:VB数组的地址;
参数5:数据的类型是双字节整型数;
参数6、7:不使用倍增因子和偏移量来修正数据;
返回值:Temp是函数返回的错误代码。
在上面的例子中,使用了双DMA缓冲区技术,其中对缓冲区大小的选择应在工作效率和实时性之间权衡考虑。这是因为系统的采样速率是一定的,故缓冲区的大小将直接影响触发VB事件的时间间隔。若间隔太短,则响应频繁,采集的数据虽能得到较快处理,但系统频繁在事件之间切换,工作效率会降低;反之,若间隔太长,会使数据得不到及时处理,降低了系统的实时性。此外,缓冲区的大小应为64的整数倍,以保证64个通道的数据不被分割开。选择每个缓冲区的容量为32 000个字,可存放32 000个采样数据,填满缓冲区的时间是320 ms。经测试,此时系统的效率和实时性均能达到要求。
由于高速实时数据采集对系统资源要求较高,当Windows 95中有多个进程在执行且CPU负荷较重时,可能导致DriverLINX/VB因对数采卡的DMA请求不能及时响应而挂起,此时,DriverLINX/VB会触发SR-AI-ServiceDone事件通知用户程序。DriverLINX/VB挂起时,采集的数据将会丢失,因此,用户应合理安排CPU的负荷,以保证程序运行中不出现挂起现象。此外,作为防范措施,用户程序应在响应SR-AI-ServiceDone事件中写入下面代码,保证当DriverLINX/VB挂起时,能重新启动DriverLINX/VB:
SR-AI.Req-op=DL-START
SR-AI.Refresh
用户退出应用系统时,程序应停止DriverLINX/VB的工作,通过下面代码完成:
SR-AI.Req-op=DL-STOP
SR-AI.Refresh
综上所述,DAS-1802HC是性能优异的高速数采卡,而DriverLINX/VB 是功能强大的驱动程序,两者完美的结合,为用户在较短时间内完成高速数据采集应用程序的开发创造了条件。
作者单位:赵从毅 (安徽马鞍山市)华东冶金学院(243002)
吴征 (杭州)浙江省电力试验研究所(310014)
参考文献
1 Keithley Instruments Inc..DAS-1800HC Series User's Guide,1996
2 Scientific Software Tools Inc..DriverLINX/VB Technical Reference Manual,1996
3 Scientific Software Tools Inc..DriverLINX 4.0 Installation and Configuration Guide,1996
评论