Bedeutung eines Fehlers, S7

A

Anonymous

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe folgendes Problem.

Ich habe einen Funktionsbaustein mit vielen indirekten Addressierungen (Pointer) programmiert.
Nun geht die CPU318 immer in STOP, wenn dieser FB aufgemacht wird.

Als Fehlermeldung beim Diagnosepuffer bekomme ich dann ''Bereichslängenfehler beim Lesen'' ausgegeben.

Wie soll ich das verstehen?

Kann es sein, dass die CPU mit dem häufigen Lese- und Schreibanweisungen nicht klar kommt?

Oder habe ich einfach nur einen Denkfehler?
 
Hallo,
ich glaub eher das du irgendwelche Operationen machst womit der Speicher nicht klar kommt. Das eventuell ein Zeiger den Fehler verursacht weil er auf irgendwas zeigt was er nicht darf oder so.
Ich hatte solche Fehler mal als ich mit Lade- und Arbeitsspeicher zu tun hatte.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Frank 7 schrieb:
Hallo,
Kann es sein, dass die CPU mit dem häufigen Lese- und Schreibanweisungen nicht klar kommt?

nein.

du wirst wohl irgendwo im code einen fehler haben. dein pointer verweist auf eine nicht vorhandene adresse. evtl db zu kurz.
 
Hallo Frank,
du macht einen Denkfehler.

Die CPU kommt mit vielen Lese/Schreibzugriffen klar.

Beeichslängenfehler kommt dann, wenn auf eine Adresse zugegriffen wird, die es nicht gibt.

z.B: Du hast einen DB mit 20 Byte Länge und nun möchtest Du das Byte 40 Lesen => Bereichslängenfehler.........
 
über den u-stack findest du auf jeden fall schon mal die stelle.

rufe deinen fehlerhaften baustein bedingt auf. zb m10.0.
öffne den fehlerhaften baustein und gehe zu der stelle wo der fehler auftritt. beobachte den baustein. in der vat setze nun m10.0 die cpu geht in stop. nun hast du aber die zuletzt gültigen werte im beobachteten baustein stehen.

oder du programmierst ob121 dann geht der prozessor nicht in stop und du kannst so evtl online den fehler entdecken.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

Falls du mit dem (guten) Tipp vom Volker nicht weiterkommst, dann geh den Baustein mit Haltepunkten durch. Zeile für Zeile.
Das ist für die Fehlersuche besonders wichtig, wenn du die Pointer in Loop`s einsetzt.

Falls die Adressen in den Pointern stimmen, dann könnte auch ein falscher DB die Ursache sein.

z.B.
AUF DBxxx
lar1 p#10.0
l dbd [ar1,p#0.0]
t db2.dbd60
l dbd [ar1,p#4.0]
t ....

Das Beispiel ist in der Form zwar Quatsch, zeigt aber was ich meine.

Beim 2. Laden holst du keine Daten mehr aus dem DB, den du oben geöffnet hast, sondern aus dem DBD14 von DB2.
Das ist schnell mal passiert.

Schöne Grüße aus dem Schwarzwald

Micha
 
Zurück
Oben