Pci2300S

更新时间:2023-11-09 22:27:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

北京阿尔泰科贸有限公司 软件版本:5.0 发行时间:2001年12月

PCI2300

DOS/Win95/98/NT/2000 驱 动 程 序 使 用 说 明 书

目 录

第一章 第二章 第三章

第四章

第五章

第六章

第七章

第八章

第九章

第十章

版权信息

本驱动程序软件的关键文件

PCI即插即用设备操作函数接口介绍 第一节 接口函数列表 第二节 PCI2300通用函数 第三节 程序方式AD读取函数

第四节 简易的数字输入、输出I/O开关量操作函数 第五节 PCI内存映射寄存器操作函数

第六节 辅助函数(硬件参数设置、保存、读取函数)原型说明 共用函数介绍

第一节 公用接口函数列表 第二节 公用接口函数原型说明 第三节 其他函数 硬件参数结构

第一节 AD硬件参数结构(PCI2300_PARA_AD)

第二节 用于数字I/O输出参数(PCI2300_PARA_DO) 第三节 用于数字I/O输入参数(PCI2300_PARA_DI) 数据转换与排列规则

第一节 如何将AD原始数据LSB转换电压值Volt

第二节 关于采集函数的InUserRegion缓冲区中的数据排放规则 上层用户函数接口应用实例

第一节 怎样使用ReadDevOneAD函数单点读取AD数据 第二节 怎样使用ReadDevBulkAD函数批量读取AD数据

第三节 怎样使用SetDeviceDO函数进行更便捷的数字开关量输出操作 第四节 怎样使用GetDeviceDI函数进行更便捷的数字开关量输入操作 底层用户函数接口应用实例

第一节 怎样使用映射寄存器读写函数直接编写数据采集程序?

第二节 怎样使用映射寄存器读写函数直接编写开关量输入输出程序? 高速大容量数据采集及存盘技术详解 第一节 使用程序查询方式实现该功能 PCI2300的DOS驱动程序说明

第一章 版权信息

本软件产品及相关套件均属北京市阿尔泰科贸有限公司所有,其产权受国家法律绝对保护,除非本公司书面允许,其他公司、单位、我公司授权的代理商及个人不得非法使用和拷贝,否则将受到国家法律的严厉制裁。您若需要我公司产品及相关信息请及时与我们联系,我们将热情接待。

第二章 本驱动程序软件的关键文件

(WinDir指Windows的系统根目录, UserDir为本驱动软件的用户安装根目录) 文件名 文件类型及功能 适用的操作系文件位置 统 PCI2300.VxD 动态虚拟设备驱动程序库 Window95/98 WinDir\\System PCI2300.Sys WinDir\\System32\\Drivers Win32标准设备驱动WDM模式的Windows NT/2000 设备驱动程序库 PCI2300.Dll WinDir\\System 底层驱动程序库的用户级函数接口所有操作系统 封装所用的动态库。

1

北京阿尔泰科贸有限公司 软件版本:5.0 发行时间:2001年12月

PCI2300.Lib PCI2300.Lib PCI2300.Bas PCI2300.Pas PCI2300.VI 基于Microsoft Visual C++工程开发环境的驱动程序函数接口输入库。 基于Borland C++ Builder工程开发环境的驱动程序函数接口输入库。 基于Microsoft Visual Basic工程开发环境的驱动程序函数接口输入模块文件 基于Borland Delphi工程开发环境的驱动程序函数接口输入单元文件。 基于National Instrument LabView工程开发环境的驱动程序函数接口输入部件文件。(只是外挂驱动接口) 所有操作系统 所有操作系统 所有操作系统 UserDir\\Include 或UserDir\\Samples\\VC? UserDir\\Samples\\C_Builder UserDir\\Samples\\VB 所有操作系统 所有操作系统 UserDir\\Samples\\Delphi UserDir\\Samples\\LabView

第三章 PCI即插即用设备操作函数接口介绍

由于我公司的设备应用于各种不同的领域,有些用户可能根本不关心硬件设备的控制细节、只关心AD的首末通道等,然后就能通过一两个简易的采集函数便能轻松得到所需要的AD数据。这方面的用户我们称之为上层用户。那么还有一部分用户不仅对硬件控制熟悉,而且由于应用对象的特殊要求,则要直接控制设备的每一个端口,这是一种复杂的工作,但又是必须的工作,我们则把这一群需要直接跟设备端口打交道的用户称之为底层用户。因此总的看来,上层用户要求简单,快捷,他们最希望他们在软件操作上所要面对的全是他们最关心的问题,比如在正式采集数据之前,只须用户调用一个简易的ReadDevBulkAD函数,告诉设备我要使用多少个通道等信息后便采集到指定的点数。而关于设备的物理地址、端口分配及功能定义等复杂的硬件信息则与上层用户无任何关系。那么对于底层用户则不然。他们不仅要关心设备的物理地址,还要关心虚拟地址、端口寄存器的功能分配,甚至每个端口的Bit位都要了如指掌,看起来这是一项相当复杂、繁琐的工作。但是这些底层用户一旦使用我们提供的技术支持,则不仅可以让您不必熟悉PCI总线复杂的控制协议,同是还可以省掉您许多繁琐的工作,比如您不用去了解PCI的资源配置空间、PNP即插即用管理,而只须用GetDeviceAddr函数便可以同时取得指定设备的物理基地址和虚拟线性基地址。这个时候您便可以用这个虚拟线性基地址,再根据硬件使用说明书中的各端口寄存器的功能说明,然后使用ReadPortULong和WritePortULong对这些端口寄存器进行32位模式的读写操作,即可实现设备的所有控制。

