sNetId automatisch aus der SPS auslesen (Beckhoff / fbSdoWrite)

Taha_Almatt

Level-2
Beiträge
16
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

wir arbeiten in unserer Firma mit einem Standardprojekt für Anlagen.
Dabei ist es erforderlich, dass bei der Inbetriebnahme bestimmte CoE-Variablen auf den EtherCAT-Karten immer auf definierte, identische Werte gesetzt werden.

Diesen Prozess möchten wir automatisieren und setzen dafür (gemäß Beckhoff-Dokumentation) den Baustein FB_EcCoESdoWrite ein.

Ein vereinfachter Code-Ausschnitt sieht wie folgt aus:


_____________________________________________________________________________________________________________________

fbSdoWrite_Filter_Activate(
sNetId := sNetId,
nSlaveAddr := nSlaveAddr_Filter_Activate,
nIndex := nIndex_Filter_Activate,
nSubIndex := nSubIndex_Filter_Activate,
pSrcBuf := ADR(bValue_Filter_Activate),
cbBufLen := SIZEOF(bValue_Filter_Activate),
bExecute := NOT StartUpMerker
);

IF NOT fbSdoWrite_Filter_Activate.bBusy THEN
IF NOT fbSdoWrite_Filter_Activate.bError THEN
// Write erfolgreich
bError_Filter_Activate := FALSE;
nErrId_Filter_Activate := 0;
ELSE
// Write fehlgeschlagen
bError_Filter_Acticate := fbSdoWrite_Filter_Activate.bError;
nErrId_Filter_Acticate := fbSdoWrite_Filter_Activate.nErrId;
END_IF

fbSdoWrite_Filter_Activate(bExecute := FALSE);
END_IF
_____________________________________________________________________________________________________________________

Das Problem ist aktuell die sNetId:
Diese muss manuell vorgegeben werden und ändert sich natürlich von SPS zu SPS.

Meine Frage:
Gibt es eine Möglichkeit, die NetId der eigenen SPS automatisch im Code auszulesen und in einer Variablen zu speichern, sodass sie nicht projektspezifisch gepflegt werden muss?

Vielen Dank im Voraus für eure Unterstützung.
 
Zuletzt bearbeitet:
Ah, das ist ja einfach.

Dann werde ich die sNetId einfach leer lassen ('') und das bei der nächsten Anlage testen.

Vielen Dank für die schnelle Antowrt
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ah, das ist ja einfach.

Dann werde ich die sNetId einfach leer lassen ('') und das bei der nächsten Anlage testen.

Vielen Dank für die schnelle Antowrt
Habe mir Deinen Beitrag nochmals durchgelesen. Ich habe im Infosys den Befehl den Du nutzt nicht gefunden. Soweit der Befehl die AMS NetId der SPS braucht kannst Du einen Leerstring übergeben. Wird die AMS NetId des EtherCAT Masters benötigt brauchst Du aber auch keine Klimmzüge über irgendwelche FBs machen, das geht viel einfacher.
Aktiviere bei den erweiterten Einstellungen des Masters die Infodaten und bei diesen die Option "Ads NetId einfügen".
1765794639435.png
Danach wird die AMS NetId im E/A-Knoten beim Master hinzugefügt und Du kannst in Deinem Programm eine Variable mit %I* deklarieren und diese dann mit diesem Eingang verknüpfen. Die Variable übergibst Du dann dem FB der die AMS NetId benötigt, fertig.
1765794727263.png
Nachtrag: Die Slave Adressen kannst Du übrigens auf ähnliche Weise ermitteln, die heißt im E/A-Knotern Port.
 
Dabei ist es erforderlich, dass bei der Inbetriebnahme bestimmte CoE-Variablen auf den EtherCAT-Karten immer auf definierte, identische Werte gesetzt werden.
Habt ihr schon mal überlegt, diese Werte in den Startup-Reiter der jeweiligen Karte einzutragen?
1765795415207.png
Das wäre die richtige Vorgehensweise und braucht kein extra SPS-Programm.
 
Habe mir Deinen Beitrag nochmals durchgelesen. Ich habe im Infosys den Befehl den Du nutzt nicht gefunden. Soweit der Befehl die AMS NetId der SPS braucht kannst Du einen Leerstring übergeben. Wird die AMS NetId des EtherCAT Masters benötigt brauchst Du aber auch keine Klimmzüge über irgendwelche FBs machen, das geht viel einfacher.
Aktiviere bei den erweiterten Einstellungen des Masters die Infodaten und bei diesen die Option "Ads NetId einfügen".
Anhang anzeigen 93090
Danach wird die AMS NetId im E/A-Knoten beim Master hinzugefügt und Du kannst in Deinem Programm eine Variable mit %I* deklarieren und diese dann mit diesem Eingang verknüpfen. Die Variable übergibst Du dann dem FB der die AMS NetId benötigt, fertig.
Anhang anzeigen 93091
Nachtrag: Die Slave Adressen kannst Du übrigens auf ähnliche Weise ermitteln, die heißt im E/A-Knotern Port.


