Wie findet man eigentlich einen Fehler mit Core Dump?`

mgl

Level-2
Beiträge
163
Reaktionspunkte
25
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

die Dokumentation für das Auffinden der Fehlerquelle ist mir etwas unklar.

Ich habe das den Core Dump geladen und wie geht es weiter? Kann ich irgendwo die Adressen eingeben um zu schauen wo genau es schief läuft. Breakpoint setzen führt mich nicht zum Ziel. Beim Aufruf der zyklischen Methode ist einfach noch vor der ersten Anweisung Schluss.

1764599134414.png

Schon mal vielen Dank für Eure Hilfe im voraus.

Ich nutze aktuell die 4024.67
 
Mal ohne den Coredump zu laden:

Hast Du versucht mal Online zu gehen, wenn der Fehler da ist? Meist springt der PLC-Editor in die Nähe des Problems und markiert die Zeile / dass Netzwerk gelb. Das ist im Grunde genommen das Gleiche wie den Coredump zu öffnen. Der Coredump ist eher für die Remote- oder Offline-Fehlersuche gedacht.

Eine Variante, wenn Du Breakpoints setzen willst:
1. Deaktiviere das PLC-Projekt auf dem Zielsystem
2. Starte das Zielsystem in Run neu
3. Lade jetzt das PLC Projekt, jetzt ist der Zustand System in Run und PLC in Stopp
4. Setze Deine Breakpoints
5. Starte die PLC, nun kannst Du die Breakpoints ablaufen

Wenn Du es einfach nicht finden kannst: Kommentiere den Quellcode Stück um Stück mit der 1/2-Methode aus und teste Dich durch.

Kleiner Tipp um während des SPS-Ausnahmezustandes nach Code-Änderungen schnell wieder in den Run zu kommen: Erst das PLC-Projekt aktivieren und dann das System neu in den Run starten.
 
Danke für eure Antworten. Ich habe gehofft, dass ich den Fehler mit dem CoreDump direkt finden kann.

Ich bin ja beim debuggen online. Das heißt ich stoppe mit dem Breakpoint den Ablauf und springe dann mit der Taste "F11" (Einzelschritt) in die Zyklische Methode meines FBs und dann ist Schluss. Der gelbe Ausführungs-Pfeil verschwindet und der Task geht in den Ruhestand. Also irgendwo ist was im meinem FB bzw. der Methode. Soweit kann ich es schon eingrenzen.

Ich werde mal versuchen bei den Variablen-Deklarationen den Fehler zu finden und da Schritt für Schritt alles auskommentieren
 
Nullpointer Exeption, du dereferenzierst einen pointer sprich du liest den Wert von einem Pointer der den Wert Null hat und das ist in der Programmierung verboten, der Pointer muss einen Wer größer Null haben
Baue mal eine Abfrage ein die den entsprechenden Teil nur Abarbeitet wenn er größer 0 ist z.B. wie im Link

 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bin ja beim debuggen online. Das heißt ich stoppe mit dem Breakpoint den Ablauf ...

Deine Beschreibung verwirrt mich. Heißt das, wenn Du nicht mit Breakpoints stoppst kommt kein Fehler? Ein Breakpoint sollte überhaupt keine Auswirkung haben. Steuerst Du reale Hardware oder ist das ein reines Software Testprojekt?
 
Der Fehler kommt auch ohne Breakpoints. Den Breakpoint verwende ich nur um näher an den Fehler zu kommen.

Ein Breakpoint sollte überhaupt keine Auswirkung haben.
Bezüglich Breakpoints meine ich, dass Flankenauswertungen mit R_TRIG / F_TRIG nicht so gut funktioniert. Aber das ist ein anderes Thema.

Ich muss die Software auf einer Steuerung laufen lassen, da die Simulation unter 4024.67 nicht funktioniert.

Ich teste normal auf einem PC mit TwinCAT BSD und einer recht aktuellen 4026 Runtime (mit 4024er Projekt) was normal auch funktioniert. Um da aber Fehler auszuschließen habe ich CX5130 mit einer 4024.68 Runtime auf dem Schreibtisch stehen.
 
Der Fehler kommt auch ohne Breakpoints. Den Breakpoint verwende ich nur um näher an den Fehler zu kommen.

Das verstehe ich nicht. Geh mal Online, wenn die Exception gefeuert hat und poste mal einen großzügigen Screenshot vom Codefenster, so dass man auch die gelbe Markierung sieht. Alles andere ist nur Glaskugelleserei.


Ich teste normal auf einem PC mit TwinCAT BSD und einer recht aktuellen 4026 Runtime (mit 4024er Projekt) was normal auch funktioniert. Um da aber Fehler auszuschließen habe ich CX5130 mit einer 4024.68 Runtime auf dem Schreibtisch stehen.
:oops:

Ähh, habe ich das richtig verstanden? Du vermischt TwinCAT 3.2 und 3.1? Das würde ich unterlassen. Und auch bezüglich dem Verhältnis Runtime - Engineering sollte man darauf achten, dass die Versionen identisch sind. Man kann ja im Engineering nicht umsonst mehrere Versionen gleichzeitig haben und dann eine bestimmte Version an das Projekt pinnen.

Nur weil etwas geht, heißt das noch lange nicht, das man es auch machen sollte.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
// FB_GetMessageEventList

fbMessageListener.Execute();

FOR i := 0 TO PARAM_General.MAX_NO_OF_MESSAGES
DO
    stMsgEventInfo := fbMessageListener.stEventByIdx(i_nIndex := i); // Aufruf führt zum Stopp
    GVL_HMI.astMessageList.sTime := stMsgEventInfo.sTimeRaised;
    GVL_HMI.astMessageList.sText := stMsgEventInfo.sEventText;
END_FOR

Code:
// FB_MessageListener
FUNCTION_BLOCK FB_MessageListener EXTENDS FB_ListenerBase2
VAR
    // ..
    _astActiveEvents         : ARRAY[0..Param_General.MAX_NO_OF_MESSAGES] OF ST_MessageEventInfo; // List of active events
    // ..
END_VAR

Param_General.MAX_NO_OF_MESSAGES - Testweise auf 17 gesetzt

Code:
// FB_MessageListener.stEventByIdx - Methode
METHOD PUBLIC stEventByIdx : ST_MessageEventInfo
VAR_INPUT
    i_nIndex    : UINT;
END_VAR

IF i_nIndex >= 0
    AND i_nIndex <= Param_General.MAX_NO_OF_MESSAGES
THEN
    stEventByIdx := _astActiveEvents[i_nIndex];
END_IF
 
Hatte ich nicht geschrieben 1. Online und 2. Screenshot? Codeausschnitte sind nett, aber bei kniffligen Dingen fehlen ein paar Informationen.
Und außerdem bitte zuerst Runtime und Engineering von der gleichen Version verwenden. Der Eventlogger wurde in TC 3.2 noch mal grundsätzlich überarbeitet.

🧐
Ich hätte da mal eine dumme Frage nebenbei: Für mich sieht es so aus, als ob Ihr den den Eventlogger im Einsatz habt. Warum lest ihr die Meldungen wieder in die SPS ein, um die dann in ein globales Array-Feld für das HMI zu speichern? Hat euer HMI sicher keine Eventlogger-Schnittstelle? Das ist ja wie Essen kochen und dann wegschmeißen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hätte da mal eine dumme Frage nebenbei: Für mich sieht es so aus, als ob Ihr den den Eventlogger im Einsatz habt. Warum lest ihr die Meldungen wieder in die SPS ein, um die dann in ein globales Array-Feld für das HMI zu speichern? Hat euer HMI sicher keine Eventlogger-Schnittstelle? Das ist ja wie Essen kochen und dann wegschmeißen.

Ja stimmt genau. Die PLC HMI hat nur eine veraltete VisuElemEventTable welche auch nicht funktioniert. Um die Sprachumschaltung zu verwenden und die Texte im Eventlogger sowieso vorliegen versuche ich die Events auszulesen und in der HMI anzuzeigen.
 
Nochmal: Wenn die Exception fiegt, dann Einloggen und einen Screenshot mit dem gelben Pfeil machen. Kein Einzelschritt oder sonst was. Wir brauchen den Zustand im Moment der Exception. Und Version XAE = Version XAR bitte sicherstellen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Für sowas gibt es einen Adapter von Beckhoff USA

Getestet habe ich den noch nicht, kommt aber noch. Da wir bei Serienmaschinen erstmal das Backend auf 4026 heben wollen.

 
Darf die Schleife evtl. erst bei 1 starten? Alternativ nur bis maxAnzahl-1? Sonst wären es ja insgesamt 1 mehr als maxAnzahl.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Darf die Schleife evtl. erst bei 1 starten? Alternativ nur bis maxAnzahl-1? Sonst wären es ja insgesamt 1 mehr als maxAnzahl.
Nee, schau Dir mal die Deklaration an. Das passt schon.

// FB_MessageListener FUNCTION_BLOCK FB_MessageListener EXTENDS FB_ListenerBase2 VAR // .. _astActiveEvents : ARRAY[0..Param_General.MAX_NO_OF_MESSAGES] OF ST_MessageEventInfo; // List of active events // .. END_VAR
 
Das ist eine Codesys-HMI. Die kann der Mächtigkeit des TwinCAT gar nicht folgen. Die würde ich nicht einsetzen.

Man brauch nicht immer eine mächtige HMI. Man hat aber auch nicht immer die Wahl.

Nun zurück zum Problem. Ich habe jetzt sowohl XAE als auch XAR auf 4024.71:
Beim Einloggen springt das Online-Fenster auf den FB_MessageListener.stEventByIdx ohne gelben Pfeil

1764666413256.png

Mir ist aufgefallen, dass ich beim Erstellen Warnmeldungen bekomme, dass in der Methode stEventByIdx der FB_Exit aufgerufen wird. Aber warum?


1764666726852.png
 
Wie es aussieht, wird das erste Element [0] abgearbeitet um beim Element [1] von _astActiveEvents knallt es. Der fehlende gelbe Pfeil irritiert mich. Die SPS ist aber im Ausnahmezustand - richtig? Sonst hätte i_nIndex ja einen anderen Wert.

Gibt es rein zufällig noch ein weiteres lokal deklariertes Arrayfeld _astActiveEvents? Rechtsklick->Gehe zu Definition. Wird da
Code:
_astActiveEvents         : ARRAY[0..Param_General.MAX_NO_OF_MESSAGES] OF ST_MessageEventInfo;
angezeigt, oder sind die Grenzen da anders?

Die Kompilerwarnungen sind in der Tat etwas eigenartig. Vielleicht schleppt ihr eine veraltete Library mit rum?

Noch ein Tipp:

Füge mal den CheckBounds hinzu.

1764669245969.png
1764669271436.png
Läuft jetzt die PLC durch? Wenn ja, dann kannst Du mal zwei Breapoints in der Zeile 4 und 6 setzen. Wenn die SPS dann stehen bleibt, kannst Du mit dem Rücksprung zur Ursache gehen. Ähnlich funktionieren auch die anderen POU's für imlizite Prüfungen. Du musst die Bausteine nicht aufrufen, das wird vom TwinCAT automatisch gemacht. Aber lass die Bausteine nicht im Projekt, die fressen einiges an Ressourcen.

Ich könnte eine kurze Anydesk-Sitzung anbieten. Schreib mir eine PN, falls gewünscht. Meine Email-Adresse findest Du auch auf meiner Website.
 
Zuletzt bearbeitet:
Zurück
Oben