综上所述,用户使用我公司提供的驱动程序软件包极大的方便和满足您的各种需求。但为了您更省心,别忘了在您正式阅读下面的函数说明时,先得明白自己是上层用户还是底层用户,因为在《第一节 接口函数列表》中的备注栏里明确注明了适用对象。

另外需要申明的是,在本章和下一章中列出的关于LabView的接口,均属于外挂式驱动接口,他是通过LabView的Call Labrary Function功能模板实现的。它的特点是除了自身的语法略有不同以外,每一个基于LabView的驱动图标与Visual C++、Visual Basic、Delphi等语言中每个驱动函数是一一对应的,其调用流程和功能是完全相同。那么相对于外挂式驱动接口的另一种方式是内嵌式驱动。这种驱动是完全作为LabView编程环境中的紧密耦合的一部分,它可以直接从LabView的Functions模板中取得,如下图所示。此种方式更适合上层用户的需要,它的最大特点是方便、快捷、简单,而且可以取得它的在线帮助。此功能由于LabView自身版本兼容的问题,我们不便提供内嵌式驱动,如果用户确有此要求,请与我们的代理商或公司总部联系,但我们不保证完全免费。

关于LabView的外挂式驱动和内嵌式驱动更详细的叙述,请参考附录A的《LabView驱动程序接口》章节。

2

北京阿尔泰科贸有限公司 软件版本:5.0 发行时间:2001年12月

LabView内嵌式驱动接口的获取方法

第一节 接口函数列表(每个函数省略了前缀“PCI2300_”) 函数名 函数功能 备注 PCI通用函数 CreateDevice 创建PCI设备对象 上层及底层用户 GetDeviceCount 取得同一种PCI设备的总台数 上层及底层用户 ListDevice 列表所有同一种PCI设备的各种配置 上层及底层用户 ReleaseDevice 关闭设备,且释放PCI总线设备对象 上层及底层用户 程序方式AD读取函数 ReadDevOneAD 单点读取PCI设备上的AD数据 上层用户 ReadDevBulkAD 批量读取PCI设备上的AD数据 上层用户 开关量简易操作函数 SetDeviceDO 开关输出函数 上层用户 GetDeviceDI 开关输入函数 上层用户 PCI总线内存映射寄存器操作函数 GetDeviceAddr 取得指定PCI设备寄存器操作基地址 底层用户 WritePortByte 以字节(8Bit)方式写I/O端口 用户程序操作端口 WritePortWord 以字(16Bit)方式写I/O端口 用户程序操作端口 WritePortULong 以无符号双字(32Bit)方式写I/O端口 用户程序操作端口 ReadPortByte 以字节(8Bit)方式读I/O端口 用户程序操作端口 ReadPortWord 以字(16Bit)方式读I/O端口 用户程序操作端口 ReadPortULong 以无符号双字(32Bit)方式读I/O端口 用户程序操作端口 WritePortByteEx 以字节(8Bit)方式写I/O端口 NT下直接操作端口 WritePortWordEx 以字(16Bit)方式写I/O端口 NT下直接操作端口 WritePortULongEx 以无符号双字(32Bit)方式写I/O端口 NT下直接操作端口 ReadPortByteEx 以字节(8Bit)方式读I/O端口 NT下直接操作端口 ReadPortWordEx 以字(16Bit)方式读I/O端口 NT下直接操作端口 ReadPortULongEx 以无符号双字(32Bit)方式读I/O端口 NT下直接操作端口

3

北京阿尔泰科贸有限公司 软件版本:5.0 发行时间:2001年12月

使用需知:

Visual C++ & C++Builder: 要使用如下函数关键的问题是:

首先,必须在您的源程序中包含如下语句:

#include “C:\\Art\\PCI2300\\INCLUDE\\PCI2300.H”

注:以上语句采用默认路径和默认板号,应根据您的板号和安装情况确定PCI2300.H文件的正确路径,当然也可以把此文件拷到您的源程序目录中。

其次,您还应该在Visual C++编译环境软件包的Project Setting对话框的Link属性页中的Object/Library Module输入行中加入指令C:\\Art\\PCI2300\\PCI2300.LIB

或者:单击Visual C++编译环境软件包的Project菜单中的Add To Project的菜单项,在此项中再单击Files?,在随后弹出的对话框中选择PCI2300.Lib,再单击“确定”,即可完成。

注:以上语句采用默认路径和默认板号,应根据您的板号和安装情况确定PCI2300.LIB的路径,当然也可以把此文件拷到您的源程序目录中。 另外,在Visual C++演示工程的目录下,也有相应的PCI2300.h和PCI2300.Lib文件。

