Twincat AddDeviceNotification Parameter (ADS + C#)

S7trainee

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

ich habe aktuell ein Problem bei dem Ereignisgesteuerten Lesen von Variablen.
Ich möchte aus einer Twincat 3 SPS Laufzeit zwei String Variablen auslesen:

PLCvariablen.JPG

Das ganze soll mit der ADS API in einer C# Form geschehen. Ich verwende dazu das Beispiel https://infosys.beckhoff.com/index....incat.ads.sample03.htm&id=7282308696436119411

Nun zu meinem Problem:

Ich finde leider keine gute Dokumentation zu dem Parametern von "AddDeviceNotification".

Was genau muss bei offset und Length eingetragen werden?

Wenn ich bei beiden Handlern den Wert 20 bei offset und den Wert 11 bei Length eintrage funktioniert es wunderbar:

Length11.JPG


Allerdings möchte ich längere Strings aus der Steuerung an das C# Programm übertragen. Scheinbar sind aber hier keine längeren Strings erlaubt, da bei Einträgen >=12 keine Antwort zurück kommt:

Length12.JPG


Hat jemand genauere Infos, wie genau diese Parameter festgelegt werden müssen? Oder welche maximale Länge an zu übertragenden Strings zulässig ist?

Vielen Dank im Voraus ;)
 
Hallo S7trainee,

