2022年调用文本编程语言创建的代码 2.pdf

上传人:H****o 文档编号:33652668 上传时间:2022-08-12 格式:PDF 页数:20 大小:1.19MB
返回 下载 相关 举报
2022年调用文本编程语言创建的代码 2.pdf_第1页
第1页 / 共20页
2022年调用文本编程语言创建的代码 2.pdf_第2页
第2页 / 共20页
点击查看更多>>
资源描述

《2022年调用文本编程语言创建的代码 2.pdf》由会员分享,可在线阅读,更多相关《2022年调用文本编程语言创建的代码 2.pdf(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、该文档版权归上海微视泰科工作室所有,转载请注明出处!网址:http:/Email: 作者: HighTech Young1 6调用文本编程语言创建的代码 6.1.概述 本章主要叙述在LabVIEW中如何调用利用传统的基于文本的编程工具创建的代码. 通过学习本章您将了解以下知识:z利用 Code Interface Node将 C 语言创建的代码集成到LabVIEW项目中;z利用 Call Library Function Node调用动态链接库。在用LabVIEW开发大型的项目的过程中,尽管它能给开发者提供快速的解决方案,但是有时候传统的基于文本的开发工具在实现某些功能时相对可能容易些(如开发

2、对运行时间要求很苛刻的程序),或者有些任务不能通过调用LabVIEW的函数来直接实现(如操作系统API 的某些功能) 。这个时候就可以考虑使用Code Interface Node ( CIN )或者 Call Library Function Node来调用基于文本的开发工具开发的代码。通常来说在大型的项目开发过程中这样做的目的主要有以下几个方面:z代码的复用。对一个项目开发团队来说,整个团队使用的开发工具可能不只是一种。从横向来看,团队中负责各子系统的开发人员可能使用的开发工具不尽相同,, 从纵向来看, 整个团队多年来可能已经换过多种不同的开发工具。为了能减少重复工作,共享代码或重复利用以

3、前的代码,可以用CIN将 C 代码或者用Call Library Function Node将其它工具创建的DLL 集成到 LabVIEW项目中来。z项目的开发效率。 虽然用 LabVIEW为项目提供解决方案,其效率相对于基于文本的传统开发工具大大提高, 但是有些时候用传统的开发工具实现某些功能却比LabVIEW来的容易。 例如开发与底层硬件交互或者开发对运行时间要求很苛刻的程序时,VC 可能就比 LabVIEW来得方便。或者开发者需要某种特殊的算法,而且这种算法用传统的开发工具实现要比LabVIEW开发容易些 (如图像处理的一些算法等)。这时开发者就可以用CIN或者 Call Library

4、 Function Node把传统开发工具的长处和LabVIEW的长处结合在一起,共同为项目提供解决方案。zLabVIEW不能胜任的工作。LabVIEW提供了很多函数和开发的toolkit,但是这并不意味着LabVIEW可以完成任何事情。例如操作系统API 提供的某些功能,LabVIEW的函数库中就没有提供。那么开发者就可以用CIN或者 Call Library Function Node来扩展 LabVIEW为项目提供方案的能力。值得注意的是, 在 LabVIEW项目执行调用的外部代码时,执行的线程将被占用,直到执行节点返回为止。也就是说如果线程正在执行外部代码,那么它将不会处理其它任务,当

5、然用户也将不能中断此执行过程。那么开发人员在将外部代码集成到项目中时,如果代码如果完成的任务执行时间较长,就一定要慎重处理了。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 20 页 - - - - - - - - - 该文档版权归上海微视泰科工作室所有,转载请注明出处!网址:http:/Email: 作者: HighTech Young2 6.2.用 CIN 调用 C 代码 Code Interface Node (CIN) 可以被看作是 LabVIEW用来扩展自身开发

6、能力的一种方法,它通过将VC+或Symantec C(在Linux平台上可以是gcc)编写的代码集成到VI中来扩展 LabVIEW自身能力的不足。与调用DLL 不同的是,CIN可以将外部的代码与VI集成在一起,一旦编译成功后就可随VI一起分发,不需要原来的源文件或者其它文件来支持其运行。从运行的效率而言,DLL和CIN相同。在LabVIEW项目中使用CIN,一般通过以下途径:1. 指定接口的输入输出参数的类型传递方式;2. 创建 .C代码的框架并完成代码; 3. 编译代码为 LabVIEW可以识别的格式(.lsb 格式 ) 4. 加载CIN目标代码以下章节用实际例子对其逐步详细说明。为了把重点

7、放在CIN调用步骤的说明上,该例子只简单完成两个数的求和的运算。6.2.1.指定接口的输入输出参数的类型和传递方式首先,在Function -Connectivity-Libraries & Executables中(如图 6-1 )选取Code Interface Node放在Diagram上。默认情况下,CIN节点只有一个输入端口和一个输出端口,用户可以通过用鼠标拖动图标的边框,或者通过选择节点端口右键菜单中的Add Parameters/Remove Parameters来增加 /删除参数。但是增加的参数是成对出现的。每增加一个输入( 或输出 ) 端口,都会有一个与之相对应的输出(或输入

8、 )端口出现。图 6-2 CIN节点在 LabVIEW8 函数面板中的位置 图 6-3 CIN的输入输出参数 输入输出参数的数据类型由与之连接的Control或Indicator决定。也就是说输入参数的类型取决于与其连接Control的数据类型,输出参数的类型取决于与其连接的Indicator的类型。CIN的参数传递方式可以分为:Input-Output和Output Only两种类型。不同的连接方式表示了不同的参数传递方式。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共

9、 20 页 - - - - - - - - - 该文档版权归上海微视泰科工作室所有,转载请注明出处!网址:http:/Email: 作者: HighTech Young3 默认情况下, LabVIEW中CIN节点的参数传递方式为“Input-Output”( 传递指向参数的指针) ,节点左边连接输入参数,右边连接输出参数。例如图 6-3 a) 中所示, 连接一个32 位整型Control作为输入参数,连接一个32 位的整型Indicator作为输出参数。 在 VI 调用CIN的时候, LabVIEW只将输入参数的指针传递给CIN目标代码,CIN代码执行完毕后,LabVIEW会将输入参数指针指向

