Windows95下利用VB实现实时数据采集

  • 来源: 互联网 作者: 若水   2008-03-17/16:19
  • 本文介绍了利用VC++编写Windows95下扩展插板端口读写的动态链接库(DLL),以及如何在VB下使用的方法。
       关键词:动态链接库(DLL)数据采集端口读写
    一、引言
       VB是一种可视化的编程语言,自面世以来,倍受广大编程人员的青睐,作为一种非常方便的Windows95应用程序开发平台,可以实现Windows的绝大部分功能。但与任何其它语言一样,VB也有自身的不足。在工业控制中对计算机的底层硬件进行访问以及利用各种控制接口板进行数据采集和控制时间,仅靠VB是无法解决的。解决这样的问题可以间接使用动态链接库DLL(Dynamic Link Library)来实现。程序人员利用DLL可以实现应用程序共享代码和资源,DLL与用户的程序完全分开。本文通过实际应用,取得较好的效果。
    二、动态链接库(DLL)
       动态链接库虽然是一个可执行模块,但它并不可以直接运行,它只是提供一群函数供Windows应用程序或其它动态链接库调用,以完成其特殊任务。由于动态链接库是在应用程序运行期间被连接起来的,故称为动态链接库。动态链接库只有在别的模块中调用了它的某个函数以后,该动态链接库才发生作用。

    三、编写DLL

    创建一个DLL应包括三个基本成分。
    其一是,Libmain函数,它是Windows DLL的入口点,主要用来完成一些初始化任务。
    其二是,出口函数WEP。Windows的DLL必须包含一个标准的出口函数。在DLL最终卸出之前,Windows调用该函数作一些必要的清除工作(如释放一些资源等)。
    其三是,自己的功能函数。
    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选项,并输入工程项目名,即可生成动态链接库的工作框架。
    笔者利用VC++5.0开发的DLL的完整的程序清单如下:

    ∥DLL源文件I098.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 outport(unsigned short port)

    reture(_inp(prot);

    int FAR PASCAL inport(unsigned short port,int databyte)

    int a;
    a=_outp(port,databyte);
    return a;

    ∥模块定义文件I098.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应用程序的全局模块中声明I098.DLL并将其放入Windows\system目录下,这样就可以向使用Windows API一样使用I098中的inport和outport函数了。

    Declare Function inport Lib“io98.d11”
    (ByVal prot As Integer)As Long
    Declare Function outport Lib“io98.d11”
    (ByVal port As Integer,ByVal
    databyte As Long)As Long

    下面的程序示范了使用I098中的intport和outport函数。

    Private Sub 输入_Click
    X=inport(&H300)
    Print x
    End Sub
    Private Sub输出_Click
    x=outport(&H300,&HF)
    Print x
    End Sub
    笔者曾在多套采用VB开发的计算机测控系统中使用这种方法,在一套车辆自动化管理系统开发过程中,笔者成功地采用上述DLL从研华PCL-722板上读取数字信号;在另一套加热炉的控制系统中,笔者成功地采用上述DLL从研华PCL-812PG板上读取1—5V的模拟信号。
    五、结束语
    以上介绍了编写32位DLL(即WIN32DLL)的一个实例,很好的解决了VB对硬件的访问的不足,实现了VB的实时数据采集,扩展了VB的功能。读者可通过本文所介绍的方法来编写自己的WIN32DLL,为自己开发的Windows95应用程序服务,不仅限于实时数据采集。除VB外,在DELPHI、Foxpro或其它类似条件下也可使用这种方法


    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多