原创 LabVIEW关于定时的研究

2007-5-29 00:18 4325 4 5 分类: 测试测量

对于LabVIEW中用于定时的两个最常用的vi就是Wait (ms).vi 以及 Wait Until Next ms Multiple,本文将用实际例子来讲述这两个vi的区别。


不想看后面的详细讨论的可以只看下面几个结论即可:


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


1.如果想实现定周期While循环时,需要用Wait(ms).vi而不是Wait Until Next ms Multiple.vi


2Wait(ms).vi在与代码并行时可以保证整个运行时间为设定值,这个功能一般都会以为是Wait Until Next ms Multiple.vi的特性


3Wait Until Next ms Multiple.vi 并非想象中那么好用,它会造成不少的问题,至少第一次的运行时间无法保证为设定值。


4.在代码执行时间没超过设定值时,两者可以通过编程实现大致相同的功能,但是当代码执行时间很大时,两者的处理方法是截然不同的。


 


一.Wait (ms)


ebf899b5-8f72-41ce-82c1-c7d159754191.JPG


       对于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),程序如下:


 


点击看大图


 


       循环中有nWait(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


 


点击看大图


二.Wait Until Next ms Multiple


be03bcf4-1b54-4bba-b193-34bcf40be70c.JPG


      


       要比较好的解释这个vi,需要知道系统(至少Windows里有)中有一个millisecond timer这样一个计时器,这个vi跟这个计时器有着千丝万缕的关系。


       简单来说,这个vi将一直等到ms timer得到输入值的整数倍才结束,通过下面的example,将会更好的理解(Wait Until Demo 1.vi)。程序中,首先输入50msWait Until,计算第一次Wait Until花的时间,再输入50ms,同样地计算出第二次Wait Until花的时间。


 

点击看大图


 


       运行完程序后,得到大致下面的结果:


248b13bf-2170-4c18-a0af-77799e85a620.JPG


      


        每次运行的结果都不相同,但是可以看到,第一次Wait Until所花的时间总不是50ms,而第二次花的时间肯定是50ms,并且Timer Value两次一般都是50ms的倍数;出现这样的情况是这样来解释:首先,在程序运行的时候,系统的Timer值并不会正好是50的倍数,假设为10450935,那么程序在运行了15msTimer达到1045095050的倍数)从而结束第一个Wait Until;在之后又进入第二个Wait Until,在达到后一个50的倍数(10451000)后完成。


      


       因此,如果将Wait Until并行地放在While循环中时,可能会出现两个问题,首先是它的第一次的周期就是不确定的。如下面的例子(Wait Until Parallel Demo 1.vi):


 


点击看大图


 


       将按钮调在Wait UntilWait,运行程序后,得到下面的对比结果:


 


73125b14-838b-460a-a119-0cbe024b9893.JPG44496c55-35df-4d3a-ad0c-1bd3ba31536b.JPG


 


       可以看到,在用Wait Until时,第一次(即第二个值)都达不到20ms,但用Wait时,第一次就能保证在20ms,这是由于程序刚开始时Timer值不是整数倍导致。


       Wait Until Next ms Multiple.vi的第二个问题见下面的链接,讲得也很清楚了:http://zone.ni.com/devzone/cda/tut/p/id/4120


       最后再看一个例子,当Wait Until放在顺序模式中时,大致可以起到Wait的并行模式的作用,但是在代码时间超过设定值时,两者还是有着很大的区别。


 


点击看大图


 


       当将Loop Num设大后,代码执行时间超过了20ms,此时得到的结果如下图,执行周期达到了40ms,这也证明了一旦代码时间超过设定值后,Wait Until就会一直等到下一个设定值的整数倍才能结束。


 


点击看大图

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户17594 2007-6-6 15:50

NI 工程師推荐的, 果然不錯. Thanks

 

相关推荐阅读
用户72875 2007-07-01 00:30
在LabVIEW下建立弹球模型
    对物理对象进行建模仿真是目前来说非常流行的一种科学研究方法,一般来说,对于这种应用,可以用C语言或者Matlab来实现。作为一种编程语言,LabVIEW其实也能非常方便地实现模型的建立,特别是...
用户72875 2007-05-07 13:51
RunonOpened的VI问题解决
        不久之前遇到这样一个问题,就是有人将某个VI作为Run on Opened的方式进行设置,另外又将其设为了Dialog模式,最终还将程序里的Stop键给覆盖了(即在Front Pane...
用户72875 2007-04-22 15:58
利用Counter来测频率的三种方法比较
        对于有一段信号的频率,我们可以用Counter来测量,利用Counter来进行频率测量的方法主要有三种,即Inverse Period,Averaging以及Divide Down,这...
用户72875 2007-04-01 22:24
关于DAQ连续采集的缓冲处理
        DAQ是虚拟仪器中最具代表性的技术之一,通过PCI、PCI-e、PXI或者PCMCIA、USB等,计算机就可以动态地采集到实际的外界物理信号。        对于使用LabVIEW来进...
用户72875 2007-03-18 20:49
DAQmx内部引脚的连接控制
        不知道大家有没有观察过,在LabVIEW中,NI-DAQmx->Advance->DAQmx Signal Routing里面有两个有趣的VI,一个叫Connect,一个叫...
我要评论
1
4
关闭 站长推荐上一条 /3 下一条