# Indirekte Adressierung in AWL



## Bensen83 (8 Dezember 2009)

Hallo Leute ich habe ein Problem. Ich möchte eine Schrittkette mehrmals durchlaufen und nach jedem durchlaufen einen Messwert in ein Array schreiben, leider weiss ich nicht, wie es in AWL geht. soll es aber in AWL machen. kann mir jemand helfen, also ich habe:

Messwert:  DB50.dbd66

Array:    db5.dbd0                  (Array [1..50])

wie kann ich es nun anstellen, dass ich nach dem ersten Durchlaufen der schrittkette in element 1 schreiben nach dem 2. durchlaufen in element 2  usw.

danke schon mal


----------



## dtsclipper (8 Dezember 2009)

Da würde ich einen einfachen Zeiger nehmen.

Der Zeiger wird am Ende der SK um 1 erhöht und zeigt auf das ARRAYfach in dem der masswert gespeichert werden soll.

hoffe geholfen haben zu können dtsclipper


----------



## Bensen83 (8 Dezember 2009)

wie geht das denn, sorry bin in awl nicht so fit


----------



## marlob (8 Dezember 2009)

Arbeite das hier mal durch 
http://www.sps-forum.de/showthread.php?t=8887


----------



## Paule (8 Dezember 2009)

Hallo Bensen,

nimm eine FC und übergib als Eingangsparameter die:
Messwerte als ANY Zeiger 
Messwert als DINT
und ein Hilfsdatenwort als Zeiger (DB50.DBW70)


```
L  P#Messwerte
   LAR1
   L  W[AR1, P#4.0]
   T  #DBNummer
 
   L  W[AR1, P#2.0]
   T #Anzahl
 
   L  #Zeiger
   SLD 5
   L  D[AR1, P#6.0]
   +D
   T  #Ziel
 
   L  #Messwert
   AUF #DBNummer 
   T DBD [#Ziel]
 
   L #Zeiger
   + 1
   T #Zeiger
   L #Anzahl
   < I
   SPB OK
   L 0
   T #Zeiger
OK:NOP 0
```
 
Bei jedem Aufruf wird der ein neuer Wert geschrieben.
Das ist aber jetzt nicht getestet.


----------



## dtsclipper (8 Dezember 2009)

Hi Paule,

dachte eher an so was...


```
UN #SK_fertig
SPB END1
 
AUF DB5
 
L DB50.dbd66
T dbd [MD 490]
 
L MD490
L 4
+D
T MD490  // [B][COLOR=#ff0000]Zeiger[/COLOR][/B] erhöhen
 
// Hier Rückstellbedingung
 L MD490
L 200
>=D
SPB NoRe
L 0
T MD 490
NoRe: nop 0
END1: nop 0
```


----------



## Paule (8 Dezember 2009)

dtsclipper schrieb:


> ```
> UN #SK_fertig
> SPB END1
> 
> ...


 
Das mit dem Zeiger mache ich doch auch, erhöhe in um 1 und schiebe später um 2 nach links.
Nur ist mein Zeiger kein Merkerwort sondern übergebe ich halt ein Datenwort

Aber egal, eigentlich meinen wir ja das gleiche


----------



## dtsclipper (8 Dezember 2009)

Du merkst aber auch alles!

hier die korrigierte Fassung:


```
UN #SK_fertig
   SPB   END1
 
      L     MD   490
      SLD   3      // Aus Speicherwert Zeiger generieren
      T     MD   494
 
 
      L     DB50.DBD   66
 
      AUF   DB     5
      T     DBD [MD 494]
      L     MD   490
      L     4
      +D    
      T     MD   490                    // Zeiger erhöhen
// Hier Rückstellbedingung
      L     MD   490
      L     200
      >=D   
      SPBN   NoRe
      L     L#0
      T     MD   490
NoRe: NOP   0
END1: NOP   0
```


----------



## Andreas- (8 Dezember 2009)

Hallo,

ich habe auch noch eine mögliche Lösung geschrieben. Kann die aber leider nicht ausprobieren, da ich zur Zeit kein STEP 7 installiert hab.


```
// START
U #Schrittkette_Ende    // Schrittkette Ende?
FP #Statisch
SPBN Ende     // Ja, dann springe nicht zur Marke "Ende"
 
// INITIALISIERUNG
UN #Init     // Statisch BOOL     
SPBN Init
L 1
T #Anz_Messungen    // Start Anzahl Messungen (Statisch INT)
L 0
T #Messung     // Start Messung (Statisch WORD)   
SET      
= #Init      
Init: NOP 0
 
L DB50.DBD66     // Messwert
T #Messwert     // TEMP DWORD
 
