2022年调用文本编程语言创建的代码 2.pdf
《2022年调用文本编程语言创建的代码 2.pdf》由会员分享,可在线阅读,更多相关《2022年调用文本编程语言创建的代码 2.pdf(20页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年调用文本编程语言创建的代码 2022 调用 文本 编程 语言 创建 代码
限制150内