您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 精讲LabVIEW设计模式
精讲LabVIEW设计模式LabVIEW设计模式LabVIEW定时结构优化LabVIEW程序内存管理调用动态链接库LabVIEW与多线程什么是设计模式?•一种LabVIEW程序模板与架构软件实践中通用的程序架构,其本质是对很多十分类似的问题进行总结归纳的基础上提炼出的一些具有代表性的软件开发规范•具有灵活的配置功能•被广泛使用使用设计模式的益处简化整个开发过程–更容易理解程序代码–代码可重用可靠性–被使用多年,被证明其“可用并可靠”–大量技术资源与例程使用设计模式注意事项1、不是一成不变的定律,既要知道有哪些设计模式,还要知道每种模式解决实际应用中的哪些问题,是如何解决的,效果如何?2、文本式编程语言中广泛使用的设计模式在图形化数据流编程中的应用问题。注意!有些时候你没有必要选用最复杂的设计模式不要忘记最常见的设计模式——数据流!通用型:状态机模式、消息队列模式、用户界面事件模式专用型:主从线程模式、生产/消费模式、后台服务模式、应用程序启动模式、代理模式LabVIEW设计模式基本工具•循环结构•移位寄存器•分支结构•枚举型常量•事件结构状态机模式“我需要执行一系列的事件步骤,但是步骤顺序可通过编程决定的。”自动贩卖机模型InitializeWaitChangeQuarterDimeNickelExitVendNoinputQuarterDepositedTotal50Total=50ChangeRequestedDimeDepositedNickelDepositedTotal50Total50Total=50Total=50Total50Total=50基本三要素:状态、事件、动作背景动态结构:允许不同的状态,按通过编程决定的顺序进行执行静态顺序结构状态机结构对于一个最简单的状态机结构而言,它是可以用顺序结构代替的;而对于相对复杂的状态机结构而言,却可以作为测试流程的组织者和管理者。在LabVIEW下实现状态机结构•While循环+Case结构•每一Case即为一个状态•当前状态中需有决定下一状态的判定代码•使用枚举常量通过移位寄存器传递至下一状态切换代码工作流程初始状态FIRSTSTATE下一状态执行步骤移位寄存器用于传递状态Case结构对每一状态都配备一个分支切换代码根据执行步骤中的结果来决定下一状态枚举常量一个自定义的枚举类型对应一个状态机中的状态集合枚举常量枚举类型是一种允许程序员自定义元素的数据类型,它可以显示数值对应的具体含义,帮助程序员理解程序中使用的变量值。枚举常量举例控件选板“Modern”1、枚举控件、指示、常量2、默认U163、修改EditItems4、隐式与显式类型转换DEMO1顺序型状态机模式数据传递方式DEMO2改进的顺序型状态机模式1、去掉i2、添加一个移位寄存器DEMO3测试流程型状态机1、解决顺序型状态机不便阅读和修改的问题,采用枚举型常量。2、采用自定义型控件,方便修改。over消息队列模式“我需要执行一系列的事件步骤,但是步骤顺序可通过编程决定的。”步骤是由用户界面事件决定的,如某个应用程序共要处理4个状态,分别是A,B,C和D,前面板有3个按钮分别控制3种运行时的状态序列ABCD、DCAB和BDCA。引入消息队列模式,通过建立队列缓冲区来解决这个问题,这种模式也称为“队列型状态机模式”。消息处理过程建立消息队列加入消息探测消息EXIT?删除消息接收消息执行代码销毁消息队列消息源YesNo队列建立方式队列函数和数组队列函数最常用的4个函数数组1、数组函数2、配合移位寄存器3、无需手动销毁队列空间数组方式DEMO队列函数方式DEMO队列函数与数组的不同1、消息传递方式不同移位寄存器&FIFO2、释放消息队列的方式不同用户界面事件模式“我需要轮询用户的操作,但是这样会降低我程序的运行速度,并且有时我还检测不到……”LabVIEW中基于事件驱动的编程LabVIEW事件示例•按下鼠标•键盘按键•前面板的用户交互LabVIEW事件结构•什么是事件结构?–带有多个子框图的结构节点,就像条件结构•事件结构是如何工作的?–当面板上事件发生时才被唤醒–自动执行相应事件框图内的事件代码–当处理完成相应事件后便结束,并不一直循环等待为什么要使用事件结构?•用更简单的事件处理替代原来的查询循环•最小化CPU的使用•不会遗漏用户界面交互事件•可检测更多的交互事件•编程生成您自己的事件用户界面事件的两种类型通知事件和过滤事件事件源:用户界面事件用户自定义事件5个函数用户自定义事件DEMO事件注册静态事件注册:只有用户界面事件选择事件源(程序、VI或控件)、特定事件、编辑分支处理事件数据。Vi运行时自动注册。动态事件注册:何时产生何种事件静态事件注册demo动态事件注册4个步骤1、获取要处理事件对象的VI服务器引用;2、将VI服务器引用连接至“注册事件”函数;3、将事件结构放在While循环中,等待处理对象事件直到终止条件出现;4、通过取消注册时间函数停止事件发生。动态事件注册demo最值器用户界面事件demo一个动态+5个静态状态机——用户界面事件混合demo初始化时不再需要用户自定义事件其他模式“我希望同一时刻能够处理多个消息事件,而不是下一个消息代码必须等待上一次响应完成后才能执行”“我不希望消息排队,等待很烦的,有时采集数据和记录数据应该同时进行的”。主从线程模式通常应用于具有多个同时发生的并且拥有不同运行速率的线程的程序中。比如采集电压同时写入磁盘,采集速率1KHz,记录则每5秒一次。1、数据通信采用全局变量、局域变量或共享变量;2、Stop为Switch模式3、有时会用到事件发生模块Occurrence生产者/消费者“我需要可以同时间执行的两个过程,并且需保证它们不会互相影响执行速度。”生产者/消费者全局变量、局域变量或共享变量的每次复制都是原始数据的一个副本,占据了大量的空间。实际上只需要使用一部分缓冲区作为数据存储的中间部分,这需要借助队列技术。存储单元数据流入数据流出生产者/消费者具体做法最简单模式在LabVIEW下实现生产者/消费者•无数据相关的多个循环•主/从关系•在循环间实现通讯与同步工作流程•主循环负责通知各个从循环是否执行•允许循环间异步执行•数据的非相关性实现多线程•程序过程分解实现循环间的数据通讯•变量•通知器•队列•信号量•集合队列在队列中添加元素从队列中释放元素Referencetoexistingqueueinmemory选择队列中元素的数据类型出列操作需要等待数据进入或者超时情况生产者/消费者循环后台服务模式问:“我需要程序在后台运行,不要前面板,不要交互”答:“采用VI属性和方法接口,足以使你控制后台运行的VI”例子:一个网络服务监听程序,程序只需要接收与客户端Sockets的连接,实现三次握手,连接完成后将引用交给前端应用程序处理,同时继续监听。后台服务模式后台服务模式应用程序启动模式“我想设计一个启动画面,同时显示应用程序加载的进度,加载完毕后退出启动画面,运行主程序”应用程序启动模式1、SubVI目录2、启动应用程序.vi3、主程序“网络实验系统.vi”代理模式“我希望顶层VI(主VI)需要某个子VI时,才将其载入内存”“可以在应用程序中引入迟载入技术”代理模式总结•设计模式–简化LabVIEW开发过程–被广泛使用及证明其可用•常用的LabVIEW设计模式–数据流–事件驱动–状态机结构–生产者/消费者•而功能型全局变量(functionalglobalvariable)是为了避免竞争机制而实现的一种非重入型子vi定时结构•精确的定时while循环•精确的定时顺序结构•多个时钟频率的定时•反馈,动态定时特性•多优先级设置•examples\general\timedloop.llb定时顺序结构类似添加内置定时功能的顺序结构定时循环1、优先级:相对同一个程序框图中的多个定时循环而言,优先级数大的循环优先执行。每一个定时循环都有自己的线程,这里的优先级即线程优先级。2、循环名称,对于可重入子VI中包含定时循环,且该子VI的多个实例出现在同一个程序框图中,可以将循环名称作为子VI的输入端子。3、Deadline:用于指定完成一个循环的时间限定,如未在指定的时间内完成,则左端数据节点FinishedLate?[i-1]返回真。默认值-1表示Deadline由Period决定。4、如何处理某次循环使用的时间大于设定的周期?是否丢弃丢失的了的循环?是否保持原始相位?定时循环定时循环演示:定时循环演示:定时循环可具体手动设置定时循环运行的核设置定时循环运行的指定核可具体手动设置定时循环运行的核定时顺序结构TimedSequence含帧的定式循环TimedLoopwithFrames为什么要优化LabVIEW程序内存管理•LabVIEW的自动管理内存特性–方便用户开发,满足一般应用需求•LabVIEW应用程序趋向大型化,复杂化–项目规模大,需求复杂–数据处理量大,性能要求高•好的编程风格帮助LabVIEW优化内存管理–可以显著提高程序运行效率–需要了解LabVIEW的内存分配机制监测VI内存占用和运行时间的工具•帮助定位和分析程序中的瓶颈部分工具性能分析性能和内存显示VI内存分配情况的工具•帮助分析程序中各个数据变量的内存拷贝情况–目标:消除黑点工具性能分析显示缓存区分配了解程序内存的使用演示:监测内存使用优化LabVIEW程序内存管理•适时选择动态调用子VI•避免强制类型转换•把复杂VI分解成多个子VI•采用多面板程序•没必要时不要设置VI的重入特性•合理分配数组内存•灵活使用LabVIEW自带的VI•使用元素同址操作结构InPlaceElementStructure在程序中动态调用子VI——减少程序占用内存以及载入时间•打开VI引用•通过引用节点调用•关闭引用3212配置VI加载1数据类型转换•强制点表明连接了两种不同的数据类型–LabVIEW中类型强制转换需要数据备份–涉及大数组的类型强制转换会占用大量内存推荐的类型转换方式•更好的解决方式是在随机数创建时进行转换–避免转换大块数据缓存(14.3KB)(22.7KB)把复杂VI分解成多个子VI•子vi会增加额外的前面板和框图的空间,但并不增添额外的代码和数据空间。由于程序运行时只有代码和数据被调入内存,子vi不会占用额外的内存。•好处是子vi运行结束后,LabVIEW可以及时收回子VI的数据空间,从而改善内存的使用效率。采用多面板程序•通过多面板程序实现只有在必要时才显示某些窗口,因为界面显示是最费内存的,因此这样可以极大降低内存的消耗。没必要时不要设置VI的重入特性•重入型vi每次运行时都会对自己使用的数据生成一个副本,这增加了内存开销合理分配数组内存•过多进行内存重新分配占用很大开销•慎用可能导致内存重新分配的相关函数–创建数组–连接字符串演示:编程方法影响程序性能总在开辟新内存,必定时间长演示:编程方法影响程序性能循环次数并非事先指定,因此每次循环也会开辟新的内存,但节省了BuildArray函数的时间。演示:编程方法影响程序性能循环无需开辟新的内存,时间会明显减少。演示:编程方法影响程序性能灵活使用LabVIEW自带的VI•基本线性代数子程序VI(BasicLinearAlgebraSubroutines)–合理归并基本线性代数操作–减少不必要的内存复制开销–使程序更加简洁数学线性代数BLAS元素同址操作结构•更新数组或簇中的元素时,避免元素数据备份应用控制内存控制元素同址操作结构的优点•方便实现多种情况的缓存重用,消除元素复制开销–数组索引和替换–簇的绑定和解除绑定–波形的绑定和解除绑定–变体的缓存重用–任意元素的缓存重用举例:数组索引和替换•将数组第2个元素增大10倍方法一:方法二:元素数据备份举例:簇的绑定和解除绑定•个人纳税信息的更新演示:嵌套的元素同址操作结构LabVIEW与多线程程序、进程与线程程序是计算机指令的静态集合、进程就是正在运行的程序,是一些所有权的集合
本文标题:精讲LabVIEW设计模式
链接地址:https://www.777doc.com/doc-7254165 .html