Das wäre natürlich die optimale Lösung.
Vielen Dank für deine Unterstützung und die Geduld.

Ich habe das Ganze an meinem Testaufbau ausprobiert. Dabei ist mir aufgefallen, dass der Baustein FB_GetLocalAmsNetId eine andere NetId liefert als die, die unter InfoData angezeigt wird.

Ist es möglich, dass hier eine Konfigurationseinstellung nicht korrekt ist?

In den CX Settings wird folgende NetId angezeigt:

1765795296282.png

Unter der EtherCAT-Karte, an der ich die CoE-Einstellungen ändern möchte, ist hingegen folgende NetId eingetragen:
1765795321392.png

Über einen Hinweis, worauf sich die unterschiedlichen NetIds beziehen bzw. wo der Unterschied herkommt, würde ich mich freuen.

1765795345322.png

1765795359984.png

Vielen Dank im Voraus.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habt ihr schon mal überlegt, diese Werte in den Startup-Reiter der jeweiligen Karte einzutragen?
Anhang anzeigen 93096
Das wäre die richtige Vorgehensweise und braucht kein extra SPS-Programm.
Die Antworten werden immer besser 🙂
Vielen Dank für den Hinweis.

Den Startup-Reiter hatten wir bisher noch nicht berücksichtigt. Das klingt nach einer sauberen und deutlich einfacheren Lösung für unseren Anwendungsfall. Ich werde das bei uns prüfen und testen.


Danke nochmals für den Input.
 
Habt ihr schon mal überlegt, diese Werte in den Startup-Reiter der jeweiligen Karte einzutragen?
Anhang anzeigen 93096
Das wäre die richtige Vorgehensweise und braucht kein extra SPS-Programm.
Ich habe das als Test nachgebaut und im Startup-Reiter des Slaves folgende Werte eingetragen:
  • Index 8000:11 = 10
  • Index 8010:11 = 20

1765798150972.png1765798161259.png

Anschließend habe ich das Projekt geladen und die SPS aus- und wieder eingeschchaltet, die CoE-Werte online geprüft. Leider wurden die Werte nicht gesetzt.
1765798221490.png


Gibt es dabei noch etwas zu beachten?
Wann genau werden die Einträge aus dem Startup-Reiter an den Slave übertragen
 
Anschließend habe ich das Projekt geladen und die SPS aus- und wieder eingeschchaltet, die CoE-Werte online geprüft. Leider wurden die Werte nicht gese
Gibt es dabei noch etwas zu beachten?
Wann genau werden die Einträge aus dem Startup-Reiter an den Slave übertragen
Die Daten werden beim Hochlaufen des EtherCAT übertragen. Wann dies genau erfolgt legst Du über die Einstellung bei "Transition" fest. In Deinem Fall werden die Werte beim Übergang von PreOp zu SafeOp gesetzt.
Um welche Klemme handelt es sich denn?
In welchen Zustand ist der Master und die Slaves? Sind alle im Zustand OP?
 
Aktiviere mal die Konfiguration ohne SPS-Programm. Dann starte das System leer neu. Die SPS-Runtime hat mit dem Startup nichts zu tun.
Hm, aber wenn er es leer neu startet ist doch keine Variable mit einem I/O-Verknüpft und der EtherCAT läuft nicht komplett hoch, wobei ich leider mal wieder nicht weiß, bis wohin er dann hoch läuft, und dann werden die Werte aus dem Startup auch eventuell nicht gesetzt.
Nachtrag: Wenn ich das richtig sehe, kann man hier einstellen bis zu welchem Zustand der EtherCAT hoch läuft, wenn keine Sync Task vorhanden ist.
1765802955790.png
Soweit dies die Standardeinstellung ist und beim OP keine Sync Task vorhanden ist, weil keine Variable mit einem I/O verknüpft ist, würden bei seinen derzeitigen Einstellungen die Werte aus dem Startup nicht gesetzt werden, weil diese erst beim Übergang von PreOp nach SafeOp gesetzt werden. Wenn der OP bei "Transition" die Auswahl auf "I->P" sollten die Werte auch ohne Sync Task gesetzt werden. Die Einstellung verwende ich meistens.
 
Zuletzt bearbeitet:
Hm, aber wenn er es leer neu startet ist doch keine Variable mit einem I/O-Verknüpft und der EtherCAT läuft nicht komplett hoch, wobei ich leider mal wieder nicht weiß, bis wohin er dann hoch läuft, und dann werden die Werte aus dem Startup auch eventuell nicht gesetzt.