为了驱动程序和相关接口尽量精炼快速,所以没有加任何调试代码,因此用户在使用VC接口的时候应使用发行版本进行源代码编译(Win32 Release),而不应该使用调试版本(Win32 Debug)。具体方法是在源代码编译前,执行Build总菜单中的Set Active Configuration子菜单命令,便可实现其发行版的设置,然后再编译,即可生成发行版的应用程序。

C++ Builder:

要使用如下函数一个关键的问题是首先必须将我们提供的头文件

(PCI2300.H)写进您的源程序头部。如:#include “\\Art\\PCI2300\\Include\\PCI2300.h” 然后再将PCI2300.Lib库文件分别加入到您的C++ Builder工程中。其具体办法是选择C++ Builder集成开发环境中的工程(Project)菜单中的“添加”(Add to Project)命令,在弹出的对话框中分别选择文件类型:Library file (*.lib) , 即可选择PCI2300.Lib文件。该文件的路径为用户安装驱动程序后其子目录Samples\\C_Builder下 Visual Basic:

要使用如下函数一个关键的问题是首先必须将我们提供的模块文件(*.Bas)加入到您的VB工程中。其方法是选择VB编程环境中的工程(Project)菜单,执行其中的\添加模块\Module)命令,在弹出的对话中选择PCI2300.Bas模块文件,该文件的路径为用户安装驱动程序后其子目录Samples\\VB下面。

请注意,因考虑Visual C++和Visual Basic两种语言的兼容问题,在下列函数说明和示范程序中,所举的Visual Basic程序均是需要编译后在独立环境中运行。所以用户若在解释环境中运行这些代码,我们不能保证完全顺利运行。 Delphi:

要使用如下函数一个关键的问题是首先必须将我们提供的单元模块文件(*.Pas)加入到您的Delphi工程中。其方法是选择Delphi编程环境中的View菜单,执行其中的\Manager\命令,在弹出的对话中选择*.exe项目,再单击鼠标右键,最后Add指令,即可将PCI2300.Pas单元模块文件加入到工程中。或者在Delphi的编程环境中的Project菜单中,执行Add To Project命令,然后选择*.Pas文件类型也能实现单元模块文件的添加。该文件的路径为用户安装驱动程序后其子目录Samples\\Delphi下面。最后请在使用驱动程序接口的源程序文件中的头部的Uses关键字后面的项目中加入:“PCI2300”。如: uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, PCI2300; // 注意: 在此加入驱动程序接口单元PCI2300 LabView/CVI :

LabVIEW是美国国家仪器公司(National Instrument)推出的一种基于图形开发、调试和运行程序的集成化环境,是目前国际上唯一的编译型的图形化编程语言。在以 PC 机为基础的测量和工控软件中,LabVIEW的市场普及率仅次于C++/C语言。LabVIEW开发环境具有一系列优点,从其流程图式的编程、不需预先编译就存在的语法检查、调试过程使用的数据探针,到其丰富的函数功能、数值分析、信号处理和设备驱动等功能,都令人称道。关于LabView/CVI的进一步介绍请见本文最后一部分关于LabView的专述。其驱动程序接口单元模块的使用方法如下:

一、在LabView中打开PCI2300.VI文件,用鼠标单击接口单元图标,比如CreateDevice图标

然后按Ctrl+C或选择LabView菜单Edit中的Copy命令,接着进入用户的应用程序LabView中,按Ctrl+V或选择LabView菜单Edit中的Paste命令,即可将接口单元加入到用户工程中,然后按以下函数原型说明或演示程序的说明连接该接口模块即可顺利使用。

4

北京阿尔泰科贸有限公司 软件版本:5.0 发行时间:2001年12月

二、根据LabView语言本身的规定,接口单元图标以黑色的较粗的中坚线为中心,以左边的方格为数据输

入端,右边的方格为数据的输出端.

三、在单元接口图标中,凡标有“I32”为有符号长整型32位数据类型,“U16”为无符号短整型16位数据类型,“[U16]”为无符号16位短整型数组或缓冲区或指针,“[U32]”与“[U16]”同理,只是位数不一样。

第二节、PCI2300通用函数 1、创建设备对象函数

Visual C++ & C++Builder:

HANDLE CreateDevice (int DeviceID) Visual Basic:

Declare Function CreateDevice Lib “PCI2300”(Byval DeviceID as long)as long Delphi:

Function CreateDevice(DeviceID:Integer):Integer;

StdCall; External 'PCI2300' Name ' CreateDevice'; LabView:

功能:该函数负责创建PCI设备对象,并返回其设备对象句柄。 参数:

DeviceID 设备ID( Identifier )标识号。当向同一个Windows系统中加入若干相同类型的PCI设备时,我们的驱动程序将以该设备的“基本名称”与DeviceID标识值为名称后缀的标识符来确认和管理该设备。比如若用户往Windows系统中加入第一个PCI2300 AD模板时,驱动程序则以“PCI2300”作为基本名称,再以DeviceID的初值组合成该设备的标识符“PCI2300-0”来确认和管理这第一个设备,若用户接着再添加第二个PCI2300 AD模板时,则系统将以“PCI2300-1”来确认和管理第二个设备,若再添加,则以此类推。所以当用户要创建设备句柄管理和操作第一个PCI设备时,DeviceID应置0,第二个应置1,也以此类推。

