Step 7 Frage an Erfahrene - Pointer und falsche Adresse

Ingmar64

Level-2
Beiträge
326
Reaktionspunkte
53
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe in meinem Programm umfangreiche Zugriffe auf Datenbausteine mittels Pointer, also z.B

AUF DB [#DB_NR_T]
L P#0.0
T #offset
L #Adresse //z.B. Bytenummer
SLD 3
L #offset
+D
LAR1
L Wert
T DBW [AR1,P#0.0]

und außerdem etliche Kopiervorgänge mit dem SFC20.
Um sporadische Fehler eingrenzen zu können, würde mich interessieren, was eigentlich passiert, wenn man mit Pointer auf Bereiche außerhalb des eigentlich angesprochenen Bereichs zugreift, desgleichen bei SFC20.
Hat da jemand Erfahrung oder sicheres Wissen?

Danke!
 
Das ist relativ einfach:

Wenn der Adressbereich vorhanden ist, wird die Adresse angesprochen auf die der Pointer zeigt.

Wenn der Adressbereich nicht vorhanden ist, geht die SPS in Stop. Es sei denn der Fehler wird mit dem OB121 abgefangen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Um die Fehler besser eingrenzen zu können, kannst du vor dem LAR1 die berechnete Adresse auf ein DWORD (Merker, temporäre Variable, DB) legen. Dann kannst du sie im "Beobachten" anschauen.
Im OB121 kannst du diesen berechneten Wert auch in ein Array in einem DB schreiben, um den Fehler im laufe der Zeit beheben zu können.
Ich bin jedoch der Meinung, dass der OB121 in einer laufenden Anlage nichts verloren hat, zumindest nicht um einfach die CPU vor dem Stop zu bewahren.
Außerdem kannst du in der Baugruppendiagnose unter "Stacks" wenn die CPU in Stop geht anschauen, in welchem FB/FC und Netzwerk der Stop ausgelöst wurde.
Wenn die der Fehler sporadisch ein paar Mal am Tag auftritt, würde ich "Warten auf Stop und Stack schauen"-Variante bevorzugen.
Falls der Fehler nur ein Paar mal in der Woche auftritt, würde ich im OB121 den berechneten Adress-Merker in einen DB schreiben und dann alle paar Tage rein schauen.

Ich hoffe, das hilft dir etwas weiter.

Gruß
 
Danke an alle.
Die CPU (übrigens eine 315F PN/DP) stürzt leider nicht ab, da käme man mit dem Diagnosespeicher weiter (zumindest oft), sondern angeblich kippen irgendwo Werte.
Kriegt man eigentlich irgendwo heraus, in welche Reihenfolge die DB's im Speicher liegen? Außer die DB's alle nacheinander aufzumachen und sich die Adresse des ersten Bytes anzeigen zulassen?

Ich meine mal bemerkt zu haben, daß zumindest der SFC20 Zugriffe verweigert, wenn der zu kopierende Bereich (Quelle und Ziel) den DB wechselt. Zumindest gibt es ja im Fehlerwort Werte, die auf so etwas hindeuten.

Grüsse
 
Um die Fehler besser eingrenzen zu können, kannst du vor dem LAR1 die berechnete Adresse auf ein DWORD (Merker, temporäre Variable, DB) legen. Dann kannst du sie im "Beobachten" anschauen.
Im OB121 kannst du diesen berechneten Wert auch in ein Array in einem DB schreiben, um den Fehler im laufe der Zeit beheben zu können.
Ich bin jedoch der Meinung, dass der OB121 in einer laufenden Anlage nichts verloren hat, zumindest nicht um einfach die CPU vor dem Stop zu bewahren.
Außerdem kannst du in der Baugruppendiagnose unter "Stacks" wenn die CPU in Stop geht anschauen, in welchem FB/FC und Netzwerk der Stop ausgelöst wurde.
Wenn die der Fehler sporadisch ein paar Mal am Tag auftritt, würde ich "Warten auf Stop und Stack schauen"-Variante bevorzugen.
Falls der Fehler nur ein Paar mal in der Woche auftritt, würde ich im OB121 den berechneten Adress-Merker in einen DB schreiben und dann alle paar Tage rein schauen.

Ich hoffe, das hilft dir etwas weiter.

Gruß
1. Im "Beobachten" kann ich mir gleich das AR1 anschauen.
2. Also pauschal einen OB121 zu verdammen ist zumindest vom Anlagentyp abhängig. Wenn ein chemischer Prozess am werkeln ist, ist das der letzte Baustein den ich löschen würde. Wegen einem "Verschreiber" eine Anlage abstellen die vielleicht wieder einen Tag braucht um in die Höhe zu kommen könnte ich einer Werksleitung nicht erklären. Gefährliche Zustände können/dürfen ja sowieso nicht auftreteten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich aus irgendwelchen Werten eine Adresse berechne dann mache generell vorher eine Bereichs- bzw. eine Plausibiliätsprüfung.
Damit ist die Gefahr des Überschreibens anderer Bereiche geringer.

Gruß
Dieter
 
ich weiß, dass ich das AR gleich im beobachten anschauen kann, jedoch lege ich mir manchmal bei mehreren Berechnungen das Ergebnis in einen Merker-Bereich, um mithilfe einer Variablentabelle debuggen zu können.
ich habe nichts gegen den OB121 generell, habe aber in der letzten Zeit zu oft gesehen, dass ein leerer OB121 im Programm ist um die CPU vor dem Stop zu bewahren, obwohl wissentlich noch Fehler in der Berechnung waren.
Habe leider keine Erfahrung mit größeren verfahrenstechnischen Anlagen. Unsere Anlagen sind normalerweise Fördertechnik oder Beladesysteme für Maschinen. Nach einem Ausfall benötigt es zum Wiederanlauf meist nur wenig Zeit :D
 
Also ich habe jetzt mal einen Zugriff wie oben in meiner Frage in der PLCSim ausprobiert. Sobald ich auf einen Bereich außerhalb des eigentlich geöffneten DB's zugreife, geht die CPU mit Bereichsfehler in Stop. Mit SFC20 habe ich es nicht noch einmal probiert, da meine ich schlichte Arbeitsverweigerung in solchen Fällen in Erinnerung zu haben. Ich bin insofern beruhigter, da es ohne CPU-Stop unwahrschweinlicher ist, daß meine Zeigeroperationen Mist machen.
Danke an alle Torsten
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die CPU geht in Stop bzw. meldet Bereichsfehler nur wenn man auf Bereiche zugreift die es nicht gibt. Wenn das Programm auf eine falsche jedoch existierende Adresse zugreift, dann stört das die CPU nicht.

Harald
 
So hatte ich es eigentlich erwartet, denn so machen es auch die B+R - CPU's zum Beispiel.
Bei S7-300 scheint doch noch eine Überprüfung stattzufinden, denn sobald ich auf eine Adresse hinter dem eigentlichen Ziel-DB zugreife, geht die CPU in Stop. Und dabei habe ich ca. 60 DB's geladen und greife auf einen in der "Mitte" zu, bei dem ich erwarten würde, daß danach noch was kommt.
Von der Syntax her würde so etwas ja auch Sinn machen, denn wozu muß ich sonst mit AUF den DB erst öffnen. Schaut man sich die berechneten Adressen an, sieht man auch, daß danach auf das erste Byte bei jedem(!) DB mit Adresse 0 zugegriffen wird. Offensichtlich bewirkt der AUF-Befehl hier zusammen mit den Zugriffsbefehlen (L DIX, L DBX) eine interne Verwaltung des richtigen Adressbereichs.

Greife ich innerhalb des DB auf eine falsche Adresse zu, kann die CPU das mangels Kristallkugel natürlich nicht erkennen. Das ist mir schon klar. Doch am fehlerträchtigsten sind ja immer die Randbereiche.
 
Zurück
Oben