-PCL-813B(简称813B)是研华公司推出的高性能、多功能数据采集卡。VB是一种高效、易学易用的开发工具。在一些工业测控系统中,需要计算机从现场获取实际数据或发出控制命令,这就需要计算机实现对I/O端口的控制与访问,但是VB不具备直接对硬件地址进行访问的功能,可以利用VC++编写访问I/O接口地址的程序,创建动态链接库(DLL),利用DLL进行调用来实现端口访问与控制。本文以此卡为例,详细介绍了在VB环境下的应用。
813B数据采集卡简介
---813B是基于ISA结构的,采用了12位分辨率A/D转换器AD574,转换时间为25μs,数据传送速率达25kbps,输入范围为双极性±5V、±2.5V、±1.25V和±0.625V,单极性为0~10V、0~5V、0~2.5V和0~1.25V,A/D转换触发方式为软件触发,支持32路单端隔离模拟量输入,最大连续过压为±30V。卡上的一个DIP开关(SW1)和1个跳线器(JP100)可由用户自行设置,以满足不同的需要。
I/O基地址设置
---813B使用16个连续的I/O地址,其I/O基地址由开关SW1选择,有效地址从000到3F0(十六进制)。SW1开关共有6个微型拨码开关,其拨码组合与对应的基地址有关系。
---如使用单极性输入,把开关置在“U”位置,此时允许0~10V、0~5V、0~1.25V模拟量输入。如放大倍数是1,允许输入0~10V;放大倍数是2,允许输入0~5V;放大倍数8,允许输入0~1.25V。放大倍数由软件控制。
DLL的编写
---在VB中要利用DLL进行调用来实现板卡的访问与控制,首先要编写DLL。在工业控制中对计算机的底层硬件进行访问,以及利用各种控制接口板进行数据采集和控制时间,仅靠VB是无法解决的,需要使用动态链接库来实现。
---创建一个DLL应包括三个基本成分,分别是入口函数Libmain、出口函数WEP和用户自己的功能函数。
---C++5.0开发的DLL的完整的程序清单如下。
∥DLL源文件IO.CPP
#include <windows.h>
#include<conio.h>
int FAR PASCAL outport(unsigned)
short port;
int FAR PASCAL outport(unsigned short port,int databyte);
∥D11EntryPoint函数
BOOL WINAPI D11EntryPoint
(HINSTANCE hD11,
DWORDdwReason,
LPVOID Reserved)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
{
break;
}
case DLL_PROCESS_DETACH:
{
break;
}
}
return TRUE;
}
∥两个功能函数
int FAR PASCAL inport(unsigned short port)
{
reture(_inp(port);
)
int FAR PASCAL outport(unsigned short port,int databyte)
{
int a;
a=_outp(port,databyte);
return a;
}
∥模块定义文件IO.DEF
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD SINGLE
EXPORTS
inport
outport
VB中的DLL调用
---DLL函数或过程必须在全局模块(*.BAS)中正确说明才有效。VB是用Declare语句把一个DLL函数引入VB中的,它告诉VB在哪里找到DLL函数,并且让VB知道DLL需要哪种类型的参数,同时返回哪种类型的值。当某个DLL函数用Declare语句正确声明以后,就可以像使用其他函数一样使用这个DLL函数。
---在VB应用程序的全局模块中声明IO.DLL并将其放入Windows\system目录下,这样就可以像使用Windows API一样使用其中的inport和outport函数了。
---Declare Function inport Lib"io.d11" (ByVal port As Integer)As Long
---Declare Function outport Lib"io.d11" (ByVal port As Integer,ByVal databyte As Long)As Long
应用实例
---813B采集卡的初始化(采集卡基地址220H)。
● 选通道,向22AH写入相应的控制字选择通道,写入0表示0通道,写入1代表1通道,依次类推;
● 启动AD转换,向22CH写入任意值,触发AD转换;
● 读入数据,把12位数据的低8位读入224H,把高4位读入225H中。
VB的编程实例
---利用定时器实现定时采集在VB中,可利用定时器的Interval属性设置每秒钟采集的次数,把采集段程序放在定时器的Timer事件中来实现数据采集。对于一般计算机来讲,由于受系统硬件能力的限制,定时器每秒钟最多只能产生18个事件,若时间间隔设置得过小,将达不到预期效果。
---应用实例下面给出数据采集软件程序中部分主要源代码,以采集某0~100℃的温度信号(经温度变送器转换为0~5V)为例。设定A/D板为单极性输入方式,I/O端口基地址为220H,放大倍率为1。
---在module1中声明:
:Declare function outport Lib "io.dll" (ByVal port As Integer, By Valdata As Integer)
Declare Function inport Lib "io.dll"(ByVal port As Integer)
---采集程序部分:
Private Sub TimerWD-Timer()
chwd=1 '设定温度通道号为1'
x=outport(&H22a,chwd) '输入通道号'
y=outport(&H2C,0) '启动A/D转换'
J=1
DoWhileJ<>0 '判断A/D转换是否结束'
J=inport&H22A And 1
Loop
adwl=inport(&H224) 'A/D结果低8位送入变量adwl'
adwh=inport (&H225) 'A/D结果高4位送入变量adwh'
adwdata=VAL(adwh-224)*256+VAL(adwl) '12位A/D转换结果'
vWD=adwdata*10/4095 '对应的电压'
WD=100*vWD/5 '标度变换为实际温度'
EndSub
---数据采集值是12位,放在两个地址里,其中224H放数据的低8位(数据7~数据0),225H放数据的高4位(数据11~数据8),225H的其他位自动变为1 1 1 0。
---则12位AD转换的结果为adwdata=VAL(adwh-224)*256+VAL(adwl),其中224表示无采集数据时的自然值(即11100000)。
---12位AD经AD转换的最大值是212=4096
结束语
---上述采用VB调用DLL实现数据采集的方法有一定的通用性,上述程序全部经过测试通过,可作为类似控制的参考。