Labview .Net 事件

Labview .Net events


我有一个与 LabVIEW 一起使用的 .Net 4 control /.dll。

控件公开以下事件:

    public delegate void CommNewDataEventHandler(UInt16 u16StageGroup, UInt32 u32Status , string [] strNewDataTitle, float[] fNewData, string[] strNewDataUnit);
    public event CommNewDataEventHandler CommNewDataEvent;

我想做的是在 LabView 中订阅此事件,并使用 float[] fNewData 中指定的值更新数字指示器。 这样做的正确方法是什么?

current VI callback VI

没有 "correct" 方法可以做到这一点,但您可以将代码放在回调 VI 中以将数据传递到您需要的地方。

例如,您可以将控件引用作为用户参数传递(这是寄存器节点上的终端和 FP 上的控件),然后使用 Variant to Data 将其转换回引用(编辑 -如果在将数据连接到节点后创建 VI,则不需要转换)并使用值 属性。这很不优雅,但它会起作用。

一个更优雅的解决方案是将您的数据类型的用户事件传递给回调 VI(例如,作为用户参数),然后使用您获得的数据生成该事件。这比较麻烦,但隐蔽性较低。

像这样(忽略漏掉的那条横线,我截图的时候肯定是闪了一下,但确实有):

如果 imgur 把它拿下来,你可以在这里找到图片:https://forums.ni.com/ni/attachments/ni/130/16266/1/event%20callback%20example.PNG

正如之前的发帖人所建议的,没有 "correct" 方法可以做到这一点。根据项目的范围,您可以采用多种不同的方法。对于一般的 .NET 事件注册和处理过程,NI 在这里有一个很好的例子:https://decibel.ni.com/content/docs/DOC-9161

此示例代码是 "timer handler"(使用本机 .NET 计时器 API),说明了如何注册事件和创建回调 VI。让我们修改它以实现您的目标。为此,我们必须以某种方式通过我们的回调 VI 与程序的另一部分进行通信(包含我们要更新的数字指标)。在我们的应用程序的不同部分之间建立通信的选项:

  • 全局变量
  • 函数全局变量
  • Control/indicator 引用
  • 结构化同步机制(即队列、通知器等)
  • 消息系统(即通过本地环回的 UDP、托管队列等)

有很多很多选项,这肯定不是一个详尽的列表。每种方法都有优点和缺点,您的决定应基于您正在编写的应用程序类型。请注意,有些风格比其他风格更好。我的偏好(在编写相当简单的应用程序时)是使用通知程序之类的东西来进行单点数据更新。我的意见是,这提供了大量 flexibility/power,而且你不会因为风格点数而被淘汰。

以下是 NI 示例程序的修改版本,它使用通知程序将数据从回调 VI 传递到顶层 VI。当事件触发时,回调将一些数据推送到通知器,以向顶层 VI 发出信号,表明经过的时间已过且事件已发生。顶层VI等待通知并使用提供的数据更新数值指示器的值。

请注意,这是一个非常简单的示例。在这种情况下,我什至不必发回任何数据。我知道,如果通知程序没有超时,则事件已触发,并且随后可以在顶层增加我的计数器。但是,通知程序允许您灵活地在通信管道中填充任意数据。因此,它可以告诉我 "hey! your condition occurred!" 和 "here's some data that was generated".


回调VI


顶级VI


如果您正在编写更大的应用程序,监视通知程序的循环可以 运行 与其他代码并行。这样做允许您使用异步机制来监视事件的状态并将其显示在 GUI 上。这种方法允许您在不干扰应用程序其余部分的情况下监视事件。