正文

基于VB的数据采集卡的应用2007-03-16 21:48:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/iamben250/24017.html

分享到:

基于VB的数据采集卡的应用
            Application of Data Acquisition Card based on VB

                  本文来自2004年第7期“计算机控制,监测与管理”上 ,已经被阅读过903次

                  作 者 :济南大学    张智杰

                  关键词: VB   数据采集   动态链接库
                  
                        1  引言
                            
                        PCL-813B(简称813B)是台湾研华公司推出的一款基于PC的高性能、多功能数据采集卡。该卡不仅性能优异,而且有完善的软件支持,使得此卡能广泛适用于工业自动化系统、自动化设备监控系统,具有广阔的应用前景。VB是一种高效、易学易用的开发工具。一些工业测控系统中,需要计算机从现场获取实际数据或发出控制命令,这就需要计算机实现对I/O端口的控制与访问,但是VB不具备直接对硬件地址进行访问的功能,可以利用VC++编写访问I/O接口地址的程序,创建动态链接库(DLL),利用DLL进行调用来实现端口访问与控制。本文以此卡为例,详细介绍了在VB环境下的应用。
                        2  PCL-813B数据采集卡简介
                           
                        813B是基于ISA结构的,需插在计算机的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转换触发方式为软件触发; 813B支持32路单端隔离模拟量输入,最大连续过压±30V。

                           
                        813B是一种通用型数据采集卡,可以满足不同用户的不同要求。因此卡上有一个DIP开关(SW1)和1个跳线器(JP100),可由用户自行设置,以满足不同的需要。

                           
                        813B使用16个连续的I/O地址,其I/O基地址有开关SW1选择,有效地址从000~3F0H(十六进制)。SW1开关共有6个微型拨码开关,其拨码组合与对应的基地址有关系。

                           
                        输入范围选择:如使用单极性输入,把开关置在“U”位置,此时允许0~10V,0~5V,0~1.25V模拟量输入。如放大倍数是1,允许输入0~10V;放大倍数是2,允许输入
                        0~5V;放大倍数8,允许输入0~1.25V。放大倍数由软件控制。
                        3  动态链接库DLL的编写
                            在VB中要利用DLL进行调用来实现板卡的访问与控制,首先要编写动态链接库DLL。

                            在Windows98
                        中,应用程序采取一种成为“动态链接库”的特殊函数集来实现代码和资源的共享,以最大限度地节省资源。之所以称为“动态”,是因为它们是在运行期间链接到应用程序的,而不是在编译期间。创建一个EXE文件时,会有许多例程链接到代码并放入EXE文件中。但是DLL中的例程则仅仅在实际运行时才链接到EXE文件。按照这种方式,我们可以把几个程序共用的代码放到一个DLL中,这样可以节省大量的空间,提高运行效率。同时在工业控制中对计算机的底层硬件进行访问,以及利用各种控制接口板进行数据采集和控制时间,仅靠VB是无法解决的。解决这样的问题可以间接使用动态链接库来实现。

                        3.1 创建DLL的三个基本成分
                        (1) Libmain函数
                        它是Windows DLL的入口点,主要用来完成一些初始化任务;
                        (2) 出口函数WEP
                        Windows的DLL必须包含一个标准的出口函数。在DLL最终卸出之前,Windows调用该函数作一些必要的清除工作(如释放一些资源等);
                        (3) 自己的功能函数
                           
                        Windows95下VB编写的程序是32位的,与之对应的DLL也应是32位的。对于32位的DLL,16位DLL中的入口函数LibMain、退出函数WEP被DLLEntryPoint所代替。DLLEntryPoint入口和退出两个函数服务。在每次装入或卸下DLL时,Windows95调入DLLEntryPoint。
                        在VC++5.0中选择File|New,在New对话框中选择Project WorkSpace,再在New
                        Project Workspace对话框中选择Dynamic-Link
                        Library选项,并输入工程项目名,即可生成动态链接库的工作框架。

                        3.2 利用VC++5.0开发的DLL的完整的程序清单
                        //DLL源文件I0.CPP
                        #include <windows.h>
                        #include<conio.h>
                        int FAR PASCAL outport(unsigned)
                        short sport);
                        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(prot);
                        )
                        int FAR PASCAL outport(unsigned short port,int databyte)
                        {
                        int a;
                        a=_outp(port,databyte);
                        return a;
                        }
                        //模块定义文件I0.DEF
                        CODE PRELOAD MOVEABLE DISCARDABLE
                        DATA PRELOAD SINGLE
                        EXPORTS
                        inport
                        outport

                        3.3 VB中的DLL调用
                           
                        DLL函数或过程必须在全局模块(*.BAS)中正确说明才有效。VB是用Declare语句把一个DLL函数引入VB中的,它告诉VB在哪里找到DLL函数,并且让VB知道DLL需要哪种类型的参数,同时返回哪种类型的值。当某个DLL函数用Declare语句正确声明以后,就可以像使用其它函数一样使用这个DLL函数。

                           
                        在VB应用程序的全局模块中声明I0.DLL并将其放入Windows/system目录下,这样就可以向使用Windows
                        API一样使用I098中的inport和outport函数了。
                        Declare Function inport Lib"io.d11"  (ByVal prot As
                        Integer)As Long
                        Declare Function outport Lib"io.d11"  (ByVal port As
                        Integer,ByVal databyte As Long)As Long
                        4  应用实例
                        4.1 813B采集卡的初始化(采集卡基地址220H)
                        (1) 选通道
                        向22AH写入相应的控制字选择通道,写入“0”表示0通道,写入“1”代表1通道,依次类推
                        (2) 启动AD转换
                        向22CH写入任意值,触发AD转换
                        (3) 读入数据
                        把12位数据的低8位读入224H,把高4位读入225H中。

                        4.2 VB的编程实例
                           
                        利用定时器实现定时采集在VB中,可利用定时器的Interval属性设置每秒钟采集的次数,把采集段程序放在定时器的Timer事件中来实现数据采集.对于一般计算机来讲,由于受系统硬件能力的限制,定时器每秒钟最多只能产生18个事件,若时间间隔设置得过小,将达不到预期效果
                        应用实例下面给出数据采集软件程序中部分主要源代码
                        以采集某0~100℃的温度信号(经温度变送器转换为0~5V)为例,设定A/D板为单极性输入方式,I/O端口基地址为220H,放大倍率为1
                        在module1中声明:
                        Declare function outport Lib "io.dll" (ByVal
                        portAsInteger,ByValdataAsInteger)
                         Declare Function inport Lib"io.dll"(ByVal portAsInteger
                        AsInteger)
                         DLL文件已拷贝到Windows的System目录下
                        采集程序部分:
                        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位送入变量adwh
                        adwh=inport (&H225) //A/D结果高4位送入变量adwl
                        adwdata=VAL(adwh-224)×256+VAL(adwl)  
                             //12位A/D转换结果
                        vWD=adwdata×10/4095 //对应的电压 
                        WD=100×vWD/5 //标度变换为实际温度 
                        …
                        EndSub
                        几点说明:
                        数据采集值是12位,放在2个地址里,其中224H存放数据的低8位(数据7~数据0),225H的低4位存放采集数据的高4位(数据11~数据8),225H的其它位自动变为1110。
                        
                        则12位AD转换的结果为:
                        adwdata=VAL(adwh-224)×256+VAL(adwl),
                        其中224表示无采集数据时的自然值(即11100000)。
                        12位AD经AD转换的最大值是212=4096
                        5  结束语
                            上述采用VB调用DLL实现数据采集的方法有一定的通用性,上述程序全部经过测试通过,可作为类似控制的参考。
                        参考文献
                        [1] 三味创作室. VB6.0应用与提高[M]. 北京:科学出版社,1999.
                        作者简介
                        张智杰(1970-)  工程师 
                        毕业于山东科技大学电气自动化专业,现主要从事计算机控制系统、PLC应用系统的科研与教学工作。
                        
                        本文摘自《PLC&FA》

阅读(6370) | 评论(2)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册