Step 7 Fehler(Zeigerfehler?)in AWL Programm, Hilfe zum Ereignis 2x25

Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen, ich habe folgendes Problem. Wenn ich mein AWL Programm auf der CPU 412-1 ablaufen lasse,
dann geht die CPU unter umständen in den INTF Modus. Wenn ich nun den Fehlerspeicher auslese, kommt folgendes:
Falsche Bereichskennung: 0
FB-Nummer 1000
Bausteinadresse: 1204
Angeforderter OB: Programmierfehler-OB (OB 121)
OB nicht vorhanden oder gesperrt oder nicht startbar im aktuellen Betriebszustand
interner Fehler, kommendes Ereignis
Hilfe zum Ereignis 2x25
Ursache:
Sie haben bei der bereichsübergreifenden registerindirekten Adressierung einen unzulässigen Oparandenbereich verwendet.
Die Bereichskennung der Zugriffsadresse (Bit 24-31) ist unzulässig
Behebung:
Verwenden Sie eine Pointer mit korrekter Bereichskennung

Ein Ausschnitt aus meinem Programm:
.....
L #IN_DBNr_ArchivKurve //Eingang der Nummer des Archivierungs DBs
T #TEMP_DBNr_ArchivKurve //Transferiere in Tempären Speicher
L P##IN_Pointeradresse //Lade Startadresse Pointer
LAR1 //Speichern im Adressregister von P#0.0
L D [AR1,P#4.0] //Lade Bereichszeiger
LAR1 //Speichern im Adressregister
TAR1 MD 4 //Lade Zeiger Inhalt in MD 4(dient als Zeiger Speicher)
.....
CALL "BLKMOV" //zum besetzen wird dazu die SFC 20 BLKMOV aufgerufen
SRCBLK :=P#DB4000.DBX 0.0 REAL 1201 //diese holt aus dem DB4000(welcher als 0en Speicher fungiert) die 1201 Werte
RET_VAL:=#OUT_RET_BLKMOV
DSTBLK :=P#DB1100.DBX 0.0 REAL 1201 //und kopiert Sie in den DB1100
......
LAR1 MD 4 //Lade wieder den Zeiger ins Adressregister AR1
AUF DB [#TEMP_DBNr_ArchivKurve] //Lade DB wo die Messwerte gespeichert werden sollen.

L #Messgroesse_1 //Nimm den aktuellen Messwert und speichere im paassendne Arrayindex (+0 Offset) ab
T D [AR1,P#0.0]
L #Messgroesse_2 //Nimm den aktuellen Messwert und speichere im paassendne Arrayindex (+1600 Offset) ab
T D [AR1,P#1600.0]
L #Messgroesse_3 //Nimm den aktuellen Messwert und speichere im paassendne Arrayindex (+3200 Offset) ab
T D [AR1,P#3200.0]
L #Messzyklus
T DBD 4800
+AR1 P#4.0 //Zähle das Adressregister um 4Byte hoch
TAR1 MD 4 //Speicher den Pointer in MD4, damit er für den nächsten FB aufruf gesichert ist.
......

Vielleicht noch kurz mal zur Funktion. Es sollen verschiedene Messgrößen in einem Prüfvorgang, bei bestimmten Ereignissen gespeichert werden.
Wenn der Prüfvorgang beendet ist, soll der Speicher für die Messgrößen mit dem BLKMOV mit 0en initialisiert werden und der nächste Prüfvorgang
beginnt nach einer gewissen Pause.
Ich habe auch mal die Suche benutzt und da ist das Problem vielleicht beim SFC20 zu suchen.
http://www.sps-forum.de/simatic/28455-cpu-fehlermeldung-unklar.html
Ich steh gerade auf dem Schlauch und erkenne eigentlich den Fehler gerade nicht...
Vielleicht könntet Ihr mir da weiterhelfen.
Grüße
 
Irgendetwas relaventes hast du uns in deinem Programmauszug vorenthalten.

Am Ende erhöhst du den Zeiger im AR1 und sicherst ihn ins MD4.
Am Anfang des Bausteins wird aber das MD4 immer wieder mit dem Bereichszeiger aus #IN_Pointeradresse überschrieben. So wie es dasteht würde der Zeiger immer auf die gleiche Adresse zeigen, oder was steht an diesem Parameter dran?

Warum überhaupt das Rummachen mit MD4, wenn es ein FB ist?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
L P##IN_Pointeradresse //Lade Startadresse Pointer
LAR1 //Speichern im Adressregister von P#0.0
L D [AR1,P#4.0] //Lade Bereichszeiger

Der Offset P#4.0 erscheint mir hier falsch.
Wenn IN_Pointeradresse vom Datentyp Pointer ist, müsste es P#2.0 lauten.

Wenn möglich zeig mal den gesamten Baustein.
 
Der Offset P#4.0 erscheint mir hier falsch.
Wenn IN_Pointeradresse vom Datentyp Pointer ist, müsste es P#2.0 lauten.

Wenn möglich zeig mal den gesamten Baustein.

Thomas, der ist doch geheim ;-)
Vermutlich hast du recht.

Doch ich würde den Bereich mit dem Fill leer machen, warum da noch einmal eine Baustein öffnen und in einen anderen Baustein schreiben?
Denn ob das so funktioniert, wie ich es hier lese, bezweifele ich. Kann funktionieren, muss aber nicht und ein Step 7 habe ich hier nicht zum testen.


bike
 
Der Offset P#4.0 erscheint mir hier falsch.
Wenn IN_Pointeradresse vom Datentyp Pointer ist, müsste es P#2.0 lauten.

Wenn möglich zeig mal den gesamten Baustein.

Hi, danke für die schnelle Antwort. Also ich denke du hast recht mit dem Pointer und der Änderung auf P#2.0.
Zu deiner Frage ob der Baustein immer mit Adresse 0 initialisiert wird, kann ich sagen, dass dies nur bei bestimmten definierten Ereignissen gemacht wird.

Thomas, der ist doch geheim ;-)
Vermutlich hast du recht.

Doch ich würde den Bereich mit dem Fill leer machen, warum da noch einmal eine Baustein öffnen und in einen anderen Baustein schreiben?
Denn ob das so funktioniert, wie ich es hier lese, bezweifele ich. Kann funktionieren, muss aber nicht und ein Step 7 habe ich hier nicht zum testen.


bike

Möglicherweise hast du mit dem Baustein Fill recht. Ich schau mal was sich da machen lässt.
 
Zurück
Oben