第1讲NuDAQ PCI数据采集卡的ActiveX元件(PCIS-OCX)
作者:ADLINK—凌华科技(中国)有限公司 发布时间:2003/5/19 13:31:00
本文主要举例说明,如何在微软的Visual Basic下,运用PCIS-OCX的ActiveX 控制组件来完成数据采集的应用透过此例,使用者可以了解如何运用PCIS-OCX的组件快速进行数字讯号的运作. 同时深入了解Digital I/O Card 的主要操作方法(Methods)和属性页(Property pages)的使用法。



图为: VB Component 窗口

本文假设您已经熟悉

.用DAQBench建构数据采集系统(2002.10.24)
.安装 VB 和 PCIS-OCX 和DAQBench
.在VB 中使用ActiveX 组件
PCIS-OCX 主要分为两个部份:

1. VB上显示名称为"ADLINK NuDAQ PCI Digital I/O Card ActiveX Controls", 档名为 Digital.ocx。
2. VB上显示名称为"ADLINK NuDAQ Multiple Function Card ActiveX Controls", 档名为 Multiple.ocx。

由于篇幅的关系, 本文只解释 Digital I/O 卡的部份, 至于 Multiple Function 卡系列的部份由于功能强大,所以只好另辟专文解释了。



上图为VB的组件盒加入"ADLINK NuDAQ PCI Digital I/O Card ActiveX Controls"组件后的画面

此部份组件的持色为:PCI 接口的Digital I/O Timer/ Counter 卡

范例程序:本文会完成一个用PCI-7296做数字输入及数字输出,并显示输入数据的程序。其它的DIO卡其操作接口非常类似,所以只要学会某一个组件, 聪明的读者应可举一反三的了解其它的DIO卡是如何操作的。同时范例程序也会采用软件仿真I/O卡的方式让我们的读者即使在没有安装实体的I/O卡的情况下仍然能按照范例作出仿真的程序,提早体会 DIO 卡的功能。同时写完的范例也可以只修改一行就支持真实的I/O卡,这种功能对程序开发者而言可大幅节省评估硬件层次的时间与精力,是相当贴心的设计。

在Visual Basic中建立一数据采集系统

此系统的设计步骤如下:

.安装所需的软件。
.设定数据采集卡的设备名称。
.建立一个新的项目,并加载所需的DAQBench及PCIS-OCX ActiveX控制组件。
.设定DAQBench及PCIS-OCX ActiveX 控制组件属性。
.设计人机接口部分。
.编写程序。
.测试程序。
以上的步骤如果有不清楚的地方请参考「用DAQBench建构数据采集系统(2002.10.24)」。

A. 首先新增一个名为 DIOTest 的项目,再将"ADLINK NuDAQ PCI Digital I/O Card ActiveX Controls"控制组件加到工具箱中,并加入"Pci 7296"控件和二个"命令钮"。修改"命令钮1"的Caption 为 "读 Port1A", "命令钮2"的Caption 为 "写 Port2B",此时程序如下图所示:


B. 在窗体的"Pci 7296"控件上按鼠标右键就会出现一个跳出式选单,请选择 "属性"。

C. 在开始写程序前请先了解一下不同组件的属性页,因为属性页可是帮助我们节省写程序代码和了解组件的好帮手呢。

D. 在General 的卷标中,在Device Index字段选择Demo,这样就能使用软件仿真的功能(如下图)。如果在这里选择PCI-7296 的话就可以支持真实的卡,详情请参考「用DAQBench建构数据采集系统(2002.10.24)」。


E. 再点选到Port configuration的卷标,从这里可看出原来 PCI 7296 有 P1、P2、 P3、P4 四个Port,每个Port 又可分为ABC 三个部份,其中C的部份又可分为Hi 和 Lo 二部份,同时 Port 的动作方向(输出或输入)是可以由程序设定的(其实只要在这里用鼠标点几下就设定好了也不用写什么程序代码.)。下面我们会读取P1A和写入P2A的值,所以要先在P2A 的地方点一下设定方向为输出。





F. 再点选到Interrupt event 的卷标,从这里可看出原来 PCI 7296 有二个interrupt 会发出事件。换句话说,如果想要处理某个卡上的interrupt,也是只要在这里选一选,然后在程序中处理事件即可,又是一个不用写一行程序代码的好用功能。



在属性页按下确定,回到我们原来的窗体中,我们终于要开始写程序了。利用NuDAQ ActiveX组件来执行对ADLINK之NuDAQ PCI数据采集卡的硬件操作。通常,这样的操作可以分为两种类型 (1)轮询数据采集方式(Polling Operation) (2)连续数据采集方式(Continuous Operation)

注:见附录说明

要操作Digital I/O Card通常我们会使用轮询数据采集方式来进行操作。

