第6章++Advanced子模板及LabVIEW与C语言的接口方法.ppt_第1页
第6章++Advanced子模板及LabVIEW与C语言的接口方法.ppt_第2页
第6章++Advanced子模板及LabVIEW与C语言的接口方法.ppt_第3页
第6章++Advanced子模板及LabVIEW与C语言的接口方法.ppt_第4页
第6章++Advanced子模板及LabVIEW与C语言的接口方法.ppt_第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章Advanced子模板及LabVIEW与C语言的接口方法,6.1概述6.2Advanced子模板6.3CIN(代码接口节点)图标及其与C语言接口技术6.4CIN图标的调用及参数设置6.5CIN设计步骤6.6应用举例:用CIN图标实现对HY-1232数据采集卡的驱动6.7端口操作图标InPort.vi、OutPort.vi及其应用本章小结,6.1概述,用前五章介绍的知识完全可以完成一个完整的虚拟仪器测试系统的基本编程,但是LabVIEW并不是万能的,它所提供的图标功能是有限的,实际系统中仍然有某些功能是LabVIEW无法或难以实现的。针对这个问题,LabVIEW在Advanced子模板上提供了和C语言的接口,还提供了调用Windows动态链接库DLL函数以及实现多线程编程等高级功能。,6.2Advanced子模板,1.调用路径FunctionsAdvancedAdvanced子模板如图61所示。,图61Advanced子模板,6.3CIN(代码接口节点)图标及其与C语言接口技术,CIN是CodeInterfaceNode的简称。Advanced子模板上提供了CIN图标,可以实现在LabVIEW中引入C语言源代码,因此它是LabVIEW图形化编程语言环境与C语言的接口。C语言是功能非常强大的文本式编程语言,当遇到某些LabVIEW图标难以实现的功能时,就可以通过CIN图标在LabVIEW中引入C语言源代码来实现,从而大大提高了LabVIEW数据处理的整体功能。,作为LabVIEW与C编程语言的接口图标,CIN是通过输入、输出端口实现两种语言之间的数据传递的。输入、输出端口的个数可由设计者根据实际需要确定。当LabVIEW的程序运行到CIN节点时,数据由CIN的输入端口传递给C源代码图标,程序转去执行C源代码,代码执行完后,得到的数据结果由CIN的输出端口返回给LabVIEW。,CIN的设计方法大致包括以下几个步骤:(1)确定CIN图标的输入、输出参数个数和数据类型。(2)生成C源代码编辑格式文件。(3)在编辑格式文件中的规定位置(/*EnterYourCodeHere*/)填写实现某种测量功能的C源代码,生成最终的C源代码文件。,(4)在LabVIEW指定的环境下编译步骤(3)中生成的C源代码文件,并生成可执行文件。(5)调用CIN的功能菜单将生成的可执行文件载入CIN图标。这样就基本形成了一个具备某种功能的CIN图标。,本章以实现c=a+b为例,介绍CIN图标的使用方法,同时着重介绍它在驱动数据采集卡方面的应用。LabVIEW支持的数据采集卡(当然NI公司生产的数据采集卡在其中之列),是Measurement函数声明CINMgErrCINRun(float64*a,float64*b,float64*c)函数体/*ENTERYOURCODEHERE*/填入C语言源代码returnnoErr;,6.5.2添加C源代码在/*ENTERYOURCODEHERE*/处填入设计者所编写的C源代码。对于本例,填写后的C源代码文件为,/*CINsourcefile*/#includeextcode.hCINMgErrCINRun(float64*a,float64*b,float64*c);CINMgErrCINRun(float64*a,float64*b,float64*c)*c=*a+*b;/*添加的代码*/returnnoErr;,注:在C源代码的编写过程中,除可直接调用C语言的基本库函数外,LabVIEW提供有专门支持CIN设计的库函数,如存储空间(Memory)的动态分配(后面的采样举例中会用到)、文件的操作等,供设计者使用,详细内容可查看LabVIEW的在线帮助(OnlineHelp)。,6.5.3*.C文件源代码的编译*.C文件源代码的编译主要是在以C语言为主的开发系统中进行。编译完毕形成一个可以和CIN图标进行动态连接的工程文件*.lsb。下面介绍在VC+集成环境下编译*.C源代码的具体步骤。,(1)新建一个DLL工程文件,命名为Add。打开VC+开发平台,执行FileNew操作。进行选项:win32DynamicLinkLibrary。添加工程文件名:Add。location:填写工程文件的存放路径。也可以采用其默认路径D:MicrosoftVisualStudioMyProjects。最后形成工程文件add.cpp。,(2)向工程文件中添加cin.obj、labview.lib、lvsb.lib、lvsbmain.def四个文件。执行ProjectAddtoProjectFiles操作,向工程文件添加上述四个文件。这四个文件在LabVIEW安装路径下的cintools文件夹下的win32子文件夹中。,(3)向工程文件中添加上面的*.C源代码文件add.c。添加方法同(2)。(4)*.C源代码文件编译前的设置。由菜单项ProjectSetting打开设置对话框,逐项设置。Settingfor选项设置。AllConfiguration。C/C+标签页设置。用鼠标左击C/C+标签页按钮,逐项设置。,lCategory:由下拉菜单选择为Preprocessor。Additionalincludedirectories:添加LabVIEW的cintools文件夹的路径。假设LabVIEW安装路径为d:LabVIEW,则在Additionalincludedirectories处添加路径d:LabVIEWcintools。lCategory:由下拉菜单另选为CodeGeneration。Strictmemberalignment:设置为1Byte。Userun-timelibrary:设置为MultithreadedDLL。,CustomBuild标签页设置。用鼠标左击CustomBuild标签页,逐项设置。lCommands:输入命令行如下:d:labviewcintoolswin32lvsbutil$(TargetName)d“$(WkspDir)$(OurDir)”(假设LabVIEW的安装路径为:d:labview。)lOutputs:输入命令行如下:$(OutDir)$(TargetName).lsb,(5)添加C源代码程序。可在Workspacewizard窗口中双击add.c,打开源文件添加C源代码。如果已经添加过,则继续下一步。(6)编译*.C源代码文件。在主菜单Build下选择Compileadd.c选项,则进行add.c程序的编译,如有语法等错误,则给出错误提示,按提示修改程序,重新编译。重复这一过程,直至没有错误。,(7)生成可执行文件。在主菜单Build下选择BuildAdd.dll选项,即生成可执行文件Add.lsb,同时生成如Add.dll等所需的全部文件。,图65CIN图标主菜单,1.装载可执行文件到CIN图标回到LabVIEW流程图窗口,窗口中CIN图标的快捷菜单如图65所示。从中选择LoadCodeResource项,即弹出一个Chooseacoderesourcefile对话框,如图66所示。按照Add.工程文件存入的路径寻找Debug目录下的Add.lsb文件,然后点击“打开”按钮,于是Add.lsb文件就装入CIN图标中。,图66Chooseacoderesourcefile对话框,2.可执行文件的重新装载及错误文件的清除如果在装载完可执行文件后,你对源代码又进行了修改,则必须重新编译,重新装载。在重新装载的时候,CIN图标在再次装载时,它的快捷菜单发生了相应的改变,如图67所示。利用其中的ReloadCodeResource(对同一可执行文件)或ReloadCodeResourceFrom(如果是其它可执行文件)选项,可实现可执行文件的重新装载。,图67ReloadCodeResource菜单,6.5.5运行程序至此,就完成了CIN的全部设计过程,可运行该程序,改变a、b的值,察看c的输出显示。关于数据采集卡的驱动程序,LabVIEW提供的开发方式有两个:利用端口操作图标InPort.vi和OutPort.vi开发数据采集卡驱动程序。这种方法实现起来比较简单,适于采集精度要求不高的情况,但对于精度要求高且较复杂的采集系统,如包含对物理内存大量操作的情况,这种方法是远远不能满足设计需要的。,采用LabVIEW提供的CIN(CodeInterfaceNode)图标开发数据采集卡驱动程序。这种方法适用于精度要求高且功能复杂的采集系统的设计,是一种理想的设计方法。本章我们以非NI公司生产的HY1232型数据采集卡的驱动为例,重点介绍利用CIN(代码接口)子模板驱动数据采集卡的方法。最后简单介绍利用InPort.vi和OutPort.vi两个端口的操作图标实现数据采集卡驱动的方法。,CIN子模板是LabVIEW与C语言之间的一种接口图标。设计者可以将那些在LabVIEW下难以实现和无法实现的功能,利用C语言来完成,然后再将结果通过CIN传递回LabVIEW。在实际设计应用中,经常会遇到某些想实现的功能,利用LabVIEW中现成的图标无法实现,而利用其它编程语言则很容易实现的情况,这时就需要利用LabVIEW中的接口图标以实现LabVIEW和其它编程语言之间的连接。CIN图标就是其中的一种。,6.6应用举例:用CIN图标实现对HY1232数据采集卡的驱动,6.6.1HY1232数据采集卡简介HY1232是一种IBMPCXT/AT总线兼容的数据采集卡,其主要性能指标如下:32路单端模拟输入通道;A/D分辨率为12bit;1路模拟输出通道;D/A分辨率为12bit;,D/A输出上电清零;模拟输入电压范围:5V;模拟输出电压范围:5V或0+5V;软件触发方式;数据传输方式采用软件查询方式和中断方式。,6.6.1.1HY1232数据采集卡工作原理将HY1232数据采集卡插入PC机的PCI插槽中,待采集的多路模拟信号通过一个40芯的输入输出插座分别接到采集卡内部的32选1的模拟输入多路开关上。通过软件设置,选通某模拟输入通道。对于HY1232数据采集卡,在选通某模拟信号输入通道的同时即启动了该路的A/D转换。当A/D转换完成时,采集卡上的转换完成位寄存器的最高位(D7)被置为“1”。用软件查询方式查询该寄存器的D7位,当查询到该位为“1”时,即表明采样已结束,可将12bit的数据读入计算机内存中。如果采用中断方式,则在A/D转换完成后,采集卡会自动向计算机发出中断请求信号。在中断服务程序内,将12bit数据读入计算机内存。,HY1232数据采集卡中采用的是12位A/D转换器,转换完毕的12位二进制数中的低八位AD7、AD6AD1、AD0存放在低八位缓冲寄存器中,其高四位AD11、AD10、AD9、AD8存放在高四位缓冲寄存器中。HY1232数据采集卡有32路单端模拟输入通道,由八位输入通道选择寄存器低六位(C4、C3、C2、C1、C0)的二进制状态字选择被测信号的输入通道。例如,选择第4通道输入信号的二进制状态字为00100。表61列入了各寄存器的读/写操作功能与占用地址。,表61HY1232数据采集卡板基地址分配与寄存器读/写操作功能,6.6.1.2对采集卡进行参数设置(1)确定采集卡的板基地址。板基地址是CPU分配给采集卡内存空间的首地址。首地址后面的内存空间供采集卡内部寄存器分配使用。HY1232数据采集卡板基地址的可选范围为:200H3FFH(5121023)。通常选0 x280,即280H(640)。(2)确定信号的输入方式。选择设置信号是单端输入还是双端输入,单极性信号还是双极性信号。HY1232数据采集卡只有32路单端输入一种方式,故不需要用户来设置。,(3)设置信号的输入范围。根据输入信号幅值范围和分辨率的要求进行选择。HY1232数据采集卡信号输入范围不可选,只能为5V+5V,且内部的放大器增益固定为1。(4)确定采样触发方式。一般分外触发、定时触发、软件触发等几种方式。但对于HY1232采集卡,只有软件触发一种方式,即在往输入通道寄存器写入所选通道号的同时即触发了A/D转换。,(5)A/D转换结束的判断。对于HY1232采集卡分查询方式和中断方式两种。(6)采样速率的设置。对于有些数据采集卡(如LabPC1200卡),用户可在其最大采样速率范围内进行选择设置,以满足实际的需要。但HY1232数据采集卡的采样速率是固定的,用户不可选。(7)设置信号输入通道。在031可选范围内选择。(8)设置一次采集点数。,6.6.1.3采集程序流程图与编程要点1流程图HY1232数采卡单点数据采集程序流程图如图68所示。,图68HY1232数采卡单点数据采集程序流程图,2.数据采集程序HY1232数据采集卡采集一个点的C源程序如下:#include#include#includevoidmain(void)intbasea,channel;floatvalue,lo,hi;,basea=0 x280;/*板基地址设为640*/printf(“Inputchannelnumber:”);/*设置采集通道号*/scanf(“%d”,/*往输入通道寄存器写入所选通道号,并触发A/D转换*/do/*查询A/D转换完成寄存器的最高位,若为1,则表明A/D;换结束,否则继续查询*/,while(!(inp(basea+5),3.编程要点说明1)outp(x,y)和inp(x)函数C语言接口函数outp(x,y)函数的功能是把函数y送入端口地址为x的寄存器中。outp(base,channel)是把通道号channel(程序中是由前面板控件设置)送入地址为base的输入通道选择寄存器,并启动该通道的A/D转换。,inp(x)函数的功能是从端口地址为x的寄存器中读取二进制数据。inp(base+1)从地址为base1的低八位寄存器读取A/D转换结果。inp(base+2)从地址为base+2的高四位寄存器读取A/D转换结果二进制数的高四位,并清除A/D完成位寄存器和中断请求信号。inp(base+5)从地址为base+5的完成位寄存器读取完成标志位I/O显示值,当IO=0时,表示A/D转换未完成;当IO=1时,表示A/D转换完毕。,2)A/D转换完成的判别采用Dowhile循环语句如下:Dowhile(!(inp(basea+5)句中0 x80的十进制数为128,相应二进制数为10000000,故inp(base+5)float64arg11;,TD1;typedefTD1*TD1Hdl;CINMgErrCINRun(uInt16*basea,uInt8*channel,int32*samples,TD1HdlWaveform);CINMgErrCINRun(uInt16*basea,uInt8*channel,int32*samples,TD1HdlWaveform)/*ENTERYOURCODEHERE*/returnnoErr;,从上面生成的代码可以看到,因为定义的CIN图标输出参数是数组型的,而LabVIEW向CIN传递数组类数据时,用的是句柄handle。传递数组的句柄结构是这样定义的:typedefstructint32dimSize;/*数组尺寸*/float64arg11;/*数组首地址指针*/TD1;,typedefTD1*TD1Hdl;对于一个有n个元素的一维数组,用dimsize函数表示为dimsizen。对于一个mn的二维数组amn,用dimSize函数表示为dimSize0=m,dimSize1=n。,(3)填写C源代码。将6.6.1.3节中的HY1232的C语言采集程序填入到上面的C源代码框架中。最终完成的C源代码文件(sampdata.c文件)如下:(注:设计者自行添加的语句为黑斜体,其余为自动生成的语句),/*CINsourcefile*/#includeextcode.h/*自动生成*/#includehosttype.h/*调用了系统及功能函数,因此添加此头文件*/#includedos.h/*调用了C语言中的inp()、outp()函数,因此添加此头文件*/*,*typedefs*/typedefstructint32dimSize;/*数组尺寸*/float64arg11;/*数组首地址指针*/TD1;typedefTD1*TD1Hdl;,CINMgErrCINRun(uInt16*basea,uInt8*channel,int32samples,TD1HdlWaveform);/*函数声明*/CINMgErrCINRun(uInt16*basea,uInt8*channel,int32*samples,TD1HdlWaveform)/*函数体*/*ENTERYOURCODEHERE*/,int16dbyte;/*定义16位字(A/D转换结果)*/float64value;/*定义变量,存放单点的A/D转换结果对应的模拟量*/float64array;/*定义数组,存放所有点的A/D转换结果对应的模拟量*/int32i;/*定义变量,存放循环采样次数*/MgErrerr=noErr;,/*动态设定数组Waveform的大小*/if(err=SetCINArraySize(UHandle)Waveform,3,*samples)gotoout;(*Waveform)dimSize=*samples;/*取数组Waveform的参数:dimSize,将其置为samples*/array=(*Waveform)arg1;/*取数组Waveform的参数:arg1e,置给array*/,/*软件查询式采集程序*/for(i=0;iAdvancedMemoryInPort.viFunctionsAdvancedMemoryOutPort.vi,图612Memory子模板,6.7.2InPort.vi、OutPort.vi图标端口参数设置1.InPort.vi图标及其端口参数设置InPort.vi图标及其端口参数设置如图613所示。,图613InPort.vi图标及其输入、输出参数设置,该函数完成从指定地址读取一个字节或一个字的操作,其输入、输出口参数及其含义为:输入端口:registeraddress:U32型。数据读入端口的物理地址。readabyteoraword:Boolean型。当该值为True时,读取一个字;当该值为False时,读取一个字节。默认值为False。输出端口:value:U16型。该值是从指定端口读取的字(或字节)。,2OutPort.vi图标及其端口参数设置OutPort.vi图标及其端口参数设置如图614所示。该函数完成向指定地址写入一个字或字节的操作。其输入端口参数及其含义为:,图614OutPort.vi图标及其端口参数设置,输入端口:registeraddress:U32型。该值为待写入寄存器的物理地址。writeabyteoraword:Boolean型。当该值为True时,向待写入寄存器写一个字;当该值为False时,向待写入寄存器

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论