事件结构无法捕捉由程序修改控件值产生的“值改变”事件

更新 Jul 22, 2022

适用于

软件

  • LabVIEW Full
  • LabVIEW Base
  • LabVIEW Professional

问题详述

在使用事件结构的时候,我在事件分支中响应前面板中的一个显示控件的值改变事件,该显示控件在程序的其他部分动态改变其值。VI运行的时候,可以观察到显示控件值已经被改变了,但是对应事件分支却没有执行。为什么事件结构里没有响应我显示控件的值改变事件呢?

解决方案

事件结构仅仅注册直接与前面板交互生成的事件。在这个问题中,显示控件的值以编程方式更改,因此LabVIEW不会捕获到值改变事件。此外,如果您使用VI服务器,全局变量,局部变量等编程方式更改VI或前面板对象,则不会发生值改变(Value Change)事件。

有一个例外:输入控件和显示控件的事件可以使用属性节点Val(Sgnl)(值(信号))以编程形式生成,如下图所示。此只写属性创建的事件在每次写入时,都会发生像前面板值改变一样的动作。但是,在循环中使用此属性时要注意一下,因为如果在循环的每次迭代中写入该属性,那么不管该值是否实际更改,它都会在每次迭代中生成一个值改变的触发。
它可以通过右键单击控件或显示器,然后导航到创建>>属性节点>>值(信号)来创建。
1.jpg
当数据写入只写属性时,引用的显示器/控件的值会更新,并触发一个事件,就像用户交互更改了前面板值一样。请注意,每次写入数据时都会触发该事件,无论该值是否被相同的值覆盖。当例如在循环中使用此属性,它将为每次迭代生成一个值更改事件,而不管值是否实际更改。
 

相关信息

许多实时目标不支持前面板,因此也不支持值更改事件。详情请参考“相关链接”。
有关使用Val(Sgnl)属性的值改变事件的演示,请参见下图。

这个VI使用“Val(Sgnl)(值(信号))”属性来更新显示控件并产生事件。更新“A*B”显示控件时,事件结构将会注册该事件并使用当前时间更新“Last Updated”显示控件。

相反,请参阅下图,了解使用值属性的值改变事件。


此VI使用值(Value)属性更新显示控件。当“A*B”显示控件更新时,事件结构将不会注册事件,因为没有要注册的事件。

在两个VI中,产品以编程方式写入显示控件“A*B”。两个VI还具有用于捕获“A*B”显示控件的值改变事件的事件结构。只有使用“值(信号)”属性的VI才会在更新“A*B”显示控件时注册事件。