Advanced LabVIEW Programming Tips and Techniques-高级编程技巧.ppt_第1页
Advanced LabVIEW Programming Tips and Techniques-高级编程技巧.ppt_第2页
Advanced LabVIEW Programming Tips and Techniques-高级编程技巧.ppt_第3页
Advanced LabVIEW Programming Tips and Techniques-高级编程技巧.ppt_第4页
Advanced LabVIEW Programming Tips and Techniques-高级编程技巧.ppt_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

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

文档简介

1、LabVIEW 高级编程技巧,内容概要,National Instruments 公司简介 LabVIEW 高级编程技巧 用户定义的调试指示器 定时循环 基于事件触发的编程 改善VI的性能 调用动态链接库,National Instruments: 虚拟仪器倡导者,建立于1976年 超过1,000种测试测量产品 在40个国家设有直属分支机构,600家系统联盟商,中国: 研发, 区域咨询, 技术支持, 市场,NI 客户的分布,超过25,000个客户分布在多达80个国家 财富500强中95的制造型企业,1. 调试指示器,灵活的调试工具,可详细显示数据线上通过的数据 指示器的操作可以体现 VI 的灵

2、活性和强大功能 传统的调试指示器存在一些缺点,如只能显示数组中的一个元素,用户定义的调试指示器,能显示各种数据类型 可定制指示器外观 可定制指示器处理功能 设置条件断点,定制你的需求,指示器不仅仅可以显示数据 将数据录入文件 对两个指示器之间的执行进行定时 计算总的调用次数或是每秒的调用次数,内建的定制指示器,在数据连线上点击鼠标右键 菜单显示所有相关的指示器 指示器存放在目录 vi.lib_probesdefault下,Keep graphics below the text and to the right,客户指示器的结构,包含一个控件 控件的数据类型就是所指示的数据线 包含一个指示器

3、Boolean, 类似条件断点 True = 暂停执行 False = 继续执行,Keep graphics below the text and to the right,2. 定时循环,精确的定时 while 循环 多个时钟频率的定时 反馈, 动态定时特性 多达128个循环优先级 examplesgeneraltimedloop.llb,定时循环的配置,定时循环,3. 基于事件的编程,管理用户界面,通常采用的方法有中断响应和事件驱动 中断响应采用轮询机制处理,非常占用CPU资源,还可能会丢失用户界面的响应 事件驱动无需轮询即可捕捉到相关事件,顺序处理捕捉到的所有事件,不会丢失也不会颠倒顺序

4、,事件举例,事件结构不需要轮询就可以捕捉到自定义菜单上的用户选择 ItemTag 返回菜单条目 MenuRef 返回菜单的 refnum,Virtual Instrument,事件类型,Application,事件举例: 退出应用程序 超时,Control,事件举例: 关闭前面板 VI 上的鼠标移动,事件举例: 改变控件数值 特定控件上的鼠标移动,通知事件和可滤除事件,通知事件 通知 LabVIEW 发生了一个用户行为; 只能在 Event Data Node中使用 可滤除事件 在用户界面处理之前验证或改变事件数据,避免影响 VI; 可在 Event Filter Node 和 Event D

5、ata Node 中使用,LabVIEW 7 新事件,更多的用户界面事件 动态注册的事件 用户定义的事件 ActiveX 事件,事件结构的组成部分,Event Selector Label 确定观察的事件 Timeout 等待事件的毫秒数; 缺省值 1 (无限期) Defaulted Tunnels 新型tunnel, 允许未连线的事件案例提供缺省值 Dynamic Event Terminals 用于动态事件的注册,事件结构的组成部分,Event Data Node 确定事件发生时 LV 提供的数据,与 Unbundle By Name 函数类似 Event Filter Node 确定Ev

6、ent Data Node 中可提供的数据子集,可供事件案例修改,事件结构的基本使用,通常在 While 循环中使用 每次循环只处理一次事件,其它时间休眠 在事件结构的左侧边框端口上可获得事件数据,事件结构的配置,通过对话框来配置事件,右击事件结构的边框 ,选择 “Edit Events Handled by This Case”,事件注册和面板锁定,包含事件结构的 VI 被预留以后,事件就成为已注册的 已注册事件发生后, 会进入队列等待直到相应的事件结构开始执行,事件不会丢失也不会出现顺序混乱 默认情况下, 前面板被锁定直到事件被处理完 可以关闭锁定,但只针对过滤事件 VI 变成空闲后,事件

7、被注销,3.1 动态事件,下列情况时,需要动态注册事件: 事件注册只能发生在应用程序的某些部分 在程序运行过程中需要改变哪些 VIs 或控件可以发生事件 在 subVI 中处理事件,而不是仅在注册事件的 VI 中,动态事件,Register For Events Event Structure Unregister For Events Create User Event Generate User Event Destroy User Event,编程模型,注册 事件,连接到 事件结构,选择 动态事件,注销 事件,3.2 程序产生的 (用户) 事件,Register For Events E

8、vent Structure Unregister For Events Create User Event Generate User Event Destroy User Event,用户事件编程模型,创建并注册用户事件,产生 用户事件,注销 用户事件,消灭 用户事件,用户事件举例,3.3 ActiveX 事件,Register Event Callback,ActiveX 编程模型,注册ActiveX 事件,选择事件,创建和编辑Callback VI,总结:事件处理结构,允许在subvi中处理事件代码 提供统一的,简化的事件处理机制 用户界面 接口控制 外部代码 硬件触发 用户定义事件

