传统文本编程语言根据指令的先后顺序决定应用程序执行顺序,也称为:“控制流”;而LabVIEW则按照“数据流”的模式运行VI。所谓数据流也就是说:当所有的输入端都具备了必要的输入数据时,程序框图节点将运行。节点在运行时产生输出数据并将该数据传送给数据流路径中的下一个节点。数据流经节点的动作决定了程序框图上VI和函数的执行顺序。
使用LabVIEW进行编程则必须按数据流的方式进行程序设计。所以,养成良好的数据流编程习惯是非常必要的。那么根据数据流的特点,编程时要注意哪些问题呢?
1、根据自然的数据的依赖关系,从左向右进行程序设计图1数据依赖关系
图1 可以清晰的表明数据流是依据数据依赖关系从左向右流动的。“差”只有在“和”完成后才能得到;以此类推,“积”必须在“差”完成后获得;而“商”也必须在得到“积”后获得。所以,这里是利用数据依赖关系实现数据流的。
图1中的下图比较好的呈现出数据流的关系,所以我们称之为“好的习惯”,建议大家习惯用这种方式来进行程序设计。
我们上面谈到利用数据依赖关系很容易满足数据流的要求(自然的数据依赖关系)。那么,当数据依赖关系不存在或不明显时,怎么办?
2、 利用强制数据依赖关系之一:顺序结构
如果我们想要知道一个vi的运行时间可以通过下面的实例程序进行测试,程序如图3所示。这 里我们利用强制数据依赖关系“顺序结构”来满足数据流的要求。这里待测vi我们用一个“等 待”函数来代替。顺序结构确保:第一帧:开始计时,第二帧:运行“等待”函数或待测vi,第三帧:停止计时并显示结果。
这里要注意两点:
第一:Windows操作系统的定时精度为:1mS。所以,测量结果会出现100±1mS。
第二:如果vi的运行时间很短小于1mS,可在第二帧内的vi外面加个N次的for循环增加运行时间。然后,在结果中再除个N。
现在,我们用“等待下一个整数倍毫秒”(定时选板)函数来替代“等待”函数,运行后会发生什么情况?这应该对理解这两个函数的不同会有所帮助。
3、 利用人工数据依赖关系之二:错误簇
图2中各个函数之间的错误簇连接就实现了利用人工数据依赖关系,与上面连接的任务I/O起的作用是一致的(它们应该成对出现)。有关“错误簇”的机制和数据流的作用,敬请看我的另一篇博客:LabVIEW中的“错误”机制。
4、 利用人工数据依赖关系之三:引用句柄
对于引用句柄LabVIEW的帮助文档是这样介绍的:引用句柄可作为对象(例如,文件、设备或网络连接)的唯一标识。可使用不同类型的引用句柄控件将引用句柄输入或输出VI。
由于引用句柄是一个打开对象的临时指针,因此它仅在对象打开期间有效。如关闭对象,LabVIEW会将引用句柄与对象分开,引用句柄随即失效。如再次打开对象,LabVIEW将创建一个与第一个引用句柄不同的新引用句柄。LabVIEW将为引用句柄指向的对象分配内存空间。关闭引用句柄,该对象就会从内存中释放。
由于LabVIEW可以记住每个引用句柄所指的信息,如读取或写入的对象的当前地址和用户访问情况,因此可以对单一对象执行并行但相互独立的操作。如一个VI多次打开同一个对象,那么每次的打开操作都将返回一个不同的引用句柄。VI结束运行时LabVIEW会自动关闭引用句柄,如果用户在结束使用引用句柄时就立即将其关闭,可最有效地利用内存空间和其它资源,这是一个良好的编程习惯。关闭引用句柄的顺序与打开时相反。例如,如果获得了对象A的一个引用句柄,然后对对象A调用方法使获得对象B的引用句柄,请先关闭对象B的引用句柄然后再关闭对象A的引用句柄。关于引用句柄我们要注意的是:“引用句柄”是有“生命周期“的。从我们打开引用句柄开始,它就进入新的“生命周期”,直道关闭“引用句柄”后它的“生命周期”结束。如果一个引用句柄的生命周期无限长,那么就意味着发生了“内存泄露”。所以使用时必须注意“打开”与“关闭”必须是成双成对出现的。
对于本地变量和全局变量来讲,因无法保证数据按数据流的方式工作,所以要尽量避免大量使用。由于顺序结构是强制数据流也尽量甚用。
上面我们分别介绍了实现或确保数据流编程的几个方法,供大家参考,希望对大家能有一定的帮助。
jizzll_617398179 2008-5-18 23:52
用户394922 2008-5-17 20:51