购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.1 数据流驱动

LabVIEW与传统程序设计语言最主要的不同之处,在于其以“数据流”而不是“控制流”(命令的先后顺序)来决定程序的执行顺序。控制流执行模式由指令驱动程序,数据流执行模式则由数据驱动,又称为数据依赖(Data Dependency)。即需要输入参数的程序框图节点,总是在向它提供参数的程序框图节点执行完毕后才可执行。

在LabVIEW程序中,当数据依赖关系不存在时,不要想当然地认为程序的执行顺序是从左到右,自顶向下的。实际上没有连线的程序框图,其各节点可以按照任意顺序执行。图4-4(a)显示了一个由于数据依赖关系不存在造成数据竞争状态的例子。在程序中,两个加法函数试图并行改变同一个数据资源的值,程序的运行结果取决于变量先执行哪个动作,所以无法确定结果是7,还是3。这种数据的竞争状态经常在使用局部变量、全局变量或外部文件时发生,它会引起程序运行的不可预见性。程序设计中当然不能容忍这种随意性发生,必须确保事件顺序有非常明确的定义,以避免程序失控。在LabVIEW中,可使用连线实现变量的多种运算,从而避免竞争状态。图4-4(b)按照自然的数据依赖关系,通过连线连接各函数,以确保程序按照数据流驱动模式安全运行。

当自然的数据依赖关系不存在时,通常需要通过人工数据依赖(Artificial Data Dependency)设定程序的执行顺序。此时,程序框图并不一定将接收到的数据作为参数使用,而是根据数据是否到达来触发程序框图节点的执行。人工数据依赖可以使用数据流参数(Flow-through Parameters)或顺序结构创建。数据流参数通常为引用句柄或错误簇,它返回与相应的输入参数相同的值。把要执行的前一个节点的输出数据流参数连接到要执行的下一个节点的相应输入,即可创建基于数据流参数的人工数据依赖。如果程序框图节点中没有数据流参数,则必须使用顺序结构来确保数据操作按期望的顺序执行,这一点我们将在4.2节讲解。

图4-4 数据竞争

图4-5(a)的程序框图中,读取二进制文件函数和关闭文件函数没有相连,它们之间不存在数据依赖关系。由于不能确定哪个函数先执行,可能导致预想的文件读取功能无法实现。例如,如果“关闭文件”函数先运行,则“读取二进制文件”函数将不执行。图4-5(b)的程序框图中“读取二进制文件”函数的输出连接到“关闭文件”函数,二者建立了数据依赖关系,“关闭文件”函数只有在接收到“读取二进制文件”函数的输出后才能执行。数据依赖关系确保了文件读取功能的实现。

图4-5 数据依赖

在LabVIEW程序设计中,使用错误簇作为数据流参数创建数据依赖的情况处处可见,图4-6是一个典型的例子。在无明显数据依赖的情况下,错误簇可以用来为程序创建数据依赖关系。错误处理功能是提高程序健壮性的有效手段,优秀的程序设计者会为子VI创建错误处理的能力,因而错误簇就顺理成章地成为驱动程序按照数据流模式运行的选择。一般来说,当VI中出现错误时,VI中代码将不被执行,而错误的状态将通过错误簇继续向下传递。

图4-6 错误簇作为数据流参数

从内存管理角度来看,数据流驱动模式比传统的控制流执行模式更简单。这是因为在LabVIEW中,多数情况下无须通过创建变量和对变量赋值来传递数据,而只需创建带有连线的程序框图,来表示数据的传输即可。LabVIEW具有内存自动管理功能。在生成数据的VI和函数中,LabVIEW会自动为该数据分配内存。当该数据不再被使用时,LabVIEW将释放相关内存。若VI要处理大量的数据,用户应当了解程序如何分配和释放内存。这些内存管理的相关原则,可帮助用户编写使用更少内存的程序,提高程序运行的速度。

由于LabVIEW以数据流来决定程序的执行顺序,因此它与生俱来就有创建并行操作的能力。如图4-7所示,在LabVIEW中可以同时运行两个For循环,以便同时更新前面板上的数据采集和验证结果。数据流驱动模式使得LabVIEW能够很容易地实现多线程和多任务程序结构,而这些结构恰恰是虚拟仪器系统能力突飞猛进的重要因素之一,本书在后续章节详细讲解类似的高级程序开发结构和框架。

图4-7 数据流驱动模式与生俱来就支持并行循环 zmdN4SqJ1Rc/4hOa/R46ErpruweI5Hl03pM9E6ZNeoJiizloenVisM5N3jpe4VxK

点击中间区域
呼出菜单
上一章
目录
下一章
×