# Arrays in S7 schreiben



## CrazyCat (19 Januar 2006)

Ist es möglich für die S7 so etwas wie eine for - Schleife in C oder Basic zu schreiben?

Die Schleife würde in etwa o aussehen:

for (i = 1 to 100 step 1)
      (Berechnungen)
      .
      .
      .
      Ergebnis_ = zwischen * exp (hilf)
next

Ich schaffe es nicht das Array über eine Variable zu schreiben.

Kann die S7 so etwas als AWL - Code.

Konkret ist mein Feld im DB151 und beginnt ab der Adresse DBD8. Die Variablen sind REAL - Variablen._


----------



## volker (19 Januar 2006)

kannst du mit scl machen

geht aber auch leicht mit pointern in awl


```
L     #Datenanfang
      T     #akt_dw

anf:  NOP   0                           //schleifenanfang

      L     #akt_dw
      SLD   3
      LAR1  
...
...
      T     DBD [AR1,P#0.0]

      L     #akt_dw
      L     4
      +D                                //nächstes dw
      T     #akt_dw
      L     #Datenende
      >D    
      SPB   ende                        //Schleifenende erreicht

      SPA   anf                         //zum Schleifenanfang
ende: nop 0
```


----------



## Ralle (19 Januar 2006)

Oder mit dem Loop-Befehl, siehe Hilfe in Step7.


----------



## CrazyCat (20 Januar 2006)

Danke!


Damit das funktioniert muss ich den DB zuerst öffnen, oder?

AUF  DB151 //??????

Dann übertrage ich nur die Zahl der Anfangsadresse in akt_dw.

Also bei DB150.DBW20 muss in akt_dw 20 stehen, richtig?

Was bewirkt SLD3?

Wofür ist der Zusatz p#0.0?

Für akt_dw ist nur der Datentyp INT zulässig, oder?

Die Suche nach LOOP hat nichts ergeben.


----------



## volker (20 Januar 2006)

Damit das funktioniert muss ich den DB zuerst öffnen, oder?

>>AUF  DB151 //??????
richtig

>>Dann übertrage ich nur die Zahl der Anfangsadresse in akt_dw.
>>Also bei DB150.DBW20 muss in akt_dw 20 stehen, richtig?
richtig

>>Was bewirkt SLD3?
macht einen pointer aus akt_dw

>>Wofür ist der Zusatz p#0.0?
ist der versatz des pointers
wüdre hier z.b. p#4.0 stehen würdest du nicht auf dbd20 sondern auf dbd24 zugreifen

>>Für akt_dw ist nur der Datentyp INT zulässig, oder?
sollte doch wohl reichen,oder? oder hast du einen db der dw mit einer adresse > 32768 hat.  :wink:


----------



## CrazyCat (20 Januar 2006)

Nochmals danke!

Werd' das sofort versuchen.

SLD bewirkt also einen Pointer, p#0.0 steht für den Versatz. Das ist für die Dokumentation sehr wichtig.

Der Kunde liest diese ständig und fragt bei solchen Sachen immer nach.
Würde schlecht aussehen, wenn ich nicht erklären könnte was der Befehl bewirkt.


----------



## Ralle (20 Januar 2006)

Es geht ja auch ohne Loop, hier nur mal aus der AWL-Hilfe von Step7:

Format



> LOOP <Sprungmarke>
> 
> Operand	Beschreibung
> <Sprungmarke>	Symbolischer Name des Sprungziels.
> ...


----------



## SPS.bz (21 Januar 2006)

*Schleife in AWL*

Hallo,

mit der S7 gibt es mehrere Möglichkeiten der Schleifenprogrammierung, durch die verschieden Softwareprodukte, die Siemens für die Steuerung anbietet.

Hier eine Lösungsmöglichkeit in AWL:


```
// Schleifen Voreinstellung
      L     L#0                         			// Schleifen anfangswert laden
      T     #DIT_Schleifenwert          		// Schleifenanfangswert laden

      L     L#1234                      		// Letzte Adresse zum bearbeiten
      T     #DIT_Schleifenende          		// Schleifenende speichern


// Schleifenausführung

RS50: L     DBD [#DIT_Schleifenwert]    	// DB-Bytewert zurücksetzen

// --- Aktion mit den geladenen Wert ---
// --- Ende ---

// Kontrolle auf Schleifenende

      SET                               		// VKE-1 laden
      L     #DIT_Schleifenwert          	// Schleifenanfangswert laden
      L     L#32                         		// Wert für Adressanpassung laden
      +D                                		// Adresse anpassen
      T     #DIT_Schleifenwert          	// Schleifenanfangswert speichern
      SRD   3                           		// Adresse für Schleifenende Kontrolle anpassen
      L     #DIT_Schleifenende          	// Schleifenende laden
      <D                                		// Wenn noch nicht alle Werte bearbeitet, dann
      SPB   RS50                        	// Sprung für erneuten Schleifendurchlauf
```

Wenn du noch Fragen hast, oder noch andere Varianten benötigst, melde dich bitte.[/code]


