循环运行某个时间后退出

有时候需要一个循环不是在迭代多少次之后停下,而是在运行多少时间之后停下。一般,直接的解决方案就是利用“时间计数器”函数,进入循环前,记下当前时间,然后每次循环迭代都查看一下当前时间,若超过所需时间,则退出循环。这个功能也可以使用“已用时间”Express VI来完成。

把“已用时间”Express VI拖到程序框图上,会出现它的配置对话框。我们需要这个Express VI计时5秒,每次计时完成自动重置。

在循环里,需要用到的是“已用时间”的“结束”输出,一旦运行时间超过5秒,这个值就会被设为真。这时循环停止。

但是下图程序有个问题,就是“耗时40毫秒”这个完成功能的VI和“已用时间”VI之间没有连线,它们是同时运行的,而“已用时间”运行时间几乎可以忽略,一调用它,它就立刻返回“结束”值。这时,即便“结束”值为“真”,循环也要再等大约40毫秒,待功能完成功能不部分运行结束,循环才停止。

强制程序先工作,再计时间是否可以解决这个问题呢,如下图中的程序。这样也不行,因为“已用时间”是在重置后,第一次调用它的时候开始计时的。下图这个程序,循环第一次迭代,并没有马上就开始计时,而是要等到功能VI完成后,已经耗用的一段时间,才开始计时。这个即时已经不精确了。

所以要完全解决这个问题,只能麻烦一点。程序中多加一个条件语句。在循环一开始,就立刻计时;而在后续的迭代中,每次功能完成再检查当前时间。或者,把“已用时间”放在前面,每次判断是否结束。如果是,则不执行“耗时40毫秒”这个VI。

《我和 LabVIEW》目录

Advertisements

8 thoughts on “循环运行某个时间后退出

  1. Pingback引用通告: 博客版《我和LabVIEW》目录 « 凡人琐忆

  2. “耗时40毫秒”这个VI只是用来演示的,所以也没有加error in/out第一和第三种方案在于第一种方案要多延时一个迭代周期,在这里就是40毫秒。比如一个极端的设置,我们设定0秒后循环停止。正确的行为就应当是“耗时40毫秒”这个VI一次都不执行。第三种方案可以做到,但是第一种就不行,它至少也要运行“耗时40毫秒”VI一次。当然,这几种方案一般都用在定时精度要求不高的应用场合,任务VI被多执行一次问题也不大,为了程序简介,用第一种方案也未尝不可。

  3. 其实感觉第3中办法和第1种办法也没什么区别啊。一样是要等耗时40毫秒的子VI结束了才能结束。比如说设置的已用时间不是耗时的子VI的所用时间的整数倍的话。这两种方法就没什么区别了。反而感觉第一中方法来得干净利落,呵呵。个人见解,请大侠指点

  4. 耗时40ms.vi怎么没有error in and out呢?
    没有错误处理的子VI不符合LV的编程规则,虽然程序没有问题,呵呵。
    把这两个VI的错误簇输入并联到一起,大概就差不多了吧。不过搞不清到底LV会先执行哪个,所谓的 race condition 是吧?
    但是本来,用软件来定时就不精确,虽然ms量级的效果还凑合。

  5. 其实可以直接把时间判定做在序列第一格,然后拉一条线从下面(不透过第二个序列)把结束与否传给循环终止就好.

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google photo

You are commenting using your Google account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s