ADS C# AddDeviceNotification Parameter

J_Kapkan

Level-1
Beiträge
30
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute

Ich habe da mal wieder ne vielleicht auch ne dumme frage.

Aber ich frag trotzdem :)


Also ich versuche grade mich mit AddDeviceNotification zu beschäftigen, und das was ich nicht verstehen kann ist folgendes.


Ich mache erst ein Handle zu der Variable Lampe

WZ_Lampe = adsClient.CreateVariableHandle(".Lampe");

und dann möchte ich das wenn sich die Variable ändert das es gemeldet wird also so >>>
hConnect[0] = tcClient.AddDeviceNotification(".Lampe", dataStream, 0, 1,AdsTransMode.OnChange, 100, 0, tbBool);
tcClient.AdsNotification += new AdsNotificationEventHandler(OnNotification);

und das was ich hier nicht verstehen kann wozu die Variable tbBool (rot markiert) wenn es sowieso alles zu den EventHandler gesendet wird und da der Value zu einer textBox oder auch immer zugewiesen wird. also so>>>

private void OnNotification(object sender, AdsNotificationEventArgs e)
{
e.DataStream.Position = e.Offset;
string strValue = "";

if (e.NotificationHandle == hConnect[0])
strValue = binRead.ReadBoolean().ToString();

Oder geht das alle viel einfacher ich verstehe auch nicht wenn ich schon ein Handle zu der Variable habe warum muss ich mit tcClient.AddDeviceNotification die variable als string übergeben??

Ich hoffe ihr habt mich verstehen können.

Danke

Mit freundlichen Grusen
J
 
Dein Handle WZ_Lampe brauchst du nicht. Das wird ja auch in dem Beckhoff-Beispiel das du hier genommen hast nicht erzeugt.

Die Variable tbBool ist keine Variable sondern ein TextBox Control (die Deklaration steht ja auch im Beckhoff Beispiel ganz oben im OnLoad Event des Forms).
tbBool wird beim Erstellen der Notification als Userdata Object übergeben damit dort gleich beim feuern des OnNotification Events der Wert der überwachten Variable (MAIN.boolVal im Beispiel, .Lampe bei dir) übergeben werden kann.

D.h. du hast eine TextBox mit dem Namen "tbBool" in der der Zustand deiner Variable angezeigt werden soll. Du erstellst eine DeviceNotification für die globale Bool Variable ".Lampe" und merkst dir den dazugehörigen Handle. Dann legst du fest, welche Methode aufgerufen werden soll wenn ".Lampe" einen neuen Wert hat (hier OnNotification). Da mehrere DeviceNotifications den Event auslösen können, musst du prüfen welche der "Zünder" war. Das machst du mit dem gemerkten Handle. Jetzt wird der Wert der Variable aus dem Stream gefischt und in dem temporären String gespeichert.
Wenn du jetzt das Beispiel noch einen Tick weiter liest, siehst du am Ende von OnNotification das UserData-Object in eine TextBox gecastet wird (tbBool). Der Text Eigenschaft von tbBool wird dann der String mit dem Wert deiner Variablen übergeben, der dann im Form angezeigt wird.


Einfach nochmal das ganze Beispiel in ruhe durchgehen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
OK Super

Das habe ich auch fast genau so verstanden den Handle habe ich nur gemacht damit ich auch später über die Variable schreiben bzw lesen kann z.b adsClient.WriteAny(WZ_Lampe, int.Parse(tbDint1.Text));

Und jetzt ne frage zu OnNotification Events, da ich aber den Wert der Variable nur abfragen (zur weiter Verarbeitung) möchte und nicht in die textbox schreiben, Was soll ich dann anstatt tbBool eingeben wenn ich es weglassen dann bekomme ich ne Fehlermeldung.
 
Du kannst in dem Event auch gleich eine Methode aufrufen die irgendetwas mit dem Wert deiner Variable anstellt. Wenn du das UserData Objekt nicht brauchst kannst da ja einfach null übergeben.
Oder du übergibst eine Variable in welcher der Wert zwischengespeichert werden soll (Typecasting nicht vergessen). Du kannst auch Delegaten übergeben oder, oder, oder. UserData ist ein object, da geht also so ziehmlich alles rein (wenn man es denn braucht).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Leute

Da bin ich wieder mit den nächsten Problem.
Ich wollte jetzt die ganze Notification in eine Klasse packen, damit ich überblick behalten kann.
Das Problem ist aber das wenn es in einen Eigene Klasse kommt, dann kann ich nicht mehr auf die Controller in XAML zugreifen, da man auf XAML nur über MainWindows zugreift. Oder wie kann ich das Ereignis von Notification zur MainWindows leiten ohne es immer aufzufordern.
Ich weiß das ist bestimmt einfach aber ich kriegst nicht hin.

Also wenn mal einer Lust und Zeit hat währe es Super wenn ihr mir ein Beispiel zeigen würdet.
 
Zurück
Oben