LabVIEW 關於定時的研究


對於LabVIEW中用於定時的兩個最常用的vi就是Wait (ms).vi 以及 Wait Until Next ms Multiple,本文將用實際例子來講述這兩個vi的區別。不想看后面的詳細討論的可以只看下面幾個結論即可: 

  1. 如果想實現定周期While循環時,需要用Wait(ms).vi而不是Wait Until Next ms Multiple.vi
  2. Wait(ms).vi在與代碼並行時可以保證整個運行時間為設定值,這個功能一般都會以為是Wait Until Next ms Multiple.vi的特性
  3. Wait Until Next ms Multiple.vi 並非想象中那么好用,它會造成不少的問題,至少第一次的運行時間無法保證為設定值。
  4. 在代碼執行時間沒超過設定值時,兩者可以通過編程實現大致相同的功能,但是當代碼執行時間很大時,兩者的處理方法是截然不同的。

一.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。
 

二.Wait Until Next ms Multiple

 
       要比較好的解釋這個vi,需要知道系統(至少Windows里有)中有一個millisecond timer這樣一個計時器,這個vi跟這個計時器有着千絲萬縷的關系。
       簡單來說,這個vi將一直等到ms timer得到輸入值的整數倍才結束,通過下面的example,將會更好的理解(Wait Until Demo 1.vi)。程序中,首先輸入50ms給Wait Until,計算第一次Wait Until花的時間,再輸入50ms,同樣地計算出第二次Wait Until花的時間。
 
       運行完程序后,得到大致下面的結果:
 
        每次運行的結果都不相同,但是可以看到,第一次Wait Until所花的時間總不是50ms,而第二次花的時間肯定是50ms,並且Timer Value兩次一般都是50ms的倍數;出現這樣的情況是這樣來解釋:首先,在程序運行的時候,系統的Timer值並不會正好是50的倍數,假設為10450935,那么程序在運行了15ms后Timer達到10450950(50的倍數)從而結束第一個Wait Until;在之后又進入第二個Wait Until,在達到后一個50的倍數(10451000)后完成。
       因此,如果將Wait Until並行地放在While循環中時,可能會出現兩個問題,首先是它的第一次的周期就是不確定的。如下面的例子(Wait Until Parallel Demo 1.vi):

       將按鈕調在Wait Until和Wait,運行程序后,得到下面的對比結果:
  
  可以看到,在用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就會一直等到下一個設定值的整數倍才能結束。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM