1天津大学精仪学院精讲LabVIEW设计模式天津大学精仪学院陈世利2天津大学精仪学院LabVIEW设计模式LabVIEW定时结构优化LabVIEW程序内存管理调用动态链接库LabVIEW与多线程3天津大学精仪学院什么是设计模式?•一种LabVIEW程序模板与架构软件实践中通用的程序架构,其本质是对很多十分类似的问题进行总结归纳的基础上提炼出的一些具有代表性的软件开发规范•具有灵活的配置功能•被广泛使用4天津大学精仪学院使用设计模式的益处简化整个开发过程–更容易理解程序代码–代码可重用可靠性–被使用多年,被证明其“可用并可靠”–大量技术资源与例程5天津大学精仪学院使用设计模式注意事项1、不是一成不变的定律,既要知道有哪些设计模式,还要知道每种模式解决实际应用中的哪些问题,是如何解决的,效果如何?2、文本式编程语言中广泛使用的设计模式在图形化数据流编程中的应用问题。6天津大学精仪学院注意!有些时候你没有必要选用最复杂的设计模式不要忘记最常见的设计模式——数据流!7天津大学精仪学院通用型:状态机模式、消息队列模式、用户界面事件模式专用型:主从线程模式、生产/消费模式、后台服务模式、应用程序启动模式、代理模式LabVIEW设计模式8天津大学精仪学院基本工具•循环结构•移位寄存器•分支结构•枚举型常量•事件结构9天津大学精仪学院状态机模式“我需要执行一系列的事件步骤,但是步骤顺序可通过编程决定的。”10天津大学精仪学院自动贩卖机模型InitializeWaitChangeQuarterDimeNickelExitVendNoinputQuarterDepositedTotal50Total=50ChangeRequestedDimeDepositedNickelDepositedTotal50Total50Total=50Total=50Total50Total=5011天津大学精仪学院基本三要素:状态、事件、动作12天津大学精仪学院背景动态结构:允许不同的状态,按通过编程决定的顺序进行执行静态顺序结构13天津大学精仪学院状态机结构对于一个最简单的状态机结构而言,它是可以用顺序结构代替的;而对于相对复杂的状态机结构而言,却可以作为测试流程的组织者和管理者。14天津大学精仪学院在LabVIEW下实现状态机结构•While循环+Case结构•每一Case即为一个状态•当前状态中需有决定下一状态的判定代码•使用枚举常量通过移位寄存器传递至下一状态15天津大学精仪学院切换代码工作流程初始状态FIRSTSTATE下一状态执行步骤移位寄存器用于传递状态Case结构对每一状态都配备一个分支切换代码根据执行步骤中的结果来决定下一状态枚举常量16天津大学精仪学院一个自定义的枚举类型对应一个状态机中的状态集合枚举常量枚举类型是一种允许程序员自定义元素的数据类型,它可以显示数值对应的具体含义,帮助程序员理解程序中使用的变量值。17天津大学精仪学院枚举常量举例控件选板“Modern”1、枚举控件、指示、常量2、默认U163、修改EditItems4、隐式与显式类型转换18天津大学精仪学院DEMO1顺序型状态机模式数据传递方式19天津大学精仪学院DEMO2改进的顺序型状态机模式1、去掉i2、添加一个移位寄存器20天津大学精仪学院DEMO3测试流程型状态机1、解决顺序型状态机不便阅读和修改的问题,采用枚举型常量。2、采用自定义型控件,方便修改。over21天津大学精仪学院消息队列模式“我需要执行一系列的事件步骤,但是步骤顺序可通过编程决定的。”步骤是由用户界面事件决定的,如某个应用程序共要处理4个状态,分别是A,B,C和D,前面板有3个按钮分别控制3种运行时的状态序列ABCD、DCAB和BDCA。引入消息队列模式,通过建立队列缓冲区来解决这个问题,这种模式也称为“队列型状态机模式”。22天津大学精仪学院消息处理过程建立消息队列加入消息探测消息EXIT?删除消息接收消息执行代码销毁消息队列消息源YesNo23天津大学精仪学院队列建立方式队列函数和数组24天津大学精仪学院队列函数最常用的4个函数25天津大学精仪学院数组1、数组函数2、配合移位寄存器3、无需手动销毁队列空间26天津大学精仪学院数组方式DEMO27天津大学精仪学院队列函数方式DEMO28天津大学精仪学院队列函数与数组的不同1、消息传递方式不同移位寄存器&FIFO2、释放消息队列的方式不同29天津大学精仪学院用户界面事件模式“我需要轮询用户的操作,但是这样会降低我程序的运行速度,并且有时我还检测不到……”30天津大学精仪学院LabVIEW中基于事件驱动的编程LabVIEW事件示例•按下鼠标•键盘按键•前面板的用户交互31天津大学精仪学院LabVIEW事件结构•什么是事件结构?–带有多个子框图的结构节点,就像条件结构•事件结构是如何工作的?–当面板上事件发生时才被唤醒–自动执行相应事件框图内的事件代码–当处理完成相应事件后便结束,并不一直循环等待32天津大学精仪学院为什么要使用事件结构?•用更简单的事件处理替代原来的查询循环•最小化CPU的使用•不会遗漏用户界面交互事件•可检测更多的交互事件•编程生成您自己的事件33天津大学精仪学院用户界面事件的两种类型通知事件和过滤事件34天津大学精仪学院事件源:用户界面事件用户自定义事件5个函数35天津大学精仪学院用户自定义事件DEMO36天津大学精仪学院事件注册静态事件注册:只有用户界面事件选择事件源(程序、VI或控件)、特定事件、编辑分支处理事件数据。Vi运行时自动注册。动态事件注册:何时产生何种事件37天津大学精仪学院静态事件注册demo38天津大学精仪学院动态事件注册4个步骤1、获取要处理事件对象的VI服务器引用;2、将VI服务器引用连接至“注册事件”函数;3、将事件结构放在While循环中,等待处理对象事件直到终止条件出现;4、通过取消注册时间函数停止事件发生。39天津大学精仪学院动态事件注册demo最值器40天津大学精仪学院用户界面事件demo一个动态+5个静态41天津大学精仪学院状态机——用户界面事件混合demo初始化时不再需要用户自定义事件42天津大学精仪学院其他模式“我希望同一时刻能够处理多个消息事件,而不是下一个消息代码必须等待上一次响应完成后才能执行”“我不希望消息排队,等待很烦的,有时采集数据和记录数据应该同时进行的”。43天津大学精仪学院主从线程模式通常应用于具有多个同时发生的并且拥有不同运行速率的线程的程序中。比如采集电压同时写入磁盘,采集速率1KHz,记录则每5秒一次。1、数据通信采用全局变量、局域变量或共享变量;2、Stop为Switch模式3、有时会用到事件发生模块Occurrence44天津大学精仪学院生产者/消费者“我需要可以同时间执行的两个过程,并且需保证它们不会互相影响执行速度。”45天津大学精仪学院生产者/消费者全局变量、局域变量或共享变量的每次复制都是原始数据的一个副本,占据了大量的空间。实际上只需要使用一部分缓冲区作为数据存储的中间部分,这需要借助队列技术。存储单元数据流入数据流出46天津大学精仪学院生产者/消费者具体做法最简单模式47天津大学精仪学院在LabVIEW下实现生产者/消费者•无数据相关的多个循环•主/从关系•在循环间实现通讯与同步48天津大学精仪学院工作流程•主循环负责通知各个从循环是否执行•允许循环间异步执行•数据的非相关性实现多线程•程序过程分解49天津大学精仪学院实现循环间的数据通讯•变量•通知器•队列•信号量•集合50天津大学精仪学院队列在队列中添加元素从队列中释放元素Referencetoexistingqueueinmemory选择队列中元素的数据类型出列操作需要等待数据进入或者超时情况51天津大学精仪学院生产者/消费者循环52天津大学精仪学院后台服务模式问:“我需要程序在后台运行,不要前面板,不要交互”答:“采用VI属性和方法接口,足以使你控制后台运行的VI”例子:一个网络服务监听程序,程序只需要接收与客户端Sockets的连接,实现三次握手,连接完成后将引用交给前端应用程序处理,同时继续监听。53天津大学精仪学院后台服务模式54天津大学精仪学院后台服务模式55天津大学精仪学院应用程序启动模式“我想设计一个启动画面,同时显示应用程序加载的进度,加载完毕后退出启动画面,运行主程序”56天津大学精仪学院应用程序启动模式1、SubVI目录2、启动应用程序.vi3、主程序“网络实验系统.vi”57天津大学精仪学院代理模式“我希望顶层VI(主VI)需要某个子VI时,才将其载入内存”“可以在应用程序中引入迟载入技术”58天津大学精仪学院代理模式59天津大学精仪学院总结•设计模式–简化LabVIEW开发过程–被广泛使用及证明其可用•常用的LabVIEW设计模式–数据流–事件驱动–状态机结构–生产者/消费者60天津大学精仪学院•而功能型全局变量(functionalglobalvariable)是为了避免竞争机制而实现的一种非重入型子vi61天津大学精仪学院定时结构•精确的定时while循环•精确的定时顺序结构•多个时钟频率的定时•反馈,动态定时特性•多优先级设置•examples\general\timedloop.llb62天津大学精仪学院定时顺序结构类似添加内置定时功能的顺序结构63天津大学精仪学院定时循环1、优先级:相对同一个程序框图中的多个定时循环而言,优先级数大的循环优先执行。每一个定时循环都有自己的线程,这里的优先级即线程优先级。2、循环名称,对于可重入子VI中包含定时循环,且该子VI的多个实例出现在同一个程序框图中,可以将循环名称作为子VI的输入端子。3、Deadline:用于指定完成一个循环的时间限定,如未在指定的时间内完成,则左端数据节点FinishedLate?[i-1]返回真。默认值-1表示Deadline由Period决定。4、如何处理某次循环使用的时间大于设定的周期?是否丢弃丢失的了的循环?是否保持原始相位?64天津大学精仪学院定时循环65天津大学精仪学院定时循环66天津大学精仪学院演示:定时循环67天津大学精仪学院演示:定时循环68天津大学精仪学院可具体手动设置定时循环运行的核设置定时循环运行的指定核69天津大学精仪学院可具体手动设置定时循环运行的核70天津大学精仪学院定时顺序结构TimedSequence含帧的定式循环TimedLoopwithFrames71天津大学精仪学院为什么要优化LabVIEW程序内存管理•LabVIEW的自动管理内存特性–方便用户开发,满足一般应用需求•LabVIEW应用程序趋向大型化,复杂化–项目规模大,需求复杂–数据处理量大,性能要求高•好的编程风格帮助LabVIEW优化内存管理–可以显著提高程序运行效率–需要了解LabVIEW的内存分配机制72天津大学精仪学院监测VI内存占用和运行时间的工具•帮助定位和分析程序中的瓶颈部分工具性能分析性能和内存73天津大学精仪学院显示VI内存分配情况的工具•帮助分析程序中各个数据变量的内存拷贝情况–目标:消除黑点工具性能分析显示缓存区分配74天津大学精仪学院了解程序内存的使用75天津大学精仪学院演示:监测内存使用76天津大学精仪学院优化LabVIEW程序内存管理•适时选择动态调用子VI•避免强制类型转换•把复杂VI分解成多个子VI•采用多面板程序•没必要时不要设置VI的重入特性•合理分配数组内存•灵活使用LabVIEW自带的VI•使用元素同址操作结构InPlaceElementStructure77天津大学精仪学院在程序中动态调用子VI321——减少程序占用内存以及载入时间•打开VI引用•通过引用节点调用•关闭引用78天津大学精仪学院2配置VI加载179天津大学精仪学院数据类型转换•强制点表明连接了两种不同的数据类型–LabVIEW中类型强制转换需要数据备份–涉及大数组的类型强制转换会占用大量内存80天津大学精仪学院推荐的类型转换方式•更好的解决方式是在随机数创建时进行转换–