9、注册和非注册事件,4. 改善VI 的性能,改进内存使用 使用高效数组函数 谨慎处理字符串和数组 避免不必要的复杂数据结构 减少 I/O 开销 减少 I/O 调用的次数 减少开启和关闭资源的次数 减少屏幕更新,4.1 改进内存使用,LabVIEW 处理了大部分内存管理的细节 资源分配, 复制, 释放, 溢出 减少程序框图的大小 提高可读性和稳定性 内存管理自动进行,你不需要过多的干预 理解 LabVIEW 是何时并如何为你“代劳”内存管理的可以大大提高 对内存使用的效率,VI 在内存中的数据结构,Front Panel Block Diagram Code 框图编译成机器码 Data Space

10、 Control/indicator 数值 Block diagram 常量 动态定义的数据,VI 何时加载到内存中,始终载入 data 平台符合时载入Code (Mac OS, Windows, Sun, Linux) Panel 和 Diagram 在必要时载入 (recompiling),Main VI,SubVI,Always in memory,Resident sometimes,Front Panel,Block Diagram,Code,Data Space,Front Panel,Block Diagram,Code,Data Space,内存使用情况,Tools Advan

11、ced Profile VIs 勾选 “Profile Memory Usage” 虽然看起来不大,但如果是在一个循环结构中,就会累加出一个很大结果。 在高速运行的循环结构中,不要显示 subVI 的前面板 如果可能,将循环结构移到 subVI 中完成。,全局和局部变量,每一次变量的读操作都会给数据生成一个新的缓冲区 在使用大数组、字符串或复杂数据结构时会带来很大影响 从内存使用和执行速度来看,使用数据线永远是更有效的方法,属性节点,使用属性节点会引起线程间的交换,从而降低效率 如果只是为了更新控件的值,不要使用属性节点 如果同时改变其它属性,更新数值不会造成更大损失,因为线程交换已经发生了,

12、更新前面板控件,GoodBetterBest,创建高效的平行框图,LabVIEW 周期性地在平行循环间切换 使用 Wait (ms) function 确保不太重要的循环占用较少的处理器时间,5. 共享库函数,What? Windows 中的 .dll, UNIX/Linux 中的 .so, 等等 Why? 降低磁盘空间和内存占用 How? 应用程序只在需要的时候调用库函数 程序开始执行以后,由运行链接编辑器来处理所有调用,动态链接库 (DLL),Microsoft Windows 中的一种软件模块 包含可执行代码和可被Windows应用程序或其它 DLL 调用的数据 函数和数据只有在运行状态

13、下,被Windows 应用程序或其它DLL调用时才被加载和链接 一个 DLL 包括: 一个特殊函数 (DllMain) 几个编程者自定义来完成常用任务的函数,DLL 特性,不能单独运行的可执行文件 应用程序要求时,由操作系统加载 应用程序把 DLL 代码作为自己二进制文件的一部分来使用 应用程序不需要知道原始DLL是由什么语言编写的,也不需要清楚这些功能是如何实现的。 DLL就像一个有输出函数的黑盒子,LabVIEW 中调用 Shared Library/DLL,Advanced Call Library Function Node 右击 Call Library Function Node,

14、选择 Configure 来调用DLL中的特定函数,Call Library Function 的配置,指定需调用的 DLL 函数和函数参数 选择 dll 的调用规则; 对于 Win32 dll 来说,可以是缺省 (stdcall) 或 C.,Call Library Function 和 Win32 DLLs,函数参数可以是以下类型:,Void 数字型 有符号/无符号 8-bit, 16-bit 和 32-bit 整数 4-byte, 单精度数 8-byte, 双精度数,数组 数组数据指针 数组句柄 字符串 C Pascal G (LabVIEW) Adapt to Type,DLL 实例:

15、 MessageBoxA 函数,回传类型,函数名,参数: HWNDhWnd 32-bit 无符号整数. 确定 parent window. 此时为 NULL. LPCSTRlpText C-style string LPCSTRlpCaption C-style string UINTuType unsigned 32-bit integer value.,回传类型: int 32-bit signed integer,调试 Call Library Function,如果 VI不执行或者导致死机, 检查下列可能: DLL的路径名是否正确 如果错误信息是 function not found

16、in library, 检查函数名的拼写、语法和大小写 传递给 DLL函数的所有参数都有数据线连接到 Call Library Function 图标的输入端口上. 检查数据类型和参数顺序 使用了正确的调用规则: C 或者缺省(stdcall); The Win32 API 使用 缺省(stdcall) 规则 需要更多帮助, 请参阅 Using External Code in LabVIEW 手册,Creating DLLs in LabVIEW,编写和 测试 VI,从VI 创建DLL,最终应用 程序中 调用 DLL,LabVIEW 中创建 DLL,要创建其它编程环境中可轻松调用的DLL, 需要注意以下几点: 调用规则 应用程序的结构 输入/输出参数 (包括可选项) 函数原型声明,参数 数组选项,数字量的数组可以是: 任意整数类型 单 (4-byte) 精度浮点数 双 (8-byte) 精度浮点数 创建DLL时,可以选择如何从DLL中传递数据 通过数值或引用, 作为数组数据指针或者数组句柄指针等等 根据DLL最终如何使用来选择合适的项目,参数 字符串选项,LabVIEW 字

温馨提示

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

评论

0/150

提交评论