返回值:如果执行成功,则返回设备对象句柄;如果没有成功,则返回错误码INVALID_HANDLE_VALUE。由于此函数已带容错处理,即若出错,它会自动弹出一个对话框告诉您出错的原因。您只需要对此函数的返回值作一个条件处理即可,别的任何事情您都不必做。

相关函数:ReleaseDevice

Visual C++ & C++Builder程序举例 :

HANDLE hDevice; // 定义设备对象句柄

hDevice=CreateDevice ( 0 ); // 创建设备对象,并取得设备对象句柄

if(hDevice==INVALIDE_HANDLE_VALUE); // 判断设备对象句柄是否有效 { return; // 退出该函数

)

Visual Basic程序举例 :

Dim hDevice As Long ' 定义设备对象句柄

hDevice = CreateDevice ( 0 ) ' 创建设备对象,并取得设备对象句柄

If hDevice = INVALID_HANDLE_VALUE Then ' 判断设备对象句柄是否有效 Else

Exit Sub ' 退出该过程

End If :

2、取得本计算机系统中PCI2300设备的总数量

函数原型:

Visual C++ & C++Builder:

int GetDeviceCount (HANDLE hDevice) Visual Basic:

Declare Function GetDeviceCount Lib \ Delphi:

5

北京阿尔泰科贸有限公司 软件版本:5.0 发行时间:2001年12月

hDevice 设备对象句柄,它应由CreateDevice或CreateDeviceEx创建。 nPort 设备的I/O端口号。(本设备应使用GetDeviceAddr函数返回的PhysAddr地址作为基地址) Value 写入由nPort指定端口的值。

返回值:若成功,返回TRUE, 否则返回FALSE, 用户可用GetLastError捕获当前错误码。 相关函数: CreateDevice WritePortByte

WritePortWord WritePortULong ReadPortByte ReadPortWord WritePortByteEx WritePortWordEx WritePortULongEx ReadPortByteEx ReadPortWordEx ReadPortULongEx ReadPortULongEx ReleaseDevice

2 以双字(16Bit)方式写I/O端口 Visual C++ & C++ Builder:

BOOL WritePortWord (HANDLE hDevice, UINT nPort, WORD Value) BOOL WritePortWordEx (UINT nPort, WORD Value)

(在Windows NT/2000用户模式程序中直接访问I/O端口)

Visual Basic:

Declare Function WritePortWord Lib \

ByVal nPort As Long, _

ByVal Value As Integer) As Boolean

Declare Function WritePortWordEx Lib \

ByVal Value As Integer) As Boolean

(在Windows NT/2000用户模式程序中直接访问I/O端口) Delphi:

Function WritePortWord(hDevice : Integer; nPort:LongWord; Value:Word):Boolean; StdCall; External 'PCI2300' Name 'WritePortWord';

Function WritePortWordEx(nPort:LongWord; Value:Word):Boolean; StdCall; External 'PCI2300' Name 'WritePortWord';

LabView:

功能:以双字(16Bit)方式写I/O端口

参数:

hDevice设备对象句柄,它应由CreateDevice创建。 nPort 设备的I/O端口号。(本设备应使用GetDeviceAddr函数返回的PhysAddr地址作为基地址) Value 写入由nPort指定端口的值。

返回值:若成功,返回TRUE, 否则返回FALSE, 用户可用GetLastError捕获当前错误码。 相关函数: CreateDevice WritePortByte

WritePortWord WritePortULong ReadPortByte ReadPortWord WritePortByteEx WritePortWordEx WritePortULongEx ReadPortByteEx ReadPortWordEx ReadPortULongEx ReadPortULongEx ReleaseDevice

3 以四字节(32Bit)方式写I/O端口 Visual C++ & C++ Builder:

BOOL WritePortULong(HANDLE hDevice, UINT nPort, ULONG Value) BOOL WritePortULongEx(UINT nPort, ULONG Value)

11

北京阿尔泰科贸有限公司 软件版本:5.0 发行时间:2001年12月

(在NT用户模式程序中直接访问I/O端口) Visual Basic:

Declare Function WritePortULong Lib \

ByVal nPort As Long, _

ByVal Value As Long ) As Boolean

Declare Function WritePortULongEx Lib \

ByVal Value As Long ) As Boolean

(在Windows NT/2000用户模式程序中直接访问I/O端口) Delphi:

Function WritePortULong(hDevice : Integer; nPort:LongWord; Value:LongWord):Boolean; StdCall; External 'PCI2300' Name 'WritePortULong';

Function WritePortULongEx(nPort:LongWord; Value:LongWord):Boolean; StdCall; External 'PCI2300' Name 'WritePortULong';

LabView:

功能:以四字节(32Bit)方式写I/O端口

参数:

hDevice 设备对象句柄,它应由CreateDevice或CreateDeviceEx创建。 nPort 设备的I/O端口号。(本设备应使用GetDeviceAddr函数返回的PhysAddr地址作为基地址) Value 写入由nPort指定端口的值。

返回值:若成功,返回TRUE, 否则返回FALSE, 用户可用GetLastError捕获当前错误码。 相关函数: CreateDevice WritePortByte