10、的值传递给输出Indicator。在这种情况下, LabVIEW认为CIN代码可以修改连接到输入端Control的值。此时就要注意,如果VI 中有其它地方也需要调用CIN前输入Control中的值作为参数,那么必须在调用CIN前copy输入Control的值,否则就有可能出错。在参数传递时,也可以只在输入端连接Control,而使输出端悬空。例如图 6-3 b)中所示,连接一个32 位整型Control作为输入参数,而输出端悬空。这时LabVIEW会认为CIN不会修改传递给它参数的值。如果 VI 中有其它地方也需要调用CIN前输入Control中的值作为参数, 就不必在调用CIN前 copy

11、输入Control的值了。当然必须确保在CIN代码中不能修改参数的值,如果用户非要更改参数的值,那么更改后的值将在输入Control中显示。如果用户只想用一对连接端子连接输出参数,就可以将参数传递方式设置为Output Only类型。可以通过选择端子右键菜单中的Output Only将参数传递类型设置为Output Only类型。设置成功后端子对应得输入端就会变成灰色(图 6-3 c) 。对于Output Only类型的参数, LabVIEW会为其分配专门的空间来存放返回值,然后将指向分配空间的指针传递给CIN,一旦CIN执行完成 ,就会按照与其连接的Indicator数据类型将返回值显示在出

12、来。 但是在某些情况下, 可能会将同一个输出连接到多个具有不同数据类型的Indicator上 (图 6-3 d) ,这时对LabVIEW 来说就有可能出现判断数据类型错误的情况。为了解决此问题,可以将一个Control连接到与输出对应得输入端子上,输出端子将会引用该Control的数据类型(图 6-3 d) 。对于求和运算的例子来说,我们指定两个8 位的整型量作为输入参数,指定一个8 位的整型量作为输出参数,结果如下:图 6-4 Sum=A+B 的 CIN参数 6.2.2.创建 .C 文件框架并完成代码为CIN节点指定了输入输出参数后,可以通过选择节点右键菜单中的Create .c File生

