本文剖析了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
针对问题⑵,则必须充分考虑程序的数据“流”运行过程。分述如下:
① 每次读BUTTON布尔值时,都要考虑外界面是否有对按钮的操作输入,这在框图1、2中都体现得很明显;
② 框图1要循环2次很关键。考虑这样一种情况:外界面对按钮的操作在BUTTON ARRAY(1)与BUTTON ARRAY(2)之间,则在循环的第一次对按钮的操作没有起作用,但它以反馈机制把按钮信息传给了始端,由于程序运行的速度远在人工界面上的手动操作速度之上,所以循环的第二次无外界输入,这样对按钮的操作在循环二次后便响应了,没有挂空。同理,当外界面对按钮的操作介于BUTTON ARRAY(2)与框图2的read BUTTONs之间时,外界面对按钮的操作会在下一循环(对实际测试系统肯定是大范围循环操作的)产生作用,由于程序运行得很快,操作者看到的是“实时”的操作。如果在read BUTTONs之后,那就回到框图1的始端了。因此,任何时候按下按钮,程序皆运行正常。
针对问题⑶,未初始化的移位寄存器能保留原有的状态。在程序运行前,若出现按钮异常现象,由于程序默认一个按钮按下,异常按钮会立即得以纠正。
对于数字化按钮(见流程图框图2)的实现,将按钮状态转化为0、1,用一个连加运算根据其和的大小便可知道是否同时有多按钮或单按钮或无按钮按下,从而将按钮信号引出。
图2 部分LabVIEW程序示例
4 结束语
单选功能按钮的设计是个很典型的数据流控制实例,文中给出的用LabVIEW本身解决变量冲突、响应时序控制、初始状态自适应调整等问题的方法,没有使用事件驱动结构,避免了在测试系统中并行使用事件驱动结构产生的冲突。
1