
详尽讲解了LabVIEW常用的编程方法、编程技巧和工程应用技术。全书共分为3篇,其中,入门篇归纳总结了LabVIEW编程人员必须掌握的基础知识,包括LabVIEW的基本概念、基本函数的用法和常用的运行结构,以及LabVIEW的基本数据结构和文件存储方式;高级篇细致地讲解了引用、属性、方法及各类高级控件的运用,LabVIEW的文本方式编程及DLL、C语言接口,基于MATLAB语法的math*编程技术,LabVIEW基于组件的高级编程方法和编程模式;工程应用篇介绍了串口、并口和网络通信的常用方法,数据采集的基本原理和方法,LabVIEW实时系统的构建和编程,以及各种常用专业工具包的使用方法,包括数据库连接工具包、数据监控与记录工具包、报表生成工具包、状态图工具包等。《LabVIEW宝典》可作为高等院校通信、测量技术、自动控制等相关课程的教材和教学参考书,也可作为相关工程技术人员设计开发仪器或自动测试系统的技术手册。
前 言 计算机的出现,彻底改变了人们的工作和生活方式。如今计算机已经无处不在,进入了每个人的生活之中。在工程技术人员看来,计算机不仅仅是人们常见的PC,也包括各种微处理器。从这个角度看,我们无时无刻不在使用计算机,例如,电视、洗衣机、自动提款机等都依赖计算机来实现各种便捷的功能。 相同的计算机可以完成不同的工作,在于它们使用不同的程序,而程序是由计算机编程语言创建的。短短几十年中,出现了众多的编程语言,这些编程语言的共同特点是采用文本方式创建程序。文本方式编程对编程人员要求很高,这使得计算机编程只能是少数人才可以从事的职业。 美国国家仪器公司(National Instruments,NI)的创新软件产品LabVIEW,允许用图形方式编程,摒弃了晦涩难懂的文本代码,使得计算机编程不再是少数人的专利。LabVIEW的最早版本诞生于1986年,几乎和Windows的最早版本同步,这注定了LabVIEW是多平台的编程语言,适用于不同的操作系统。 20世纪80年代初,NI公司是GPIB总线设备的主要供货商,丰富的硬件经验和强大的软件开发需求,促使NI公司的工程师们决心寻找一种代替传统编程语言的开发工具,这促成了1986年LabVIEW的横空出世。LabVIEW是由测试工程师开发的专用编程语言,因此,LabVIEW具有鲜明的行业特点,最早主要用于测试测量领域。NI公司独创了虚拟仪器的概念,提出了“软件就是仪器”的理念,并逐步成为业界的标准。 随着LabVIEW的不断发展,几乎每隔一两年,都要推出新的版本。LabVIEW的应用范围已经覆盖了工业自动化、测试测量、嵌入式应用、运动控制、图像处理、计算机仿真、FPGA等众多领域。以LabVIEW为核心,采用不同的专用工具包和统一的图形编程方式,可以实现不同技术领域的需求。 由于LabVIEW版本升级过快,导致许多函数、VI的名称与图标发生了变化。使用LabVIEW新版本的读者,会发现本书前两版中程序框图中的函数、VI与新版LabVIEW对应不上,而且LabVIEW每次更新都增加了很多新功能。鉴于此,我们编写了本书的第3版。第3版在前两版的基础上,修改了一些程序框图,同时也针对新功能,增加了对应的内容。 本书要点 本书作者多年使用LabVIEW作为主要的编程语言,因此特别关注LabVIEW在工业领域的具体运用以及LabVIEW的实用编程技术。本书共17章,分为入门篇、高级篇、工程应用篇。 第1~5章为入门篇,介绍了LabVIEW的基本概念、基本函数的用法和常用的运行结构,详尽地分析了LabVIEW的基本数据结构和文件存储方式。 第6~11章为高级篇,介绍了应用程序、VI和控件的引用、属性和方法,以及各类高级控件的运用方法。第8章介绍了LabVIEW的文本编程方式及DLL、C语言接口,第9章详细介绍了基于MATLAB语法的MathScript编程技术,第10章介绍了LabVIEW基于组件的编程方法。 第12~17章为工程应用篇,具体而细致地讲解了在做实际工程开发时所用到的LabVIEW编程技术。本篇结合LabVIEW的常用工具包,具体分析了计算机串口、并口、网络通信方面的编程技术,以及数据记录和监控工具包、数据库连接工具包、报表生成工具包、状态图工具包、FPGA工具包等的应用。第13、第14章详细介绍了数据采集的基本原理和常用编程方法,其中重点介绍了LabVIEW在实时系统下的运用。第15章讲解了LabVIEW实时系统的开发案例。第16章讲解了LabVIEW数据采集系统开发案例。第17章讲解了FPGA的开发案例,以及如何利用LabVIEW图形编程方式,提高开发效率。 读者对象 本书可作为高等院校通信、测量技术、自动控制等专业相关课程的教材和教学参考书,也可作为相关工程技术人员设计开发仪器或自动测试系统的技术手册。 本书特色 本书内容非常丰富,在每个章节都安排了大量的示例,针对具体编程实践中遇到的问题,提出了多种解决方法。在兼顾基础知识的前提下,深入讨论了LabVIEW的高级编程方法和编程技巧。 本书的宗旨是作为实用工具书,侧重于来自工程实践的一线案例。笔者在写作过程中,与众多的LabVIEW爱好者进行了充分的沟通与交流,总结了编程过程中经常遇到的问题,本书针对这些问题进行了探讨,并作为书中的重要内容。 本书使用了大量篇幅讲解NI公司各种专用工具包的运用,这部分内容具有一定的深度和实用价值,特别适合具有一定基础的编程人员学习运用。在入门篇中,虽然也介绍了许多LabVIEW的基础知识,但还是侧重于具体应用,其中大量的例程可以直接在具体项目中使用。 在高级篇中,重点介绍了LabVIEW常用的编程模式,以及状态图工具包的运用,同时介绍了新增的面向对象的编程方法。 补遗说明 本书写作时主要使用8.6版本,但是书中介绍的具体内容并不限于特定的版本,因此无版本限制。本书案例文件和相关课件扫描下方二维码可以下载,方便读者提高学习效率,也方便教师教学。此外,对于比较重要的内容,为了让读者印象深刻,我们以“学习笔记”的体例呈现出来。 致谢与分工 本书由陈树学、刘萱两位工程师编写,我们有多年的LabVIEW实际开发经验,经过浓缩和总结才成此书。在编写本书的过程中得到张国强老师的大力支持,他为我们提供了开发硬件,使得写作能在真实的开发环境中进行,应该说没有他的热心帮助,完成本书是难以想象的事情。本书也离不开成都道然科技有限责任公司的专业策划支持。因为本书作者为工程技术人员,对于写作并不擅长,书中错漏之处在所难免,敬请批评指正。能够为LabVIEW在国内的推广使用做一点力所能及的贡献,能够对广大的LabVIEW爱好者有所帮助,是我们最大的愿望。
第1部分 入门篇 第1章 打开LabVIEW编程之门 2 1.1 从VI开始 2 1.1.1 创建VI 3 1.1.2 控件属性设置与快捷菜单 6 1.1.3 创建控件、常量、局部变量、引用、属性节点和方法节点 8 1.1.4 创建自定义控件 10 1.2 编辑前面板和程序框图 12 1.2.1 选择、移动和删除对象 12 1.2.2 使用布局工具 13 1.3 VI及其属性对话框 17 1.3.1 VI的层次结构 17 1.3.2 调用子VI 19 1.3.3 VI的属性设置 19 1.4 基本控件及其使用方法 24 1.4.1 基本数值控件 24 1.4.2 基本布尔控件 30 1.4.3 控件的通用编辑方法 33 1.4.4 字符串和路径控件 35 1.4.5 下拉列表与枚举控件 38 1.4.6 数组控件及其属性设置 39 1.4.7 簇控件 40 1.4.8 时间标识控件与波形数据控件 42 1.5 小结 44 第2章 LabVIEW基本函数 45 2.1 必须了解的一些基本算术运算函数 45 2.1.1 基本运算函数 45 2.1.2 标量之间的基本运算 46 2.1.3 标量与数组的运算 46 2.1.4 数组与数组的运算 46 2.1.5 数组运算相关函数 47 2.1.6 标量与簇的基本运算 55 2.1.7 簇与簇的运算 56 2.1.8 簇的函数 56 2.2 必须了解的位运算函数和逻辑运算函数 59 2.2.1 常用逻辑运算函数 59 2.2.2 位运算 59 2.2.3 深入理解复合运算函数 60 2.3 必须了解的关系运算函数和比较函数 61 2.3.1 比较模式 62 2.3.2 通用关系运算函数 62 2.3.3 “比较0”关系运算函数 63 2.3.4 复杂关系运算函数 64 2.3.5 字符关系运算函数 67 2.3.6 表达式节点与公式快速VI 67 2.4 群体函数 69 2.4.1 集合与映射表函数选板 69 2.4.2 创建集合 69 2.4.3 集合的基本运算 70 2.4.4 创建映射表 70 2.4.5 注册与注销映射表 71 2.5 小结 72 第3章 LabVIEW的程序运行结构 73 3.1 两种不同的循环结构 73 3.1.1 For循环的组成和特点 73 3.1.2 For循环与数组 75 3.1.3 For循环与移位寄存器 77 3.1.4 For循环中的continue和break 78 3.1.5 While循环,不仅仅是循环 79 3.1.6 While循环与定时 80 3.1.7 反馈节点 86 3.2 定时结构 86 3.2.1 定时循环的基本组成要素和配置对话框 87 3.2.2 定时顺序结构 90 3.3 独特的条件结构 90 3.3.1 条件结构的基本结构 90 3.3.2 布尔型输入 91 3.3.3 错误簇输入 91 3.3.4 数值型输入 91 3.3.5 枚举型输入 92 3.3.6 下拉列表输入 93 3.3.7 字符串和组合框输入 93 3.3.8 输入/输出隧道 93 3.3.9 多重If-Else的处理方法 94 3.4 不和谐的顺序结构 94 3.4.1 多线程运行次序 95 3.4.2 两种不同的顺序结构 95 3.4.3 隧道与顺序局部变量 96 3.4.4 顺序结构的替代 97 3.4.5 顺序结构的典型应用 97 3.5 程序框图禁用结构 98 3.6 局部变量、内置全局变量和功能(LV2型)全局变量 98 3.6.1 局部变量 98 3.6.2 内置全局变量 100 3.6.3 功能(LV2型)全局变量 102 3.7 事件结构 103 3.7.1 事件结构的基本构成和创建方法 104 3.7.2 事件的分类及其特点 105 3.7.3 事件结构之间的数据传送与共享 107 3.7.4 事件发生的次序、事件过滤和转发 108 3.7.5 正确地使用事件结构 109 3.8 小结 110 第4章 LabVIEW的数据结构及内存优化 111 4.1 常用数据类型转换函数 111 4.1.1 “强制类型转换”函数 111 4.1.2 “平化至字符串”函数与“从字符串还原”函数 112 4.1.3 变体数据 113 4.1.4 变体数据数据类型解析 113 4.2 整数的类型转换及内存映射 114 4.2.1 布尔型数据与字符串和数值之间的相互转换 115 4.2.2 U8类型数据与字符串之间的相互转换 115 4.2.3 整数类型之间的相互转换 115 4.3 其他标量数据的类型转换及内存映射 116 4.3.1 定点数、浮点数的类型转换与内存映射 116 4.3.2 复数的类型转换及内存映射 119 4.3.3 时间标识的类型转换与内存映射 119 4.4 复合数据类型 120 4.4.1 标量数组的内存映射 120 4.4.2 字符串、路径和字符串数组的内存映射 121 4.4.3 LabVIEW使用的编码 122 4.5 簇的内存映射 123 4.5.1 由标量组成的簇 123 4.5.2 包含数组和字符串的簇 123 4.6 类型描述符 124 4.6.1 类型描述符的基本构成要素 124 4.6.2 常用类型描述符列表 124 4.6.3 常见数据类型的类型描述符结构 125 4.7 OpenG中有关类型描述符的函数 126 4.7.1 类型描述符函数 127 4.7.2 利用类型描述符处理枚举型数据 128 4.7.3 利用类型描述符处理簇 128 4.8 几种常用的内存分析工具和方法 128 4.8.1 内存的重要性 129 4.8.2 内存和性能查看工具 130 4.8.3 VI使用的内存 131 4.8.4 优化内存的一般注意事项 132 4.8.5 数组与内存优化 133 4.8.6 避免在循环中进行不必要的计算、读/写控件或者变量 136 4.9 影响VI运行速度的因素 137 4.9.1 硬件输入/输出 137 4.9.2 屏幕显示 138 4.10 小结 138 第5章 字符串与文件存储 139 5.1 字符串 139 5.1.1 几种常用的字符串常量 139 5.1.2 几种常用的字符串函数 140 5.1.3 “匹配模式”和“匹配正则表达式”函数 141 5.1.4 字符串与数值的相互转换 144 5.1.5 功能强大的“格式化字符串”函数和“扫描字符串”函数 145 5.1.6 数组与电子表格字符串 148 5.1.7 附加字符串函数 148 5.2 文件存储 149 5.2.1 文本文件与二进制文件的区别 149 5.2.2 文件常量和通用目录、文件函数 150 5.2.3 构造路径的方法 151 5.2.4 文本文件的读/写 154 5.2.5 数据记录文件的读/写 158 5.2.6 读/写二进制文件 159 5.2.7 INI文件的读/写 161 5.2.8 XML文件的读/写 163 5.2.9 注册表的读/写 165 5.2.10 TDM文件 166 5.2.11 TDMS文件 168 5.3 小结 171 第2部分 高级篇 第6章 LabVIEW对象的解析 174 6.1 LabVIEW控件对象的层次继承结构 174 6.1.1 布尔控件的层次继承结构 174 6.1.2 通用类的属性 175 6.1.3 图形对象类 177 6.2 图形对象类的子类 178 6.2.1 前面板类 178 6.2.2 窗格类和分隔栏类 179 6.2.3 LabVIEW的坐标映射 180 6.2.4 修饰类 182 6.3 控件类 184 6.3.1 控件类的常用属性 184 6.3.2 控件类的常用方法 186 6.3.3 数值控件类 187 6.4 常用控件的专有属性 188 6.4.1 布尔控件的专有属性 189 6.4.2 枚举控件和下拉列表控件的专有属性 189 6.4.3 字符串控件、路径控件和组合框控件的专有属性 190 6.4.4 数组控件的属性和方法 192 6.4.5 簇的属性及方法 194 6.5 引用句柄 195 6.6 VI的属性 197 6.6.1 获取VI的引用句柄 197 6.6.2 常用VI属性 197 6.7 常用VI方法 200 6.7.1 获取前面板、程序框图和VI图标的图像 201 6.7.2 打印控制 201 6.7.3 默认值方法 201 6.8 动态调用VI 202 6.8.1 静态调用和动态调用的比较 202 6.8.2 通过“引用节点调用”函数动态调用VI 203 6.8.3 一般类型VI的动态调用 205 6.8.4 创建闪屏 207 6.8.5 创建后台运行程序 207 6.8.6 创建向导程序 208 6.8.7 动态调用VI之间的数据交换 209 6.9 应用程序的属性和方法 210 6.9.1 获取应用程序的引用句柄 210 6.9.2 应用程序的常用属性 211 6.10 小结 212 第7章 高级控件的运用 213 7.1 列表框 213 7.1.1 列表框的创建及显示风格 213 7.1.2 列表框的常用属性、方法与事件 213 7.1.3 列表框的应用举例 214 7.2 多列列表框 217 7.2.1 显示多列项目并排序 218 7.2.2 多列列表框的特效制作 220 7.3 表格 220 7.3.1 表格的常用属性和方法 221 7.3.2 表格的应用举例 224 7.4 树形控件 228 7.4.1 树形控件的创建与静态编辑 228 7.4.2 树形控件的常用属性、方法和事件 229 7.4.3 树形控件高级应用举例 231 7.5 波形图表 232 7.5.1 波形图表的组成要件 233 7.5.2 波形图表的输入类型 235 7.5.3 波形图表专用属性 235 7.5.4 波形图表应用举例 237 7.6 波形图 238 7.6.1 波形图控件的创建和组成要件 239 7.6.2 波形图控件的输入类型 239 7.6.3 波形图控件的专用属性 242 7.6.4 波形图控件的高级应用举例 244 7.7 XY图 246 7.7.1 XY图的输入数据类型 247 7.7.2 XY图的高级应用 249 7.8 强度图表和强度图 251 7.9 数字数据、数字波形数据与数字波形图 251 7.9.1 数字数据 252 7.9.2 数字波形数据和数字波形图 252 7.10 图片控件 253 7.10.1 利用图片控件显示图片 253 7.10.2 常用绘图操作函数 255 7.10.3 图片控件的高级应用 257 7.11 小结 259 第8章 文本式编程与外部程序接口 260 8.1 公式节点 260 8.1.1 公式节点的数据类型、语法与控制结构 260 8.1.2 公式节点的应用举例 262 8.2 调用库函数 263 8.2.1 DLL与API函数 263 8.2.2 如何调用DLL函数 265 8.2.3 常用API函数的调用 270 8.2.4 LabVIEW调用DLL的局限性 273 8.3 CIN 276 8.3.1 CIN创建的一般过程 277 8.3.2 CIN的数据类型和常用函数 279 8.3.3 CIN与内存管理器 283 8.3.4 CIN的运行过程和数据共享 286 8.4 系统命令 289 8.5 剪贴板 290 8.6 DDE库 291 8.6.1 DDE概述 291 8.6.2 LabVIEW中的常用DDE方法 292 8.7 ActiveX控件与ActiveX文档 294 8.7.1 ActiveX的基本概念 294 8.7.2 ActiveX控件的调用过程 294 8.7.3 ActiveX应用实例 295 8.7.4 ActiveX自动化服务器 297 8.8 .NET技术 298 8.8.1 .NET控件 298 8.8.2 .NET服务 299 8.8.3 利用.NET创建托盘程序 301 8.9 小结 304 第9章 MathScript 305 9.1 如何使用MathScript 305 9.1.1 使用MathScript节点 305 9.1.2 使用MathScript交互窗口 306 9.2 MathScript常用命令 307 9.3 MathScript基础知识 308 9.3.1 创建向量和矩阵的基本方法 308 9.3.2 矩阵的基本运算 309 9.3.3 标准矩阵 310 9.3.4 矩阵元素的插入、替换、删除和提取 310 9.3.5 矩阵元素的排序和搜索特征值 312 9.3.6 常用的矩阵变换函数 313 9.3.7 矩阵中元素的数据类型及转换 314 9.3.8 关系运算、逻辑运算和位操作 316 9.3.9 集合函数 316 9.3.10 时间、日期和计时函数 317 9.4 程序控制结构与函数 318 9.4.1 For循环和While循环 318 9.4.2 If条件结构和Switch分支条件结构 319 9.4.3 函数和脚本文件 320 9.5 数据统计和数据插值拟合 322 9.5.1 常用数据统计函数 322 9.5.2 数据插值 325 9.6 多项式、积分和微分 327 9.6.1 多项式 327 9.6.2 极值与零点 328 9.6.3 积分和微分 329 9.7 数据的图形显示 329 9.7.1 窗口类属性与常用窗口操作函数 330 9.7.2 绘图区域属性 332 9.7.3 线对象和文本对象的属性及常用函数 334 9.7.4 基本绘图函数 335 9.8 小结 338 第10章 组件、同步技术、面向对象编程 339 10.1 数据的封装与隔离 339 10.1.1 合理地使用数据流 339 10.1.2 LV2型全局变量 340 10.1.3 值变化与上升、下降沿 342 10.1.4 定时触发与计数器 344 10.2 动作机(Action Engine) 346 10.2.1 准备建立动作机 346 10.2.2 建立动作机的步骤 347 10.3 用户事件与动态注册事件 348 10.3.1 用户事件 348 10.3.2 动态注册事件 351 10.4 堆栈与数据缓冲区 352 10.4.1 堆栈的实现 353 10.4.2 数据缓冲区 354 10.5 同步控制技术 354 10.5.1 队列 355 10.5.2 通知器 360 10.5.3 信号量与集合点 363 10.6 项目管理器 364 10.6.1 项目管理器的结构 364 10.6.2 虚拟文件夹 365 10.6.3 库 365 10.7 面向对象编程 367 10.7.1 面向对象编程的基本概念 368 10.7.2 类的封装特性 368 10.7.3 类的继承特性 371 10.7.4 类的多态性 374 10.7.5 类变量 378 10.7.6 调用父类中的重写方法 378 10.7.7 类的引用转换 379 10.7.8 简单工厂模式 381 10.7.9 类的动态加载与插件功能 381 10.7.10 类方法的递归功能 382 10.7.11 类的单态模式 382 10.7.12 接口 383 10.8 自适应VI(VIM) 385 10.8.1 内置函数的自适应 385 10.8.2 多态VI的缺点 385 10.8.3 创建自适应VI 386 10.8.4 扩充自适应VI数据类型范围 387 10.8.5 限制自适应VI数据类型范围 388 10.9 利用通道在循环之间交换数据 388 10.9.1 创建通道 389 10.9.2 串流的基本概念与分类 389 10.9.3 串流的基本用法 390 10.9.4 Tag 392 10.9.5 消息器 392 10.9.6 事件消息器 394 10.10 小结 396 第11章 人机交互与编程风格 397 11.1 对话框 397 11.1.1 内置对话框 397 11.1.2 用户输入和显示对话框 398 11.1.3 定制对话框 399 11.2 菜单 399 11.2.1 创建静态菜单 399 11.2.2 菜单相关函数 400 11.2.3 动态创建菜单 402 11.2.4 调用多个静态菜单,存储运行时菜单 403 11.2.5 自动触发预定义的菜单项 404 11.2.6 控件的快捷菜单 404 11.3 光标工具 405 11.3.1 “设置为忙碌状态”VI与“取消设置忙碌状态”VI 406 11.3.2 设置控件光标 406 11.3.3 使用光标文件 406 11.4 选项卡、子面板与分隔栏 407 11.4.1 选项卡控件 407 11.4.2 选项卡控件的页面 407 11.4.3 页面的公用控件 408 11.4.4 分隔栏控件 408 11.4.5 分隔栏与窗格滚动条 409 11.4.6 利用分隔栏创建工具栏与状态栏 409 11.4.7 利用分隔栏自动缩放控件 410 11.4.8 子面板控件 410 11.4.9 动态调用VI插入子面板 411 11.4.10 异步调用VI插入子面板 412 11.4.11 并行的静态调用VI插入子面板 412 11.4.12 在多个子面板插入相同VI 413 11.4.13 判断VI是否插入子面板 413 11.4.14 子面板的属性 414 11.5 XControl 414 11.5.1 Hover按钮 415 11.5.2 新建XControl 415 11.5.3 修改数据控件和状态控件 415 11.5.4 “外观”VI 416 11.5.5 创建属性和方法 418 11.5.6 调试XControl 419 11.5.7 自定义属性对话框与快捷菜单 420 11.6 错误处理 421 11.6.1 错误簇 421 11.6.2 常用错误处理函数 422 11.7 LabVIEW的编程风格 423 11.7.1 编程风格的内涵 423 11.7.2 前面板设计应该遵循的原则 424 11.7.3 程序框图设计应该遵循的原则 426 11.7.4 连线板设计应该遵循的原则 427 11.7.5 图标设计应该遵循的原则 427 11.7.6 数据结构应该遵循的原则 428 11.7.7 错误处理应该遵循的原则 429 11.8 小结 429 第3部分 工程应用篇 第12章 LabVIEW设计模式与状态图工具 432 12.1 程序的基本单元VI 432 12.1.1 VI的可重入属性 432 12.1.2 不可重入VI 432 12.1.3 可重入VI 433 12.2 VI模板与代码重用 434 12.2.1 内置的VI模板 434 12.2.2 用户自定义模板 434 12.3 VI的调试 435 12.3.1 连续运行VI 435 12.3.2 高亮执行 436 12.3.3 单步运行 436 12.3.4 探针 436 12.3.5 自定义探针 437 12.3.6 断点 437 12.4 VI的重构 438 12.4.1 无用编程举例 438 12.4.2 查找框图中重复的功能 439 12.4.3 创建VI代替重复的功能 440 12.4.4 创建多态VI处理相似的功能 440 12.5 LabVIEW标准设计模式 441 12.5.1 用户界面事件处理器设计模式 441 12.5.2 生产者/消费者设计模式(事件) 442 12.5.3 生产者/消费者设计模式(数据) 443 12.5.4 主/从设计模式 443 12.6 用户界面事件处理器模式的拓展 444 12.6.1 用户界面事件处理器+顺序结构设计模式 444 12.6.2 用户界面事件处理器+用户事件 444 12.6.3 用户界面事件处理器+超时分频 445 12.6.4 用户界面事件处理器+定时循环 446 12.7 队列消息处理器(QMH)设计模式 446 12.7.1 基本队列消息处理器模式(字符串数组) 446 12.7.2 基本队列消息处理器模式(字符串) 447 12.7.3 基于生产者/消费者设计模式(队列)的队列消息处理器 447 12.7.4 AMC队列消息处理器 448 12.7.5 基于队列消息处理器的命令模式 450 12.8 有限状态机设计模式 451 12.8.1 标准状态机设计模式 452 12.8.2 早期界面处理状态机 452 12.8.3 顺序状态机 453 12.8.4 处理公共状态 454 12.8.5 状态机+用户界面事件处理器 454 12.8.6 进入、运行和离开状态的处理 455 12.8.7 有限状态机+LVOOP 455 12.9 状态图工具 458 12.9.1 调用状态图工具 458 12.9.2 使用状态图编辑器 458 12.9.3 添加转换条件和状态代码 458 12.9.4 选择独立运行或者子VI方式 459 12.10 队列消息状态机 460 12.10.1 通用队列消息状态机自定义模板 460 12.10.2 消息+数据队列状态机 461 12.10.3 事件驱动队列消息状态机 462 12.11 JKI事件驱动队列消息状态机 462 12.11.1 JKI状态机模板 463 12.11.2 JKI状态机的初始化 463 12.11.3 JKI状态机的预定义事件 464 12.11.4 JKI状态机的退出 465 12.12 简单状态机项目模板 465 12.12.1 简单状态机项目模板的基本构成 465 12.12.2 简单状态机 466 12.12.3 简单状态机范例(有限次测量) 466 12.13 队列消息处理器项目模板 468 12.13.1 队列消息处理器项目模板的基本构成 468 12.13.2 队列消息处理器 468 12.13.3 队列消息处理器的退出机制 469 12.13.4 队列消息处理器的错误处理机制 470 12.13.5 队列消息处理器的拓展 470 12.14 Delacor队列消息处理器 472 12.14.1 DQMH项目模板的基本构成 472 12.14.2 DQMH模块的基本构成与对外接口 473 12.14.3 DQMH模块测试器 474 12.14.4 DQMH模块 476 12.14.5 使用DQMH模块 476 12.15 操作执行者框架 478 12.15.1 操作者框架概述 479 12.15.2 创建操作者和消息 479 12.15.3 启动、停止操作者,发送消息至操作者 481 12.15.4 创建操作者界面 482 12.15.5 操作者的定时功能 483 12.15.6 嵌套操作者 484 12.15.7 嵌套操作者的动态启动与停止 485 12.16 操作者框架项目模板 486 12.16.1 闪屏引导VI 486 12.16.2 操作者框架根操作者 487 12.16.3 Alpha嵌套操作者 488 12.16.4 Beta嵌套操作者 489 12.17 状态图工具包(Statechart) 490 12.17.1 状态图工具包简介 490 12.17.2 同步与异步方式 490 12.17.3 创建状态图 491 12.17.4 同步型状态图 492 12.17.5 状态图的调用和调试 495 12.17.6 异步型状态图 496 12.17.7 区域、超级状态和子状态 497 12.17.8 多区域并发、连接、分叉与子图 499 12.17.9 高级应用函数 501 12.18 小结 503 第13章 LabVIEW通信与DSC 504 13.1 串口通信 504 13.1.1 串口通信的基本概念 504 13.1.2 串口通信的准备工作 505 13.1.3 串口通信函数 507 13.1.4 串口通信典型应用举例 508 13.2 并口通信 510 13.2.1 设置并口通信模式 510 13.2.2 传送字节型数据 510 13.2.3 传送EPP模式数据 511 13.3 共享变量 512 13.3.1 共享变量与共享变量引擎 512 13.3.2 创建与监视共享变量 513 13.3.3 共享变量的内部缓冲机制 515 13.3.4 共享变量的批量创建、部署与引用 516 13.4 DataSocket 518 13.4.1 DataSocket支持的协议与URL 518 13.4.2 DataSocket服务器与服务管理器 519 13.4.3 DataSocket API 520 13.4.4 DataSocket API应用举例 521 13.4.5 DataSocket控件绑定 522 13.5 TCP与UDP网络通信 523 13.5.1 TCP通信 523 13.5.2 TCP STM库 524 13.5.3 UDP通信 525 13.6 网络流 526 13.6.1 在应用程序之间传递命令或者数据 526 13.6.2 网络流基本函数 527 13.6.3 创建网络流URL 527 13.6.4 网络流应用举例 528 13.7 DSC工具包 529 13.7.1 OPC与DSC的基本概念 529 13.7.2 DSC强大的图形显示能力 531 13.7.3 OPC配置与I/O变量 531 13.7.4 Modbus 534 13.7.5 共享变量的属性 536 13.7.6 共享变量引擎SVE函数 537 13.7.7 预警与事件 539 13.7.8 数据记录 542 13.7.9 安全与权限管理 546 13.8 小结 548 第14章 数据库与报表工具包 549 14.1 准备使用数据库连接工具包 549 14.1.1 创建数据库 549 14.1.2 建立数据源 550 14.1.3 数据库工具包支持的数据类型 551 14.1.4 ADO模型 552 14.2 数据库基本操作 552 14.2.1 建立连接 552 14.2.2 表操作 554 14.2.3 插入数据 555 14.2.4 读取数据 556 14.2.5 记录集与数据浏览 558 14.2.6 事务与提交 561 14.2.7 使用命令对象和SQL语句 562 14.3 报表与报表工具包 563 14.3.1 LabVIEW中的报表VI 563 14.3.2 VI说明信息与HTML报表 565 14.3.3 报表布局与高级报表VI 566 14.3.4 利用Word和Excel模板创建报表 567 14.4 利用报表工具包操作Excel 568 14.4.1 常用的简单Excel VI 568 14.4.2 单元格格式 570 14.4.3 图表与图片VI 571 14.4.4 Excel通用VI和高级VI 572 14.5 利用报表工具包操作Word 574 14.5.1 Word简单VI 574 14.5.2 Word通用VI 575 14.5.3 Word表格与图表VI 576 14.6 小结 577 第15章 LabVIEW与实时操作系统 578 15.1 实时操作系统 578 15.1.1 实时操作系统的特点与实现 578 15.1.2 操作系统的有关名词解释 579 15.1.3 LabVIEW中的实时开发软件 580 15.1.4 LabVIEW支持的实时操作系统 581 15.1.5 LabVIEW实时平台概述 581 15.2 实时控制器软件的安装及配置 583 15.2.1 配置实时系统BIOS(PXI) 583 15.2.2 在MAX下安装PXI实时软件 584 15.2.3 识别远程设备 584 15.2.4 建立实时项目 585 15.3 实时应用软件高级编程及技巧 586 15.3.1 在实时操作系统下LabVIEW不支持的特性 587 15.3.2 实时操作系统下的多线程 587 15.3.3 实时系统中时间确定性的实现 590 15.3.4 实时系统中的线程间通信 594 15.3.5 实时控制系统的网络通信 597 15.3.6 实时控制系统的软件架构 604 15.4 小结 607 第16章 LabVIEW实现数据采集 608 16.1 数据采集的基本概念 608 16.1.1 信号 608 16.1.2 传感器 609 16.1.3 信号处理 610 16.2 数据采集卡 612 16.2.1 数据采集卡的定义及分类 612 16.2.2 多功能数据采集卡原理图 613 16.2.3 数据采集的关键参数和概念 613 16.2.4 数据采集卡与信号接地 618 16.3 采样定理 620 16.4 降低系统噪声和提高精度 622 16.5 如何选购采集卡 624 16.6 数据采集软件基础 625 16.6.1 采集系统的安装 625 16.6.2 NI采集卡的常用函数 628 16.6.3 研华常用采集函数 632 16.7 基于NI-DAQmx的高级编程 633 16.7.1 触发信号 633 16.7.2 采集系统时钟 635 16.7.3 多板卡之间的同步采集 638 16.7.4 数据传输机制 640 16.7.5 完整波形输出 643 16.7.6 并行结构采集 644 16.7.7 通过硬件信号触发定时循环运行 645 16.7.8 使用NI-DAQmx的事件编写事件驱动程序 646 16.7.9 选择合适的读取策略 647 16.7.10 使用NI-DAQmx控制任务安全终止采集 649 16.7.11 计数器/定时器及其应用 650 16.8 小结 654 第17章 FPGA开发 655 17.1 FPGA的基本概念与CRIO的组成 655 17.1.1 FPGA的基本概念 655 17.1.2 CRIO的构成 656 17.1.3 构建FPGA项目 657 17.2 FPGA编程 658 17.2.1 FPGA基本I/O之模拟量输入/输出 658 17.2.2 FPGA基本I/O之数字量输入/输出 659 17.2.3 FPAG定时、时钟与分频 661 17.2.4 FPGA计数器应用 662 17.2.5 触发与外部时钟循环 665 17.2.6 FPGA常用函数 666 17.2.7 FPGA多线程与线程之间的数据交换 668 17.2.8 FPGA IP Core 672 17.3 FPGA与RT程序之间的数据交换 672 17.3.1 读写控件方式 672 17.3.2 中断 673 17.3.3 FIFO 675 17.3.4 扫描方式 677 17.3.5 专用C模块 681 17.3.6 FPGA程序的优化 683 17.4 Spartan-3E开发板 685 17.4.1 Spartan-3E开发板简介 685 17.4.2 建立Spartan-3E FPGA项目 686 17.4.3 编译FPGA程序 687 17.5 小结 688