13、成CIN源代码的模版。用户在生成的模版中添加CIN要完成功能的代码。为求和运算例子创建的源代码如下:/* CIN source file */ #include extcode.h MgErr CINRun(int8 *A, int8 *B, int8 *Sum); MgErr CINRun(int8 *A, int8 *B, int8 *Sum) /* Insert code here */ return noErr; 模版会自动包含LabVIEW程序目录下Cintools目录中的extcode.h文件,这个文件不仅定义了CIN使用的基本数据类型和函数原型,还定义了可能与系统头文件中定义有冲

14、突的一些常量。Cintools目录中还有一个hosttype.h文件,此文件用于解析系统头文件和extcode.h之间的差异, 同时也包含了给定平台的通用头文件。始终在 .C 源文件的起始位置包含extcode.h文件,如果代码对系统进行了调用,则一般应该在extcode.h名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 20 页 - - - - - - - - - 该文档版权归上海微视泰科工作室所有,转载请注明出处!网址:http:/Email: 作者: HighTec

15、h Young4 文件后立刻包含hosttype.h文件,然后再将系统的头文件包含进来。对给定的系统来说,hosttype.h只包含了部分头文件,如果用户需要的系统头文件没有包含在内,则可以在它之后包含需要的头文件。在生成的 C 模版文件中, 除CINRun必须存在外, 还有其它 7 个用于维护现场的函数可选则使用:CINLoad, CINSave, CINUnload, CINAbort, CINInit, CINDispose, and CINProperties。LabVIEW在运行到CIN 节点时会调用调用CINRun函数,CINRun函数会接收到输入输出参数。7 个用于清理现场的函数

16、只有在特定的情况下才会被调用。例如,LabVIEW在第一次加载vi 时会调用 CINLoad函数,如果用户要在第一次加载vi 时完成某种特殊的任务,就可以在CINLoad函数中添加相应的代码。下面代码给出了一个在CINLoad中添加代码的模版:CIN MgErr CINLoad(RsrcFile reserved) Unused (reserved); /* Insert code here */ return noErr; 一般说来,在C 源代码文件中只需要编写CINRun函数九可以了,只有在某些特殊情况(如完成某些初始化,预分配空间或者维护交叉调用的信息)下才调用现场维护的函数。对于两个数

17、求和的例子来说,我们可以在CINRun函数的/* Insert code here */ 处添加下句A 和 B 求和的代码如下:/* CIN source file */ #include extcode.h MgErr CINRun(int8 *A, int8 *B, int8 *Sum); MgErr CINRun(int8 *A, int8 *B, int8 *Sum) /* Insert code here */ *Sum = *A + *B; return noErr; 6.2.3.编译代码为LabVIEW可以识别的 .lsb格式完成了代码的编写后就需要将代码编译成LabVIEW可识

18、别的 .lsb格式。 LabVIEW支持不同平台上的编译器(Windows上的VC+,Symantec C,Linux的gcc,以及Mac上的xCode)编译CIN。开发平台和编译器不同编译的方法也不同。对于Linux和Mac平台上CIN的编译,用户可以参考LabVIEW的操作手册,这里只对在Windows平台上用VC来编译CIN的方法做详细讨论。CIN的编译其实并不复杂,但是 NI 在 LabVIEW的手册中提供的编译方法(特别是基于Makefile的编译方法)并不是很完美,这使很多同仁几乎为此忙到崩溃(我曾经在论坛中见到好多朋友为此花了大量的时间来求救)。下面提供两种在Win32平台下使用

19、VC+6来的编译的CIN的方法:Makefile方法和VC+ IDE方法。Makefile方法1.在 C 源文件的目录中创建一个与C源文件同名且后缀名为.mak的文件(如add.mak)其中包含以下内容:name = C源文件去掉后缀的部分type = CIN 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 20 页 - - - - - - - - - 该文档版权归上海微视泰科工作室所有,转载请注明出处!网址:http:/Email: 作者: HighTech Young

20、5 cinlibraries = Kernel32.lib CINTOOLSDIR=Cintools目录的路径!include 例如为两个数求和的例子创建的add.mak文件如下:name = add type = CIN cinlibraries = Kernel32.lib CINTOOLSDIR=d:cintools !include 文件中“ CINTOOLSDIR=CIN工具所在目录 ”是指向 LabVIEW安装目录中Cintools目录的路径。但是由于编译器不识别长文件名,所以此处的路径比须是DOS 操作系统的路径名(即目录和文件名8 字符,后缀名3 字符的格式),否则编译器将不能

