LabVIEW如何方便地调用DLL文件_第1页
LabVIEW如何方便地调用DLL文件_第2页
LabVIEW如何方便地调用DLL文件_第3页
LabVIEW如何方便地调用DLL文件_第4页
LabVIEW如何方便地调用DLL文件_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

LabVIEW 如何方便地调用如何方便地调用 DLL 文件文件 LabVIEW 调用调用 DLL 文件文件 LabVIEW 支持通过调用 DLL 文件的方式与其它编程语言混合使用 比如 在实际的工程项目中 用户可以用 C 语言实现软件的运算部分 并把这些功能构建在 DLL 文件中 然后再使用 LabVIEW 编写程序的界面部分 并 通过调用编写好的 DLL 来调用运算部分的功能 LabVIEW 中是通过 Call Library Function Node CLN 节点来完成 DLL 文件调用的 创建一个新的 VI 右击程 序框图 在 Functions Palette 中依次选中 Connectivity Libraries Executables 工具栏即可找到该节点 如下图 将节点放置在程序框图中 双击会出现它的配置对话框 共有四页 第一页用于填写被调用函数的信息 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 中所有的暴露出来的函数都列出 用户只要在下拉框中选取即可 Thread 栏用于设定 哪个线程里运行被调用的函数 用户可以通过 CLN 节点的配置面板来指定被调用函数运行所在的线程 CLN 的线 程选项非常简单 只有两项 Run in UI thread 和 Run in any thread LabVIEW 的程序框图上直接可以看出一个 CLN 节点是选用的什么线程 如果 Run in UI thread 节点颜色是橙色的 Run in any thread 则是浅黄色的 通常情况下 除非使用的动态链接库是多线程安全的 CLN 中选择 Run in any thread 方式 否则必须选择 Run in UI thread 方式 判断一个动态链接库是不是多线程安全的 需通过以下方法 如果一个动态链接库的文档中 没有明确说明它是多线程安全的 那么就要当作是非多线程安全的 在可以看到动态链接库源代码的条件下 如果 代码中存在全局变量 静态变量或者代码中看不到有 lock 一类的操作 那么这个动态链接库也就肯定不是多线程安 全的 选择了 Run in any thread 方式 LabVIEW 会在最方便的线程内运行动态链接库函数 且一般会与调用它的 VI 在同一个线程内运行 因为 LabVIEW 是自动多线程的语言 它也很可能会把动态链接库函数分配给一个单独的线程 运行 如果程序中存在没有直接或间接先后关系的两个 CLN 节点 LabVIEW 很可能会同时在不同的线程内运行它们 所调用的函数 也许是同一函数 对于非多线程安全的动态链接库 这是很危险的操作 很容易引起数据混乱 甚 至是程序崩溃 选择 Run in UI thread 方式 因为 LabVIEW 只有一个界面线程 所以如果所有的 CLN 设置都是界面线程 那么 就可以保证这些 CLN 调用的函数肯定全部都运行在同一线程下 肯定不会被同时调用 对于非多线程安全的动态链 接库 这种方式就保证了它的安全 让我们回到配置对话框第一页 Calling convention 用于指明被调用函数的调用约定 这里只支持两种约定 stdcall 和 C call 它们之间的区别在于 stdcall 由被调用者负责清理堆栈 C call 由调用者清理堆栈 这个设置错误 时 可能会引起 LabVIEW 崩溃 也就是说如果 LabVIEW 调用 DLL 函数时出现异常 首先应该考虑这个设置是否正 确 Windows API 一般使用的都是 stdcall 标准 C 的库函数大多使用 C call 如果函数声明中有类似 stdcall 这 样的关键字 它就是 stdcall 的 第二页是函数参数的配置 图 4 DLL 和 LabVIEW 之间传递参数 最常用的三种数据类型是数值 数值型数组和字符串 C 语言中经常把指针或者数 据的地址在函数间传递 在 32 位操作系统中 可以使用 int32 数值来表示指针 因此 当需要在 LabVIEW 中传递 指针数据时 可以使用 I32 或 U32 数值类型来表示这个地址类型的数据 但是 64 位的程序中 数据的地址只能使 用 I64 或 U64 来表示 这样 如果一个调用了 DLL 函数的 VI 并且函数参数中有地址型数据 使用固定数据类型的 数值来表示地址 就要准备两份代码 解决方法是使用 LabVIEW 中的新的数据类型 Pointer sized Integer 这个数 据类型的长度在不同的平台上会自动使用 32 位或 64 位长度 如果在 C 语言函数参数声明中有 const 关键字 可以 选中 Constant 选项 布尔类型在 DLL 函数和 LabVIEW VI 之间传递没有专有的数据类型 是利用数值类型来传递的 输入时先把布尔值转变为数值 在传递给 DLL 函数 输出时再把数值转为布尔值 对于数组的传递 LabVIEW 只支 持 C 数据类型中的数值型数组 传递数组类型需要注意的的是 Array Format 要选择 Array Data Pointer 这个设置 中还有其他两个选项 带有 Handle 的参数类型都是表示 LabVIEW 定义的特殊类型的 在第三方的 DLL 中不会使用 到数组参数作为输出值时 要记得为输出的数组数开辟空间 开辟数据空间的方法有两种 第一种方法 创建一个 长度满足要求的数组 作为初始值传递给参数 输出数的数据就会被放置在输入数组的所在的内存空间内 第二种 方法是直接在参数配置面板上进行设置 在 Minimum size 中写入一个固定的数值 LabVIEW 就会按此大小为输出 的数组开辟空间 在 Minimum size 中选择函数的其它数值参数 而不是固定数值 这样 LabVIEW 会按照当时被选 择的参数值的大小来开辟空间 字符串与使用与数组是非常类似的 实际上在 C 语言中字符串就是一个 I8 数组 在 NI 软件的安装路径下打开当前使用版本的 LabVIEW 文件夹 通过 examples dll data passing Call NativeCode llb 找到简单数据类型在 LabVIEW 与 C 之间的对应关系 部分常见关系见表 1 第三页用于为 DLL 设置一些回调函数 可以使用这些回调函数在特定的情形下完成初始化 清理资源等工作 图 5 如果为 Reserve 选择了一个回调函数 那么当一个新的线程开始调用这个 DLL 时 这个回调函数首先被调用 可以 利用这个函数为新线程使用到的数据做初始化工作 线程在使用完这个 DLL 之后 它会去调用 Unreserve 中指定的 回调函数 Abort 中指定的函数用于 VI 非正常结束时被调用 也就是让一个程序在运行完前停止 这些回调函数的 原型在 Prototype for these procedures 中列出 必须要由 DLL 的开发者按照特定的格式实现 如果使用的 DLL 不是 专为 LabVIEW 设计的 一般不会包含这样的回调函数 第四页是错误处理方式 用户可根据需要选择相应的错误检查级别 另外还需要注意的是 C 语言中的 struct 在 LabVIEW 中可以使用 cluster 来表示 但有时需要作出相应的调整 这是因为在 C 语言中 struct 的字节对齐是可以进行设置的 这就决定了其各元素的存放地址的可变性 C 语言中 的对字节对齐数可通过 pragma pack 指令或在工程属性中进行指定 而在 LabVIEW 的 cluster 中 所有元素只能是 1 字节对齐的 所以如果要和 C 语言中非 1 字节对齐的 struct 对应 需要做出一些调整 比如 对于 C 语言中 2 字 节对齐的 struct 第一个元素如果是 I8 型的 在 LabVIEW 的 cluster 中第一个元素对应不变 但不能紧挨着放第二 个元素 必须留一个无意义的空位 C 语言的 struct 其实也是如此 只不过没有表现出来 所以为了方便 如果自 己用 C 语言生成 DLL 文件供 LabVIEW 调用最好将 struct 都设为 1 字节对齐 C 语言的 struct 中可以嵌套数组 但 是这和 LabVIEW 中含有数组元素的 cluster 是不一样的 LabVIEW 中需要将数组中的元素都拆开放入 cluster 中 如果 C 语言的 struct 中含有一个指针 LabVIEW 中的 cluster 只能用一个 U32 数值 32 位系统上 64 位系统 上使用 U64 来表示指针的地址 而不能将指针所指向的内容放到 Cluster 中去 如果声明的是指向 struct 的指针 才能在 L

温馨提示

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

评论

0/150

提交评论