Step 7 Indirekte Adressierung Fehler

Zuviel Werbung?
-> Hier kostenlos registrieren
mit dem LW tritt der Fehler nicht auf. Aber wieso? Wo liegt der Unterschied?
Hilfe zu AWL > Indirekte Adressierung
> Bereichsinterne, registerindirekte Adressierung: die Speicherbereichskennung wird aus der Operation genommen: "T LW [AR1..."
> Bereichsübergreifende, registerindirekte Adressierung: die Speicherbereichskennung wird aus AR1 genommen: "T W [AR1..."


Ist es von der Funktion überhaupt noch das selbe mit LW?
Ja, wenn #Ziel in TEMP liegt.
Ist #Ziel wirklich in TEMP deklariert? Wenn Du im AWL-Editor "LAR1 P#L16.0" eingibst, wird das automatisch in "LAR1 P##Ziel" geändert?

"T W [AR1..." ist eigentlich der bessere Code, der funktioniert nämlich auch dann richtig, wenn #Ziel woanders als TEMP deklariert ist.


In einer 319-F funktioniert das Programm auch ohne LW. Warum in der 400er nur mit LW?
Das ist nicht normal, "T W [AR1..." muß auch in einer S7-400 funktionieren.

Hast Du vielleicht eine "komische" HW Konfig, z.B. hast Du in der CPU zu wenig Lokaldatengröße eingestellt?
HW Konfig ist übersetzt und geladen? Bausteinkonsistenz ist OK? Welchen Lokaldatenbedarf hat der FC68?
Kannst Du mal einen völlig neuen FC anlegen und die Deklarationen und alle Netzwerke aus dem FC68 in den neuen FC kopieren - ist der Fehler dann immer noch da?

Wann bzw. in welchem OB wird der Code (FC68) aufgerufen? Wie sieht der Aufruf des FC68 aus? Existiert der übergebene DB und ist lang genug?


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
Hmm, wie kann bei einer indirekten Adressierung die Bereichskennung 16#86 = L "falsch" sein??? :confused:

Deine CPU ist ja schon etwas älter - Vielleicht ist das ein Firmware-Problem? Was für eine Firmware-Version hat Deine CPU 414-1XG02?
Was für eine Step7-Version benutzt Du?