21、识别。建议将整个Cintools目录 copy到一个容易用DOS 命名方式表达的路径下使用,如d:cintools。2.mak文件创建完成后,运行VC+ 6并选择File - Open打开.mak文件(注意不要打开工作空间)。此时将会跳出询问是否生成新的project来包装 makefile和询问工作平台的对话框(图 6-5和图6-6 )选择Yes和OK.图 6-5 包装makefile的对话框 3.保存 Project并选择 Build就会生成需要的.lsb文件图 6-6 为包装的项目选择平台 VC+ IDE方法使用VC+ IDE编译.lsb的方法可以按照下面步骤来完成。1 创建新的 DLL

22、 Project 。选择File - New 选择Win32 Dynamic-Link Library作为要创建项目的类型,并为项目命名(图 6-7 ),选 OK 后再选择An Empty DLL Project,然后生成一个dll 项目;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 20 页 - - - - - - - - - 该文档版权归上海微视泰科工作室所有,转载请注明出处!网址:http:/Email: 作者: HighTech Young6 2 为创建的项目添

23、加所需要的目标文件和库文件。选择Project - Add To Project - Files添加Cintools目录中的下列4 个文件cin.obj, labview.lib, lvsb.lib和lvsbmain.def.到项目中图 6-7 创建 DLL项目3 将 Cintools添加到包含路径中。选择Project - Settings把Settings for下拉列表框切换到All Configurations. 选择选项卡C/C+,把category下拉列表框切换到Preprocessor然后在Additional Include Directories域中输入 Cintools所在

24、的路径。 (如图 6-8) 图 6-8 将 Cintools添加到包含路径名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 20 页 - - - - - - - - - 该文档版权归上海微视泰科工作室所有,转载请注明出处!网址:http:/Email: 作者: HighTech Young7 4 设置Struct member alignment为1 Byte.选择Project - Settings把Settings for下拉列表框切换到All Configuratio

25、ns. 选择选项卡C/C+,把category下拉列表框切换到Code Generation,从Struct member alignmen下拉列表框中选择1 Byte(如图 6-9 ) 。图 6-9设置Struct member alignment为1 Byte 5 选择运行库。选择Project - Settings把Settings for下拉列表框切换到All Configurations. 选择选项卡C/C+,把category下拉列表框切换到Code Generation,从Use run-time library下拉列表框中选择Multithreaded DLL(如图 6-10

26、) 。图 6-10选择运行库名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 20 页 - - - - - - - - - 该文档版权归上海微视泰科工作室所有,转载请注明出处!网址:http:/Email: 作者: HighTech Young8 6 为lvsbutil设置Custom Build命令。选择Project - Settings把Settings for下拉列表框切换到All Configurations. 选择选项卡Custom Build。在 Comman

27、ds域中填写以下内容(其中代表空格):lvsbutil$(TargetName)d$(WkspDir)$(OutDir)例如:D:cintoolslvsbutil $(TargetName) d $(WkspDir)$(OutDir) 此处 是指向 LabVIEW安装目录中cintools目录的路径。 但是由于编译器不识别长文件名,所以此处的路径比须是DOS 操作系统的路径名(即目录和文件名8 字符,后缀名3 字符的格式) ,否则编译时会出错。建议将整个Cintools目录 copy到一个容易用DOS 命名方式表达的路径下来使用,如d:cintools。在 Outputs域中填写以下内容:$(

28、OutDir)$(TargetName).lsb为编译两数求和的例子所作配置如图6-11所示。图 6-11为lvsbutil设置Custom Build命令 7 最后将 C 源文件添加进项目中来进行编译。添加C 源文件的方法可参看第2 步。编译成功后即可生成.lsb 文件。6.2.4.为 CIN加载 .lsb文件为了在 VI 中调用 CIN ,还要完成加载CIN 目标代码的最后一步。可以通过选择CIN 节点右键菜单中Load Code Resource来加载相应.lsb文件 ,一旦加载成功,此VI 就可以脱离源文件单独运行了。如果用户升级了代码,只需要重新加载新的.lsb文件即可。6.2.5.

