Beckhoff ADS.Net DLL und C#

Majestic_1987

Level-1
Beiträge
270
Reaktionspunkte
22
Zuviel Werbung?
-> Hier kostenlos registrieren
Also, ich habe eine Frage zur Beckhoff ADS.Net DLL.

Ich möchte ereignisgesteuert Lesen. Dazu verbinde ich mich mit der SPS und erzeuge dann mit AddDeviceNotification eine Notification auf die Variable.

Diese ruft dann bei Änderung eine OnNotification-Methode auf.

Darin gibt es einen Parameter vom Typ AdsNotificationEventArgs mit Namen e.

Diesem wurde von der AddDeviceNotification ein Objekt übergeben, welches die Daten der Variable enthalten können soll.

Ich möchte jetzt, dass ich das mehr oder weniger universell verwenden kann.
Momentan caste ich das Ding passend:

Code:
((RadioButton)e.UserData).Checked = binRead.ReadBoolean();
ABER wie kann ich dafür sorgen, dass, egal welches Objekt ich übergebe, das richtige damit getan wird? Denn nur mit

Code:
e.UserData = binRead.ReadBoolean();
kann ich nix tun, dann meckert der Compiler:

Einer Eigenschaft oder einem Indexer
"TwinCAT.Ads.AdsNotificationEventArgs.UserData" kann nichts zugewiesen werden -- sie sind schreibgeschützt.

Wie kann ich C# dazu bringen, das Objekt korrekt zu behandeln?
Ich kann ja schlecht für jeden Typ, den es haben kann, eine eigene Behandlungsvorschrift programmieren...zumal mir ganz lieb wäre, der AddDeviceNotification-Methode ein Objekt vom Typ Bool zu übergeben und dann so zu casten:

Code:
(bool)e.UserData = binRead.ReadBoolean();
was aber zu einem neuen Fehler führt:

Die linke Seite einer Zuweisung muss eine Variable, eine Eigenschaft oder ein Indexer sein.

Vielleicht kann mir jemand hier weiterhelfen. Danke schonmal im Voraus.
 
Übergebe doch einfach einen Delegate. Dann rufst du einfache den Delegate auf. Variabler kannst du das (glaube ich) nicht machen, denn darin kannst du alles umsetzten.

Warum willst du überhaupt nachträglich das Objekt UserData nochmal ändern? Du möchstest doch einen Wert übergeben, den du später verwenden kannst. Im Event, welches auf die Notification reagiert, kannst du die UserData nicht nocheinmal wieder verändern.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Jo, auf den Gedanken bin ich, nachdem ich mit C# nun etwas weiter gekommen bin, auch schon gekommen.

Ich übergebe also einfach ein Delegate als Object und in der On-Notification-Methode löse ich das Delegate auf?
 
Code:
// Callback auslesen
AdsNotifyCallback callback = (AdsNotifyCallback) e.UserData;

// Kein Callback gefunden
if (callback == null)
{
    throw new AdsException();
}

// Ausführen des Callbacks in einem extra Thread
ThreadPool.QueueUserWorkItem(
    delegate
    {
        callback(sender, new AdsNotifyEventArgs(data /* Daten halt */));
    });

So löse ich das meist.
Denke daran, dass du so schnell wie möglich die Funktion, die das Notification-Event fängt, beendest. Die Funktionen blockiert nämlich den AdsRouter.
 
Inwiefern korrespondiert das mit meinem AddDeviceNotification?

Ergänzung: In meiner .Net-Dokumentation finde ich keinen Typ "AdsNotifyCallback"
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Die AdsNotifyCallback ist der Delegate, der im AddNotification als UserData übergeben wird. Den kannst du ja nach deinen Vorstellungen erstellen.

Den Code den ich im Beitrag vorher dargestellt habe, ist in der Funktion nötig, die auf das Event gelegt wird.
 
Übergebe doch einfach einen Delegate. Dann rufst du einfache den Delegate auf. Variabler kannst du das (glaube ich) nicht machen, denn darin kannst du alles umsetzten.

Warum willst du überhaupt nachträglich das Objekt UserData nochmal ändern? Du möchstest doch einen Wert übergeben, den du später verwenden kannst. Im Event, welches auf die Notification reagiert, kannst du die UserData nicht nocheinmal wieder verändern.

Ich schreibe mir eine Klasse, mit welcher ich Objekte vom Typ "SPS-Variable" erstellen kann. Im Konstruktor bau ich die Verbindung auf. So spare ich mir pro Variable viel Code. Allerdings müsste ich meiner Klasse eine Funktion nennen, welche bei Änderung der Variable aufgerufen werden soll. Diese muss natürlich je nach Variable anders sein, damit ich z.b. bei Variable 1 deren Wert in eine Textbox schreibe, bei Variable 2 deren Wert nutze, um eine Check-Box zu checken, etc.
 
Zurück
Oben