WritePortWord WritePortULong ReadPortByte ReadPortWord WritePortByteEx WritePortWordEx WritePortULongEx ReadPortByteEx ReadPortWordEx ReadPortULongEx ReadPortULongEx ReleaseDevice

4 以单字节(8Bit)方式读I/O端口 Visual C++ & C++ Builder:

BYTE ReadPortByte(HANDLE hDevice, UINT nPort) BYTE ReadPortByteEx(UINT nPort)

(在Windows NT/2000用户模式程序中直接访问I/O端口) Visual Basic:

Declare Function ReadPortByte Lib \

ByVal nPort As Long ) As Byte

Declare Function ReadPortByteEx Lib \(在Windows NT/2000用户模式程序中直接访问I/O端口) Delphi:

Function ReadPortByte(hDevice : Integer; nPort:LongWord):Byte; StdCall; External 'PCI2300' Name 'ReadPortByte'; Function ReadPortByteEx(nPort:LongWord):Byte;

StdCall; External 'PCI2300' Name 'ReadPortByte';

LabView:

12

北京阿尔泰科贸有限公司 软件版本:5.0 发行时间:2001年12月

功能:以单字节(8Bit)方式读I/O端口

参数:

hDevice设备对象句柄,它应由CreateDevice或CreateDeviceEx创建。 nPort 设备的I/O端口号。(本设备应使用GetDeviceAddr函数返回的PhysAddr地址作为基地址) 返回值:返回由nPort指定的端口的值 相关函数: CreateDevice WritePortByte

WritePortWord WritePortULong ReadPortByte ReadPortWord WritePortByteEx WritePortWordEx WritePortULongEx ReadPortByteEx ReadPortWordEx ReadPortULongEx ReadPortULongEx ReleaseDevice

5 以双字节(16Bit)方式读I/O端口 Visual C++ & C++ Builder:

WORD ReadPortWord(HANDLE hDevice, UINT nPort) WORD ReadPortWordEx(UINT nPort)

(在Windows NT/2000用户模式程序中直接访问I/O端口) Visual Basic:

Declare Function ReadPortWord Lib \

ByVal nPort As Long ) As Integer

Declare Function ReadPortWordEx Lib \

ByVal nPort As Long ) As Integer

(在Windows NT/2000用户模式程序中直接访问I/O端口) Delphi:

Function ReadPortWord(hDevice : Integer; nPort:LongWord):Word; StdCall; External 'PCI2300' Name 'ReadPortWord'; Function ReadPortWordEx(nPort:LongWord):Word;

StdCall; External 'PCI2300' Name 'ReadPortWord';

LabView:

功能:以双字节(16Bit)方式读I/O端口

参数:

hDevice设备对象句柄,它应由CreateDevice或CreateDeviceEx创建。 nPort 设备的I/O端口号。(本设备应使用GetDeviceAddr函数返回的PhysAddr地址作为基地址) 返回值:返回由nPort指定的端口的值 相关函数: CreateDevice WritePortByte

WritePortWord WritePortULong ReadPortByte ReadPortWord WritePortByteEx WritePortWordEx

13

北京阿尔泰科贸有限公司 软件版本:5.0 发行时间:2001年12月

WritePortULongEx ReadPortByteEx ReadPortWordEx ReadPortULongEx ReadPortULongEx ReleaseDevice

6 以四字节(32Bit)方式读I/O端口 Visual C++ & C++ Builder:

WORD ReadPortULong(HANDLE hDevice, UINT nPort) WORD ReadPortULongEx(UINT nPort)

(在Windows NT/2000用户模式程序中直接访问I/O端口)

Visual Basic:

Declare Function ReadPortULong Lib \

ByVal nPort As Long ) As Long

Declare Function ReadPortULongEx Lib \(在Windows NT/2000用户模式程序中直接访问I/O端口) Delphi:

Function ReadPortULong(hDevice : Integer; nPort:LongWord):LongWord; StdCall; External 'PCI2300' Name 'ReadPortULong'; Function ReadPortULongEx(nPort:LongWord):LongWord; StdCall; External 'PCI2300' Name 'ReadPortULong';

LabView:

功能:以四字节(32Bit)方式读I/O端口 参数:

hDevice设备对象句柄,它应由CreateDevice创建。 nPort 设备的I/O端口号。(本设备应使用GetDeviceAddr函数返回的PhysAddr地址作为基地址) 返回值:返回由nPort指定端口的值 相关函数: CreateDevice WritePortByte

WritePortWord WritePortULong ReadPortByte ReadPortWord WritePortByteEx WritePortWordEx WritePortULongEx ReadPortByteEx ReadPortWordEx ReadPortULongEx ReadPortULongEx ReleaseDevice

第七节、辅助函数(硬件参数设置、保存、读取函数)原型说明 1、从Windows系统中读入硬件参数函数 函数原型:

Visual C++ & C++ Builder:

BOOL LoadParameter(HANDLE hDevice, PPCI2300_PARA_AD pParameter) Visual Basic:

Declare Function LoadParameter Lib \

pParameter As PCI2300_PARA_AD) As Boolean

Labview:

14

北京阿尔泰科贸有限公司 软件版本:5.0 发行时间:2001年12月