PS: Bei der Analyse von schwierigen Fehlern ist es sehr wichtig, alles GANZ genau zu lesen und wiederzugeben - der AR1 wird bestimmt nicht 16.0 sondern L16.0 enthalten.
Hast Du vielleicht mal einen Screenshot vom Beobachten Deiner Programmstelle? (wie das Bild von JoopB in #17)
Im AR1 steht die 16.0.
Normal solte da L 16.0 stehn.

Anhang anzeigen 31311

Harald
 
Die bereichsübergreifende Adressierung kann nicht auf temporäre Lokaldaten angewendet werden, nicht in der S7-300 und auch nicht in der S7-400. In Fachbüchern wird das erwähnt, eine nähere Erklärung habe ich allerdings noch nirgendwo gefunden. Man soll in so einem Fall die bereichsinterne Adressierung benutzen. Probleme kann es dadurch eigentlich keine geben, da die lokalen Daten so wie so nur bausteininterne Daten sind. d.h. der Operandenbereich kann sich nicht anwendungsspezifisch ändern.

Onkel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die bereichsübergreifende Adressierung kann nicht auf temporäre Lokaldaten angewendet werden, nicht in der S7-300 und auch nicht in der S7-400. In Fachbüchern wird das erwähnt
Hmm, in welchem Fachbuch wird das erwähnt? Wird da eventuell von der speicherindirekten Adressierung geschrieben? Die gibt es in der Tat nur bereichsintern. Oder kann es sein, daß das bei S7-CPU der ersten Generationen noch nicht ging?

Siemens zeigt z.B. hier in Bild 03 die registerindirekte bereichsübergreifende Adressierung einer ANY-Variable in TEMP. Ohne Hinweis, daß das in irgendeiner S7 nicht gehen würde.

Laut Operationslisten der S7-300 und S7-400 ist die bereichsübergreifende Adressierung von L (Lokaldaten TEMP) möglich. Leider finde ich bei Siemens aber nicht die zur 414-1XG02 gehörige Operationsliste.

Harald
 
Hallo,

ja ich habe mich verlesen. Es steht L 16.0 im AR1

#Ziel befindet sich im TEMP.


Ich werde es mit dem neuen FC später testen. Der DB existiert und ist auch lang genug. Der FC wird im OB1 aufgerufen.

Ich verwende die Step 7 Version 5.5 SP4. Die CPU ist eine 414-1XG02-0AB0

Die Hardware ist übersetzt und geladen. Welche Lokaldatengröße sollte Konfiguriert werden?

Danke für die vielen Antworten.

Gruß,
Gh0st90
 
Hmm, in welchem Fachbuch wird das erwähnt? ..
Das steht in der Berger-Bibel "Automatisieren mit Step7 in AWL und SCL". Ich weiß das, da ich schon öfter über diese Sache gestolpert bin. Ich besitze eine ältere Ausgabe des Buches. Heute abend kann ich das entsprechende Zitat heraus suchen. Wenn ich dieses Problem hatte, dann wahrscheinlich während der Entwicklung in PLCSIM, falls das von Bedeutung sein sollte.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe die 7. Auflage von 2011 und zitiere von Seite 464
Die bereichsübergreifende Adressierung könne Sie nicht auf Lokaldaten anwenden (Stopp der CPU). Weichen Sie auf die bereichsinterne Adressierung aus, wenn der adressierte Bereich in den temporären Lokaldaten liegt.
 
Naja, wer weiß wie oft der Berger seine Erkenntnisse von einem Buch ins nächste kopiert...

Bei S7-314-CPU wurde der Zugriff auf Lokaldaten mit bereichsübergreifender, registerindirekter Adressierung mit der Firmware V1.1.0 eingeführt. (1998 ?)
Bei S7-400 habe ich nichts dazu gefunden. Es funktioniert aber mindestens schon seit V3.0 (2001).


Testcode:
Code:
      L     0
      T     LW    16

      LAR1  P##Ziel          //Ziel ist eine ANY-Variable in TEMP an Adresse 16.0
      L     W#16#1002
      T     W [AR1,P#0.0]    //bereichsübergreifend

      L     0
      L     W [AR1,P#0.0]    //bereichsübergreifend

      L     W#16#1234
      T     LW [AR1,P#0.0]   //bereichsintern
      L     0
      L     W [AR1,P#0.0]    //bereichsübergreifend
Ich habe heute mal diesen Code in verschiedenen möglichst alten echten CPU getestet.
Z.B. in einer 414-2XG03 V3.0.2 - die CPU kennt das Fachbuch anscheinend nicht und funktioniert einfach ohne Murren ;) 8)
Eine 416-2XK04 V4.1.0 verhält sich genauso "unmöglich" einwandfrei :)
In einer 314 IFM 314-5AE03 V1.2.0 von 2001 und in einer 315-2EH14 V3.2.10 funktioniert der Code ebenfalls einwandfrei. :)

Leider habe ich keine S7-400-CPU mit Firmware älter als V3 (2001).


Ob eine CPU die bereichsübergreifende registerindirekte Adressierung der temporären Lokaldaten beherrscht kann man sehr einfach testen:
Code:
      LAR1  P##OB1_DATE_TIME
      L     D [AR1,P#0.0]
      L     D [AR1,P#4.0]
Diesen Code in den OB1 packen und beobachten. Und einen Blick in den Diagnosepuffer der CPU werfen.
(bei realen Anlagen kann man vorsichtshalber einen OB121 in die CPU laden)


@Gh0st90
Welche Firmware hat Deine CPU 414-1XG02 ?

Harald
 

Anhänge

  • 414_bereichsübergreifend_L.gif
    414_bereichsübergreifend_L.gif
    31,1 KB · Aufrufe: 17
Zuletzt bearbeitet:
Danke Harald! Ich war schon fast an mir verzweifelt. Das Zitat aus der Bibel kann ich mir nun wohl sparen. In meiner Ausgabe von 1999 steht es im Kapitel "25.2.5 Registerindirekte bereichsübergreifende Adressierung".

Aus Kompatibilitätsgründen würde ich in Standardbausteinen dennoch die "alte Version" bevorzugen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Aus Kompatibilitätsgründen würde ich in Standardbausteinen dennoch die "alte Version" bevorzugen.
Jepp, wenn es nicht zwingend bereichsübergreifend sein muß (z.B. wenn man nicht weiß, worauf ein übergebener Pointer zeigen wird).

Außerdem ist bereichsinterne Adressierung verständlicher, deshalb nehme ich die öfter, z.B.
In FC einen DATE_AND_TIME-Parameter von IN nach TEMP kopieren
Code:
      L     P##BT;             // Adresse IN.BT
      LAR1  ;
      L     W [AR1,P#0.0];     // POINTER.DB_Nr
      T     #DB_No;
      L     D [AR1,P#2.0];     // POINTER.Bereichsadresse
      LAR1  ;                  // AR1: Adresse des IN-DT (Bereichskennung ?)
      LAR2  P##tmpBT;          // AR2: Adresse des TEMP-DT (Bereichskennung L)

//DATE_AND_TIME (8 Byte) BT von IN nach TEMP kopieren
      AUF   DB [#DB_No];
      L     [COLOR="#0000FF"]D[/COLOR] [AR1,P#0.0];     [COLOR="#0000FF"]<-- bereichsübergreifend, weil unvorhersehbarer IN-Parameter[/COLOR]
      T     [COLOR="#0000FF"]LD[/COLOR] [AR2,P#0.0];    [COLOR="#0000FF"]<-- bereichsintern, schreibt deutlich lesbar nach L (TEMP)[/COLOR]
      L     D [AR1,P#4.0];
      T     LD [AR2,P#4.0];


Wenn der Speicherbereich feststeht, dann kann man bereichsübergreifend oder bereichsintern nach Belieben verwenden:
In FB einen ANY-Parameter von IN nach TEMP kopieren
Code:
      ...
      LAR1                              // AR1: absolute Adresse #E_Any_farAdr im IDB (Bereichskennung DI)
      LAR2  P##tmp_Any_farAdr           // AR2: Adresse des TEMP-ANY (Bereichskennung L)

//ANY IN.E_Any_farAdr nach TEMP.tmp_Any_farAdr kopieren, [COLOR="#0000FF"]bereichsübergreifend IDB nach TEMP[/COLOR]
      L     [COLOR="#0000FF"]D[/COLOR] [AR1,P#0.0]               // (S7-ID + Datentyp + Wiederholfaktor)
      T     [COLOR="#0000FF"]D[/COLOR] [AR2,P#0.0]
      L     W [AR1,P#4.0]               // (DB_Nr)
      T     W [AR2,P#4.0]
      L     D [AR1,P#6.0]               // (Bereichsadresse)
      T     D [AR2,P#6.0]
...
      ...
      LAR1                              // AR1: absolute Adresse #E_Any_locAdr im IDB (Bereichskennung DI)
      LAR2  P##tmp_Any_locAdr           // AR2: Adresse des TEMP-ANY (Bereichskennung L)

//ANY IN.E_Any_locAdr nach TEMP.tmp_Any_locAdr kopieren, [COLOR="#0000FF"]bereichsintern IDB nach TEMP[/COLOR]
//ALTERNATIVE Codevariante für besser verstehbar
      L     [COLOR="#0000FF"]DID[/COLOR] [AR1,P#0.0]             // (S7-ID + Datentyp + Wiederholfaktor)
      T     [COLOR="#0000FF"]LD[/COLOR] [AR2,P#0.0]
      L     DIW [AR1,P#4.0]             // (DB_Nr)
      T     LW [AR2,P#4.0]
      L     DID [AR1,P#6.0]             // (Bereichsadresse)
      T     LD [AR2,P#6.0]

Harald
 
@ Harald
In einer 314 IFM 314-5AE03 V1.2.0 von 2001 und in einer 315-2EH14 V3.2.10 funktioniert der Code ebenfalls einwandfrei. :smile:
Ich habe die test gemacht mit ein 314IFM 314-5AE02 V2 (baujahr +/- 1998 und da gibt dass ein fehler bei bereichsubergreifende zugang. OB121 wurde aktiefiert.
314imf.JPG

Joop
 
Ich habe die test gemacht mit ein 314IFM 314-5AE02 V2 (baujahr +/- 1998 und da gibt dass ein fehler bei bereichsubergreifende zugang. OB121 wurde aktiefiert.
Anhang anzeigen 31337
Die ist ja so alt, die hat noch nicht einmal eine Firmware-Versionsnummer. :ROFLMAO: Außerdem steht da im Baugruppenzustand 314-5AE01
Bei der 314IFM 314-5AE03 wurde der Support für bereichsübergreifende registerindirekte Adressierung der temporären Lokaldaten erst in Firmware V1.1.0 eingeführt.

Harald
 
Zurück
Oben