29、CIN的调试编写复杂的CIN 代码很难一次成功,一般需要反复调试才能完成。调试CIN可以使用以下两种方法。一种通过配置VC+ 开发环境以便能在设计时对代码调试,另一种是使用DbgPrintf函数显示变量运行时信名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 20 页 - - - - - - - - - 该文档版权归上海微视泰科工作室所有,转载请注明出处!网址:http:/Email: 作者: HighTech Young9 息。(1) 使用DbgPrintf函数显示变量运

30、行时信息DbgPrintf函数与SPrintf函数类似 ,其函数原型如下:Int32 DbgPrintf(CStr cfmt, .); 在运行时,如果第一次执行它时,会弹出一个窗口显示传递给该函数的值,随后的调用会在窗口中添加新的行。如果传递参数NULL 给该函数时窗口会关闭。(2) 配置 VC+ 开发环境以便能在设计时对代码调试为了能在设计时利用VC+调试 CIN, 必须按照下面步骤来进行。a.在 CIN 源代码中设置中断。中断必须在CIN 被加载进内存后设置。这可以通过在CINLoad函数种添加asm int 3;汇编代码来进行,代码如下:CIN MgErr CINLoad(RsrcFil

31、e reserved) Unused(reserved); asm int 3; /*DebugBreak();*/ return noErr; 在 Windows 2000/XP平台上可以使用DebugBreak();代替汇编代码行,但是应该包含windows.h头文件#include CIN MgErr CINLoad(RsrcFile reserved) Unused(reserved); DebugBreak(); return noErr; b.重新创建带有中断的CIN如果用户使用的Makefile编译项目,只要在.lvm文件中添加下面两行,然后重新创建项目: DEBUG = 1 c

32、inLibraries = Kernel32.lib 如果用户使用VC+ IDE编译项目则按照下面方法对项目进行配置:1) 指 定LabVIEW为 调 用 所 调 试DLL项 目 的 可 执 行 执 行 程 序 。 打 开 项 目 , 选 择Projects-Settings将Settings For下拉列表框设置为Win32 Debug;选择Debug选项卡,将Category下拉列表框设置为General;在Executable for debug session域中输入(或浏览)LabVIEW可执行文件的路径后选择OK;名师资料总结 - - -精品资料欢迎下载 - - - - - - -

33、 - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 20 页 - - - - - - - - - 该文档版权归上海微视泰科工作室所有,转载请注明出处!网址:http:/Email: 作者: HighTech Young10 2) 配置Win32 Debug。选择Build-Set Active Configuration,设置Win32 Debug为Active Configuration;选择Win32 Debug 然后点OK关闭Set Active Project Configuration窗口再重新创建项目 c.最后如果用户是使用Mak

34、efile编译项目,则正常运行程序,当其运行到中断处时会弹出如下信息:Click Cancel to launch the debugger, which attaches to LabVIEW, searches for the DLLs, then asks for the source file of your CIN. 此时用户便可以调试源文件了。如果用户使用VC+ IDE编译项目, 则可以在源文件中任何位置设置断点,将项目配置设置为Debug然后运行即可调试。6.2.6.关于 CIN的其它知识点前面几节只是对LabVIEW中 CIN 的开发方法作了介绍。但是要出色的完成CIN 开发其

35、实还有其它几个方面的知识需要了解,这里只对这些知识点简要介绍,详细介绍请参考LabVIEW随机手册。(1) 使 LabVIEW以多线程方式运行CIN 。如果 LabVIEW将以多线程方式运行CIN ,则 CIN 节点的颜色为黄色,负责为橙色。为了让LabVIEW以多线程方式处理CIN ,用户要在C 源文件中添加下面函数的原型声明和代码:CIN MgErr CINProperties(int32 prop, void *data); CIN MgErr CINProperties(int32 prop, void *data) switch (prop) case kCINIsReentrant

36、: *(Bool32 *)data = TRUE; return noErr; return mgNotSupported; (2) 使 CIN 为线程安全。 CINProperties只能保证LabVIEW以多线程的方式运行CIN, 至于 CIN是否能真正线程安全,则取决于C 代码的编写。下面给出一些基本的代码线程安全特点。a.代码不含有未受保护的全局数据(如全局变量,文件);b.代码不访问硬件(即不含有寄存器一级的代码);c.代码不调用非线程安全的函数、DLL 或者驱动;d.代码使用信号量或者互斥量来保护全局量;e.代码不用 CIN 的现场管理函数来访问全局资源等。(3) LabVIEW管