功能:负责从Windows系统中读取设备的硬件参数。 参数:

hDevice 设备对象句柄,它应由CreateDevice决定。

pParameter属于PPCI2300_PARA_AD的结构指针类型,它负责返回PCI硬件参数值,关于结构指针类型PPCI2300_PARA_AD请参考PCI2300.h或PCI2300.Bas或PCI2300.Pas函数原型定义文件,也可参考本文第六章《硬件参数结构》关于该结构的有关说明。

返回值:若成功,返回TRUE,否则返回FALSE。 相关函数: CreateDevice LoadParameter

SaveParameter ReleaseDevice

Visual C++ & C++ Builder举例:

PPCI2300_PARA_AD Parameter; HANDLE hDevice;

hDevice = CreateDevice() ; // 创建设备对象 if(!LoadParameter(hDevice, &Parameter)) {

AfxMessageBox(“读入硬件参数失败,请确认您的驱动程序是否正确安装”); Return; // 若错误,则退出该过程 }

Visual Basic举例:

Dim Parameter As PCI2300_PARA_AD Dim hDevice As Long :

hDevice = CreateDevice(0) ? 创建设备对象 If Not LoadParameter(hDevice, Parameter) Then MsgBox “读入硬件参数失败,请确认您的驱动程序是否正确安装” Exit Sub ' 若错误,则退出该过程 End If :

2、往Windows系统写入设备硬件参数函数

函数原型:

Viusal C++ & C++ Builder:

BOOL SaveParameter(HANDLE hDevice, PPCI2300_PARA_AD pParameter) Visual Basic:

Declare Function SaveParameter Lib \

pParameter As PCI2300_PARA_AD) As Boolean

Labview:

功能:负责把用户设置的硬件参数保存在Windows系统中,以供下次使用。 参数:

hDevice 设备对象句柄,它应由CreateDevice决定。

pParameter设备硬件参数,关于PCI2300_PARA_AD的详细介绍请参考PCI2300.h或PCI2300.Bas或PCI2300.Pas函数原型定义文件,也可参考本文第六章《硬件参数结构》关于该结构的有关说明。 返回值:若成功,返回TRUE,否则返回FALSE。

相关函数: CreateDevice LoadParameter

SaveParameter ReleaseDevice

Visual C++ & C++ Builder程序举例:

PPCI2300_PARA_AD Parameter;

HANDLE hDevice ;

hDevice = CreateDevice(); // 可以手工设置硬件参数,然后保存 Parameter.FirstChannel=0; // 首通道 Parameter.LastChannel=31; // 末通道 : // 您应同时设置其他参数,否则未设置的参数将以0值保存 if(!SaveParameter(hDevice, pParameter)) {

AfxMessageBox(“保存参数有误”);

}

15

北京阿尔泰科贸有限公司 软件版本:5.0 发行时间:2001年12月

功能:取得指定磁盘的可用剩余空间(以字为单位)。

参数:需要访问的盘符,若为C盘为\盘为\,以此类推。

返回值:若成功,返回大于或等于0的长整型值,否则返回负值,用户可用GetLastError捕获错误码

二、高效高精度延时

Visual C++:

BOOL DelayTimeNs(HANDLE hDevice, LONG nTimenS) Visual Basic:

Declare Function DelayTimeNs Lib \ LabView:

功能:以不消耗CPU时间为前提,提供精确到纳秒级的延时操作,单位为100纳秒。如果应用在线程中,它会使所在的线程自动睡眠指定时间,且将这段时间抛给其他线程及进程,再自动被唤醒。如果应用在进程中,它会使所在进程自动睡眠指定时间,且将这段时间抛给整个系统及其他进程。特别是在等待某些状态,但状态未达到需要轮询时,可以使用该函数延时等待状态,而不必消耗大量CPU时间。因此,使用此函数可能提高应用程序的整体性能。

参数:

hDevice 设备对象句柄,它应由CreateDevice决定。

nTimenS 时间常数。单位为100纳秒。如果用户要求延时100微秒,则用下列公式换算:

时间常数 = 延时时间(纳秒)/100(纳秒)

可得到时间常数为1000,即该参数应等于1000。

返回值:若成功,返回TRUE,否则返回FALSE,用户可用GetLastError捕获错误码 注意事项:

此函数现只提供了Windows NT、Windows 2000版,对于Win95、Win98等系统可能在以后会提供。

用户若要精确延时,切莫以多次调用为累加。比如您若延时100微秒,而用循环方式循环执行下面指令100次则是错的:

DelayTimeNs(hDevice, 10);

因为此函数本身就有时间消耗,它在调用时,首先有一个从用户模式到内核模式的切换,还有压栈的过程,然后延时后还有从内核模式到用户模式的切换及出栈过程,这可能会花掉1-3微秒。

为正确的实现方法是一次调用此函数: DelayTimeNs(hDevice, 1000);

第六章 硬件参数结构

第一节、

AD硬件参数结构(PCI2300_PARA_AD)

Visual C++ & C++Builder:

Typedef struct _PCI2300_PARA_AD // 板卡各参数值 {

DWORD FirstChannel; // 首通道 DWORD LastChannel; // 末通道

} PCI2300_PARA_AD,* PPCI2300_PARA_AD; Visual Basic:

