在Wait(ms)内置函数的探讨(1)、(2)中我们谈到了该内置函数的基本功能和数据流的运行机制,并给出了长期定时时的退出方法。其实,我们还有一个问题我们没有讨论到,那就是它的错误机制问题。

      任何编程语言的错误处理机制都与它的健壮性有关,LabVIEW也会不例外。特别是LabVIEW主要使用在测控领域,良好的错误处理机制更是非常必要的。可是我们在等待(ms)内置函数本身上根本看不到任何错误处理的机制,那合理吗?不会出现问题吗?
     
等待(ms)内置函数的工作是基于线程的,它的运行机制是执着的,那么在它执行定时任务时出现错误怎么办?特别是在定时时间很长的状态下,到底是停下来处理错误还是继续执行定时工作?这是值得认真分析探讨的问题。

       我们暂且将问题先放在这里,先看看其它人是如何解决这个问题的。


1、MGI——wait(s).vi

Picture
图3-1 图标
      MGI公司在他的vi库中提供了改进后的Wait(s).vi。左图使是该vi的图标。如果安装了MGIvi库可以在函数选板〉MGI All VIs>MGI Time子选板上可以找到该vi。下图3-2是该vi的程序框图。

Picture
图3-2 Wait(s).vi程序框图
      该vi对Wait(ms)内置函数作了如下改动:以秒为定时单位;添加了一对错误簇端口。
      其实,这些改动对错误处理根本没有任何有效的帮助,附加的错误簇也仅仅是提供了数据流通道,也就是通常所说的“公共线程”,以便于编程中使用。通过下面的例子完全可以证明我们的说法。

Picture
图3-3 错误试验
      在图3-3中,我们使用一个While循环来包装一个定时器,定时时间为10秒钟,并且在该vi的错误输入端人为的为错误簇设定一个错误状态。然后运行该程序,尽管程序开始运行前,就已经有错误存在,可是我们看到程序在运行结果是10秒钟后停下来(定时结束后报错)。这就验证了我们在(2)中所表述的数据流关系。同时认证了我们上面的说法:对错误处理根本没有任何及时地帮助换句话说,该vi对定时前发生的错误会置之不理。显然这不是我们所期待的结果。


2、来自NI网站上的一个例子

      我们在NI的网站上看到了另外一个例子,它似乎解决了这个问题。其实道理很简单,就是使用带错误处理的子vi将Wait(ms)内置函数封装起来。

Picture
图3-4用带错误处理的子vi将Wait(ms)内置函数封装
      显然,使用这个vi不会出现图3-3所示的问题。当前面出现错误时,程序将不会执行定时任务。

      其实,MGI也有一个Wait+(ms).vi同他有异曲同工之处。该vi的程序框图见下图。关于它的工作机理应该是很简单,这里就不详解了,错误处理机制与图3-4相同。

Picture
      能否做到在错误出现时,可以由我们人为的控制选择执行定时功能或不执行定时功能,那岂不是更好吗!
      下面会看到这样的例程。


3、OpenG——wait(ms).vi

Picture
OpenG_Wait(ms).vi_图标
      OpenG在它的vi库中提供了一个Wait(ms).vi可以实现上述的要求,这是一个很好的设计范例。他的程序框图如图3-1所示。

Picture
图3-1 Case=真
Picture
图3-2 Case=假
      这个例子可以实现在出现错误时,人为的事先通过“Wait on Error布尔开关与错误状态组合来控制程序是否继续执行定时操作。
      它的另一个特点就是可以通过”事件发生“同步技术在任何时候终止定时的运行。仔细看看这个程序很有意思,利用“事件结构”处理
”事件发生“同步技术。参见图3-4。

Picture
图3-3 可在定时执行时停止的定时程序框图

      现在我们在本节开头所提的问题已经有了解决方案,可以根据自己的需求来选择使用。关于MGI和OpenG的本站都有专栏作介绍。


尊重别人就是尊重自己
转载请注明出处

Picture
9/23/2012 09:27:11 pm

Nice article bro

Reply



Leave a Reply.


Google Analytics