《精讲LabVIEW设计模式PPT课件》由会员分享,可在线阅读,更多相关《精讲LabVIEW设计模式PPT课件(142页珍藏版)》请在金锄头文库上搜索。
1、精讲LabVIEW设计模式LabVIEW 设计模式LabVIEW 定时结构优化LabVIEW程序内存管理调用动态链接库LabVIEW与多线程什么是设计模式?什么是设计模式?一种LabVIEW程序模板与架构软件实践中通用的程序架构,其本质是对很多十分类似的问题进行总结归纳的基础上提炼出的一些具有代表性的软件开发规范具有灵活的配置功能被广泛使用使用设计模式的益处使用设计模式的益处简化整个开发过程更容易理解程序代码代码可重用可靠性被使用多年,被证明其“可用并可靠”大量技术资源与例程使用设计模式注意事项使用设计模式注意事项1、不是一成不变的定律,既要知道有哪些设计模式,还要知道每种模式解决实际应用中的
2、哪些问题,是如何解决的,效果如何?2、文本式编程语言中广泛使用的设计模式在图形化数据流编程中的应用问题。注意!注意!有些时候你没有必要选用最复杂的设计模式不要忘记最常见的设计模式数据流!数据流!通用型通用型:状态机模式、消息队列模式、用户界面事件模式专用型:专用型:主从线程模式、生产/消费模式、后台服务模式、应用程序启动模式、代理模式LabVIEW设计模式设计模式基本工具基本工具循环结构移位寄存器分支结构枚举型常量事件结构状态机模式状态机模式“我需要执行一系列的事件步骤,但是步骤顺序我需要执行一系列的事件步骤,但是步骤顺序可通过编程决定的。可通过编程决定的。”自动贩卖机模型自动贩卖机模型Ini
3、tializeWaitChangeQuarterDimeNickelExitVendNo inputQuarter DepositedTotal = 50Change RequestedDime DepositedNickel DepositedTotal 50Total = 50Total = 50Total 50Total = 50基本三要素:基本三要素:状态、事件、动作状态、事件、动作背景背景动态结构:允许不同的状态,按通过编程决定的顺序进动态结构:允许不同的状态,按通过编程决定的顺序进行执行行执行静态顺序结构静态顺序结构状态机结构状态机结构对于一个最简单的状态机结构而言,它是可以用顺序
4、结构代替的;而对于相对复杂的状态机结构而言,却可以作为测试流程的组织者和管理者。在在LabVIEW下实现状态机结构下实现状态机结构While循环+Case结构每一Case即为一个状态当前状态中需有决定下一状态的判定代码使用枚举常量枚举常量通过移位寄存器传递至下一状态 切换代码切换代码工作流程工作流程初始状态初始状态FIRST STATE下一状态下一状态 执行步骤执行步骤移位寄存器用于传递状态Case结构对每一状态都配备一个分支切换代码根据执行步骤中的结果来决定下一状态枚举常量枚举常量一个自定义的枚举类型对应一一个自定义的枚举类型对应一个状态机中的状态集合个状态机中的状态集合枚举常量枚举常量枚举
5、类型是一种允许程序员自枚举类型是一种允许程序员自定义元素的数据类型,它可以显示数值定义元素的数据类型,它可以显示数值对应的具体含义,帮助程序员理解程序对应的具体含义,帮助程序员理解程序中使用的变量值。中使用的变量值。枚举常量举例枚举常量举例控件选板控件选板“Modern”1、枚举控件、指示、常量、枚举控件、指示、常量2、默认、默认U163、修改、修改 Edit Items4、隐式与显式类型转换、隐式与显式类型转换DEMO1顺序型状态机模式顺序型状态机模式数据传数据传递方式递方式DEMO2改进的顺序型状态机模式改进的顺序型状态机模式1、去掉、去掉i 2、添加一个移位寄存器、添加一个移位寄存器DE
6、MO3测试流程型状态机测试流程型状态机1、解决顺序型状态机不便阅读和修、解决顺序型状态机不便阅读和修改的问题,采用枚举型常量。改的问题,采用枚举型常量。2、采用自定义型控件,方便修改。、采用自定义型控件,方便修改。over消息队列模式消息队列模式“我需要执行一系列的事件步骤,但是步骤顺序可通过我需要执行一系列的事件步骤,但是步骤顺序可通过编程决定的。编程决定的。”步骤是由用户界面事件决定的,如某个应用程序共要处步骤是由用户界面事件决定的,如某个应用程序共要处理理4个状态,分别是个状态,分别是A,B,C和和D,前面板有,前面板有3个按钮分个按钮分别控制别控制3种运行时的状态序列种运行时的状态序列
7、ABCD、DCAB和和BDCA。引入消息队列模式,通过建立队列缓冲区来解决这个问引入消息队列模式,通过建立队列缓冲区来解决这个问题,这种模式也称为题,这种模式也称为“队列型状态机模式队列型状态机模式”。消息处理过程消息处理过程建立消息队列加入消息探测消息EXIT?删除消息接收消息执行代码销毁消息队列消息源YesNo队列建立方式队列建立方式队列函数和数组队列函数和数组队列函数队列函数最常用的最常用的4个函数个函数数组数组1、数组函数、数组函数2、配合移位寄存器、配合移位寄存器3、无需手动销毁队列空间、无需手动销毁队列空间数组方式数组方式DEMO队列函数方式队列函数方式DEMO队列函数与数组的不同
8、队列函数与数组的不同1、消息传递方式不同、消息传递方式不同移位寄存器移位寄存器 & FIFO2、释放消息队列的方式不同、释放消息队列的方式不同用户界面事件模式用户界面事件模式“我需要轮询用户的操作,但是这样会降低我程我需要轮询用户的操作,但是这样会降低我程序的运行速度,并且有时我还检测不到序的运行速度,并且有时我还检测不到”LabVIEW中基于事件驱动的编程中基于事件驱动的编程LabVIEW事件示例事件示例 按下鼠标 键盘按键前面板的用户交互LabVIEW 事件结构事件结构什么是事件结构?带有多个子框图的结构节点,就像条件结构条件结构事件结构是如何工作的?当面板上事件发生时才被唤醒自动执行相应
9、事件框图内的事件代码当处理完成相应事件后便结束,并不一直循环等待为什么要使用事件为什么要使用事件结构结构 ?用更简单的事件处理替代原来的查询循环最小化 CPU 的使用不会遗漏用户界面交互事件可检测更多的交互事件编程生成您自己的事件编程生成您自己的事件用户界面事件的两种类型用户界面事件的两种类型通知事件通知事件和和过滤事件过滤事件事件源:用户界面事件事件源:用户界面事件用户自定义事件用户自定义事件5个函数个函数用户自定义事件用户自定义事件DEMO事件注册事件注册静态事件注册:只有用户界面事件静态事件注册:只有用户界面事件选择事件源(程序、选择事件源(程序、VI或控件)、特定事件、或控件)、特定事
10、件、编辑编辑分支处理事件数据。分支处理事件数据。Vi运行时自动注册。运行时自动注册。动态事件注册:何时产生何种事件动态事件注册:何时产生何种事件静态事件注册静态事件注册demo动态事件注册动态事件注册4个步骤个步骤1、获取要处理事件对象的、获取要处理事件对象的VI服务器引用;服务器引用;2、将、将VI服务器引用连接至服务器引用连接至“注册事件注册事件”函数;函数;3、将事件结构放在、将事件结构放在While循环中,等待处理循环中,等待处理对象事件直到终止条件出现;对象事件直到终止条件出现;4、通过取消注册时间函数停止事件发生。、通过取消注册时间函数停止事件发生。动态事件注册动态事件注册demo
11、最值器最值器用户界面事件用户界面事件demo一个动态一个动态+5个静态个静态状态机状态机用户界面事件混合用户界面事件混合demo初始化时不初始化时不再需要用户再需要用户自定义事件自定义事件其他模式其他模式“我希望同一时刻能够处理多个消息事件,而不我希望同一时刻能够处理多个消息事件,而不是下一个消息代码必须等待上一次响应完成后才是下一个消息代码必须等待上一次响应完成后才能执行能执行”“我不希望消息排队,等待很烦的,有时采集数据和我不希望消息排队,等待很烦的,有时采集数据和记录数据应该同时进行的记录数据应该同时进行的”。主从线程模式主从线程模式通常应用于具有多个通常应用于具有多个同时发生的并且拥有
12、同时发生的并且拥有不同运行速率的线程不同运行速率的线程的程序中。比如采集的程序中。比如采集电压同时写入磁盘,电压同时写入磁盘,采集速率采集速率1KHz,记录,记录则每则每5秒一次。秒一次。1、数据通信采用全局变量、局域变量或共享变量;、数据通信采用全局变量、局域变量或共享变量;2、Stop为为Switch模式模式3、有时会用到事件发生模块、有时会用到事件发生模块Occurrence生产者生产者/消费者消费者“我需要可以同时间执行的两个过程,并且需保我需要可以同时间执行的两个过程,并且需保证它们不会互相影响执行速度。证它们不会互相影响执行速度。”生产者生产者/消费者消费者全局变量、局域变量或共享
13、变量的每次复制都是原始数全局变量、局域变量或共享变量的每次复制都是原始数据的一个副本,占据了大量的空间。实际上只需要使用据的一个副本,占据了大量的空间。实际上只需要使用一部分缓冲区作为数据存储的中间部分,这需要借助队一部分缓冲区作为数据存储的中间部分,这需要借助队列技术。列技术。存储单元存储单元数据流入数据流入数据流出数据流出生产者生产者/消费者具体做法消费者具体做法最简单模式最简单模式在在LabVIEW下实现生产者下实现生产者/消费者消费者无数据相关的多个循环主/ 从关系在循环间实现通讯与同步工作流程工作流程主循环负责通知各个从循环是否执行允许循环间异步执行数据的非相关性实现多线程程序过程分
14、解实现循环间的数据通讯实现循环间的数据通讯变量通知器队列信号量集合队列队列在队列中添加元素在队列中添加元素从队列中释放元素从队列中释放元素Reference to existing queue in memory选择队列中元素的数据类型出列操作需要等待数据进入或者超时情况生产者生产者 / 消费者循环消费者循环后台服务模式后台服务模式问:问:“我需要程序在后台运行,不要前面板,不要交互我需要程序在后台运行,不要前面板,不要交互”答:答:“采用采用VI属性和方法接口,足以使你控制后台运行的属性和方法接口,足以使你控制后台运行的VI” 例子:一个网络服务监听程序,程序只需要接收与客户端例子:一个网络
15、服务监听程序,程序只需要接收与客户端Sockets的连接,实现三次握手,连接完成后将引用交给前端应用程序处理,的连接,实现三次握手,连接完成后将引用交给前端应用程序处理,同时继续监听。同时继续监听。后台服务模式后台服务模式后台服务模式后台服务模式应用程序启动模式应用程序启动模式“我想设计一个启动画面,同时显示应用程序加载的进度,加我想设计一个启动画面,同时显示应用程序加载的进度,加载完毕后退出启动画面,运行主程序载完毕后退出启动画面,运行主程序”应用程序启动模式应用程序启动模式1、SubVI目录目录2、启动应用程序、启动应用程序.vi3、主程序、主程序“网络实验系统网络实验系统.vi”代理模式
16、代理模式“我希望顶层我希望顶层VI(主(主VI)需要某个子)需要某个子VI时,才将其载入内存时,才将其载入内存”“可以在应用程序中引入迟载入技术可以在应用程序中引入迟载入技术”代理模式代理模式总结总结设计模式简化LabVIEW开发过程被广泛使用及证明其可用常用的LabVIEW设计模式数据流事件驱动状态机结构生产者/消费者而功能型全局变量(functionalglobalvariable)是为了避免竞争机制而实现的一种非重入型子vi定时结构定时结构精确的定时while 循环精确的定时顺序结构多个时钟频率的定时反馈,动态定时特性多优先级设置examplesgeneraltimedloop.llb定
17、时顺序结构定时顺序结构类似添加内置定时功能的顺序结构定时循环定时循环1、优先级:相对同一个程序框图中的多个定时循环而言,优先级数大的循环优先执行。每一个定时循环都有自己的线程,这里的优先级即线程优先级。2、循环名称,对于可重入子VI中包含定时循环,且该子VI的多个实例出现在同一个程序框图中,可以将循环名称作为子VI的输入端子。3、Deadline:用于指定完成一个循环的时间限定,如未在指定的时间内完成,则左端数据节点Finished Late?i-1返回真。默认值-1表示Deadline由Period决定。4、如何处理某次循环使用的时间大于设定的周期?是否丢弃丢失的了的循环?是否保持原始相位?
18、定时循环定时循环定时循环定时循环演示:定时循环演示:定时循环演示:定时循环演示:定时循环可具体手动设置定时循环运行的核可具体手动设置定时循环运行的核设置定时循环运设置定时循环运行的指定核行的指定核NEW!可具体手动设置定时循环运行的核可具体手动设置定时循环运行的核NEW!定时顺序结构定时顺序结构Timed Sequence含帧的定式循环含帧的定式循环Timed Loop with Frames为什么要优化为什么要优化LabVIEW程序内存管理程序内存管理LabVIEW的自动管理内存特性方便用户开发,满足一般应用需求LabVIEW应用程序趋向大型化,复杂化项目规模大,需求复杂数据处理量大,性能要
19、求高好的编程风格帮助LabVIEW优化内存管理可以显著提高程序运行效率需要了解LabVIEW的内存分配机制监测监测VI内存占用和运行时间的工具内存占用和运行时间的工具帮助定位和分析程序中的瓶颈部分工具工具性能分析性能分析性能和内存性能和内存显示显示VI内存分配情况的工具内存分配情况的工具帮助分析程序中各个数据变量的内存拷贝情况目标:消除黑点工具工具性能分析性能分析显示缓存区分配显示缓存区分配了解程序内存的使用了解程序内存的使用演示:监测内存使用演示:监测内存使用优化优化 LabVIEW程序内存管理程序内存管理适时选择动态调用子VI避免强制类型转换把复杂VI分解成多个子VI采用多面板程序没必要时
20、不要设置VI的重入特性合理分配数组内存灵活使用LabVIEW自带的VI使用元素同址操作结构In Place Element Structure在程序中动态调用子在程序中动态调用子VI 减少程序占用内存以及载入时间打开VI引用通过引用节点调用关闭引用3212配置配置 VI加载加载1数据类型转换数据类型转换强制点表明连接了两种不同的数据类型LabVIEW中类型强制转换需要数据备份涉及大数组的类型强制转换会占用大量内存推荐的类型转换方式推荐的类型转换方式更好的解决方式是在随机数创建时进行转换避免转换大块数据缓存(14.3 KB)(22.7 KB)把复杂把复杂VI分解成多个子分解成多个子VI子vi会增
21、加额外的前面板和框图的空间,但并不增添额外的代码和数据空间。由于程序运行时只有代码和数据被调入内存,子vi不会占用额外的内存。好处是子vi运行结束后,LabVIEW可以及时收回子VI的数据空间,从而改善内存的使用效率。采用多面板程序采用多面板程序通过多面板程序实现只有在必要时才显示某些窗口,因为界面显示是最费内存的,因此这样可以极大降低内存的消耗。没必要时不要设置VI的重入特性重入型vi每次运行时都会对自己使用的数据生成一个副本,这增加了内存开销合理分配数组内存合理分配数组内存过多进行内存重新分配占用很大开销慎用可能导致内存重新分配的相关函数创建数组连接字符串演示:编程方法影响程序性能演示:编
22、程方法影响程序性能总在开辟新内存,必定时间长总在开辟新内存,必定时间长演示:编程方法影响程序性能演示:编程方法影响程序性能循环次数并非事先指定,因此每次循环也会开循环次数并非事先指定,因此每次循环也会开辟新的内存,但节省了辟新的内存,但节省了Build Array函数的时间。函数的时间。演示:编程方法影响程序性能演示:编程方法影响程序性能循环无需开辟新的内存,时间会明显减少。循环无需开辟新的内存,时间会明显减少。演示:编程方法影响程序性能演示:编程方法影响程序性能灵活使用灵活使用LabVIEW自带的自带的VI基本线性代数子程序VI (Basic Linear Algebra Subroutin
23、es)合理归并基本线性代数操作减少不必要的内存复制开销使程序更加简洁数学数学线性代数线性代数BLASNEW!元素同址操作结构元素同址操作结构更新数组或簇中的元素时,避免元素数据备份应用控制应用控制内存控制内存控制NEW!元素同址操作结构的优点元素同址操作结构的优点方便实现多种情况的缓存重用,消除元素复制开销数组索引和替换簇的绑定和解除绑定波形的绑定和解除绑定变体的缓存重用任意元素的缓存重用举例:数组索引和替换举例:数组索引和替换将数组第2个元素增大10倍方法一:方法一:方法二:方法二:元素数据备份元素数据备份举例:簇的绑定和解除绑定举例:簇的绑定和解除绑定个人纳税信息的更新演示:嵌套的元素同址
24、操作结构演示:嵌套的元素同址操作结构LabVIEW 与多线程与多线程程序、进程与线程程序、进程与线程程序是计算机指令的静态集合、进程就是正在运行的程序,程序是计算机指令的静态集合、进程就是正在运行的程序,是一些所有权的集合,包括内存、是一些所有权的集合,包括内存、CPU运行时间等一系列运行时间等一系列资源,为线程的运行提供一个环境。线程才是程序的最小资源,为线程的运行提供一个环境。线程才是程序的最小执行单位,是程序的一条执行路径,是操作系统分配执行单位,是程序的一条执行路径,是操作系统分配CPU时间的基本实体。一个程序的进程以一个主线程开始,如时间的基本实体。一个程序的进程以一个主线程开始,如
25、果进程的执行可以划分为多个执行路径,则可以创建多个果进程的执行可以划分为多个执行路径,则可以创建多个线程。线程。例:三线程程序,用户界面线程、数据采集线程、仪器控例:三线程程序,用户界面线程、数据采集线程、仪器控制线程。这些线程共享进程内的公共资源。制线程。这些线程共享进程内的公共资源。LabVIEW 与多线程与多线程多处理器环境下的并行编程多处理器环境下的并行编程1、线程调度、线程调度2、线程优先级、线程优先级3、线程通信与同步、线程通信与同步进程间:环境变量、命名管道、共享内存等进程间:环境变量、命名管道、共享内存等线程间:全局变量、全局数据、文件句柄或通信参数等进程内线程间:全局变量、全
26、局数据、文件句柄或通信参数等进程内数据结构来完成。数据结构来完成。同步:数据同步、设备同步、任务同步。同步:数据同步、设备同步、任务同步。LabVIEW对多线程程序设计的支持不支持线程的直接创建,从不支持线程的直接创建,从执行系统执行系统和和数据流控制数据流控制两个层两个层次提供对多线程程序设计的支持次提供对多线程程序设计的支持发布时需要运行引擎。发布时需要运行引擎。执行子系统线程数量配置执行子系统线程数量配置 vi.lib utilities sysinfo.llb 中的中的threadconfig.vi一共有一共有25个具有优先级的执行子系统。个具有优先级的执行子系统。执行子执行子系统线系
27、统线程数量程数量配置配置线程是一把双刃剑!线程是一把双刃剑!线程优先级的设置线程优先级的设置1、有时你只要一个不同时间的等待。、有时你只要一个不同时间的等待。2、避免优先级倒置或饥饿的发生。、避免优先级倒置或饥饿的发生。LabVIEW多线程程序设计多线程程序设计LabVIEW执行系统会自动管理线程,但这并不意味着不执行系统会自动管理线程,但这并不意味着不需要用户的参与。在需要用户的参与。在LabVIEW程序中,从数据流的起始程序中,从数据流的起始点到结束点的整个流程称为点到结束点的整个流程称为执行路径执行路径。并行的执行路径是。并行的执行路径是划分线程任务的依据。如要充分利用线程的优势,应尽量
28、划分线程任务的依据。如要充分利用线程的优势,应尽量提高程序的并行度,提高程序的并行度,避免使用顺序结构避免使用顺序结构来实现程序架构。来实现程序架构。超线程求质数超线程求质数demo可重入技术可重入技术demo线程通信与同步线程通信与同步“多个循环要访问同一个设备,但该设备任何时候只能同时多个循环要访问同一个设备,但该设备任何时候只能同时响应一个命令响应一个命令”线程通信与同步线程通信与同步1、局部变量、局部变量创建方法、写竞争、布尔端子注意机创建方法、写竞争、布尔端子注意机械动作设置,破坏数据流编程模式械动作设置,破坏数据流编程模式2、全局变量、全局变量创建方法、减少创建方法、减少vi之间数
29、据传递的连线之间数据传递的连线3、共享变量、共享变量必须有项目,单进程或网络发布必须有项目,单进程或网络发布4、功能全局变量、功能全局变量共享变量共享变量1、要有项目、要有项目2、使用的文件要位于项目中、使用的文件要位于项目中3、必须部署才能使用、必须部署才能使用4、对于客户端,需要指定绑定数据源、对于客户端,需要指定绑定数据源5、可以拖到前面板,小箭头变成绿色表示连接成功(红、可以拖到前面板,小箭头变成绿色表示连接成功(红色失败)色失败)6、右键面板控件,属性、右键面板控件,属性/数据绑定可以将控件于某个共享数据绑定可以将控件于某个共享变量绑定。变量绑定。7、共享变量引擎、共享变量引擎Sha
30、red Variabled Engine(NI-PSP)SVE功能全局变量功能全局变量Functional Global Variables 将一个只执行一次的将一个只执行一次的For循环或循环或While循环循环放在一个子放在一个子vi中,并使用中,并使用未初始化的未初始化的移位寄移位寄存器保存可读写的数据。与全局变量相比,存器保存可读写的数据。与全局变量相比,该方法的优势在于可以控制对移位寄存器的该方法的优势在于可以控制对移位寄存器的访问。访问。功能全局变量功能全局变量demo1、Notification通知技术通知技术1一段程序框图在收到来自于一段程序框图在收到来自于其它程序框图或其它程
31、序框图或vi的通知的通知消息前消息前保持等待状态保持等待状态。而通知消息可以是任何类型。而通知消息可以是任何类型的数据,因此可以实现不同框图不同的数据,因此可以实现不同框图不同vi之间的数据之间的数据传递。传递。2不同于局部变量和全局变量,不需轮询。不同于局部变量和全局变量,不需轮询。3通知器任何时候只能存放一个消息,新消息发出时,通知器任何时候只能存放一个消息,新消息发出时,旧消息会被丢弃。消息接收者的数目没有限制,新旧消息会被丢弃。消息接收者的数目没有限制,新消息发出之前,该消息一直存在于通知器中,在任消息发出之前,该消息一直存在于通知器中,在任何时候都可以被任何接收者接收,接收者接收到该
32、何时候都可以被任何接收者接收,接收者接收到该消息后并不删除通知器中的消息。消息后并不删除通知器中的消息。Notification DEMO in LabVIEW注意观察注意观察User1-3的延时设置与是否忽略以前的消息的的延时设置与是否忽略以前的消息的设置对波形的影响设置对波形的影响Queue in LabVIEW Queue结构是一种结构是一种FIFO结构,采用结构,采用Obtain Queue函数创建队列时需要指定函数创建队列时需要指定size大小。大小。数据进去后如果没有程序将这些数据读出,将数据进去后如果没有程序将这些数据读出,将一直保存在队列中,直到有程序将其读出并删除。如果有一直
33、保存在队列中,直到有程序将其读出并删除。如果有两个应用程序都在等待同一个队列中的同一条数据,只有两个应用程序都在等待同一个队列中的同一条数据,只有那个动作快的程序会收到数据。那个动作快的程序会收到数据。Queue DEMO in LabVIEW3个子函数的周期不同个子函数的周期不同Semaphore in LabVIEW信号量技术用于限制同时访问一个被保护的共享资源的任务数目,信号量就像一把key。比如两个独立运行的vi需要控制同一个机器人,而该机器人任何时候只能被一个vi控制,此时就可以使用信号量技术。当某个vi正在控制机器人时,通过锁定该信号量,其他vi只能处于信号量等待状态,只有该vi释
34、放信号量后,增等待的vi才能获得信号量,实现对机器人的控制。Semaphore demo in LabVIEWRendezvous in LabVIEW集合点技术可以让若干并行的任务同步执行,只有所有的任务到达后,才开始同步执行。这就好比一个会议,只有等到参会人员到齐后才开始。1、修改主函数的集合点数目为2、3、42、添加集合名称,并在4的时候运行一个同名集合用户,解救!添加自定义模板添加自定义模板更多资源更多资源http:/ Instruments 公司简介LabVIEW 高级编程技巧1.用户定义的调试指示器2.巧用LabVIEW控件3.定时结构4.基于事件触发的编程5.优化LabVIEW程
35、序内存管理6.6.调用动态链接库调用动态链接库共享库函数共享库函数What?Windows 中的.dll, UNIX/Linux 中的.so, 等等Why?降低磁盘空间和内存占用How?应用程序只在需要的时候调用库函数程序开始执行以后,由运行链接编辑器来处理所有调用 动态链接库动态链接库 (DLL)Microsoft Windows 中的一种软件模块包含可执行代码和可被Windows应用程序或其它DLL 调用的数据 函数和数据只有在运行状态下,被Windows 应用程序或其它DLL调用时才被加载和链接一个DLL 包括:-一个特殊函数(DllMain) -几个编程者自定义来完成常用任务的函数DL
36、L 特性特性不能单独运行的可执行文件应用程序要求时,由操作系统加载应用程序把DLL 代码作为自己二进制文件的一部分来使用应用程序不需要知道原始DLL是由什么语言编写的,也不需要清楚这些功能是如何实现的。DLL就像一个有输出函数的黑盒子LabVIEW下调用下调用DLL的方法的方法勿在浮沙筑高台调用库函数节点剑走中锋导入共享库工具LabVIEW 中调用中调用 Shared Library/DLLConnectivity Libraries & Executables Call Library Function Node右击Call Library Function Node,选择Configure
37、 来调用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, 双精度数数组数组数据指针数组句柄字符串CPascalG (LabVIEW)Adapt to TypeDLL 实例实例: MessageBoxA 函数函数回传类型回传类型函数名函数
38、名int MessageBoxA (hWnd, lpText, lpCaption, uType)参数参数参数参数:HWNDhWnd 32-bit 无符号整数. 确定parent window. 此时为NULL.LPCSTRlpText C-style stringLPCSTRlpCaption C-style stringUINTuType unsigned 32-bit integer value.回传类型回传类型:int 32-bit signed integer调试调试 Call Library Function如果VI不执行或者导致死机, 检查下列可能:DLL的路径名是否正确如果错误
39、信息是function not found in library, 检查函数名的拼写、语法和大小写传递给 DLL函数的所有参数都有数据线连接到Call Library Function 图标的输入端口上. 检查数据类型和参数顺序使用了正确的调用规则: C 或者缺省(stdcall); The Win32 API 使用缺省(stdcall) 规则需要更多帮助, 请参阅Using External Code in LabVIEW 手册导入共享库工具导入共享库工具头文件路径和预定义符号头文件路径和预定义符号包含路径:解包含路径:解析头文件时的析头文件时的搜索路径搜索路径预定义符号:预定义符号:#if
40、def 导入函数列表导入函数列表函数列表:选函数列表:选择需要导入的择需要导入的函数函数操作提示:操作提示:设置导入参数设置导入参数 控件类型控件类型 输入输入/ /输出输出 传递方式传递方式 默认值默认值 数据类型数据类型 函数声明函数声明 基本类型基本类型 导入函数原型导入函数原型1 1、自定义控件、自定义控件2 2、类型定义与严格类型定义、类型定义与严格类型定义3 3、自定义错误代码、自定义错误代码4 4、DataSocket 5、TCP与UDP DataSocket 1 1、URLURL是是DataSocketDataSocket访问目标的唯一地址。访问目标的唯一地址。2 2、Data
41、SocketDataSocket由由DataSocket APIDataSocket API和和DataSocket ServerDataSocket Server两两部分组成,部分组成,ServerServer负责提供负责提供DSTPDSTP协议和管理底层网络通信,协议和管理底层网络通信,自动管理与客户端的连接,极大简化了自动管理与客户端的连接,极大简化了TCPTCP编程,安装编程,安装LabVIEWLabVIEW时时DataSocket ServerDataSocket Server组件会被自动安装。组件会被自动安装。3 3、3 3种角色种角色发布者发布者PublisherPublishe
42、r、DataSocket ServerDataSocket Server、订阅者订阅者SubscriberSubscriberDataSocket 使用步骤1 1、在、在DataSocket Server ManagerDataSocket Server Manager中建立数据项中建立数据项2 2、启动、启动ServerServer3 3、编写发布端程序、编写发布端程序4 4、编写订阅者程序、编写订阅者程序可采用数据绑定方式可采用数据绑定方式TCP与UDP1 1、TCPTransmission Control ProtocolTCPTransmission Control Protocol由由ipip地址与端口号唯一标识的有连接的通信方式。地址与端口号唯一标识的有连接的通信方式。2 2、UDPUser Datagram ProtocolUDPUser Datagram Protocol快速、轻量、但不可靠的数据传输。快速、轻量、但不可靠的数据传输。电话与明信片电话与明信片放映结束 感谢各位的批评指导! 谢谢 谢!谢!让我们共同进步1422021/3/9