Private Type PCI2300_PARA_AD

FirstChannel As Long ' 首通道号 LastChannel As Long End Type

21

北京阿尔泰科贸有限公司 软件版本:5.0 发行时间:2001年12月

Delphi:

Type // 定义结构体数据类型

PPCI2300_PARA_AD = ^ PCI2300_PARA_AD; // 指针类型结构 PCI2300_PARA_AD = record // 标记为记录型 FirstChannel: DWORD; LastChannel: DWORD; End;

LabView:

首先请您关注一下这个结构与前面ISA总线部分中的两个结构PARA、PARAEX比较,该结构实在太简短了。其原因就是PCI设备是系统全自动管理的设备,什么端口地址,中断号,DMA等将与PCI设备的用户永远告别,一句话PCI设备是一种更易于管理和使用的设备。

硬件参数说明:此结构主要用于设定设备硬件参数值,用这个参数结构对设备进行批量读数。

FirstChannel: AD采样首通道值,取值范围应根据设备的总通道数设定,本设备的通道取值为:0~31,要求首通小于或等于末通道。

LastChannel : AD采样末通道值,取值范围应根据设备的总通道数设定,本设备的通道取值为:0~31,要求末通道大于或等于首通道。

注:当首通道和末通道相等时,即为单通道采集。否则,为多通道采集。如果为多通道采集,即采集通道总数由LastChannel 减去 FirstChannel 再加1,其结果便是通道数。为多通道采集时,采集的通道顺序为:FirstChannel, FirstChannel+1, FirstChannel+2??LastChannel,然后重复下去。比如设首通道为0,末通道为3,则采样顺序时:0、1、2、3、0、1、2、3、0、1、2、3??。

相关函数: ReadDevBulkAD

第二节、 用于数字I/O输出参数(PCI2300_PARA_DO)

Visual C++ & C++Builder:

Typedef struct _PCI2300_PARA_DO // 数字量输出参数 { BYTE DO0; // 0通道 BYTE DO1; // 1通道 BYTE DO2; // 2通道 BYTE DO3; // 3通道 BYTE DO4; // 4通道 BYTE DO5; // 5通道 BYTE DO6; // 6通道 BYTE DO7; // 7通道 BYTE DO8; // 8通道 BYTE DO9; // 9通道 BYTE DO10; // 10通道 BYTE DO11; // 11通道 BYTE DO12; // 12通道 BYTE DO13; // 13通道 BYTE DO14; // 14通道 BYTE DO15; // 15通道

} PCI2300_PARA_DO,*PPCI2300_PARA_DO; Visual Basic:

Type PCI2300_PARA_DO DO0 As Byte ? 0通道 DO1 As Byte ? 1通道 DO2 As Byte ? 2通道 DO3 As Byte ? 3通道 DO4 As Byte ? 4通道

22

北京阿尔泰科贸有限公司 软件版本:5.0 发行时间:2001年12月

DO5 As Byte ? 5通道 DO6 As Byte ? 6通道 DO7 As Byte ? 7通道 DO8 As Byte ? 8通道 DO9 As Byte ? 9通道 DO10 As Byte ? 10通道 DO11 As Byte ? 11通道 DO12 As Byte ? 12通道 DO13 As Byte ? 13通道 DO14 As Byte ? 14通道 DO15 As Byte ? 15通道 End Type Delphi:

Type // 定义结构体数据类型

PPCI2300_PARA_DO = ^PCI2300_PARA_DO; // 指针类型结构 PCI2300_PARA_DO = record // 标记为记录型 DO0: Byte; // 0通道 DO1: Byte; // 1通道 DO2: Byte; // 2通道 DO3: Byte; // 3通道 DO4: Byte; // 4通道 DO5: Byte; // 5通道 DO6: Byte; // 6通道 DO7: Byte; // 7通道 DO8: Byte; // 8通道 DO9: Byte; // 9通道 DO10: Byte; // 10通道 DO11: Byte; // 11通道 DO12: Byte; // 12通道 DO13: Byte; // 13通道 DO14: Byte; // 14通道 DO15: Byte; // 15通道 End;

LabView:

该参数结构的使用极大的方便了不熟悉硬件端口控制和二进制位操作的用户。在这里您不需要了解技术细节,

23

北京阿尔泰科贸有限公司 软件版本:5.0 发行时间:2001年12月

只需要象Visual Basic中的属性操作那样,只需要有简单的进行属性赋值,然后执行SetDeviceDO即可完成数字量输出。注意关于LabView的参数定义,他最主要表达了在LabView环境中怎样使用SetDeviceDO实现开关量输出操作的基本实现方法。在用户实际使用中,您可以将左边的常量图标换成开关控件图标等,以实现动态改变开关量输出状态。但需要注意的是开关控件图标(xxx Switch)输出的值是布尔变量,因此在开关控件图标与PPCI2300_PARA_DO之间,应使用Boolean To (0,1)逻辑转换控件,即先将布尔变量转换成0或1的整型值,再将这个整型值传递给PPCI2300_PARA_DO,详见开关量输入输出LabView演示部分。 其每一个成员变量对应于相应的DO通道,即DO0-DO15分别对应于DO通道0-15。且这些成员变量只能被赋值为“0”或“1”数值。“0”代表“关”状态或“低”状态,“1”代表“开”状态或“高”状态。