----------



## emilio20 (2 Dezember 2010)

volker schrieb:


> kannst du mit scl machen
> 
> geht aber auch leicht mit pointern in awl
> 
> ...



Kann mir jemand das in fup darstellen?


----------



## Paule (2 Dezember 2010)

emilio20 schrieb:


> Kann mir jemand das in fup darstellen?


Nein.
Indirekte Adressierung geht nur mit AWL oder SCL


----------



## emilio20 (3 Dezember 2010)

wie würde mann so was in fup machen?


----------



## M-Ott (3 Dezember 2010)

Gar nicht!


paule schrieb:


> indirekte adressierung geht nur mit awl oder scl


----------



## dentech (29 Juni 2012)

Hi,wenn ich diese Schleife benutzen will bekomme ich immer Syntax Error, was mache ich falsch?





> // Schleifen Voreinstellung
> L     L#0                                     // Schleifen anfangswert laden
> T     #DIT_Schleifenwert                  // Schleifenanfangswert laden
> L     L#1234                              // Letzte Adresse zum bearbeiten
> ...



Der Fehler tritt bei "RS50: L DBD" auf


----------



## bike (29 Juni 2012)

dentech schrieb:


> Hi,wenn ich diese Schleife benutzen will bekomme ich immer Syntax Error, was mache ich falsch?
> 
> Der Fehler tritt bei "RS50: L DBD" auf



Wie bzw als was ist die Variable #DIT_Schleifenwert deklariert?


bike


----------



## dentech (29 Juni 2012)

Die ist als int deklariert


----------



## martin1988 (29 Juni 2012)

Ein Pointer ist aber grundsätzlich 32bit lang und zeigt die Startadresse in Bit an ...


----------



## Verpolt (29 Juni 2012)

dentech schrieb:


> Die ist als int deklariert




```
RS50: L     DB[COLOR=#ff0000]D[/COLOR] [#DIT_Schleifenwert]
```

W=Word / Int
D = Doppel Word / Int


----------



## Ralle (29 Juni 2012)

Du mußt die Variable #DIT_Schleifenwert als Temp deklarieren und besser als DWord.


```
// Schleifen Voreinstellung
      L     L#0                         // Schleifen anfangswert laden
      T     #DIT_Schleifenwert          // Schleifenanfangswert laden
      L     L#1234                      // Letzte Adresse zum bearbeiten
      T     #DIT_Schleifenende          // Schleifenende speichern// Schleifenausführung
RS50: L     DBD [#DIT_Schleifenwert]    // DB-Bytewert zurücksetzen
// --- Aktion mit den geladenen Wert ---
// --- Ende ---
// Kontrolle auf Schleifenende
      SET                               // VKE-1 laden 
      L     #DIT_Schleifenwert          // Schleifenanfangswert laden 
      L     L#32                        // Wert für Adressanpassung laden 
      +D                                // Adresse anpassen 
      T     #DIT_Schleifenwert          // Schleifenanfangswert speichern 
      SRD   3                           // Adresse für Schleifenende Kontrolle anpassen
      L     #DIT_Schleifenende          // Schleifenende laden
      <D                                // Wenn noch nicht alle Werte bearbeitet, dann
      SPB   RS50                        // Sprung für erneuten Schleifendurchlauf
```

Code stellst du bitte mit den Code-Tags dar, wer soll das sonst lesen können?


----------



## PN/DP (29 Juni 2012)

Was sagt die Step7-Hilfe zu AWL beim Thema "Speicherindirekte Adressierung"? (praktischerweise mit F1 aufrufbar)

Pointer im Wordformat können nur für die speicherindirekte Adressierung von T, Z, DB, DI, FB, FC benutzt werden.
Für die speicherindirekte Adressierung von E, A, M, L, DIx, DBx, PEx, PAx müssen Pointer im *Doppelwortformat* verwendet werden, welche die genaue Adresse eines Bits, Bytes, Worts oder Doppelworts angeben: P#Byte.Bit . Bei Pointern auf Byte, Word oder Doppelword muß die Bitadresse 0 sein.

#DIT_Schleifenwert muß also ein DWORD oder DINT sein.

Wenn man versucht, das originale Programmbeispiel zu verstehen, dann sieht man höchstwahrscheinlich auch, daß das Programmbeispiel mit +D und >D arbeitet ...




Verpolt schrieb:


> ```
> RS50: L     DB[COLOR=#ff0000]D[/COLOR] [#DIT_Schleifenwert]
> ```
> 
> ...


Der Datentyp von #DIT_Schleifenwert hat nichts mit dem DBD zu tun, auch DBW[#DIT_Schleifenwert] erfordert einen Pointer im Doppelwortformat ...

Harald


----------



## Ralle (29 Juni 2012)

Auch wenn ich es schon geschrieben habe: In einem FB muss #DIT_Schleifenwert als Temp deklariert werden. Eine STAT führt ebenfalls zu einer Fehlermeldung!


----------

