JanB1
Level-2
- Beiträge
- 384
- Reaktionspunkte
- 55
-> Hier kostenlos registrieren
Hallo zusammen
Ich habe gerade ein interessantes kleines Problem.
Ich will mit dem OB121 "Programmierfehler" erkennen, ob ich einen ungültigen Zugriff mit einem Zeiger in einem bestimmten Baustein habe. Zum Test habe ich mit nun einen FC mit der Bausteinnummer 3 angelegt in AWL und erstelle einen Zeiger, welchen ich über einen DB mit Werten versorgen kann. Ich lasse den Zeiger Testweise auf den DB0 zeigen und rufe die Funktion BLKMOV auf. Im OB121 habe ich Code, welcher prüft ob "BlockNr"=3 und "BlockType"=2 (FC)ist und daraufhin ein Bit in einem DB setzt um zu sehen, ob der OB121 auch korrekt ausgeführt wird.
Soweit so gut, wenn ich den BLKMOV aktiviere erscheint im Diagnosepuffer der CPU ein temporärer Fehler "DB0 nicht geladen" und das Bit im DB wird gesetzt. OB121 erkennt also den Fehler im FC3 und setzt das Bit.
Nun zu meinem Problem:
Ich habe zum Test noch einen zweiten Baustein erstellt um zu prüfen dass wirklich alles korrekt funktioniert. Also habe ich einen FB mit der Nummer 1 in FUP erstellt, in welchen ich ein SCL Netzwerk eingefügt habe (ich habe immer einen FC und einen FB "Test" in meiner Test Area in FUP da ich in einem FUP Baustein Netzwerke in allen Sprachen (ausser Graph) einfügen kann). In diesem Baustein habe ich das gleiche wie in meinem FC3 aufgebaut (also Zeiger welcher auf DB0 zeigt und BLKMOV welcher aufgerufen wird und den Zugriffsfehler auslösen sollte). Im OB121 habe ich den entsprechenden Code hinzugefügt um ein zweites Bit zu setzen wenn ein Fehler in diesem FB erkannt wird.
Interessanterweise wird beim BLKMOV im FB1 KEIN Zugriffsfehler ausgelöst. Weder im Diagnosepuffer noch das Test-Bit lassen erkennen, dass ein Fehler aufgetreten ist.
Was ich geprüft habe:
Anscheinend wird der Zugriffsfehler nicht erkannt wenn der Baustein in SCL geschrieben ist. Weiss irgendjemand von euch, warum das so ist oder habe ich soeben einen Bug/Feature entdeckt?
Ich habe gerade ein interessantes kleines Problem.
Ich will mit dem OB121 "Programmierfehler" erkennen, ob ich einen ungültigen Zugriff mit einem Zeiger in einem bestimmten Baustein habe. Zum Test habe ich mit nun einen FC mit der Bausteinnummer 3 angelegt in AWL und erstelle einen Zeiger, welchen ich über einen DB mit Werten versorgen kann. Ich lasse den Zeiger Testweise auf den DB0 zeigen und rufe die Funktion BLKMOV auf. Im OB121 habe ich Code, welcher prüft ob "BlockNr"=3 und "BlockType"=2 (FC)ist und daraufhin ein Bit in einem DB setzt um zu sehen, ob der OB121 auch korrekt ausgeführt wird.
Soweit so gut, wenn ich den BLKMOV aktiviere erscheint im Diagnosepuffer der CPU ein temporärer Fehler "DB0 nicht geladen" und das Bit im DB wird gesetzt. OB121 erkennt also den Fehler im FC3 und setzt das Bit.
Nun zu meinem Problem:
Ich habe zum Test noch einen zweiten Baustein erstellt um zu prüfen dass wirklich alles korrekt funktioniert. Also habe ich einen FB mit der Nummer 1 in FUP erstellt, in welchen ich ein SCL Netzwerk eingefügt habe (ich habe immer einen FC und einen FB "Test" in meiner Test Area in FUP da ich in einem FUP Baustein Netzwerke in allen Sprachen (ausser Graph) einfügen kann). In diesem Baustein habe ich das gleiche wie in meinem FC3 aufgebaut (also Zeiger welcher auf DB0 zeigt und BLKMOV welcher aufgerufen wird und den Zugriffsfehler auslösen sollte). Im OB121 habe ich den entsprechenden Code hinzugefügt um ein zweites Bit zu setzen wenn ein Fehler in diesem FB erkannt wird.
Interessanterweise wird beim BLKMOV im FB1 KEIN Zugriffsfehler ausgelöst. Weder im Diagnosepuffer noch das Test-Bit lassen erkennen, dass ein Fehler aufgetreten ist.
Was ich geprüft habe:
- Code in OB121 korrekt
- Zusätzlichen FC in AWL und Szenario nachgestellt, Fehler wird erkannt
- Zusätzlichen FB in AWL und Szenario nachgestellt, Fehler wird erkannt
- Zusätzlichen FB in FUP und Szenario nachgestellt, Fehler wird erkannt
- Zusätzlichen FB in SCL und Szenario nachgestellt, Fehler wird NICHT erkannt
- Zusätzlichen FC in SCL und Szenario nachgestellt, Fehler wird NICHT erkannt
Anscheinend wird der Zugriffsfehler nicht erkannt wenn der Baustein in SCL geschrieben ist. Weiss irgendjemand von euch, warum das so ist oder habe ich soeben einen Bug/Feature entdeckt?