相关函数: SetDeviceDO

第三节、 用于数字I/O输入参数(PCI2300_PARA_DI)

typedef struct _PCI2300_PARA_DI // 数字量输入参数 { BYTE DI0; // 0通道 BYTE DI1; // 1通道 BYTE DI2; // 2通道 BYTE DI3; // 3通道 BYTE DI4; // 4通道 BYTE DI5; // 5通道 BYTE DI6; // 6通道 BYTE DI7; // 7通道 BYTE DI8; // 8通道 BYTE DI9; // 9通道 BYTE DI10; // 10通道 BYTE DI11; // 11通道 BYTE DI12; // 12通道 BYTE DI13; // 13通道 BYTE DI14; // 14通道 BYTE DI15; // 15通道

} PCI2300_PARA_DI,*PPCI2300_PARA_DI; Visual Basic:

Type PCI2300_PARA_DI DI0 As Byte ? 0通道 DI1 As Byte ? 1通道 DI2 As Byte ? 2通道 DI3 As Byte ? 3通道 DI4 As Byte ? 4通道 DI5 As Byte ? 5通道 DI6 As Byte ? 6通道 DI7 As Byte ? 7通道 DI8 As Byte ? 8通道 DI9 As Byte ? 9通道 DI10 As Byte ? 10通道 DI11 As Byte ? 11通道 DI12 As Byte ? 12通道 DI13 As Byte ? 13通道 DI14 As Byte ? 14通道 DI15 As Byte ? 15通道 End Type Delphi:

Type // 定义结构体数据类型

PPCI2300_PARA_DI = ^PCI2300_PARA_DI; // 指针类型结构 PCI2300_PARA_DI = record // 标记为记录型 DI0: Byte; // 0通道 DI1: Byte; // 1通道

24

北京阿尔泰科贸有限公司 软件版本:5.0 发行时间:2001年12月

DI2: Byte; // 2通道 DI3: Byte; // 3通道 DI4: Byte; // 4通道 DI5: Byte; // 5通道 DI6: Byte; // 6通道 DI7: Byte; // 7通道 DI8: Byte; // 8通道 DI9: Byte; // 9通道 DI10: Byte; // 10通道 DI11: Byte; // 11通道 DI12: Byte; // 12通道 DI13: Byte; // 13通道 DI14: Byte; // 14通道 DI15: Byte; // 15通道 End;

该参数结构的使用极大的方便了不熟悉硬件端口控制和二进制位操作的用户。在这里您不需要了解技术细节,只需要执行GetDeviceDI即可完成数字量输入操作。然后象Visual Basic中的属性操作那样,简单的进行属性成员分析即可确定各路状态。

关于LabView的参数,由于需要的是返回值,因此根据LabView的特点,应分配一个16字节的内存单元,每一个字节的内存单元对应相应位置上的开关量输入状态。要使用这些状态,则应在GetDeviceDI之后,将存放实际的当前开关量状态的内存单元用Index Array数组操作控件将其每一路开关量状态分离出来,即可确定每一路开关输入状态。详见开关量输入输出LabView演示部分。 其每一个成员变量对应于相应的DI通道,即DI0-DI15分别对应于DI通道0-15。且这些成员变量只能是“0”或“1”数值。“0”代表“关”状态或“低”状态,“1”代表“开”状态或“高”状态。

相关函数: GetDeviceDI

第七章 数据格式转换与排列规则

第一节、如何将AD原始数据LSB转换电压值Volt

在换算过程中弄清模板精度(即Bit位数)是很关键的,因为它决定了LSB数码的总宽度CountLSB。比如8位的模板CountLSB为256。而本设备的AD为12位,则为4096。其他类型同理均按2=LSB总数(n为Bit位数)换算即可。

第一节AD原码LSB数据如何转换成电压值?

设从设备上读入的某个AD原码数据为变量Lsb,其对应的电压为变量Volt(单位mV)

量程(毫伏) 计算机语言换算公式 Volt取值范围mV Volt = Lsb * (10000 / 4096) – 5000 ±5000mV [-5000,+5000] Volt = Lsb * (20000 / 4096) – 10000 [-10000, +10000] ±10000mV 注意:以上所列Lsb必须是将从设备上读入的AD数(设为InUserRegion[0])经最高4位屏蔽后得到的,各种语言的求反指令如下:

Visual C++&C++Builder: Lsb = InUserRegion[0]&0xFFF Visual Basic: Lsb = InUserRegion(0)And &HFFF Delphi: Lsb := InUserRegion[0]And $FFF 换算举例:(设量程为±5000mV, 这里只转换第一个点) Visual C++&C++Builder: WORD Lsb; // 定义存放标准LSB原码的变量 float Volt; // 定义存放转换后的电压值的变量

Lsb = InUserRegion[0] & 0x0FFF; // 取得标准LSB原码

Volt = Lsb * (10000.0/4096) – 5000.0; // 用LSB原码与单位电压值相乘求得实际电压值

25

n

本文来源:https://www.bwwdw.com/article/319v.html

Top