Step 7 AWL: Loop Problem

Sickone4

Level-2
Beiträge
68
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

ich möchte folgende Codestruktur gerne einfacher / übersichtlicher gestalten.
Sinn: löschen eines einegangs/ausgangsbereiches in einem db.

es gibt sicherlich mehrere lösungen, von SL seite her würde ich es mit einer forschleife machen, in AWl geht glaube ich nur mit dem loop und da hab ich so gut wie garnicht mit gearbeitet und bräuchte hilfe:

Code:
L     0 
// Nutzdaten
      T     #Read.Nutzdaten[0]
      T     #Read.Nutzdaten[1]
      T     #Read.Nutzdaten[2]
      T     #Read.Nutzdaten[3]
      T     #Read.Nutzdaten[4]
      T     #Read.Nutzdaten[5]
      T     #Read.Nutzdaten[6]
      T     #Read.Nutzdaten[7]
      T     #Read.Nutzdaten[8]
      T     #Read.Nutzdaten[9]
      T     #Read.Nutzdaten[10]
      T     #Read.Nutzdaten[11]
      T     #Read.Nutzdaten[12]
      T     #Read.Nutzdaten[13]
      T     #Read.Nutzdaten[14]
      T     #Read.Nutzdaten[15]
      T     #Read.Nutzdaten[16]
      T     #Read.Nutzdaten[17]
      T     #Read.Nutzdaten[18]
      T     #Read.Nutzdaten[19]
      T     #Read.Nutzdaten[20]
      T     #Read.Nutzdaten[21]
      T     #Read.Nutzdaten[22]
      T     #Read.Nutzdaten[23]
      T     #Read.Nutzdaten[24]
      T     #Read.Nutzdaten[25]
      T     #Read.Nutzdaten[26]
      T     #Read.Nutzdaten[27]
 
// Schreibepuffer
      T     #Write.Puffer[0]
      T     #Write.Puffer[1]
      T     #Write.Puffer[2]
      T     #Write.Puffer[3]
      T     #Write.Puffer[4]
      T     #Write.Puffer[5]
      T     #Write.Puffer[6]
      T     #Write.Puffer[7]
      T     #Write.Puffer[8]
      T     #Write.Puffer[9]
      T     #Write.Puffer[10]
      T     #Write.Puffer[11]
      T     #Write.Puffer[12]
      T     #Write.Puffer[13]
      T     #Write.Puffer[14]
      T     #Write.Puffer[15]
      T     #Write.Puffer[16]
      T     #Write.Puffer[17]
      T     #Write.Puffer[18]
      T     #Write.Puffer[19]
      T     #Write.Puffer[20]
      T     #Write.Puffer[21]
      T     #Write.Puffer[22]
      T     #Write.Puffer[23]
      T     #Write.Puffer[24]
      T     #Write.Puffer[25]
      T     #Write.Puffer[26]
      T     #Write.Puffer[27]

Könnte mir bitte jemand sagen, wie ich das am einfachsten machen kann und was ich für variablen benötige?

Vielen Dank,
Gruß Sven
 
da gibts doch SFB's dafür glaube war Blockmove ...
Da schreibst halt Null auf den Bereich und gut ist's
 
Zuviel Werbung?
-> Hier kostenlos registrieren
AWL-Hilfe Stichwort: Indirekte Adressierung
- Speicherindirekte Adressierung: T DBB [#temppointer]
- Bereichsinterne, registerindirekte Adressierung: T DBB [AR1, P#0.0]
- Bereichsübergreifende, registerindirekte Adressierung: T B [AR1, P#0.0]

Siehe auch: Hilfe zu AWL > Programmierbeispiele > Beispiele zu Datentypen und zur Adressierung > Beispiel zur speicherindirekten Adressierung (und weitere Beispiele)

Weitere Möglichkeit: SFC21 FILL, evtl. auch SFC20 BLKMOV


Wie/wo sind #Read und #Write deklariert?
Wo willst Du den Programmcode einbauen? In einen FB oder FC?

Harald
 
In AWL könnte sowas z.B. so aussehen.
Code:
      L     20                          // anzahl Schleifendurchläufe

Anf:  T     #Index
      L     0
      LAR1  P##testarray                // hier wird das array angegeben. Ich hab hier ein "testarray[0..100] of INT" definiert
      L     #Index                      // Lade den derzeitigen Index in den Akku
      L     2                           // da Array aus INT mit zwei Multiplizieren
      *I                                //mit 2 multiplizieren, da eine Int aus 2 Byte besteht
      L     2
      -I                                // weil loop bei 0 ausspringt würde index 0 nie beschrieben werden. darum bei index 2 auf adresse 0 schreiben bei index 4 auf adresse 2 etc.
      SLD   3                           // Schiebe den Wert im Akku um 3 Bits nach links (Pointer)
      +AR1                              // zum akku dazuzählen


      L     0                           // den wert der in die einzelnen Arrayelemente kopiert werden soll (kann vorgängig natürlich erheblich mehr rechnungen haben)
      T     W [AR1,P#0.0]               // da das Adressregister berechnet wurde kann jetzt da rein kopiert werden.


      L     #Index                      // index in akku laden um loop zu adressieren
      LOOP  Anf                         // Loop wenn index noch grösser 0 ist. ansonsten wird ausgesprungen

Jetzt frag dich selber. Ist das übersichtlicher? Der Leistungsverbrauch ist wohl sogar höher.
Dafür ist SCL eigentlich sowas von geschaffen. Da versteht noch jeder was da abläuft.
 
hm ob das übersichtlicher ist weiß ich nicht. anfangs wollte ich den Baustein in SCL schreiben, jetzt ist es eher so, dass ich das in AWl gemacht habe und da nicht extra einen scl baustein reinladen möchte!

danke für die infos.

p.s. bei einem INT würde ich mit
L p#2.0
+AR1
arbeiten um den direkt um zwei zu erhöhen!

gruß sven
 
Zurück
Oben