Step 7 Indirekte Adressierung Fehler

Gh0st90

Level-1
Beiträge
16
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe hier eine S7 414-1 CPU vor mir.

Diese gibt folgenden Baugruppenzustand aus:

Code:
Diagnosepuffer der Baugruppe CPU 414-1
Bestell-Nr./ Bezeichn.         Komponente                     Ausgabestand                  
6ES7 414-1XG02-0AB0            - - -                          9                             
Baugruppenträger:              0
Steckplatz:                    3

Ereignis 1 von 120:  Ereignis-ID 16# 2525
Bereichsfehler beim Schreiben 
Falsche Bereichskennung:    0
FC-Nummer:    68
Bausteinadresse:     34
Angeforderter OB: Programmierfehler-OB (OB 121)
Prioritätsklasse:  1
interner Fehler, kommendes Ereignis

Der Fehler wird von einem Bereichszeiger ausgelöst. Die Fehlerstelle sieht so aus:

LAR1 P#15.0
L W#16#1002
T W [AR1,P#0.0] <---- Löst den Fehler aus!

Leider verstehe ich nicht ganz, wohin nun versucht wird zu transferieren. Er Versucht den Inhalt von Akku 1 nach ?15.0 zu transferieren. Aber wohin genau? Ausganswort, Merkerwort, Datenbausteinwort?

Ich hoffe ihr könnt mir helfen und sagen wieso der Fehler auftrifft.

Gruß,
Gh0st90
 
Wenn ich mich jetzt nicht komplett verhaue, lädst du ja bereichsintern etwas ins Adressregister 1. Das müsste aus dem Bereich 'TEMP' kommen.
Was steht denn im FC68 im Lokaldatenbereich 15.0?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Leider verstehe ich nicht ganz, wohin nun versucht wird zu transferieren. Er Versucht den Inhalt von Akku 1 nach ?15.0 zu transferieren. Aber wohin genau? Ausganswort, Merkerwort, Datenbausteinwort?

LAR1 P#15.0 => Adressregister 1 mit dem Inhalt des bereichsinternen Zeigers P#15.0 laden.

Edit:

So wie ich das verstehe willst du evtl das?

L P#I15.0 (oder M15.0 oder DBX15.0)
//Load ACCU1 with pointer value
LAR1
//Load AR1 with pointer in ACCU1



 
Zuletzt bearbeitet:
Dein Problem: Deine indirekte Adressierung enthält keine Speicherbereichskennung, weder im AR1 noch in der Operation.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

sorry, ich habe gerade erfahren das ein Kollege sich schon dran probiert hat und Sachen ausprobiert hat. Der Ursprung sieht so aus:


LAR1 P##Ziel
L W#16#1002
T W [AR1,P#0.0]


#Ziel ist eine Variable vom Typ ANY im TEMP mit der Adresse 16.0

Nur leider bringt mich das immer noch nicht weiter. Und der Fehler ist der Selbe.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Ursprung sieht so aus:


LAR1 P##Ziel
L W#16#1002
T W [AR1,P#0.0]


#Ziel ist eine Variable vom Typ ANY im TEMP mit der Adresse 16.0

Nur leider bringt mich das immer noch nicht weiter. Und der Fehler ist der Selbe.
Die Adresse der fehlerhaften Codestelle ist aber nun bestimmt eine andere? Dieser Code wird nicht mehr den Fehler auslösen.
Wie lautet die Diagnosemeldung jetzt?

Dein Code sieht aus, als ob da ein ANY-Pointer z.B. für SFC20 BLKMOV zusammengebastelt wird. Wie sieht der komplette Code aus, wie sah er vor Euren Versuchen aus? Was ist der Sinn des Codes?

Harald
 
Der Wert in der Variable #Ziel ist unerheblich, "LAR1 P##Ziel" lädt nicht den Wert sondern die Adresse der Variable (P#L16.0).

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kann ich mir den Wert irgendwie anzeigen lassen?
Es ist empfehlenswert, wenn Du beim Beobachten des AWL-Codes die Spalte "Adressregister 1" einblendest (Rechtsmausklick in die Beobachtungsspalten), evtl. auch "DB-Register 1" und ggf. weitere Spalten.

Harald
 
Hallo,

danke für die Antworten. Der gesamte Code sieht so aus:

NW1:
L #Koppel_DBNR // Nummer des Koppel DB
T #Koppel_DB
AUF DB [#Koppel_DB] // Koppel DB aufrufen
// Taktimpuls bilden
U #Takt_1s
FP DBX 314.1 // Flankenhilfsbit
= DBX 314.0 // Taktimpuls in Koppel DB

NW2:

LAR1 P##Ziel
L W#16#1002
T W [AR1,P#0.0]


Im AR1 steht die 16.0.

Der Fehler lautet weiterhin:

Bereichsfehler beim Schreiben
Falsche Bereichskennung: 86
FC-Nummer: 68
Bausteinadresse: 34
Angeforderter OB: Programmierfehler-OB (OB 121)
Prioritätsklasse: 1
interner Fehler, kommendes Ereignis
 
Zuviel Werbung?
-> Hier kostenlos registrieren
der Pointer steht doch schon auf Lokaldaten, oder?
Ich denke, er will in einen DB kopieren, und der Fehler tritt auf, weil der Lokaldatenbereich des FC68 kleiner 18 Byte ist..
 
@SPSKILLER
Dachte ich auch zuerst, aber er hat das noch einmal hier #6 präzisiert.

Wenn #Ziel also im Temp-Bereich liegt, dann kann man es zumindest mal mit LW testen.
 
Hast du es mal so versucht?

LAR1 P##Ziel
L W#16#1002
T LW [AR1,P#0.0]

Hallo,

mit dem LW tritt der Fehler nicht auf. Aber wieso? Wo liegt der Unterschied?



EDIT:
Noch ein für mich nicht verständliches Problem. In einer 319-F funktioniert das Programm auch ohne LW. Warum in der 400er nur mit LW?

Ist es von der Funktion überhaupt noch das selbe mit LW?
 
Zuletzt bearbeitet:
Zwischen 300-er und 400-er gibt es definitiv ein paar Unterschiede, die beim "normaloprogrammieren" eher nicht zum tragen kommen. So hat die 400-er z.B. 4 Akkus, die 300-er 2.
Damit hatte ich bisher noch nie ein Problem, aber hier könnte schon etwas anders laufen, wenn man indirekt adressiert etc. Vielleicht gibts ja im Forum ein paar 400-er-Kenner, da gehöre ich nicht unbedingt zu denen, die hier tiefer gehen könnten.
 
Zurück
Oben