Ich hatte mich wohl etwas missverständlich ausgedrückt. Ich meinte dass das SPS Boot-Projekt nicht aktiviert sein soll, um auszuschließen, dass irgendein SPS-Teil da was in die Parameter schreibt.

Das erreicht man hier beim aktivieren der Konfiguration, indem man den Haken entfernt:
1765802619770.png
Oder hier: indem man den Haken bei Autostart entfernt
1765802831897.png
Dann das System neu in Run starten. Die EthertCAT-Teilnehmer gehen dann in den Safe-OP und die Parameter werden geschrieben.
1765803039652.png
 

Anhänge

  • 1765802913130.png
    1765802913130.png
    9,4 KB · Aufrufe: 0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich will mal reingrätschen zur Originalfrage

Die NetID auslesen ist per Baustein einfach (s.o.) Das ist aber immer die Heim-Adresse = x.x.x.x.1.1
Die NetID der EtherCAT-Master (es können je mehr als einen geben) bekommt man damit aber NICHT.
Man muss ja irgendwie zwischen EtherCAT-Master1, 2 oder 3 unterscheiden.

Es gibt es die Möglichkeit über die IO-Funktions die "Geräte im EA-Baum" über ihre dortigen Nummern abzufragen (nach deren Typ) und wenn der Typ EtherCAT ist dann kann man in einen zweiten Schritt die AmsNetID auslesen.
Wenn von Interesse schiebe ich gerne die Details bzw. konkreten Bausteine hinterher aber aus dem Gedächtnis weiss ich es auch nicht.
 
Ich will mal reingrätschen zur Originalfrage

Die NetID auslesen ist per Baustein einfach (s.o.) Das ist aber immer die Heim-Adresse = x.x.x.x.1.1
Die NetID der EtherCAT-Master (es können je mehr als einen geben) bekommt man damit aber NICHT.
Man muss ja irgendwie zwischen EtherCAT-Master1, 2 oder 3 unterscheiden.

Es gibt es die Möglichkeit über die IO-Funktions die "Geräte im EA-Baum" über ihre dortigen Nummern abzufragen (nach deren Typ) und wenn der Typ EtherCAT ist dann kann man in einen zweiten Schritt die AmsNetID auslesen.
Wenn von Interesse schiebe ich gerne die Details bzw. konkreten Bausteine hinterher aber aus dem Gedächtnis weiss ich es auch nicht.

Man kann die NetId jedes EtherCAT-Masters direkt im IO-Baum am EtherCAT-Master verknüpfen.

1765815178018.png
 
Zuletzt bearbeitet:
Kurzes Feedback von meiner Seite:

Nach einem Online Reset des EtherCAT-Masters wurden die Werte korrekt gesetzt.
Ein reines Aus- und Einschalten der SPS reicht in diesem Fall tatsächlich nicht aus, da der EtherCAT-Bus dabei nicht neu initialisiert wird und somit kein PreOp → SafeOp Übergang stattfindet.

Vielen Dank an alle für die Unterstützung und die hilfreichen Hinweise.

1765868514865.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe mir das Thema noch einmal genauer angesehen und muss mein vorheriges Feedback korrigieren.


Ein reines Aus- und Einschalten der SPS bewirkt tatsächlich, dass der EtherCAT-Master in den Zustand INIT wechselt. In diesem Zustand ist weder Mailbox- noch Prozessdatenkommunikation möglich, weshalb dieser Übergang auch nicht bei den Transitionen auftaucht.

1765888522125.png


Die Mailbox-Kommunikation ist erst beim Übergang INIT → PREOP (I -> P) verfügbar. Dieser Übergang kann somit auch durch ein Aus- und Wiedereinschalten der SPS ausgelöst werden.

Standardmäßig sind die Startup-Einträge jedoch auf die Transition PREOP → SAFEOP (P->S) eingestellt. Dieser Zustandswechsel erfolgt nur, wenn folgende Bedingungen erfüllt sind:

  1. Eine gültige EtherCAT-Konfiguration ist vorhanden
  2. Die PLC-Runtime läuft
  3. Es werden Prozessdaten benötigt (z. B. mindestens eine verknüpfte I/O-Variable)

In meinem Testaufbau war Punkt 3 nicht erfüllt, da keine I/O-Variable verknüpft war.
Dadurch fand der Wechsel nach SAFEOP nicht statt und die Parameter wurden folglich nicht gesetzt.


Vielleicht hilft diese Erkenntnis auch anderen weiter.

Quelle:

1765889116913.png

Vielen Dank an oliver.tonn und asci25 für die vielen hilfreichen Hinweise sowie die neuen Begriffe und Denkanstöße.
 
Zurück
Oben