记住密码

您所在的位置:首页 > 新闻 > 交流培训

数据采集卡的应用

信息时间:2012-11-28 信息来源:网络转载

      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

      #include

      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实现数据采集的方法有一定的通用性,上述程序全部经过测试通过,可作为类似控制的参考。

     

     

     

     

     

     

     

     

     

     

     

Copyright2006 www.xbgk.com Corporation,All Rights Reserved 客服电话:029-84589271 15719286749 备案号:陕ICP备05014423号
关注我们,随时随地获得最新资讯