.NET Events in LabVIEW verfügbar machen

Es ist möglich, mit einem Callback-VI in LabVIEW auf Ereignisse in einer .NET Assembly zu reagieren. Ich zeige hier, wie man mit C# Events programmiert, die in LabVIEW sichtbar sind.

Zunächst ein Blick darauf, was erreicht werden soll anhand der Klasse System.Timers.Timer. Diese Klasse stellt das Event „Elapsed“ bereit, dass bei wiederholt beim Ablauf der vorgegebenen Zeit stattfindet. Mit der Funktion „Ereignis-Callback registrieren“ (engl. „Register Event Callback“) wird LabVIEW das Ereignis bekannt gemacht und ein VI festgelegt, dass aufgerufen wird, wenn die .NET Assembly das Ereignis auslöst. Dieses VI wird Callback-VI genannt.

Registrierung des .NET Ereignisses Elapsed der Klasse System.Timers.Timer in LabVIEW.

In diesem Artikel geht es darum, wie die Assembly in C# programmiert sein muss, damit LabVIEW ein registrierbares Ereignis wie „Elapsed“ sieht.
UserControls, die in LabVIEW über den .NET Frontpanel Container eingebunden werden, stellen ihre Events selbst bereit, so dass man die hier beschriebene Programmierung nicht benötigt.

Jeder, der sich ein wenig mit C# beschäftigt hat, weiß, dass .NET beim Auftreten eines Ereignisses die definierte Event-Handler-Methode aufruft. Diese kann man als „public“ deklarieren und sie von LabVIEW aus aufrufen. Für eine Ereignisregistrierung taugt die Event-Handler-Methode aber nicht.

Als Beispiel wird eine Class Library erstellt. Es soll ein Ereignis ausgelöst werden, wenn sich die Netzwerkkonfiguration ändert. LabVIEW soll daraufhin ein VI ausführen – eben das Callback-VI.

Um das Event in LabVIEW registieren zu können, muss ein sogenannter Delegate angelegt werden. Er muss „public“ deklariert sein.

public delegate void MyDelegate(object sender, EventArgs e);

Dann wird ein „event“ vom zuvor definierten Typ „MyDelegate“ erstellt.

public event MyEventHandler myNetworkChanged;

In LabVIEW wird das Event „myNetworkChanged“ sichtbar sein. myNetworkChanged wird innerhalb der Assembly durch einen einfachen Aufruf ausgelöst, der zunächst prüft, ob ein Callback zugewiesen wurde.

if(myNetworkChanged != null) myNetworkChanged(this, e);

Der Aufruf des benutzerdefinierten Events kann in normalen Eventhandlern Stattfinden, wie hier zum Beispiel der EventHandler AddressChangedCallback zum Ereignis NetworkChange.NetworkAddressChanged.

public void AddressChangedCallback(object sender, EventArgs e)
 {
      if (myNetworkChanged != null) myNetworkChanged(this, e);
  }

Ereignisregistierung des Ereignisses myNetworkChanged der selbstprogrammierten Klasse NetworkEventWatcher.

Der gesamte Code ist sehr übersichtlich:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.NetworkInformation;

namespace NetworkEventWatcher
{
    public class NetworkEventWatcher
    {
        // Definieren des Delegate mit Parametern
        public delegate void MyEventHandler(object sender, EventArgs e);
        // Definieren des Event-Delegate
        public event MyEventHandler myNetworkChanged;

        public NetworkEventWatcher()    // Konstruktor
        {
            // Definieren des Eventhandlers für dsa NetworkAddressChanged-Ereignis
            NetworkChange.NetworkAddressChanged += new
            NetworkAddressChangedEventHandler(AddressChangedCallback);
        }

        public void AddressChangedCallback(object sender, EventArgs e)
        {
            // Aufruf des Event-Delegate, wenn der Delegate nicht leer ist
            if (myNetworkChanged != null) myNetworkChanged(this, e);
        }     
    }
}

2 Gedanken zu „.NET Events in LabVIEW verfügbar machen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.