37、理函数。LabVIEW有一套移植性很好的函数集可以通过CIN 调用,其实 LabVIEW本身就基于这些函数之上来实现用户的需求。这些函数包括内存管理,文件管理以及其它的支持函数(如位操作,字节转换等)。用户可以同过调用这些函数开发与平台无关的程序。此外LabVIEW的分析函数主要基于CIN 创建,所以用户可以直接调用这些函数。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 20 页 - - - - - - - - - 该文档版权归上海微视泰科工作室所有,转载请注明出处!

38、网址:http:/Email: 作者: HighTech Young11 6.3. 调用动态链接库 (DLL) 相对于 CIN 来讲, NI 更推荐用户使用DLL 来共享基于文本编程语言开发的代码。除了共享或重复利用代码,开发人员还能利用DLL 封装软件的功能模块,以便这些模块能被不同开发工具利用。在LabVIEW中使用 DLL 一般有以下几种途径:1.使用自己开发DLL 中的函数。2.调用操作系统或硬件驱动供应商提供的API 。对于前一种方法来说,又可以通过以下几步来实现:a)在 LabVIEW中定义 DLL 原型;b)生成 .C 或.C+文件,完成实现函数功能的代码并为函数添加DLL 导出

39、声明;c)通过外部 IDE (如 VC+)创建 DLL 项目并编译生成.dll 文件。d)在 LabVIEW项目中使用DLL 中的函数。以下章节将通过实例对这两种情况详细进行叙述。6.3.1.配置 Call Library Function Node(CFN) 无论在 LabVIEW中使用自己开发的DLL ,硬件驱动供应商或者操作系统提供的API ,都可以通过配置 Call Library Function Node (CFN,图 6-12)来完成。图 6-12 LabVIEW的 Call Library Function Node在 CFN 图标的右键菜单上选择 “Configure ” 打

40、开 Call Library Function配置对话框 ( 图 6-13)。通过该对话框,可以指定动态库存放路径、调用的函数名以及传递给函数的参数类型和函数返回值的类型。在配置完后,CLF 节点会根据用户的配置自动更新其显示。通过Browse按钮或者直接在“Library Name or Path”输入框中指定调用函数多在.dll文件的路径。通过Browse按钮下的控件用户可以指定多个线程同时调用DLL 。默认情况下, LabVIEW以“Run 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - -

41、- - 第 11 页,共 20 页 - - - - - - - - - 该文档版权归上海微视泰科工作室所有,转载请注明出处!网址:http:/Email: 作者: HighTech Young12 in UI Thread”方式调用DLL ,调用的函数将直接在用户线程中运行。另外一种方式为递归方式“Reentrant” ,在这种情况下可以允许多个线程同时调用DLL中的函数。但要确保正常调用,必须使DLL 中的代码线程安全。以下是一些最基本的线程安全特性:a.代码不含有未受保护的全局数据(如全局变量,文件);b.代码不访问硬件(即不含有寄存器一级的代码);c.代码不调用非线程安全的函数、DLL

42、或者驱动;d.代码使用信号量或者互斥量来保护全局量;e.代码被一个非递归的VI 调用时为线程安全。图 6-13 CLF配置对话框 在“Function Name”输入框中指定要调用函数的函数名。通过“Call Conventions”下拉列表框指定调用DLL 中函数的方式。可以指定调用方式为“C” (默认方式) 或 Windows标准调用方式 “stdcall” 。 一般来说用“C” 方式调用开发人员自己写的DLL 函数, 而“stdcall”一般做为标准调用方式来调用windows的 API 通过Parameter域可以指定所调用函数的返回值类型。默认情况下CFN 节点没有输入参数而且只有一

