Überwachen ob EtherCAT-BUS läuft

twincatter

Level-2
Beiträge
139
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo miteinander,

wir hatten neulich an einer Anlage daß Problem dass der EtherCAT-Bus nicht gelaufen ist.
Abziehen und wieder anstecken der Netzwerkleitung hat den Fehler behoben.

Wie handhabt Ihr so einen Fall?
Prüft die SPS ob der Bus läuft? Wenn ja, wie kann eine Überprüfung realisiert werden?

Vielen Dank und allen einen schönen Tag
 
Hallo twincatter,

Wie handhabt Ihr so einen Fall?

Es kommt auf die Applikation drauf an, wir unterscheiden entsprechend, ob ein Ausfall des EtherCAT-Bus eine Gefährdung darstellen könnte oder dies in Kauf genommen werden kann und das System nach einem Ausfall mittels Restart unproblematisch zurückgesetzt werden kann. Wobei man allerdings sagen kann, dass ein Busausfall eher selten der Fall ist (und man in diesem Fall die Ursache analysieren sollte).

Prüft die SPS ob der Bus läuft? Wenn ja, wie kann eine Überprüfung realisiert werden?
Es kommt drauf an welches System du nutzt. Falls du das native CODESYS nutzt, gibt es hier ein schönes Beispiel (CAA Device Diagnosis Example) im CODESYS Store. Die beinhaltete Bibliothek ermöglicht dir Starten/Stoppen/Rücksetzen/Aktivieren/Deaktivieren der EtherCAT-Geräte aus dem Quellcode heraus. Mit ein bisschen eigenständiger Anpassung und ein Blick in die weiteren Funktionen der Bibliothek lässt sich hieraus ebenfalls für jeden individuell ein EtherCAT-Monitoring erstellen ;-)

Falls du nicht auf das native CODESYS, sondern auf andere Entwicklungsumgebungen, die den IEC-Editor verwenden, angewiesen bist (z.B. Movisuite, e! COCKPIT, Twincat, etc.), kommt es darauf an, ob die oben genannte Bibliothek unterstützt wird oder ob sie für die Diagnose eigene Bibliotheken zur Verfügung stellen.

Gruß

Biiebs
 
Überprüfen vom FrmXWcState reicht eigentlich für alles aus. Man findet raus ob alles läuft und wo ein Fehler ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo wenn du ein pures CODESYS verwendest findest du direkt einige Status Infos and den Device-Instanzen um zu überprüfen in welchem Zustand deine Teilnehmer sind dies kannst du direkt in deiner Applikation abfragen. (>device<.Wstate)
und das Verhalten des Masters kannst du bereits in der Konfiguration angeben. (Checkbox Automatically Restart slaves)
oder auch in der Applikation mit >Master<.xRestart

1678270932298.png
 
Hallo miteinander,

vielen Dank für die schnellen und ausführlichen Antworten.
Wir verwenden TwinCAT 3, hätte ich dazuschreiben sollen, tut mir leid.

Grüße vom Bodensee, Michael
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wir benutzen im Twincat den FB_EcGetConfSlaves und diagnostizieren dann alle EC Slaves damit (in ST_EcSlaveConfigData: nLinkStatus).
Ich weiß nicht ob es so einen FB auch in CODESYS gibt.
Geht aber auch auf einem anderen Weg.
Man kann bei der Konfiguration die entsprechenden Infodaten aktivieren und den dann im E/A-Knoten erscheinenden Eingang mit einer Variablen verknüpfen und braucht keinen extra Baustein.
 
Geht aber auch auf einem anderen Weg.
Man kann bei der Konfiguration die entsprechenden Infodaten aktivieren und den dann im E/A-Knoten erscheinenden Eingang mit einer Variablen verknüpfen und braucht keinen extra Baustein.
Ja. Was ich halt an der Lösung mit dem Baustein gut finde, dass man in einem neuen Projekt (oder wenn in einem bestehenden neue HW dazukommt) nichts manuell machen muss. Der Baustein ließt zur Laufzeit die HW-Infos und wertet sie aus.

Sowas ähnliches haben wir auch bei Siemens für Profinet. Ein Baustein der zur Laufzeit bei allen Slaves den Status abfragt und Diagnosebits (Sammelfehler...) zurückgibt.
 
Code:
timerUpdate(IN := NOT timerUpdate.Q);

IF xHMI_GlobalError_reset THEN
xGlobalError := FALSE;
END_IF

IF timerUpdate.Q THEN
    
    // 1. Zuerst gehen wir davon aus, dass alles okay ist
    xGlobalError := FALSE;

    FOR i := 0 TO (EtherCAT_Master.NumberActiveSlaves - 1) DO
        itfNode := EtherCAT_Master.GetChild(i);
        
        IF itfNode <> 0 THEN
            IF __QUERYINTERFACE(itfNode, itfChildDevice) THEN
                
                // Status auslesen
                arrSlaveStates[i] := ANY_TO_UINT(itfChildDevice.GetDeviceState());
                
                // 2. Prüfung: Wenn der Status NICHT 2 (Running) ist
                IF arrSlaveStates[i] <> 2 THEN
                    xGlobalError := TRUE; // Fehler-Bit setzen
                END_IF
                
            END_IF
        END_IF
    END_FOR
END_IF

Ich glaube das ist dann zu Kompliziert ?
 
Zurück
Oben