引言
LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是虚拟仪器概念的首创者,是世界上最优秀的虚拟仪器软件开发平台。它使用图形化数据流编程语言,这种新兴的编程方式给编程人员带来了新的困难,主要体现于对数据流的控制上。
本文剖析了LabVIEW数据流语言的特点,提供了其若干有效控制方法,指出LabVIEW本身即可解决数据流控制上的变量冲突、响应时序控制、初始状态自适应调整等问题并保证其通用性,而不必求助于其它代码语言(如C语言),这样,既减轻了程序的复杂性,提高了效率,还丰富了LabVIEW的应用。文中以单选功能按钮设计实例详述了变量冲突、响应时序控制、初始状态自适应调整等问题的具体解决方案,在某型装备测试系统的实际运行中验证了该方法可行有效。
1 数据流编程的特点
数据流语言的每个节点在执行之前需要提供其所有输入端口的有效数据,LabVIEW允许用户在一个图表上拥有任意数量的不同节点,所有的节点可以并行执行。LabVIEW环境还支持多个VI并行执行,而不管 *** 作系统或者计算机的功能如何。这些功能使得用户无须做任何特殊编程工作就可以非常自由地同步执行各种不同的任务。
LabVIEW数据流编程克服了文本语言编程内存管理中的许多困难。在LabVIEW中,不必给变量分配内存,也不必为变量赋值或者从变量取值,只需创建一个带有描述数据转换关系的内部联系的框图程序。产生数据的函数可以精心地为数据分配内存,当数据不再使用时,相应的内存被释放。当向数组或字符串添加新数据时,管理新数据的足够内存资源会自动进行分配,这种自动的内存分配 *** 作是LabVIEW的主要优势之一。
2 数据流编程的难点及若干解决方案
LabVIEW程序的内存管理是自动进行的,中间状态的捕捉和控制十分困难。例如,实时显示现场采集数据串的最大值问题、通过按钮手动控制现场采集数据串某一时刻数据作为比较对象的问题以及单选功能按钮的实现问题等等,似简实难。经编程实践,总结方案如下:
(1)结构控制
循环结构,如For循环和while循环结构;顺序(Sequence)结构,适当使用Sequence结构能提高程序可读性,让数据清晰流动;分支结构(case Structure);事件结构(Event Structure),允许用户在前面板的直接干预或程序不同部分之间的交流影响程序的执行;定时循环(TImed Loop)结构,可创建多采样率(mulTI-rate)的、对时间要求严格(TIme-criTIcal)的数据采集应用程序,并定义不同优先级的循环。
(2)移位寄存器(Shift Register)控制
移位寄存器与While或For循环结合能够保存各种状态信息,未初始化的移位寄存器则保留着以前的内容。
(3)变量控制
变量在这里指局部变量和全局变量。局部变量用来在一个VI程序内部传递数据,它不仅可以解决连线的困难,而且可以对同一个控件多次写入和读出数据。全局变量则可用于在不同程序之间传递数据,全局变量也是用一个控件的形式存放数据,但是这个控件独立于调用它的VI,以一个特殊的VI作为自己的容器。
(4)通告(Notifier)和队列(Queue)控制
通告和队列的方式有时可代替变量方式来传递数据。使用通告方式传递数据时,只有写入数据并告知后才能读取数据。通告以广播的方式发布,收到广播的用户都可以去读数据。队列方式传递数据是最先去读数据的用户读完数据就将它擦掉,只有一个接收数据的用户。
单一使用上述某种方案往往力不从心,综合灵活运用才能在编程中产生较好的效果。
3 实例分析
单选功能按钮的设计是许多综合测试系统设计中的一部分。它要求完成的功能是:
⑴ 某一个按钮按下去时,其余按钮全部处于无效的工作状态。
⑵ 按下去的按钮要求能无误地启动系统的该项功能。
设计中需要解决以下问题:
⑴ 变量冲突。程序包含按钮间的相互控制,其控件及局部变量间的冲突问题十分突出;
⑵ 响应时序控制。按钮 *** 作和读按钮状态的先后次序需进行适应控制,否则容易产生空档(按钮按下却不启动系统的功能)和几个按钮同时被按下等异常情况,导致程序紊乱;
⑶ 初始状态自适应调整问题。
用LabVIEW设计流程图及流程图示说明如下所示:
BUTTON ARRAY :按钮合在一起的数组;
SEARCH 1D ARRAY:比较两数组的不同,返回不同元素的序号;
INDEX ARRAY(INDEX,ELEM):数组ARRAY, INDEX是序号,ELEM是元素。此函数是找出数组ARRAY中序号为INDEX的元素;
NULL:空 *** 作;
DIFFERENCES:差异信息;
D.B.:Digital buttons数字化按钮,即用编号表示不同按钮。
总流程为将框图1所示流程循环两次!再进行框图2所示流程,具体步骤详述如下:
针对问题⑴,程序遵循“对 *** 作的按钮不 *** 作”的原则。如框图1,用SEARCH 1D ARRAY分辨出被 *** 作的按钮,对其它按钮置“假”。这样,按钮间就可不发生冲突。
框图1
框图2
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)