精讲LabVIEW设计模式ppt课件.ppt_第1页
精讲LabVIEW设计模式ppt课件.ppt_第2页
精讲LabVIEW设计模式ppt课件.ppt_第3页
精讲LabVIEW设计模式ppt课件.ppt_第4页
精讲LabVIEW设计模式ppt课件.ppt_第5页
已阅读5页,还剩137页未读 继续免费阅读

下载本文档

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

文档简介

精讲LabVIEW设计模式 LabVIEW设计模式 LabVIEW定时结构 优化LabVIEW程序内存管理 调用动态链接库 LabVIEW与多线程 什么是设计模式 一种LabVIEW程序模板与架构软件实践中通用的程序架构 其本质是对很多十分类似的问题进行总结归纳的基础上提炼出的一些具有代表性的软件开发规范具有灵活的配置功能被广泛使用 使用设计模式的益处 简化整个开发过程更容易理解程序代码代码可重用可靠性被使用多年 被证明其 可用并可靠 大量技术资源与例程 使用设计模式注意事项 1 不是一成不变的定律 既要知道有哪些设计模式 还要知道每种模式解决实际应用中的哪些问题 是如何解决的 效果如何 2 文本式编程语言中广泛使用的设计模式在图形化数据流编程中的应用问题 注意 有些时候你没有必要选用最复杂的设计模式不要忘记最常见的设计模式 数据流 通用型 状态机模式 消息队列模式 用户界面事件模式专用型 主从线程模式 生产 消费模式 后台服务模式 应用程序启动模式 代理模式 LabVIEW设计模式 基本工具 循环结构移位寄存器分支结构枚举型常量事件结构 状态机模式 我需要执行一系列的事件步骤 但是步骤顺序可通过编程决定的 自动贩卖机模型 Initialize Wait Change Quarter Dime Nickel Exit Vend Noinput QuarterDeposited Total 50 Total 50 ChangeRequested DimeDeposited NickelDeposited Total 50 Total 50 Total 50 Total 50 Total 50 Total 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 删除消息 接收消息执行代码 销毁消息队列 消息源 Yes No 队列建立方式 队列函数和数组 队列函数 最常用的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下实现生产者 消费者 无数据相关的多个循环主 从关系在循环间实现通讯与同步 工作流程 主循环负责通知各个从循环是否执行允许循环间异步执行数据的非相关性实现多线程程序过程分解 从循环1 从循环2 主循环 实现循环间的数据通讯 变量通知器队列信号量集合 队列 在队列中添加元素 从队列中释放元素 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 如何处理某次循环使用的时间大于设定的周期 是否丢弃丢失的了的循环 是否保持原始相位 定时循环 定时循环 演示 定时循环 演示 定时循环 可具体手动设置定时循环运行的核 NEW 可具体手动设置定时循环运行的核 NEW 定时顺序结构TimedSequence含帧的定式循环TimedLoopwithFrames 为什么要优化LabVIEW程序内存管理 LabVIEW的自动管理内存特性方便用户开发 满足一般应用需求LabVIEW应用程序趋向大型化 复杂化项目规模大 需求复杂数据处理量大 性能要求高好的编程风格帮助LabVIEW优化内存管理可以显著提高程序运行效率需要了解LabVIEW的内存分配机制 监测VI内存占用和运行时间的工具 帮助定位和分析程序中的瓶颈部分 工具 性能分析 性能和内存 显示VI内存分配情况的工具 帮助分析程序中各个数据变量的内存拷贝情况目标 消除黑点 工具 性能分析 显示缓存区分配 了解程序内存的使用 演示 监测内存使用 优化LabVIEW程序内存管理 适时选择动态调用子VI避免强制类型转换把复杂VI分解成多个子VI采用多面板程序没必要时不要设置VI的重入特性合理分配数组内存灵活使用LabVIEW自带的VI使用元素同址操作结构InPlaceElementStructure 在程序中动态调用子VI 3 2 1 减少程序占用内存以及载入时间打开VI引用通过引用节点调用关闭引用 2 配置VI加载 1 数据类型转换 强制点表明连接了两种不同的数据类型LabVIEW中类型强制转换需要数据备份涉及大数组的类型强制转换会占用大量内存 推荐的类型转换方式 更好的解决方式是在随机数创建时进行转换避免转换大块数据缓存 14 3KB 22 7KB 把复杂VI分解成多个子VI 子vi会增加额外的前面板和框图的空间 但并不增添额外的代码和数据空间 由于程序运行时只有代码和数据被调入内存 子vi不会占用额外的内存 好处是子vi运行结束后 LabVIEW可以及时收回子VI的数据空间 从而改善内存的使用效率 采用多面板程序 通过多面板程序实现只有在必要时才显示某些窗口 因为界面显示是最费内存的 因此这样可以极大降低内存的消耗 没必要时不要设置VI的重入特性 重入型vi每次运行时都会对自己使用的数据生成一个副本 这增加了内存开销 合理分配数组内存 过多进行内存重新分配占用很大开销慎用可能导致内存重新分配的相关函数创建数组连接字符串 演示 编程方法影响程序性能 总在开辟新内存 必定时间长 演示 编程方法影响程序性能 循环次数并非事先指定 因此每次循环也会开辟新的内存 但节省了BuildArray函数的时间 演示 编程方法影响程序性能 循环无需开辟新的内存 时间会明显减少 演示 编程方法影响程序性能 灵活使用LabVIEW自带的VI 基本线性代数子程序VI BasicLinearAlgebraSubroutines 合理归并基本线性代数操作减少不必要的内存复制开销使程序更加简洁 数学 线性代数 BLAS NEW 元素同址操作结构 更新数组或簇中的元素时 避免元素数据备份 应用控制 内存控制 NEW 元素同址操作结构的优点 方便实现多种情况的缓存重用 消除元素复制开销数组索引和替换簇的绑定和解除绑定波形的绑定和解除绑定变体的缓存重用任意元素的缓存重用 举例 数组索引和替换 将数组第2个元素增大10倍 方法一 方法二 元素数据备份 举例 簇的绑定和解除绑定 个人纳税信息的更新 演示 嵌套的元素同址操作结构 LabVIEW与多线程 程序 进程与线程 程序是计算机指令的静态集合 进程就是正在运行的程序 是一些所有权的集合 包括内存 CPU运行时间等一系列资源 为线程的运行提供一个环境 线程才是程序的最小执行单位 是程序的一条执行路径 是操作系统分配CPU时间的基本实体 一个程序的进程以一个主线程开始 如果进程的执行可以划分为多个执行路径 则可以创建多个线程 例 三线程程序 用户界面线程 数据采集线程 仪器控制线程 这些线程共享进程内的公共资源 LabVIEW与多线程 多处理器环境下的并行编程 1 线程调度2 线程优先级3 线程通信与同步进程间 环境变量 命名管道 共享内存等线程间 全局变量 全局数据 文件句柄或通信参数等进程内数据结构来完成 同步 数据同步 设备同步 任务同步 LabVIEW对多线程程序设计的支持 不支持线程的直接创建 从执行系统和数据流控制两个层次提供对多线程程序设计的支持 发布时需要运行引擎 执行子系统线程数量配置 vi lib utilities sysinfo llb中的threadconfig vi一共有25个具有优先级的执行子系统 执行子系统线程数量配置 线程是一把双刃剑 线程优先级的设置1 有时你只要一个不同时间的等待 2 避免优先级倒置或饥饿的发生 LabVIEW多线程程序设计 LabVIEW执行系统会自动管理线程 但这并不意味着不需要用户的参与 在LabVIEW程序中 从数据流的起始点到结束点的整个流程称为执行路径 并行的执行路径是划分线程任务的依据 如要充分利用线程的优势 应尽量提高程序的并行度 避免使用顺序结构来实现程序架构 超线程求质数demo 可重入技术demo 线程通信与同步 多个循环要访问同一个设备 但该设备任何时候只能同时响应一个命令 线程通信与同步 1 局部变量创建方法 写竞争 布尔端子注意机械动作设置 破坏数据流编程模式 2 全局变量创建方法 减少vi之间数据传递的连线 3 共享变量必须有项目 单进程或网络发布 4 功能全局变量 共享变量 1 要有项目2 使用的文件要位于项目中3 必须部署才能使用4 对于客户端 需要指定绑定数据源5 可以拖到前面板 小箭头变成绿色表示连接成功 红色失败 6 右键面板控件 属性 数据绑定可以将控件于某个共享变量绑定 7 共享变量引擎SharedVariabledEngine NI PSP SVE 功能全局变量FunctionalGlobalVariables 将一个只执行一次的For循环或While循环放在一个子vi中 并使用未初始化的移位寄存器保存可读写的数据 与全局变量相比 该方法的优势在于可以控制对移位寄存器的访问 功能全局变量demo 1 Notification通知技术 1 一段程序框图在收到来自于其它程序框图或vi的通知消息前保持等待状态 而通知消息可以是任何类型的数据 因此可以实现不同框图不同vi之间的数据传递 2 不同于局部变量和全局变量 不需轮询 3 通知器任何时候只能存放一个消息 新消息发出时 旧消息会被丢弃 消息接收者的数目没有限制 新消息发出之前 该消息一直存在于通知器中 在任何时候都可以被任何接收者接收 接收者接收到该消息后并不删除通知器中的消息 NotificationDEMOinLabVIEW 注意观察User1 3的延时设置与是否忽略以前的消息的设置对波形的影响 QueueinLabVIEW Queue结构是一种FIFO结构 采用ObtainQueue函数创建队列时需要指定size大小 数据进去后如果没有程序将这些数据读出 将一直保存在队列中 直到有程序将其读出并删除 如果有两个应用程序都在等待同一个队列中的同一条数据 只有那个动作快的程序会收到数据 QueueDEMOinLabVIEW 3个子函数的周期不同 SemaphoreinLabVIEW 信号量技术用于限制同时访问一个被保护的共享资源的任务数目 信号量就像一把key 比如两个独立运行的vi需要控制同一个机器人 而该机器人任何时候只能被一个vi控制 此时就可以使用信号量技术 当某个vi正在控制机器人时 通过锁定该信号量 其他vi只能处于信号量等待状态 只有该vi释放信号量后 增等待的vi才能获得信号量 实现对机器人的控制 SemaphoredemoinLabVIEW RendezvousinLabVIEW 集合点技术可以让若干并行的任务同步执行 只有所有的任务到达后 才开始同步执行 这就好比一个会议 只有等到参会人员到齐后才开始 1 修改主函数的集合点数目为2 3 42 添加集合名称 并在4的时候运行一个同名集合用户 解救 LabVIEW状态图模块LabVIEWStatechart 简单的状态机结构无法实现状态并发 包含与保存功能 LabVIEW状态图模块 状态图 用直观的方法来表达基于事件的系统 应用领域 数字协议控制类应用时序逻辑批处理事件响应用户界面的实现系统建模 设计状态和转移设计动作和警戒代码产生状态图子VI嵌入到LabVIEW程序框图中 LabVIEW状态图开发的步骤 动手演示 创建简单状态图 DEMO LabVIEW状态图 添加自定义模板 更多资源 议程 NationalInstruments公司简介LabVIEW高级编程技巧用户定义的调试指示器巧用LabVIEW控件定时结构基于事件触发的编程优化LabVIEW程序内存管理调用动态链接库 共享库函数 What Windows中的 dll UNIX Linux中的 so 等等Why 降低磁盘空间和内存占用How 应用程序只在需要的时候调用库函数程序开始执行以后 由运行链接编辑器来处理所有调用 动态链接库 DLL MicrosoftWindows中的一种软件模块包含可执行代码和可被Windows应用程序或其它DLL调用的数据函数和数据只有在运行状态下 被Windows应用程序或其它DLL调用时才被加载和链接一个DLL包括 一个特殊函数 DllMain 几个编程者自定义来完成常用任务的函数 DLL特性 不能单独运行的可执行文件应用程序要求时 由操作系统加载应用程序把DLL代码作为自己二进制文件的一部分来使用应用程序不需要知道原始DLL是由什么语言编写的 也不需要清楚这些功能是如何实现的 DLL就像一个有输出函数的黑盒子 LabVIEW下调用DLL的方法 勿在浮沙筑高台 调用库函数节点剑走中锋 导入共享库工具 LabVIEW中调用SharedLibrary DLL Connectivity Libraries Executables CallLibraryFunctionNode右击CallLibraryFunctionNode 选择Configure来调用DLL中的特定函数 CallLibraryFunction的配置 指定需调用的DLL函数和函数参数选择dll的调用规则 对于Win32dll来说 可以是缺省 stdcall 或C CallLibraryFunction和Win32DLLs 函数参数可以是以下类型 Void数字型有符号 无符号8 bit 16 bit和32 bit整数4 byte 单精度数8 byte 双精度数 数组数组数据指针数组句柄字符串CPascalG LabVIEW AdapttoType DLL实例 MessageBoxA函数 回传类型 函数名 参数 HWNDhWnd32 bit无符号整数 确定parentwindow 此时为NULL LPCSTRlpTextC stylestringLPCSTRlpCaptionC stylestringUINTuTypeunsigned32 bit

温馨提示

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

评论

0/150

提交评论