PCI2006 数据采集卡
WIN2000/XP 驱动程序使用说明书
北京阿尔泰科技发展有限公司
产品研发部修订
北京阿尔泰科技发展有限公司
请您务必阅读《
使用纲要》,他会使您事半功倍!
目 录
目 录 ...............................................................................................................................................................................1
第一章 版权信息与命名约定..................................................................................................................................2
第一节、版权信息 ...........................................................................................................................................2
第二节、命名约定 ...........................................................................................................................................2
第二章 使用纲要 .....................................................................................................................................................2
第一节、使用上层用户函数,高效、简单....................................................................................................2
第二节、如何管理 PCI 设备............................................................................................................................2
第三节、如何用非空查询方式取得 AD 数据..................................................................................................2
第四节、如何用半满查询方式取得 AD 数据..................................................................................................3
第五节、如何用中断方式取得 AD 数据..........................................................................................................3
第六节、如何实现开关量的简便操作............................................................................................................7
第七节、哪些函数对您不是必须的................................................................................................................7
第三章 PCI 即插即用设备操作函数接口介绍 ......................................................................................................7
第一节、设备驱动接口函数总列表(每个函数省略了前缀“PCI2006_”)............................................8
第二节、设备对象管理函数原型说明..........................................................................................................10
第三节、AD 程序查询方式采样操作函数原型说明.....................................................................................12
第四节、AD 中断方式采样操作函数原型说明.............................................................................................17
第五节、AD 硬件参数保存与读取函数原型说明.........................................................................................20
第六节、DA 模拟量输出操作函数原型说明.................................................................................................21
第七节、DIO 数字量输入输出开关量操作函数原型说明...........................................................................22
第四章 硬件参数结构 ...........................................................................................................................................23
第一节、AD 硬件参数结构(PCI2006_PARA_AD).......................................................................................23
第二节、数字量输入参数(PCI2006_PARA_DI)........................................................................................26
第三节、数字量输出参数(PCI2006_PARA_DO)........................................................................................28
第五章 数据格式转换与排列规则........................................................................................................................30
第一节、AD 原码 LSB 数据转换成电压值的换算方法.................................................................................30
第二节、AD 采集函数的 ADBuffer 缓冲区中的数据排放规则...................................................................30
第三节、AD 测试应用程序创建并形成的数据文件格式.............................................................................31
第四节、DA 电压值转换成 LSB 原码数据的换算方法.................................................................................31
第六章 上层用户函数接口应用实例....................................................................................................................32
第一节、怎样使用 ReadDeviceProAD_ NotEmpty 函数直接取得 AD 数据................................................32
第二节、怎样使用 ReadDeviceProAD_Half 函数直接取得 AD 数据..........................................................32
第三节、怎样使用中断方式取得 AD 数据....................................................................................................32
第四节、怎样使用 WriteDeviceDA 函数取得 DA 数据................................................................................32
第五节、怎样使用 GetDeviceDI 函数进行更便捷的数字开关量输入操作..............................................32
第六节、怎样使用 SetDeviceDO 函数进行更便捷的数字开关量输出操作..............................................32
第七章 高速大容量、连续不间断数据采集及存盘技术详解............................................................................32
第一节、使用程序查询方式实现该功能......................................................................................................34
第二节、使用中断方式实现该功能..............................................................................................................35
第八章 共用函数介绍 ...........................................................................................................................................35
第一节、公用接口函数总列表(每个函数省略了前缀“PCI2006_”)..................................................35
第二节、PCI 内存映射寄存器操作函数原型说明.......................................................................................36
第三节、IO 端口读写函数原型说明.............................................................................................................43
第四节、线程操作函数原型说明..................................................................................................................46
第五节、文件对象操作函数原型说明..........................................................................................................48
1
PCI2006 WIN2000/XP 驱动程序使用说明书 版本:6.011
第一章 版权信息与命名约定
第一节、版权信息
本软件产品及相关套件均属北京阿尔泰科技发展有限公司所有,其产权受国家法律绝对保护,除非本公司
书面允许,其他公司、单位、我公司授权的代理商及个人不得非法使用和拷贝,否则将受到国家法律的严厉制
裁。您若需要我公司产品及相关信息请及时与当地代理商联系或直接与我们联系,我们将热情接待。
第二节、命名约定
一、为简化文字内容,突出重点,本文中提到的函数名通常为基本功能名部分,其前缀设备名如 PCIxxxx_
则被省略。如 PCI2006_CreateDevice 则写为 CreateDevice 。
二、函数名及参数中各种关键字缩写
缩写 全称 汉语意思 缩写 全称 汉语意思
Dev Device
Pro Program
Int Interrupt
Dma Direct Memory
Access
AD Analog convert
to Digital
Npt Not Empty
Para Parameter
SRC Source
TRIG Trigger
CLK Clock
GND Ground
Lgc Logical
Phys Physical
设备
程序
中断
直接内存存取
模数转换
非空
参数
源
触发
时钟
地
逻辑的
物理的
DI Digital Input
DO Digital Output
CNT Counter
DA Digital convert
to Analog
DI Differential
SE Single end
DIR Direction
ATR Analog Trigger
DTR Digital Trigger
Cur Current
OPT Operate
ID Identifier
数字量输入
数字量输出
计数器
数模转换
(双端或差分) 注:
在常量选项中
单端
方向
模拟量触发
数字量触发
当前的
操作
标识
第二章 使用纲要
第一节、使用上层用户函数,高效、简单
如果您只关心通道及频率等基本参数,而不必了解复杂的硬件知识和控制细节,那么我们强烈建议您使用
上层用户函数,它们就是几个简单的形如Win32 API 的函数,具有相当的灵活性、可靠性和高效性。诸如
InitDeviceProAD、 ReadDeviceProAD_ NotEmpty、 SetDeviceDO等。而底层用户函数如 WriteRegisterULong、
ReadRegisterULong、 WritePortByte、 ReadPortByte……则是满足了解硬件知识和控制细节、且又需要特殊复杂
控制的用户。但不管怎样,我们强烈建议您使用上层函数(在这些函数中,您见不到任何设备地址、寄存器端
口、中断号等物理信息,其复杂的控制细节完全封装在上层用户函数中。)对于上层用户函数的使用,您基本
上不必参考硬件说明书,除非您需要知道板上D 型插座等管脚分配情况。
第二节、如何管理 PCI 设备
由于我们的驱动程序采用面向对象编程,所以要使用设备的一切功能,则必须首先用CreateDevice 函数创
建一个设备对象句柄hDevice ,有了这个句柄,您就拥有了对该设备的绝对控制权。然后将此句柄作为参数传
递给相应的驱动函数,如InitDeviceProAD 可以使用hDevice 句柄以程序查询方式初始化设备的AD 部件,
ReadDeviceProAD_ NotEmpty
SetDeviceDO函数可用实现开关量的输出等。最后可以通过 ReleaseDevice将hDevice释放掉。
(或ReadDeviceProAD_Half)函数可以用hDevice句柄实现对 AD数据的采样读取,
第三节、如何用非空查询方式取得 AD 数据
当您有了hDevice 设备对象句柄后,便可用InitDeviceProAD 函数初始化AD 部件,关于采样通道、频率等参
数的设置是由这个函数的pADPara 参数结构体决定的。您只需要对这个pADPara 参数结构体的各个成员简单赋
值即可实现所有硬件参数和设备状态的初始化。然后用StartDeviceProAD即可启动AD 部件,开始AD 采样,然
后便可用ReadDeviceProAD_ NotEmpty
StopDeviceProAD ,当您需要关闭AD 设备时, ReleaseDeviceProAD便可帮您实现(但设备对象hDevice依然存在)。
反复读取AD 数据以实现连续不间断采样。当您需要暂停设备时,执行
2
北京阿尔泰科技发展有限公司
(注:ReadDeviceProAD_ NotEmpty 虽然主要面对批量读取、高速连续采集而设计,但亦可用它以单点或几点
的方式读取AD 数据,以满足慢速、高实时性采集需要)。具体执行流程请看下面的图 2.1.1 。
第四节、如何用半满查询方式取得 AD 数据
当您有了hDevice 设备对象句柄后,便可用InitDeviceProAD 函数初始化AD 部件,关于采样通道、频率等参
数的设置是由这个函数的pADPara 参数结构体决定的。您只需要对这个pADPara 参数结构体的各个成员简单赋
值即可实现所有硬件参数和设备状态的初始化。然后用StartDeviceProAD即可启动AD 部件,开始AD 采样,接
着调用
GetDevStatusProAD函数以查询AD 的存储器FIFO 的半满状态,如果达到半满状态,即可用
ReadDeviceProAD_Half函数读取一批半满长度(或半满以下)的AD数据,然后接着再查询FIFO的半满状态,
若有效再读取,就这样反复查询状态反复读取 AD数据即可实现连续不间断采样。当您需要暂停设备时,执行
StopDeviceProAD,当您需要关闭AD设备时,ReleaseDeviceProAD便可帮您实现(但设备对象hDevice依然存在)。
(注:
ReadDeviceProAD_Half函数在半满状态有效时也可以单点或几点的方式读取AD数据,只是到下一次半
满信号到来时的时间间隔会变得非常短,而不再是半满间隔。)具体执行流程请看下面的图 2.1.2 。
第五节、如何用中断方式取得 AD 数据
当您有了hDevice 设备对象句柄后,便可用InitDeviceIntAD 函数初始化AD 部件,关于采样通道、频率等的
参数的设置是由这个函数的pPara 参数结构体决定的。您只需要对这个pPara 参数结构体的各个成员简单赋值即
可实现所有硬件参数和设备状态的初始化。同时应调用CreateSystemEvent 函数创建一个内核事件对象句柄
hEvent 赋给
启动AD 部件,开始AD 采样,接着调用Win32 API 函数WaitForSingleObject等待hEvent中断事件的发生,在中断
未到时,自动使所在线程进入睡眠状态(不消耗CPU 时间),反之,则立即唤醒所在线程,执行它下面的代码,
此时您便可用
断事件,若有效再读取,就这样反复读取AD 数据即可实现连续不间断采样。当您需要暂停设备时,执行
StopDeviceIntAD,当您需要关闭AD设备时,ReleaseDeviceIntAD便可帮您实现(但设备对象hDevice依然存在)。
(注:
断事件到来时的时间间隔会变得非常短,而不再是半满间隔,但它不同于半满查询方式读取,由于半满中断属
于硬件中断,其优先级别高于所有软件,所以您单点或几点读取AD 数据时,千万不能让中断间隔太短,否则,
有可能使您的整个系统被半满中断事件吞没,就象死机一样,不能动弹。 切忌、切忌!)具体执行流程请看
图 2.1.3 。
注意:图中较粗的虚线表示对称关系。如红色虚线表示
最初执行一次
InitDeviceIntAD的相应参数,它将作为接受AD半满中断事件的变量。然后用 StartDeviceIntAD即可
ReadDeviceIntAD函数一批半满长度(或半满以下)的AD数据,然后再接着再等待FIFO的半满中
ReadDeviceIntAD函数在半满中断事件发生时可以单点或几点的方式读取AD数据,只是到下一次半满中
CreateDevice和 ReleaseDevice两个函数的关系是:
CreateDevice,在结束是就须执行一次 ReleaseDevice。
3
PCI2006 WIN2000/XP 驱动程序使用说明书 版本:6.011
开始
创建设备对象
CreateDevice()
重新初始化 AD
初始化设备对象 AD
InitDeviceProAD()
启动 AD 设备
StartDeviceProAD()
接着上次再读 AD 数据
以非空查询方式读取 AD 数据
ReadDeviceProAD_NotEmpty()
用户对采集到的 AD 数据进行处理
其代码应由用户根据需要编写
需要
需要再紧接着读取 AD 数据
以实现连续采集吗?
否
释放 AD 设备
ReleaseDeviceProAD()
需要改变通道或频率或清
FIFO 后再采集吗?
不需要
释放设备对象
ReleaseDevice()
结 束
是
图 2.1.1 非空查询方式 AD 采集过程
4
北京阿尔泰科技发展有限公司
开始
创建设备对象
CreateDevice
重新初始化 AD
启动 AD 设备
初始化设备对象 AD
StartDeviceProAD()
InitDeviceProAD()
查 FIFO 半满状态 ,半满吗 ?
GetDevStatusProAD()
半满
以半满查询方式读取 AD 数据
ReadDeviceProAD_Half()
用户对采集到的 AD 数据进行处理
其代码应由用户根据需要编写
再接着上次查询半满状态和读 AD 数据
向其他线程抛出一定时
间 Sleep(1)
没有半满
是
需要再读取 AD 数据以实现
连续采集吗?
否
释放 AD 设备
ReleaseDeviceProAD
否
需要
需要改变通道或频率或清
FIFO
吗?
不需要
释放设备对象
ReleaseDevice
结 束
图 2.1.2 半满查询方式 AD 采集过程
5
PCI2006 WIN2000/XP 驱动程序使用说明书 版本:6.011
开始
重新初始化 AD
若中断
事件到
达,则被
唤醒,往
下执行
创建设备对象
CreateDevice()
初始化设备对象 AD
InitDeviceIntAD()
启动 AD 设备
StartDeviceIntAD()
等待半满中断事件
WaitForSingleObject(hEvent)
以半满中断方式读取 AD 数据
ReadDeviceIntAD ()
用户对采集到的 AD 数据进行处理
其代码应由用户根据需要编写
创建内核事件对象
CreateSystemEvent()
若中断事件未到,
则睡眠,不往下执行
等于 0
再接着上次等待中断事件
不等于 0, 且不
等于
0xe1000000
判断函数返回值
不等于 0, 且等
于
0xe1000000
需要
需要再紧接着读取 AD 数据
以实现连续采集吗?
释放 AD 设备
ReleaseDeviceIntAD()
需要改变通道或频率或清
FIFO 后再采集吗?
不需要
释放设备对象
ReleaseDevice()
结 束
否
一级缓冲溢出,退出
吗?
是
释放内核事件对象
ReleaseSystemEvent()
是
不
图 2.1.3 中断方式 AD 采集实现过程
6
北京阿尔泰科技发展有限公司
第六节、如何实现开关量的简便操作
当您有了hDevice 设备对象句柄后,便可用SetDeviceDO 函数实现开关量的输出操作,其各路开关量的输出
状态由其bDOSts[16] 中的相应元素决定。由
由其bDISts[16] 中的相应元素决定。
GetDeviceDI函数实现开关量的输入操作,其各路开关量的输入状态
第七节、哪些函数对您不是必须的
公共函数如CreateFileObject , WriteFile ,ReadFile 等一般来说都是辅助性函数,除非您要使用存盘功能。
如果您使用上层用户函数访问设备,那么
WriteRegisterULong, ReadRegisterByte , ReadRegisterWord , ReadRegisterULong 等函数您可完全不必理会,
除非您是作为底层用户管理设备。而
ReadPortWord
功能补充,对用户额外提供的,它们可以帮助您在NT 、Win2000 等操作系统中实现对您原有传统设备如ISA卡、
串口卡、并口卡的访问,而没有这些函数,您可能在基于Windows NT架构的操作系统中无法继续使用您原有
的老设备。
, ReadPortULong 则对PCI 用户来讲,可以说完全是辅助性,它们只是对我公司驱动程序的一种
WritePortByte, WritePortWord, WritePortULong, ReadPortByte,
GetDeviceAddr , WriteRegisterByte, WriteRegisterWord ,
第三章 PCI 即插即用设备操作函数接口介绍
由于我公司的设备应用于各种不同的领域,有些用户可能根本不关心硬件设备的控制细节,只关心AD 的
首末通道、采样频率等,然后就能通过一两个简易的采集函数便能轻松得到所需要的AD 数据。这方面的用户
我们称之为上层用户。那么还有一部分用户不仅对硬件控制熟悉,而且由于应用对象的特殊要求,则要直接控
制设备的每一个端口,这是一种复杂的工作,但又是必须的工作,我们则把这一群用户称之为底层用户。因此
总的看来,上层用户要求简单、快捷,他们最希望在软件操作上所要面对的全是他们最关心的问题,比如在正
式采集数据之前,只须用户调用一个简易的初始化函数(如
采样频率是多少赫兹等,然后便可以用ReadDeviceProAD_ NotEmpty
次采集的点数,即可实现数据连续不间断采样。而关于设备的物理地址、端口分配及功能定义等复杂的硬件信
息则与上层用户无任何关系。那么对于底层用户则不然。他们不仅要关心设备的物理地址,还要关心虚拟地址、
端口寄存器的功能分配,甚至每个端口的Bit 位都要了如指掌,看起来这是一项相当复杂、繁琐的工作。但是这
些底层用户一旦使用我们提供的技术支持,则不仅可以让您不必熟悉PCI 总线复杂的控制协议,同是还可以省
掉您许多繁琐的工作,比如您不用去了解PCI 的资源配置空间、PNP 即插即用管理,而只须用
数便可以同时取得指定设备的物理基地址和虚拟线性基地址。这个时候您便可以用这个虚拟线性基地址,再根
据硬件使用说明书中的各端口寄存器的功能说明,然后使用
口寄存器进行 32 位模式的读写操作,即可实现设备的所有控制。
综上所述,用户使用我公司提供的驱动程序软件包将极大的方便和满足您的各种需求。但为了您更省心,
别忘了在您正式阅读下面的函数说明时,先明白自己是上层用户还是底层用户,因为在《
列表》中的备注栏里明确注明了适用对象。
另外需要申明的是,在本章和下一章中列明的关于 LabView 的接口,均属于外挂式驱动接口,他是通过
LabView 的 Call Labrary Function 功能模板实现的。它的特点是除了自身的语法略有不同以外,每一个基于
LabView 的驱动图标与 Visual C++、 Vi su al Basic、 Delphi 等语言中每个驱动函数是一一对应的,其调用流程和
功能是完全相同的。那么相对于外挂式驱动接口的另一种方式是内嵌式驱动。这种驱动是完全作为 LabView 编
程环境中的紧密耦合的一部分,它可以直接从 LabView 的 Functions 模板中取得,如下图所示。此种方式更适
合上层用户的需要,它的最大特点是方便、快捷、简单,而且可以取得它的在线帮助。关于 LabView 的外挂式
驱动和内嵌式驱动更详细的叙述,请参考 LabView 的相关演示。
InitDeviceProAD)告诉设备我要使用多少个通道,
(或ReadDeviceProAD_Half )函数指定每
GetDeviceAddr函
ReadRegisterULong和 WriteRegisterULong对这些端
设备驱动接口函数总
7
PCI2006 WIN2000/XP 驱动程序使用说明书 版本:6.011
LabView 内嵌式驱动接口的获取方法
第一节、设备驱动接口函数总列表(每个函数省略了前缀“PCI2006_”)
函数名 函数功能 备注
① 设备对象操作函数
CreateDevice
GetDeviceCount
GetDeviceCurrentID
ListDeviceDlg
ReleaseDevice
② AD 的程序方式读取函数
InitDeviceProAD
StartDeviceProAD
SetDevFreqenceAD
ReadDeviceProAD_ NotEmpty
GetDevStatusProAD
ReadDeviceProAD_Half
StopDeviceProAD
ReleaseDeviceProAD
③ 中断方式 AD 读取函数(唯有此种方式采用强制二级队列缓冲和动态链表技术)
InitDeviceIntAD
StartDeviceIntAD
ReadDeviceIntAD
StopDeviceIntAD
ReleaseDeviceIntAD
④ AD 硬件参数系统保存、读取函数
LoadParaAD
SaveParaAD
⑤ DA 模拟量输出操作函数
创建 PCI 设备对象(用设备逻辑号) 上层及底层用户
取得同一种 PCI 设备的总台数 上层及底层用户
取得指定设备句柄指向的设备 ID 号 上层及底层用户
列表所有同一种 PCI 设备的各种配置 上层及底层用户
关闭设备,且释放 PCI 总线设备对象 上层及底层用户
初始化 AD 部件准备传输 上层用户
启动 AD 设备,开始转换 上层用户
可动态改变 AD 采样频率 上层用户
连续读取当前 PCI 设备上的 AD 数据 上层用户
取得当前 PCI 设备 FIFO 半满状态 上层用户
连续批量读取 PCI 设备上的 AD 数据 上层用户
暂停 AD 设备 上层用户
释放设备上的 AD 部件 上层用户
初始化 PCI 设备 AD 部件,如通道等 上层用户
启动 AD 采集 上层用户
连续批量读取 PCI 设备上的 AD 数据 上层用户
停止 AD 采集 上层用户
释放设备上的 AD 部件 上层用户
从 Windows 系统中读入硬件参数 上层用户
往 Windows 系统写入设备硬件参数 上层用户
8
北京阿尔泰科技发展有限公司
InitDeviceProDA
WriteDeviceProDA
初始化 DA
输出 DA 数据
DIO 开关量简易操作函数
GetDeviceDI
SetDeviceDO
开关输入函数 上层用户
开关输出函数 上层用户
使用需知:
Visual C++ & C++Builder
:
要使用如下函数关键的问题是:
首先,必须在您的源程序中包含如下语句:
#include “C:\Art\PCI2006\INCLUDE\PCI2006.H”
注:以上语句采用默认路径和默认板号,应根据您的板号和安装情况确定 PCI2006.H 文件的正确路径,当
然也可以把此文件拷到您的源程序目录中。然后加入如下语句:
#include “PCI2006.H”
另外,要在 VB 环境中用子线程以实现高速、连续数据采集与存盘,请务必使用 VB5.0 版本。当然如果您
有 VB6.0 的最新版,也可以实现子线程操作。
C++ Builder:
要使用如下函数一个关键的问题是首先必须将我们提供的头文件 (PCI2006.H)写进您的源程序头部。如:
#include “\Art\PCI2006\Include\PCI2006.h”,然后再将 PCI2006.Lib 库文件分别加入到您的 C++ Builder 工程
中。其具体办法是选择 C++ Builder 集成开发环境中的工程(Project)菜单中的“添加”(Add to Project)命令,
在弹出的对话框中分别选择文件类型:Library file (*.lib) , 即可选择 PCI2006.Lib 文件。该文件的路径为用户
安装驱动程序后其子目录 Samples\C_Builder 下。
Visual Basic:
要使用如下函数一个关键的问题是首先必须将我们提供的模块文件(*.Bas)加入到您的 VB 工程中。其方法
是选择 VB 编程环境中的工程(Project)菜单,执行其中的"添加模块"(Add Module)命令,在弹出的对话中选择
PCI2006.Bas 模块文件,该文件的路径为用户安装驱动程序后其子目录 Samples\VB 下面。
请注意,因考虑 Visual C++ 和 Visual Basic 两种语言的兼容问题,在下列函数说明和示范程序中,所举的
Visual Basic 程序均是需要编译后在独立环境中运行。所以用户若在解释环境中运行这些代码,我们不能保证完
全顺利运行。
Delphi:
要使用如下函数一个关键的问题是首先必须将我们提供的单元模块文件(*.Pas )加入到您的 Delphi 工程
中。其方法是选择 Delphi 编程环境中的 View 菜单,执行其中的"Project Manager" 命令,在弹出的对话中选
择*.exe 项目,再单击鼠标右键,最后 Add 指令,即可将 PCI2006.Pas 单元模块文件加入到工程中。或者
在 Delphi 的编程环境中的 Project 菜单中,执行 Add To Project 命令,然后选择*.Pas 文件类型也能实现单
元模块文件的添加。该文件的路径为用户安装驱动程序后其子目录 Samples\Delphi 下面。最后请在使用驱
动程序接口的源程序文件中的头部的 Uses 关键字后面的项目中加入:“PCI2006 ”。如:
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
PCI2006; // 注意: 在此加入驱动程序接口单元 PCI2006
LabVIEW/CVI :
LabVIEW 是美国国家仪器公司(National Instrument) 推出的一种基于图形开发、调试和运行程序的集成化环
境,是目前国际上唯一的编译型的图形化编程语言。在以 PC 机为基础的测量和工控软件中,LabVIEW 的市
场普及率仅次于 C++/C 语言。LabVIEW 开发环境具有一系列优点,从其流程图式的编程、不需预先编译就存
在的语法检查、调试过程使用的数据探针,到其丰富的函数功能、数值分析、信号处理和设备驱动等功能,都
令人称道。关于 LabView/CVI 的进一步介绍请见本文最后一部分关于 LabView 的专述。其驱动程序接口单元
模块的使用方法如下:
CreateDevice
一、 在 LabView 中打开 PCI2006.VI 文件,用鼠标单击接口单元图标,比如 CreateDevice 图标
然后按 Ctrl+C 或选择 LabView 菜单 Edit 中的 Copy 命令,接着进入用户的应用程序 LabView 中,按
9
PCI2006 WIN2000/XP 驱动程序使用说明书 版本:6.011
Ctrl+V 或选择 LabView 菜单 Edit 中的 Paste 命令,即可将接口单元加入到用户工程中,然后按以下函
数原型说明或演示程序的说明连接该接口模块即可顺利使用。
二、 根据LabView 语言本身的规定,接口单元图标以黑色的较粗的中间线为中心,以左边的方格为数据输
入端,右边的方格为数据的输出端,如ReadDeviceProAD_ NotEmpty
接口单元,设备对象句柄、用户
分配的数据缓冲区、要求采集的数据长度等信息从接口单元左边输入端进入单元,待单元接口被执行
后,需要返回给用户的数据从接口单元右边的输出端输出,其他接口完全同理。
三、 在单元接口图标中,凡标有“I32 ”为有符号长整型 32 位数据类型,“U16 ”为无符号短整型 16 位数
据类型,“[U16 ]”为无符号 16 位短整型数组或缓冲区或指针,“[U32 ]”与“[U16 ]”同理,只是
位数不一样。
第二节、设备对象管理函数原型说明
♦ 创建设备对象函数(逻辑号)
函数原型:
Visual C++ & C++Builder:
HANDLE CreateDevice (int DeviceID = 0)
Visual Basic
Declare Function CreateDevice Lib "PCI2006" (ByVal DeviceID As Integer = 0) As Long
Delphi
Function CreateDevice(DeviceID : Integer = 0) : Integer;
StdCall; External 'PCI2006' Name ' CreateDevice ';
LabVIEW
DeviceID
功能:该函数使用逻辑号创建设备对象,并返回其设备对象句柄 hDevice 。只有成功获取 hDevice ,您 才能
实现对该设备所有功能的访问。
参数:
DDeevviicceeIID
返回值:如果执行成功,则返回设备对象句柄;如果没有成功,则返回错误码 INVALID_HANDLE_VALUE。
由于此函数已带容错处理,即若出错,它会自动弹出一个对话框告诉您出错的原因。您只需要对此函数的返回
值作一个条件处理即可,别的任何事情您都不必做。
相关函数:
Visual C++ & C++Builder
:
HANDLE hDevice; // 定义设备对象句柄
int DeviceLgcID = 0;
hDevice = CreateDevice ( DeviceLgcID ); // 创建设备对象,并取得设备对象句柄
if(hDevice == INVALIDE_HANDLE_VALUE); // 判断设备对象句柄是否有效
{
return; // 退出该函数
}
:
Visual Basic
:
Dim hDevice As Long ' 定义设备对象句柄
Dim DeviceLgcID As Long
DeviceLgcID = 0
hDevice = CreateDevice ( DeviceLgcID ) ' 创建设备对象,并取得设备对象句柄
If hDevice = INVALID_HANDLE_VALUE Then ' 判断设备对象句柄是否有效
MsgBox “创建设备对象失败”
:
Exit Sub ' 退出该过程
End If
♦ 取得本计算机系统中 PCI2006 设备的总数量
函数原型:
:
:
:
CreateDevice
Return Device Object
D 设备 ID 标识号。
CreateDevice GetDeviceCount GetDeviceCurrentID
ListDeviceDlg ReleaseDevice
程序举例:
程序举例:
10
北京阿尔泰科技发展有限公司
Visual C++ & C++Builder:
int GetDeviceCount (HANDLE hDevice)
Visual Basic:
Declare Function GetDeviceCount Lib "PCI2006" (ByVal hDevice As Long ) As Integer
:
Delphi
Function GetDeviceCount (hDevice : Integer) : Integer;
StdCall; External 'PCI2006' Name ' GetDeviceCount ';
:
LabVIEW
hDevice
GetDeviceCount
Return Value
功能:取得 PCI2006 设备的数量。
参数:hhDDeevviiccee设备对象句柄,它应由
CreateDevice创建。
返回值:返回系统中 PCI2006 的数量。
相关函数: CreateDevice GetDeviceCount GetDeviceCurrentID
ListDeviceDlg ReleaseDevice
♦ 取得该设备当前 ID
函数原型:
Visual C++ & C++Builder:
int GetDeviceCurrentID (HANDLE hDevice)
Visual Basic:
Declare Function GetDeviceCurrentID Lib "PCI2006" (ByVal hDevice As Long)As Integer
:
Delphi
Function GetDeviceCurrentID (hDevice : Integer): Integer;
StdCall; External 'PCI2006' Name 'GetDeviceCurrentID';
:
LabVIEW
请参考相关演示程序。
功能:取得 PCI2006 设备的数量。
参数:
hhDDeevviicce
e 设备对象句柄,它应由
CreateDevice创建。
返回值:返回系统中当前设备相应的 ID 号。
相关函数: CreateDevice GetDeviceCount GetDeviceCurrentID
ListDeviceDlg ReleaseDevice
♦ 用对话框控件列表计算机系统中所有 PCI2006 设备各种配置信息
函数原型:
Visual C++ & C++Builder:
BOOL ListDeviceDlg (HANDLE hDevice)
Visual Basic :
Declare Function ListDeviceDlg Lib "PCI2006" (ByVal hDevice As Long ) As Boolean
:
Delphi
Function ListDeviceDlg (hDevice : Integer) : Boolean;
StdCall; External 'PCI2006' Name ' ListDeviceDlg ';
:
LabVIEW
请参考相关演示程序。
功能:列表系统中 PCI2006 的硬件配置信息。
参数:hhDDeevviiccee设备对象句柄,它应由
CreateDevice创建。
返回值:若成功,则弹出对话框控件列表所有 PCI2006 设备的配置情况。
相关函数:CreateDevice ReleaseDevice
♦ 释放设备对象所占的系统资源及设备对象
函数原型:
11
PCI2006 WIN2000/XP 驱动程序使用说明书 版本:6.011
Visual C++ & C++Builder:
BOOL ReleaseDevice(HANDLE hDevice)
Visual Basic:
Declare Function ReleaseDevice Lib "PCI2006" (ByVal hDevice As Long ) As Boolean
:
Delphi
Function ReleaseDevice(hDevice : Integer) : Boolean;
StdCall; External 'PCI2006' Name ' ReleaseDevice ';
:
LabVIEW
hDevice
ReleaseDevice
Return Value
功能:释放设备对象所占用的系统资源及设备对象自身。
参数:hhDDeevviiccee设备对象句柄,它应由
返回值:若成功,则返回TRUE, 否则返回FALSE, 用户可以用
相关函数:
CreateDevice
CreateDevice创建。
GetLastErrorEx捕获错误码。
应注意的是,
执行这些函数前,必须执行一次
制器、系统内存等。只有这样,当您再次调用
CreateDevice必须和 ReleaseDevice函数一一对应,即当您执行了一次 CreateDevice后,再一次
ReleaseDevice函数,以释放由 CreateDevice占用的系统软硬件资源,如DMA控
CreateDevice函数时,那些软硬件资源才可被再次使用。
第三节、AD 程序查询方式采样操作函数原型说明
♦ 初始化 AD 设备( Initlize device AD for program mode )
函数原型:
Visual C++ & C++Builder:
BOOL InitDeviceProAD( HANDLE hDevice,
PPCI2006_PARA_AD pADPara)
Visual Basic:
Declare Function InitDeviceProAD Lib "PCI2006" (ByVal hDevice As Long, _
ByRef pADPara As PCI2006_PARA_AD) As Boolean
Delphi:
Function InitDeviceProAD(hDevice : Integer;
pADPara : PPCI2006_PARA_AD) : Boolean;
StdCall; External 'PCI2006' Name ' InitDeviceProAD ';
LabVIEW
:
请参考相关演示程序。
功能:它负责初始化设备对象中的AD 部件,为设备的操作就绪做有关准备工作,如预置AD 采集通道、采
样频率等。但它并不启动AD 设备,若要启动AD 设备,须在调用此函数之后再调用
StartDeviceProAD。
参数:
e设备对象句柄,它应由 CreateDevice 创建。
hhDDeevviicce
ppAADDPPaarraa 设备对象参数结构, 它决定了设备对象的各种状态及工作方式,如 AD采样通道、采样频率等。
关于 PCI2006_PARA_AD具体定义请参考 PCI2006.h(.Bas 或 .Pas 或 .VI) 驱动接口文件及本文档中的《
AD硬件参数
结构》章节。
返回值:如果初始化设备对象成功,则返回TRUE, 否则返回FALSE, 用户可用
GetLastErrorEx 捕获当前
错误码,并加以分析。
相关函数: CreateDevice SetDevFrequenceAD InitDeviceProAD
StartDeviceProAD ReadDeviceProAD_ NotEmpty GetDevStatusProAD
ReadDeviceProAD_Half StopDeviceProAD ReleaseDeviceProAD
ReleaseDevice
♦ 启动 AD 设备 (Start device AD for program mode)
函数原型:
Visual C++ & C++Builder:
BOOL StartDeviceProAD (HANDLE hDevice)
Visual Basic:
12
北京阿尔泰科技发展有限公司
Declare Function StartDeviceProAD Lib "PCI2006" (ByVal hDevice As Long ) As Boolean
Delphi:
Function StartDeviceProAD (hDevice : Integer ): Boolean;
StdCall; External 'PCI2006' Name ' StartDeviceProAD ';
LabVIEW:
请参考相关演示程序。
功能:启动AD 设备,它必须在调用InitDeviceProAD 后才能调用此函数。该函数除了启动AD 设备开始转换
以外,不改变设备的其他任何状态。
参数:hhDDeevviiccee设备对象句柄,它应由CreateDevice 创建。
返回值:如果调用成功,则返回TRUE ,且 AD 立刻开始转换,否则返回FALSE ,用户可用
GetLastErrorEx 捕
获当前错误码,并加以分析。
相关函数: CreateDevice SetDevFrequenceAD InitDeviceProAD
StartDeviceProAD ReadDeviceProAD_ NotEmpty GetDevStatusProAD
ReadDeviceProAD_Half StopDeviceProAD ReleaseDeviceProAD
ReleaseDevice
♦ 动态改变采样频率(Set device AD frequency)
函数原型:
Visual C++ & C++Builder:
BOOL SetDevFrequenceAD (HANDLE hDevice,
DWORD nADFrequency)
Visual Basic:
Declare Function SetDevFrequenceAD Lib "PCI2006" (ByVal hDevice As Long, _
ByVal nADFrequency As Long) As Boolean
Delphi:
Function SetDevFrequenceAD (hDevice : Integer;
nADFrequency: LongWord) : Boolean;
StdCall; External 'PCI2006' Name ' SetDevFrequenceAD ';
LabVIEW:
请参考相关演示程序。
功能:在AD采样过程中,可动态改变采样频率(在分组采样中只能改变组内频率 Frequency)。
参数:
hhDDeevviicce
nnAADDFFrreeqquueennccy
e设备对象句柄,它应由 CreateDevice 创建。
y 指定 AD 的当前采样频率。本设备的频率取值范围为 [39Hz, 400KHz]。
返回值:如果调用成功,则返回TRUE ,否则返回FALSE ,用户可用GetLastErrorEx捕获当前错误码,并加
以分析。
相关函数:
CreateDevice SetDevFrequenceAD InitDeviceProAD
StartDeviceProAD ReadDeviceProAD_ NotEmpty GetDevStatusProAD
ReadDeviceProAD_Half StopDeviceProAD ReleaseDeviceProAD
ReleaseDevice
♦ 读取 PCI 设备上的 AD 数据
① 使用 FIFO 的非空标志读取 AD 数据
函数原型:
Visual C++ & C++Builder:
LONG ReadDeviceProAD_NotEmpty ( HANDLE hDevice,
PSHORT pADBuffer,
ULONG nReadSizeWords,
BOOL bCheckOverflow = FALSE)
Visual Basic:
Declare Function ReadDeviceProAD_NotEmpty Lib "PCI2006" (ByVal hDevice As Long, _
B y R e f p A D B u f f e r A s I n t e g e r , _
B y V a l n R e a d S i z e W o r d s A s L o n g , _
ByVal bCheckOverflow As Boolean = False) As Long
Delphi:
Function ReadDeviceProAD_NotEmpty (hDevice : Integer;
13
PCI2006 WIN2000/XP 驱动程序使用说明书 版本:6.011
pADBuffer: Pointer;
nReadSizeWords : LongWord;
bCheckOverflow: Boolean = False) : LongInt;
StdCall; External 'PCI2006' Name ' ReadDeviceProAD_NotEmpty ';
:
LabVIEW
请参考相关演示程序。
功能:一旦用户使用
StartDeviceProAD后,应立即用此函数读取设备上的AD数据。此函数使用FIFO的非空
标志进行读取AD 数据。
参数:
e设备对象句柄,它应由
hhDDeevviicce
CreateDevice创建。
ppAADDBBuuffffeerr接受 AD数据的用户缓冲区,它可以是一个用户定义的数组。关于如何将这些 AD数据转换成相
应的电压值,请参考《
nnRReeaaddSSiizzeeWWoorrdds
数据格式转换与排列规则》。
s 指定一次
ReadDeviceProAD_NotEmpty操作应读取多少字数据到用户缓冲区。注意此参数
的值不能大于用户缓冲区ADBuffer 的最大空间。此参数值只与ADBuffer[] 指定的缓冲区大小有效,而与FIFO 存
储器大小无效。
bbCChheecckkOOvveerrfflloow
w 指定在读取 AD 数据的过程中,是否对溢出标志进行检测。默认值为 FALSE。若指定为
TRUE,表示对溢出标志进行监控,若发生溢出,则该函数立即返回,其返回值表示在溢出前已成功读取的 AD
数据点数,但这个返回值必将小于 nReadSizeWords 参数的值。若指定为 FALSE ,则表示不对 FIFO 存储器的溢
出标志进行监控,即便溢出已发生,也始终返回由 nReadSizeWords 参数指定长度的数据,其返回值也必将等
于 nReadSizeWords 参数值,除非用户在这个函数返回前,就提前调用了 ReleaseDeviceProAD 函数要释放 AD
设备,那么返回值也可能小于 nReadSizeWords 参数值。究竟是溢出还是提前释放 AD 引起的返回值小于
nReadSizeWords 参数值,用户可以在这种情况下,调用 GetLastError 来判断。
返回值: 其返回值表示所成功读取的数据点数(字),也表示当前读操作在ADBuffer缓冲区中的有效数据量。
通常情况下其返回值应与ReadSizeWords参数指定量的数据长度(字)相等,除非用户在这个读操作以外的其他线
程中执行了ReleaseDeviceProAD函数中断了读操作,否则设备可能有问题。对于返回值不等于nReadSizeWords
参数值的,用户可用
GetLastErrorEx捕获当前错误码,并加以分析。
注释:此函数也可用于单点读取和几个点的读取,只需要将 nnRReeaaddSSiizzeeWWoorrddss设置成 1 或相应值即可。其使
用方法请参考《
高速大容量、连续不间断数据采集及存盘技术详解》章节。
相关函数:
CreateDevice SetDevFrequenceAD InitDeviceProAD
StartDeviceProAD ReadDeviceProAD_ NotEmpty GetDevStatusProAD
ReadDeviceProAD_Half StopDeviceProAD ReleaseDeviceProAD
ReleaseDevice
② 使用 FIFO 的半满标志读取 AD 数据
♦ 取得 FIFO 的状态标志
函数原型:
Visual C++ & C++Builder:
BOOL GetDevStatusProAD ( HANDLE hDevice,
PBOOL bNotEmpty,
PBOOL bHalf,
PBOOL bOverflow )
Visual Basic:
Declare Function GetDevStatusProAD Lib "PCI2006" (ByVal hDevice As Long,_
ByRef bNotEmpty As Boolean,_
ByRef bHalf As Boolean,_
ByRef bOverflow As Boolean) As Boolean
Delphi:
Function GetDevStatusProAD (hDevice : Integer;
bNotEmpty: Pointer;
bHalf : Pointer;
bOverflow : Pointer):Boolean;
StdCall; External 'PCI2006' Name ' GetDevStatusProAD ';
LabVIEW:
请参考相关演示程序。
14
北京阿尔泰科技发展有限公司
功能:一旦用户使用
溢出标志)。我们通常用半满标志去同步半满读操作。当半满标志有效时,再紧接着用
StartDeviceProAD后,应立即用此函数查询FIFO存储器的状态(半满标志、非空标志、
ReadDeviceProAD_Half读
取FIFO 中的半满有效AD 数据。
参数:
hhDDeevviicce
bbNNoottEEmmpptty
bbHHaallf
bbOOvveerrfflloow
e设备对象句柄,它应由
y 它将带回 FIFO 的非空状态标志。若等于 TRUE,则表示非空状态有效,否则为无效。
f 它将带回 FIFO 的半满状态标志。若等于 TRUE,则表示半满状态有效,否则为无效。
w 它将带回 FIFO 的溢出状态标志。若等于 TRUE,则表示溢出状态有效,否则为无效。
返回值:若调用成功则返回TRUE ,否则返回FALSE ,用户可以调用
若用户选择半满查询方式读取AD 数据,则当
CreateDevice创建。
GetLastErrorEx函数取得当前错误码。
GetDevStatusProAD函数取得的 bHalf等于TRUE,应立即调用
ReadDeviceProAD_Half读取FIFO中的半满数据。否则用户应继续循环轮询FIFO半满状态,直到有效为止。注
意在循环轮询期间,可以用Sleep函数抛出一定时间给其他应用程序(包括本应用程序的主程序和其他子线程),
以提高系统的整体数据处理效率。
其使用方法请参考本文档的《高速大容量、连续不间断数据采集及存盘技术详解
相关函数:
CreateDevice SetDevFrequenceAD InitDeviceProAD
》章节。
StartDeviceProAD ReadDeviceProAD_ NotEmpty GetDevStatusProAD
ReadDeviceProAD_Half StopDeviceProAD ReleaseDeviceProAD
ReleaseDevice
♦ 当 FIFO 半满信号有效时,批量读取 AD 数据
函数原型:
Visual C++ & C++Builder:
BOOL ReadDeviceProAD_Half( HANDLE hDevice,
PSHORT pADBuffer,
ULONG nReadSizeWords)
Visual Basic:
Declare Function ReadDeviceProAD_Half Lib "PCI2006" ( ByVal hDevice As Long, _
B y R e f p A D B u f f e r A s I n t e g e r , _
B y V a l n R e a d S i z e W o r d s A s L o n g ) A s B o o l e a n
Delphi:
Function ReadDeviceProAD_Half(hDevice : Integer;
pADBuffer: Pointer;
nReadSizeWords : LongWord) : Boolean;
StdCall; External 'PCI2006' Name ' ReadDeviceProAD_Half ';
LabVIEW:
请参考相关演示程序。
功能:一旦用户使用
GetDevStatusProAD后取得的FIFO状态 bHalf等于TRUE(即半满状态有效)时,应立即用
此函数读取设备上FIFO 中的半满AD 数据。
参数:
hhDDeevviicce
e设备对象句柄,它应由
CreateDevice创建。
ppAADDBBuuffffeerr接受 AD数据的用户缓冲区,通常可以是一个用户定义的数组。关于如何将这些 AD数据转换成
相应的电压值,请参考《
nnRReeaaddSSiizzeeWWoorrdds
数据格式转换与排列规则》。
s 指定一次
ReadDeviceProAD_Half操作应读取多少字数据到用户缓冲区。注意此参数的值
不能大于用户缓冲区 ADBuffer的最大空间,而且应等于 FIFO总容量的二分之一 (如果用户有特殊需要可以小于
FIFO的二分之一长)。比如设备上配置了 1K FIFO,即 1024 字,那么这个参数应指定为 512 或小于 512。
返回值:如果成功的读取由 nReadSizeWords参数指定量的 AD数据到用户缓冲区,则返回TRUE,否则返回
FALSE, 用户可用
其使用方法请参考《高速大容量、连续不间断数据采集及存盘技术详解
相关函数:
GetLastErrorEx捕获当前错误码,并加以分析。
》。
CreateDevice SetDevFrequenceAD InitDeviceProAD
StartDeviceProAD ReadDeviceProAD_ NotEmpty GetDevStatusProAD
ReadDeviceProAD_Half StopDeviceProAD ReleaseDeviceProAD
ReleaseDevice
♦ 暂停 AD 设备
15