没有合适的资源?快使用搜索试试~ 我知道了~
labview dll.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 132 浏览量
2023-07-04
22:10:13
上传
评论
收藏 1.19MB DOC 举报
温馨提示
试读
32页
labview dll.doc
资源推荐
资源详情
资源评论
1. 引言
实验室虚拟仪器工作平台是美国国家仪器公司研制的一种通用程序开发系
统,以其强大的数据采集、数据处理、数据分析和仪器控制功能在现代测控领域
中得到了广泛的应用。NI 公司在推出 LabVIEW 语言同时,也推出了一系列的数
据采集卡,但实际应用中往往会用到第三方厂家生产 DAQ 卡,在这种情况下就
需要使用 LabVIEW 提供的外部程序接口。
LabVIEW 的“调用函数库节点(CLF 节点)”提供了调用标准函数和用户自
定义函数的通用方法,对于 LabVIEW 不支持的硬件设备大部分采用这种方法进
行驱动。但是 CLF 节点也存在不足,使用中遇到最多的问题是参数类型不匹配。
使用重写动态链接库的方法,一方面可以兼容旧函数库的参数类型,另一方发面
可以获得 LabVIEW 提供的高级函数库应用。以下以 SDK2000 图像采集卡为例,
介绍重写函数库的基本原理和程序编写过程。
2. 实现方案及方案论证
SDK2000 图像采集卡提供的 Visual C++ IDE 程序开发包包含了外部程序调
用的共享函数库,但是有些函数不能直接用 CLF 节点进行调用。主要有两个原
因:库函数的参数类型与 LabVIEW 不兼容;图形化语言对于一些底层操作不易实
现。SDK2000 图像采集卡提供的库函数含有 LabVIEW 不支持的数据类型,并且
很多函数涉及到一些底层操作,如文件读取和内存管理。为了正确调用函数并返
回有效数据,解决这两个问题是关键。
LabVIEW 仅提供最基本的数据类型,虽然可以在 CLF 节点参数设置中选择
“Adapt toType”,但只能够传递 LabVIEW 内部使用的参数类型而已,而共享库函
数使用上百种非标准数据类型。参数类型不匹配可分为两种情况:
(1)非标准数据类型定义。很多程序和函数用到一些非标准的类型定义,例
如它们常常用 char、short 和 long 的类型定义代替 Windows API 使用的 BYTE、
WORD 和 DWORD。这种情况下要正确调用这些程序和函数,必须找到这些参
数在 LabVIEW 中同等的数据类型。
(2) 以结构或者类作为参数。一些程序和函数使用结构或者类作为参数,但
是 LabVIEW 并不能够识别这些参数的数据结构。为了正确调用这些库函数,
LabVIEW 提供了两种解决办法:使用 CIN 节点或者重写函数库对这些函数进行
重新封装,使这些函数的输入输出参数能够符合 LabVIEW 的标准。
SDK2000 提供的共享函数库使用了很多 LabVIEW 不支持的参数类型,如
RECT、VIDEOSTREAMINFO 等。为了正确调用这些函数,必须用 CIN 节点或
者重写函数库的方法对这些函数进行重新封装。相对而言,重新编写动态链接库
方法比使用 CIN 节点更为常用。因为 CIN 代码直接嵌入到 VI 程序代码里,对于
编程器的限制比较高,所以一般不采用 CIN 节点。
重新编写动态链接库的另一个原因,是为了获得 LabVIEW 提供的高级函数
库应用。LabVIEW 提供了在代码开发环境下的高级函数库,这些函数是针对于
LabVIEW 使用的数据类型,如下面所介绍的 NumericArrayResize()函数。
NumericArrayResize()函数用于动态改变数组的大小,不过只适合于 LabVIEW
使用的数组结构。LabVIEW 高级函数库还包含了一些底层操作,如文件读写与
内存分配等等,不存在参数类型不同和底层操作困难的问题。
3. 软件编程
由于需要重写的函数比较多,这里仅以重写保存 DIB 图像数据函数为例,
说 明 重 写 函 数 库 的 编 写 过 程 。 新 函 数 GetDib ( ) 对 原 函 数
DSStream_GetCurrentDib()进行了封装,其作用是向原函数传递有效参数并返
回 LabVIEW 能识别的数据。使用的编程环境为 Visual C++6.0。
第一步:分析目标函数的参数类型
SDK2000 开发包中对获得当前图像的 DIB 数据函数的声明为:
HRESULT DSStream_GetCurrentDib (int iCardID,BYTE * pBuffer,long *
pSize)
pBuffer 指向预分配的内存,值为 NULL 时,pSize 得到保存图像需要的内存
大小,若 pBuffer 不为 NULL,函数将 DIB 图像数据保存到从 pBuffer 开始,长
度为(*pSize)的内存区域。CLF 节点不能直接调用该函数,因为 LabVIEW 编
程环境下没有提供内存管理机制,并且 CLF 节点不能把指向预分配内存的指针
传递给该函数,所以必须对这个函数进行重新封装。
图像的 DIB 数据是非数字型的数据,为了返回 LabVIEW 能够识别的数据,
可以选择字符串或者单字节数组作为数据的载体,但是由于数据中包含了十进制
的 0,所以只能用单字节数组作为载体,并且为了能够动态改变数组的大小,必
须以数组的句柄作为传递参数。因为在 LabVIEW 提供的高级函数库中,所有改
变数组、字符串大小的函数都是针对于句柄进行的。
第二步:编写动态链接库
在 VC 中使用 MFC Application(dll)建立一个名字为 MySDK2000 的工程,
然后在 MySDK2000.cpp 中键入以下代码:
typedef struct
{ int32 dimSize;
uInt8 elt[1];
} TD1;//TD1 的数据结构能被 LabVIEW 和新链接库识别
typedef TD1 **TD1Hdl;
extern "C" __declspec ( dllexport ) long GetDib ( TD1Hdl BitMapinfo )
//BitMapinfo 为数组的句柄
{ long pp=0;
hr=DSStream_GetCurrentDib(m_iCardID, NULL, &pp);//得到保存图像需要
的内存大小
if (NumericArrayResize(uB,1L,(UHandle*)&BitMapinfo,pp))//改变数
组物理大小
return 0;
(*BitMapinfo)->dimSize = pp;//改变数组大小的标志
BYTE* lpdst; // 指向缓存 DIB 图像的指针
lpdst = (*BitMapinfo)->elt;
hr=DSStream_GetCurrentDib(m_iCardID, lpdst, &pp);//将当前图像的 DIB
数据保存到内存中
BITMAPINFO* pInfo = (BITMAPINFO*)lpdst;//位图文件头指针
return pInfo->bmiHeader.biSize;//返回位图信息头的数据长度
}
编写过程的几点说明:
(1)为了正确使用 LabVIEW 中的数据类型,必须在 MySDK2000.cpp 中手工
加上#include “extcode.h”的声明。头文件”extcode.h”中定义了 CIN 和外部子程序
所用到的基本数据类型和许多函数等,用以解决某些常量和数据类型与系统头文
件的冲突。
(2) 为了能够在 VC 中调用 LabVIEW 的函数库,必须把 CINTools 目录下
LabVIEW.lib 包含在工程里。使用 NumericArrayResize()函数用以动态改变数
组的长度,它的功能和 WIN32 函数 LocalAlloc()具有相似的功能。它的函数
声明如下:
MgErr NumericArrayResize(int32 typeCode, int32 numDims,
UHandle *dataHP,int32 totalNewSize);
(3) 如果内存分配失败,函数返回错误代码。如果成功,还须修改数组结构
中的 dimSize,因为此函数不能自动修改此值。
其它代码的编写类似于 VC 环境下的开发。代码完成后,构件并产生最终的
目标文件 MySDK2000.dll。
第三步:在 LabVIEW 中调用动态链接库
配置 CLF 节点的各项参数。第一个选项为函数库文件名和路径,选择刚才
编译的文件 MySDK2000.dll;第二个选项为函数名,选择 GetDib;第三项设置返回
和传递参数。具体设置如下表:
其它选项保持默认设置。程序框图如下:
为了弄清楚 CLF 运行时传递参数和返回参数的原型,可以在 CLF 节点上
右键弹出菜单中选择“Creat.c File…”,然后在文本编程环境下察看它的参数
原型。这些参数原型其实就是 LabVIEW 使用到的数据结构,如上面说看到的数组
结构 TD1,TD1 为 LabVIEW 一维数组的数据结构
调用动态链接库 1 - 动态链接库导入工具
在 Windows 系统上,动态链接库就是 DLL 文件。调用 DLL 是 LabVIEW 与其它语言混合使用是
最重要的一种方法。比如,在一个大的项目中,用户可以用 C++ 语言实现软件的运算部分,并把这
些功能构建在 DLL 文件中;再使用 LabVIEW 编写程序的界面部分,并通过调用编写好的 DLL 来调
用运算部分的功能。
现在轻易就可以找到完成各种功能的 DLL,LabVIEW 通过调用它们,也几乎无所不能。
在 LabVIEW 中,通过 Connectivity -> Libraries & Executables -> Call Library Function
Node(CLN)节点来调用 DLL 中的函数。
在函数选板上,它旁边的一个节点是 Code Interface Node,这个 CIN 节点也是用来与 C 语言
混合编程用的。这是在 CLN 节点出现以前,LabVIEW 调用 C 函数的方法。现在有了 CLN,可以不
再考虑它了。(我个人强烈建议:不要使用 CIN!因为那样会遇到很多问题,但没人能帮你解决。)
在 LabVIEW 中调用 DLL 中的函数,最大的难度就在于把函数参数的数据类型映射为相应的
LabVIEW 中的数据类型。在准备研究 CLN 中的参数如何配置之前,可以先考虑一下这个工具:Tools
-> Import -> Shared Library。这个工具专门用作把 DLL 中的函数包装成 VI,升成的每个 VI 中
最主要的部分就是一个 CLN 节点。它自动帮你把函数的参数都已经设置好了,有了这个工具你就不
需要再费脑筋去考虑数据类型匹配的问题了。
这个工具的第一个版本是我开发的。它虽然不算完美,但大多数情况下也够用了。如果你有现成
的 DLL,打算在 LabVIEW 中使用,首先应该考虑的就是用这个工具,把 DLL 中所有函数都包装成
VI。再使用起来,就方便多了。
某些特别复杂的情况下,Import Shared Library 这个工具可能无法处理,或者包装出来的 VI
不令人满意。这时就需要编程人员手工做一些设置或修改了。因此,高级用户了解这些数据类型的匹
配也还是有必要的。我会在后续文章里对此做一详细的解释。
调用动态链接库 2 - CLN 的配置选项
双击一个 CLN(Call Library Function Node)节点,就会出现它的配置对话框。这个对
话框有四页。
第一页是被调用函数的信息。
Library name or path 是 DLL 文件名和路径。在系统路径下的 DLL,直接输入文件名即可,否
则需要全路径。在这里知名的 DLL 是被静态加载的程序中的。当调用了这个 DLL 的 VI 被装入内存
时,DLL 也同时被装入内存。
LabVIEW 也可动态加载 DLL。只要把 Specify path on diagram 选上就可以了。选择了这个
选项,在 Library name or path 中输入的内容就无效了。取而代之的是,CLN 节点多出一对输入
输出,用于指明你需要使用的 DLL 的路径。这样,当 VI 被打开时,DLL 不会被装入内存,只用程序
运行到需要使用这个 DLL 中的函数时,才把其装入内存。
Function name 及需要调用的函数的名称。LabVIEW 会把 DLL 中所有的暴露出来的函数都列
出,用户只要在下拉框中选取即可。
剩余31页未读,继续阅读
资源评论
oligaga
- 粉丝: 52
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 我分享个魔兽内存修改器
- Python毕业设计基于Django的网易云数据分析可视化大屏系统的设计与实现+使用说明+全部资料(优秀项目).zip
- Python毕业设计基于Django的网易云数据分析可视化大屏系统的设计与实现+使用说明+全部资料(高分项目).zip
- JavaScript实现的鼠标手势
- 人工兔优化算法ARO MATLAB源码, 应用案例为函数极值求解以及优化svm进行分类,代码注释详细,可结合自身需求进行应用
- 人才网站设计-asp.net+sql-(系统源码)
- asp.net+sql人才网站设计-含系统源码
- C#应用的用户配置窗体方案
- python实现绘制爱心图形的代码
- JAVAWEB项目-校园订餐系统项目源码.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功