zoukankan      html  css  js  c++  java
  • 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就会一直等到下一个设定值的整数倍才能结束。

     

  • 相关阅读:
    10 个深恶痛绝的 Java 异常。。
    为什么公司宁愿 25K 重新招人,也不给你加到 20K?原因太现实……
    推荐一款代码神器,代码量至少省一半!
    Spring Cloud Greenwich 正式发布,Hystrix 即将寿终正寝。。
    hdu 3853 LOOPS(概率 dp 期望)
    hdu 5245 Joyful(期望的计算,好题)
    hdu 4336 Card Collector(期望 dp 状态压缩)
    hdu 4405 Aeroplane chess(概率+dp)
    hdu 5036 Explosion(概率期望+bitset)
    hdu 5033 Building (单调栈 或 暴力枚举 )
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13665693.html
Copyright © 2011-2022 走看看