对于LabVIEW中用于定时的两个最常用的vi就是Wait (ms).vi 以及 Wait Until Next ms Multiple,本文将用实际例子来讲述这两个vi的区别。不想看后面的详细讨论的可以只看下面几个结论即可:
- 如果想实现定周期While循环时,需要用Wait(ms).vi而不是Wait Until Next ms Multiple.vi
- Wait(ms).vi在与代码并行时可以保证整个运行时间为设定值,这个功能一般都会以为是Wait Until Next ms Multiple.vi的特性
- Wait Until Next ms Multiple.vi 并非想象中那么好用,它会造成不少的问题,至少第一次的运行时间无法保证为设定值。
- 在代码执行时间没超过设定值时,两者可以通过编程实现大致相同的功能,但是当代码执行时间很大时,两者的处理方法是截然不同的。
一.Wait (ms)
对于Wait (ms) 这个vi来说需要分两部分来讨论,即它是被顺序地放入代码中还是并行地放入代码中,这两种方式的不同将导致它起的作用完全不同。
(1)顺序模式
看一下附带程序中的Wait Sequence Demo 1.vi ,在一个While循环中,首先用Time Delay.vi延时0.05s,然后顺序地使用Wait (ms).vi,设为20ms。
最后运行后的结果如下图,循环的周期在70ms左右。
从结果中可以得知,在顺序模式中,Wait (ms).vi是实打实地延时了所设定的时间,如果其他顺序中的代码耗了时间后,那整个循环的时间就是代码时间+延时的时间。即使在此例中将Time Delay换成一些其他消耗一定时间的code后结果也是一样。
(2)并行模式
当在并行模式时,在不是跑Real-Time时,Wait (ms)这个vi竟然是能保证整个循环周期是所设定的值,我们看下面的例子(Wait Parallel Demo 1.vi),程序如下:
循环中有n多Wait(ms).vi,运行后的结果是循环周期是20ms,因此可以初步得出结论,对于Wait(ms).vi与其他代码并行时,它会保证整个部分的运行时间是所设定的值(millisecondes to wait)。
如果还不很确定的话可以看下面一个例子(Wait Parallel Demo 2.vi):整个程序的循环中有一个Code.vi这样一个小vi,它的作用就是运行一堆代码从而占据一段时间(可调)。Results中有两条曲线,白线表示的是代码的运行时间,红线表示的是整个循环的运行时间。
运行后,我们将Loop Num设小一点,比如5,以保证代码的执行时间小于20ms,得到下面的结果曲线,可以看到,当代码时间不大于设定时间值时,整个循环周期保证为设定值。
我们再将Loop Num增大,使代码执行时间大于20ms,从而得到下面的结果曲线,即循环周期跟着代码的时间走了。
那么我们大致知道了Wait(ms).vi在并行时的特性了,那么在下面的框图中可以很明显地推断出循环周期是50ms。
1/2 1 2 下一页 尾页 |