du musst darüber hinaus auch die Größe des verwendeten AdsStreams anpassen (Zeile 273 in der Forms1.cs):
Code:
dataStream [COLOR=#b4b4b4]=[/COLOR] [COLOR=#569cd6]new[/COLOR] [COLOR=#4ec9b0]AdsStream[/COLOR]([COLOR=#b5cea8]31[/COLOR]);

und die Länge die in dem Event aus dem Stream gelesen wird (Zeile 328 in der Forms1.cs):
Code:
strValue [COLOR=#b4b4b4]=[/COLOR] [COLOR=#569cd6]new[/COLOR] [COLOR=#4ec9b0]String[/COLOR](binRead[COLOR=#b4b4b4].[/COLOR]ReadChars(11));

Bitte mal testen ob es das war...

Grüße
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo S7trainee,

noch ein kurzer Nachtrtag:

Ich persönlich finde es angenehmer die "AddDeviceNotificationEx" Routine zu verwenden, da muss man sich nicht mit dem AdsStream rum schlagen:


Code:
notifyhdl = tcClient.AddDeviceNotificationEx("MAIN.stringVal", AdsTransMode.OnChange, 100, 0, null, typeof(string),new int[]{26});    // die 26 hier im Beispiel ist die Länge des Strings in der SPS + 1 (in der SPS ist eine Variable mit STRING(25) angelegt) 

// es muss dann auch ein anderer Eventhandler registriert werden:
tcClient.AdsNotificationEx += new AdsNotificationExEventHandler(tcClient_AdsNotificationEx);


// in dem kann dann ganz einfach auf die Daten zugegriffen werden die über die Notification reingekommen sind:
void tcClient_AdsNotificationEx(object sender, AdsNotificationExEventArgs e)
{
    if (e.NotificationHandle == notifyhdl)
    {
        textBox1.Text =(string)e.Value;
    }
}

Grüße
 
Hallo S7trainee,

du musst darüber hinaus auch die Größe des verwendeten AdsStreams anpassen (Zeile 273 in der Forms1.cs):
Code:
dataStream [COLOR=#b4b4b4]=[/COLOR] [COLOR=#569cd6]new[/COLOR] [COLOR=#4ec9b0]AdsStream[/COLOR]([COLOR=#b5cea8]31[/COLOR]);

und die Länge die in dem Event aus dem Stream gelesen wird (Zeile 328 in der Forms1.cs):
Code:
strValue [COLOR=#b4b4b4]=[/COLOR] [COLOR=#569cd6]new[/COLOR] [COLOR=#4ec9b0]String[/COLOR](binRead[COLOR=#b4b4b4].[/COLOR]ReadChars(11));

Bitte mal testen ob es das war...

Grüße

Die untere Änderung hatte ich bereits vorgenommen. Leider hatte ich auch mit der Anpassung der AdsStream(31) keinen Erfolg.

Daher habe ich deine zweite Antwort mit dem AdsnotificationEX angesehen. Zusammen mit dem Sample07 von der Beckhoff Seite (https://infosys.beckhoff.com/englis...incat.ads.sample07.htm&id=2681397708872234605) kann ich jetzt Strings beliebiger Länge lesen.

Vielen Dank an KSC :D:D
 
Hallo S7trainee,

der Grund warum das mit der "AddDeviceNotification" bei dir nicht funktioniert, ist wahrscheinlich, dass du bei dem anlegen der Notification noch die falschen Werte für Offset und Länge übergibst (laut Sreenshoot):

Wenn du in der SPS 2 Variablen wie bei dir im Screenshoot wie folgt anlegst:
Code:
VAR  
   String1   : STRING(15);
   String2   : STRING(15);

Dann müsstes du einen Stream wie folgt definieren:

Code:
dataStream [COLOR=#b4b4b4]=[/COLOR] [COLOR=#569cd6]new[/COLOR] [COLOR=#4ec9b0]AdsStream[/COLOR]([COLOR=#b5cea8]32[/COLOR]);  // 2x (stringlänge in der SPS(15) + 1)

Beim Anlegen der Notification müsste das dann eigentlich so aussehen:
Code:
hConnect[0] = tcClient.AddDeviceNotification("MAIN.String1",dataStream,0,16, AdsTransMode.OnChange,100,0,tbString1);
hConnect[1] = tcClient.AddDeviceNotification("MAIN.String2",dataStream,16,16, AdsTransMode.OnChange,100,0,tbString2);

In dem Eventhandler:
Code:
strValue1 [COLOR=#b4b4b4]=[/COLOR] [COLOR=#569cd6]new[/COLOR] [COLOR=#4ec9b0]String[/COLOR](binRead[COLOR=#b4b4b4].[/COLOR]ReadChars(16));
strValue2 [COLOR=#b4b4b4]=[/COLOR] [COLOR=#569cd6]new[/COLOR] [COLOR=#4ec9b0]String[/COLOR](binRead[COLOR=#b4b4b4].[/COLOR]ReadChars(16));

Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo S7trainee,

der Grund warum das mit der "AddDeviceNotification" bei dir nicht funktioniert, ist wahrscheinlich, dass du bei dem anlegen der Notification noch die falschen Werte für Offset und Länge übergibst (laut Sreenshoot):

Wenn du in der SPS 2 Variablen wie bei dir im Screenshoot wie folgt anlegst:
Code:
VAR  
   String1   : STRING(15);
   String2   : STRING(15);

Dann müsstes du einen Stream wie folgt definieren:

Code:
dataStream [COLOR=#b4b4b4]=[/COLOR] [COLOR=#569cd6]new[/COLOR] [COLOR=#4ec9b0]AdsStream[/COLOR]([COLOR=#b5cea8]32[/COLOR]);  // 2x (stringlänge in der SPS(15) + 1)

Beim Anlegen der Notification müsste das dann eigentlich so aussehen:
Code:
hConnect[0] = tcClient.AddDeviceNotification("MAIN.String1",dataStream,0,16, AdsTransMode.OnChange,100,0,tbString1);
hConnect[1] = tcClient.AddDeviceNotification("MAIN.String2",dataStream,16,16, AdsTransMode.OnChange,100,0,tbString2);

In dem Eventhandler:
Code:
strValue1 [COLOR=#b4b4b4]=[/COLOR] [COLOR=#569cd6]new[/COLOR] [COLOR=#4ec9b0]String[/COLOR](binRead[COLOR=#b4b4b4].[/COLOR]ReadChars(16));
strValue2 [COLOR=#b4b4b4]=[/COLOR] [COLOR=#569cd6]new[/COLOR] [COLOR=#4ec9b0]String[/COLOR](binRead[COLOR=#b4b4b4].[/COLOR]ReadChars(16));

Grüße


Hi KSC,

vielen Dank. So konnte ich es reproduzieren. Funktioniert :) Die ADS Streamlänge hat von Anfang an nicht gepasst. Dadurch konnte ich bei den Offsets "rumspielen" wie ich will, hat aber zu keiner Lösung geführt. Allerdings ist die AddDeviceNotificationEx tatsächlich einfacher ;)

Eine Frage hätte ich noch zu C#:

Mit Sample 08 kann man den Status der SPS auslesen/ändern. Ist es möglich aus der C# Umgebung die PLC-Runtime neuzustarten?

Aktuell schicke ich per ADS ein Bit an die Steuerung und starte die PLC über den Function_Block_TC_Restart. Dies möchte ich umgehen, da dies ein lauffähiges PLC Programm auf der Runtime voraussetzt und ich die Runtime unabhängig neustarten möchte.

Grüße
 
Zuletzt bearbeitet:
Hallo S7trainee,

was genau möchtest du tun? Möchtest du die gesammte TwinCAT-Runtime zwischen Run-Mode und Config-Mode umschalten, oder nur die SPS starten und stoppen?

Grüße
 
Hi Ksc,

ich habe mich vertrauensvoll an den Beckhoff Service gewand. Ich ändere den Twincat Status über einen connect auf Port 10000 und dem Code:

TcState.AdsState = AdsState.Reset;
TcClient.WriteControl(TcState);

Läuft soweit ganz gut :)
 
Zurück
Oben