.DI (Digital Input Signal)操作:使用者可以使用NuDAQ控制组件中的ReadDIPort或ReadDILine方法,达成此功能需求。
.DO (Digital Output Signal)操作:使用者可以使用NuDAQ控制组件中的WriteDOPort方法,达成此功能需求。
现在我们要利用ReadDIPort和WriteDOPort二个方法来达到操作的目的,所以请先在 "读Port 1A" 按钮上快按二下,在程序代码的窗口中输入如下的程序代码:

Private Sub Command1_Click()
Dim bResult As Boolean
bResult = Pci72961.ReadDIPort(dbPortP1A, vPortValue)
End Sub

好,短短的两行指令就完成了读Port 的任务。bResult 会告诉我们读Port的动作是否正常,如果bResult 为True,那 vPortValue 就是目前Port 的值。

到了这里聪明的读者一定发现了,难道要写Port 的值只要反过来设定即可吗?答对了,就是这样。请在 "写Port 2A" 按钮上快按二下,在程序代码的窗口中输入如下的程序代码:

Private Sub Command2_Click()
Dim bResult As Boolean
vPortValue = 2
bResult = Pci72961.WriteDOPort(dbPortP2A, vPortValue)
End Sub

那如果要每隔一秒钟就去查询Port 1A 的值要怎么办呢?这也很简单,放个Timer 就搞定了。所以放个Timer到程序中,设定 Enabled为True,Interval为1000,加入以下的程序代码:

PPrivate Sub Timer1_Timer()
Command1_Click
End Sub

最后再放个文字方块,然后修改一下程序代码把值展示出来即可。

Private Sub Command1_Click()
Dim bResult As Boolean
bResult = Pci72961.ReadDIPort(dbPortP1A, vPortValue)
Text1.Text = vPortValue
End Sub



当我们兴高采烈的把程序交给老板时,一定会被老板浇冷水。老板一定会说程序看起来这么简单怎么向客户收钱呢?这个时候你就需要DAQBench软件。它有满满的可视化组件可以和PCI-OCX结合,同时也承袭了ActiveX组件简单易用的血统。如果加入DAQBench的支持在五分钟后你的程序会变成超级专业的DIO 控制程序。如果对DAQBench有兴趣的读者请不要错过了其它说明DAQBench 使用方法的文章,在这里就只作简单说明。下图为加入DAQBench DBoolean组件支持的画面。



为了支持让读Port的值经由DBoolean显示出来请在以下的程序代码再加上一行:

Private Sub Command1_Click()
Dim bResult As Boolean
bResult = Pci72961.ReadDIPort(dbPortP1A, vPortValue)
DBoolean1.Value = vPortValue
End Sub

为了支持让写Port的值由DBoolean输入请在以下的程序代码修改如下:

Private Sub Command2_Click()
Dim bResult As Boolean
vPortValue = DBoolean4.Value
bResult = Pci72961.WriteDOPort(dbPortP2A, vPortValue)
End Sub

结论:
在上面的范例中,我们了解了属性页的使用,程序只有七行程序代码(含变量宣告两行)。使用PCIS-OCX可以很简单容易的操作ADLINK的数据采集硬设备。如果您对写程序和除错(debug)有强烈的使命感,一定要写出非常困难而且不易了解的程序才算完成任务的话,那么PCIS-OCX就非常的不适合您使用,因为透过PCIS-OCX想要把程序写得很复杂是一件困难的事,PCIS-OCX适合用于想要快速把稳定的产品推上市场的工程师。

附录:利用NuDAQ ActiveX组件对硬件操作的两种类型

使用者可以利用NuDAQ ActiveX组件来执行对ADLINK之NuDAQ PCI数据采集卡的硬件操作。通常,这样的操作可以分为两种类型。

1) 轮询数据采集方式 (Polling Operation)

.DI (Digital Input Signal)操作,使用者可以使用NuDAQ控制组件中的ReadDIPort或ReadDILine方法,达成此功能需求。
.DO (Digital Output Signal)操作:使用者可以使用NuDAQ控制组件中的WriteDOPort方法,达成此功能需求。
.AI (Analog Input Signal)操作:使用者可以使用NuDAQ控制组件中的ReadSingleAI方法,达成此功能需求。
.AO (Analog Output Signal)操作:使用者可以使用NuDAQ控制组件中的WriteSingleAO方法,达成此功能需求。
2) 连续数据采集方式 (Continuous Operation)

