1


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

该控件公开以下事件:

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

我想做的是在 LabView 中订阅此事件并使用float[] fNewData. 这样做的正确方法是什么?

当前 VI 回调 VI

4

2 回答 2

2

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

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

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

像这样(忽略缺少的水平线。我截屏时它一定在闪烁,但它就在那里):

.NET LabVIEW 事件回调示例

如果 imgur 将其删除,您可以在此处找到图像:https ://forums.ni.com/ni/attachments/ni/130/16266/1/event%20callback%20example.PNG

于 2015-07-02T14:03:56.680 回答
1

正如之前的海报所暗示的那样,没有“正确”的方法可以做到这一点。根据项目的范围,您可以采用多种不同的方法。对于一般的 .NET 事件注册和处理过程,NI 有一个很好的例子:https ://decibel.ni.com/content/docs/DOC-9161

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

  • 全局变量
  • 功能性全局变量
  • 控制/指示器参考
  • 结构化同步机制(即队列、通知器等)
  • 消息系统(即通过本地环回、托管队列等的 UDP)

有很多很多的选择,这当然不是一个详尽的列表。每种方法都有优点和缺点,您的决定应该基于您正在编写的应用程序类型。请注意,有些风格比其他风格更好。我的偏好(在编写相当简单的应用程序时)是使用通知器之类的东西来进行单点数据更新。我的观点是,这提供了很好的灵活性/力量,你不会因为风格点而受到打击。

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

请注意,这是一个非常简单的示例。在这种情况下,我什至不必发回任何数据。我知道,如果通知程序没有超时,则事件已触发,并且随后可以在顶层增加我的计数器。但是,通知程序允许您灵活地将任意数据填充到通信管道中。因此,它可以告诉我“嘿!你的情况发生了!” 和“这是生成的一些数据”。


回调六

打回来


顶级 VI

顶层


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

于 2015-07-02T14:35:37.480 回答