L #Anz_Messungen
L 50      
==I      // 50 Messungen fertig?
SPBN Weit     // Ja, dann springe nicht zu Weit   
L 1   
T #Anz_Messungen    // Initalisiere Anz_Messungen auf 1
L 0
T #Messung     // Initalisiere Messung
Weit: NOP 0
 
L #Messung   
SLW 3      // erstelle Pointer
LAR1       // und lade diesen ins Address Register 1
AUF DB5
L #Messwert
T D[AR1, P#0.0]     // transferiere den Messwert nach DB5.[Pointer]
 
L #Anz_Messungen    
L 1   
+I
T #Anz_Messungen    // Messung ausgeführt
TAR1      // lade Pointer aus Address Register 1 in AKKU-1
SRW 3      // aus Pointer Integer kreieren
L 4
+I     
T #Messung     // 4 hinzu addieren (DW-Länge des Messwerts)
 
Ende: NOP 0
```
 
Falls jemand Fehler findet, bitte bescheid sagen.


----------



## Ralle (8 Dezember 2009)

@dtsclipper

Ich habe da leichte Zweifel, dein MW hat nicht das korrekte Pointerformat, hast du das mal getestet? Oder kann man das so machen, ich hab das in dieser Weise noch nie verwendet?!

@Andreas

Verwende besser SLD 3 statt SLW 3, da das sonst bei sehr großen Adressen nicht funktioniert, der Pointer hat ja 4 Byte!


----------



## dtsclipper (8 Dezember 2009)

@ RALLE:

Mach mich nicht schwach...

Laut Handbuch sollten es Doppelwörter sein...

Ich jags mal fix durch den Simulator und melde mich dann...

dtsclipper


----------



## dtsclipper (8 Dezember 2009)

Welcher Gaul hat mich da blos geritten...

Habs geändert.


----------



## Kleiny11 (31 Januar 2015)

Hallo zusammen ich,
ich bin gerade dabei mich auch mal an indirekter Adressierung zu versuchen.
Habe leider annähern keine Erfahrung mit AWL programmierung, nur leider geht es ja nicht anders.
Ich habe mir den Zitierten Ausschnitt nun erstmal geschnappt und den einfach in mein Netzwerk eingefügt.
Natürlich leichte Adressen Anpassungen.
Nun bekomme ich immer die Meldung : FC konnte nicht kopiert werden. Unter "Details" steht dann: (D280) Fehler bei der Übersetzung eines Bausteins in S7-300 CPU.
 	Code:
 	UN #SK_fertig
   SPB   END1

      L     MD   490
      SLD   3      // Aus Speicherwert Zeiger generieren
      T     MD   494


      L     DB50.DBD   66

      AUF   DB     5
      T     DBD [MD 494]
      L     MD   490
      L     4
      +D    
      T     MD   490                    // Zeiger erhöhen
// Hier Rückstellbedingung
      L     MD   490
      L     200
      >=D   
      SPBN   NoRe
      L     L#0
      T     MD   490
NoRe: NOP   0
END1: NOP   0

Es wäre echt Klasse, wenn ihr mir aus der Patsche helfen würdet.

Gruß Kleiny


----------



## Larry Laffer (31 Januar 2015)

Hallo,
in deinem Code sehe ich so erstmal keinen Fehler.
Deine Fehlermeldung besagt aber (unterschwellig), dass du in deinem Code Adressen verwendest, die der CPU nicht zur Verfügung stehen - hier u.U. die MD's. Welche CPU hast du denn ?

Gruß
Larry


----------



## Kleiny11 (31 Januar 2015)

Es ist eine 315-2 DP .
Allerdings ist der code auch nicht der originale... es ist lediglich ein zitierter. ich stelle mal meinen veränderten mit hinein.

```
UN    M      1.4
      SPB   END1

      L     MD   490
      SLD   3                           // Aus Speicherwert Zeiger generieren
      T     MD   494


      L     DB2.DBB    2

      AUF   DB     1
      T     DBD [MD 494]
      L     MD   490
      L     4
      +D    
      T     MD   490                    // Zeiger erhöhen
// Hier Rückstellbedingung
      L     MD   490
      L     200
      >=D   
      SPBN  NoRe
      L     L#0
      T     MD   490
NoRe: NOP   0
END1: NOP   0
```


Gruß Kleiny


----------



## Kleiny11 (31 Januar 2015)

Muss ich evt. erst den Datenbaustein komplet durch Adressieren damit es klappt ?

gruß Kleiny


----------



## Kleiny11 (31 Januar 2015)

Hat sich erledigt.
Lösung : zu hoher Merkerbereich hab jetzt MD 190 statt MD490 und es klappt.

Danke nochmal.
Gruß Kleiny


----------