.DI (Digital Input Signal)操作,使用者可以遵循以下步骤:
a)根据您的需求来设定相关的属性;
b)使用相关NuDAQ PCI控制组件的StartContDI方法激活连续数据采集;
c)在相关NuDAQ PCI控制组件的DiComplete或者DiHalfReady事件中接收DI数据;
d)使用相关NuDAQ PCI控制组件的StopContDI方法停止连续数据采集。
.DO(Digital Output Signal)操作:使用者可以遵循以下步骤:
a)根据您的需求来设定相关的属性;
b)使用相关NuDAQ PCI控制组件的StartContDO方法激活连续数据输出;
c)当DO数据输出完成之后,相关NuDAQ PCI控制组件会激活DoComplete事件;
d)使用控制组件的StopContDO方法停止连续数据输出。
.AI (Analog Input Signal)操作:使用者可以遵循以下步骤:
a)根据您的需求来设定相关的属性;
b)使用相关NuDAQ PCI控制组件的StartContAI方法激活连续数据采集;
c)在相关NuDAQ PCI控制组件的AiComplete或者AiHalfReady事件中接收AI数据;
d)使用相关NuDAQ PCI控制组件的StopContAI方法终止连续数据采集。
在AI连续数据采集方式中,AiComplete或者AiHalfReady事件处理例程需接收两个参数:ScaledData和BinaryCode。这两个参数的形式为:

ScaledData as Variant.

ScaledData是一个根据当前模拟讯号输入值由二进制代码经过比例运算变换而来的工程单位(电压等)资料值。这个比例运算依赖于资料撷取卡的特性和用户所指定的讯号输入范围。

BinaryCode as Variant.

这是来自PCI数据采集卡缓冲区(Buffer)内的二进制数据。这个数据可以包含信道信息。这些数据值依赖于数据采集卡的特性和用户所指定的讯号输入范围。

3) 将DI/AI连续数据保存成数据文件的功能

PCI7200、PCI7300、PCI9111、PCI9112、PCI9113、PCI9114、PCI9118 and PCI9812等NuDAQ控制组件提供了将连续数据保存成数据文件的功能。用户可遵循下述步骤来执行这个功能:
a)将该NuDAQ PCI控制组件的streamToFile属性设置为True。
b)使用StartContDI或者StartContAI方法激活操作。使用者可以将文件名作为参数传递给前述两个方法。例如:
Pci91111.StartContAI("f:\DAQBench\Samples\record.dat")
Pci72001.StartContDI("f:\DAQBench\Samples\record.dat")
c)此时讯号数据会储存到所指定的档案中。
d)您可使用AiComplete/DiComplete或者AiHalfReady/DiHalfReady事件来判断数据是否接收完毕。
e)使用StopContDI或者StopContAI方法终止操作。
此方式所储存的档案,其数据格式为二进制方式。由于二进制格式无法被标准的文字编辑器读出,而且无法用Microsoft Excel进行分析,因此DAQBench提供了一个方便的工具DAQCvt将此二进制档案转换为便于读出的文字格式。这个工具程序放置在PCIS-OCX安装目录下的Util子目录中。DAQCvt操作接口如下图所示:


DAQCvt工具程序提供两个框架。上面的框架"Input File",用于指定数据来源档案,下面的框架"Output File"用于指定目的文件档案(转换结果文件档案)。

若要加载二进制格式的来源数据文件,请在"File Path"处输入二进制数据文件名,或者点选"Browse"按钮来从输入文件框架中选择源文件,然后点选"Load"按钮。当文件被加载之后,与文件相关的信息,比如数据类型、资料宽度、AD范围等等,就会显示在"Input File"框架的相对应位置,同时,预定的转换后数据文件路径和格式将如下图那样显示:



标准的转换后文件带有.txt扩展名,位于与源文件相同的目录中,您也可以选择转为CSV檔。若要改变标准设置,可以键入您希望的路径,或者在"Output File"框架中点击"Browse"按钮来选择文件的储存路径。

DAQCvt工具程序提供三种类型的数据格式的转换。

转换成经过比例变换的数据文本文件 (File with scaled data):

数据已经根据数据采集卡的类型和资料范围等信息变换到工程单位(电压等)资料值,并且以文字格式储存成档案。这种类型只适用于由AI连续操作生成的数据。

转换成经过比例变换的数据的二进制格式档案 (Binary file with scaled data):

数据已经根据数据采集卡的类型和数据范围等信息变换到工程单位(电压等),并且以二进制格式储存成档案。这种类型只适用于由AI连续操作生成的数据。

将原始二进制格式档案的数字数据转换成文本文件 (File with binary codes):

将原始二进制格式档案的数据以文字方式储存成档案。如果原始数据包含信道信息,转换程序会处理原始的数据值以获得真实的数据值。这种类型适用于由AI和DI连续操作生成的数据。

转换后的文本文件的数据分割符号可以在空格、逗号和TAB字符之间选择。

如果您想在文件的开头添加包含资料撷取卡类型信息的标题文字,点选"Title/Head"。

当设置完与被转换文件相关的属性(文件路径、格式等等)之后,您就可以在"Output File"框架中点选"Start Convert"按钮来执行转换操作了。