43、个void类型的返回参数。该参数由 CFN 节点第一对连接点的右端返回,代表 CFN 执行结果。 如果返回参数的类型是void类型,则CFN 连接点为未启用状态(保持为灰色)。CFN 的每一对连接点代表一个输入或输出参数, 若要传递参数给CFN 则将参数连接至相应连接点的左端,若要读取返回值,则将相应连接点的右端连接到 Indicator。CFN 返回参数的类型可以是Void ,Numeric或String。只能为返回参数指定Void类型, 输入参数不能指定为Void类型。调用的函数没有返回值时,指定CFN 的返回参数类型为void类型。即使参数有确定类型的返回值,也可以指定CFN 的返回类型

44、为Void,但是此时,函数的返回值将被忽略。有些时候,调用的函数返回值不是以上三种类型,可以使用与以上三种类中有相同大小的一个来代替。例如如果调用的函数返回一个Char 类型数据, 则可以用一个8-bit unsigned integer的Numeric类型来代替。此外,由于LabVIEW中没有指针,因此调用DLL 中的返回指针的函数似乎不可能。但是可以设定返回值类型为一个与指针有相同大小的Integer类型, LabVIEW将把地址以整型值来看待,并且用户可以在以后的调用中直接使用它。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - -

45、 - 名师精心整理 - - - - - - - 第 12 页,共 20 页 - - - - - - - - - 该文档版权归上海微视泰科工作室所有,转载请注明出处!网址:http:/Email: 作者: HighTech Young13 通过Parameter域和其右边的“Add a Parameter Before”,“Add a Parameter After”和“Delete this Parameter”三个按钮可以增加、删除以及修改CFN 的输入参数和类型。当用户选择某参数的类型后,其详细的数据类型列表和参数传递方式列表将显示出来,以方便进行详细设定。表 6-1列出了可以设定的输入参

46、数类型及其详细数据类型信息。参数类型说明NumericNumeric型参数有以下几种数据类型: z8、16 、32 和 64 位符号和无符号整型(Signed or Unsigned Integer)z4 字节单精度类型(4-byte single)z8 字节双精度类型(8-byte Double)利用“ Pass ”下拉列表指定传递参数指针或是传递参数的指针。Array Array型参数的数据类型同Numeric型参数的数据类型;通过 Dimensions指定数组的维数;Array Format有以下几种选项:zArray Data Pointer传递一维指针到数组值zArray handl

47、e传递一个指向数组每一维的4 个字节指针的指针, 其后为数组的值zarray handle Pointer为数组的句柄传递一个指针String 用 String Format下拉列表框选择字符串类型zC String Pointer 以 null 字符结束的字符串zPascal String Pointer 附加长度字节的字符串zstring handle一个指向 4 个字节长度信息指针,其后为字符串的值。zstring handle PointerWaveform Waveform类型的参数默认类型为8-byte double,因此一般没有必要为其指定数据类型。但是必须为其指定维数,如果参数

48、为单独的Waveform,则指定 Dimensions为0,如果参数为waveform数组,则指定Dimensions为 1。注意: LabVIEW不支持超过1D 的 waveform数组!Digital Waveform 如果参数为digital waveform数组,则指定Dimensions为 1, 否则为 0。注意: LabVIEW不支持超过1D 的 waveform数组!Digital Data 如果参数为digital data数组,则指定Dimensions为 1, 否则为 0。注意: LabVIEW不支持超过1D 的 digital Data数组!ActiveX Data Ty

49、pe下拉列表框有以下选择:zActiveX Variant Pointer传递一个指向ActiveX数据的指针zIDispatch* Pointer传递一个指向ActiveX自动化服务器IDispatch接口的指针zIUnknown Pointer传递一个指向ActiveX自动化服务器IUnknown接口的指针Adapt to Type 用来传递 LabVIEW独有的数据类型给DLL 。表 6-2 CFN输入参数的类型 有时可能在CFN 配置对话框中并不能找到要传递给它的参数类型,在这种情况下可以通过下面方法来解决。如果参数不含指针,则可以通过Flatten to String函数()将参数转

50、换为字符串,并将此字符串指针传递给函数。还有其它一些技巧请参见NI 手册。设定后的最终结果显示在“Function Prototype”文本框中,在确认前,可以在此检查设定是否正确。如果不正确可以在此修改设定。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 20 页 - - - - - - - - - 该文档版权归上海微视泰科工作室所有,转载请注明出处!网址:http:/Email: 作者: HighTech Young14 6.3.2.调用自己开发DLL中的函数开发人

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