Step 7 AWL: In Abhängigkeit einer Index Datensätze[i] umladen,sp

anilo14

Level-1
Beiträge
38
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich will eine Rezeptverwaltung in AWL programmieren. Die Aufgabe besteht darin, in einem Datenbaustein DB100,
Rezepturdaten[1] bis Rezepturdaten[10] anzulegen. Die Rezepturdaten[index] beinhalteten 10 Bytes. Nun will ich in Abhängigkeit von index, die Daten in den Zielbereich umkopieren, umladen oder auslesen. Es soll also beispielweise 10 Bytes von Rezepturdatensatz[1] in das Rezepturdatensatz[index] gespeichert, umgeladen und oder aber auch gelöscht werden.
Für Umladen, Speichern und Löschen habe ich jeweils ein Bit vorgesehen.
Bisher habe ich eine UDT mit den Daten und im DB100 einen ARRAY[0..10] mit Bezug zum UDT 1 anlegt. Nun weiß ich nicht wie ich das Ganze in AWL realisieren soll, weil mir der Index ""reingrätscht":ROFLMAO:. In SCL habe ich das schon ein paar mal gemacht, in AWL leider noch nie.

Könnt ihr mir da weiterhelfen? Wie kann das realisieren?

Viele Grüße

anilo14

 
In AWL lässt sich der Index leider nicht direkt verwenden, sondern nur mit der sogenannten indirekten Addressierung. Der SCL Compiler macht im Prinzip nichts anderes.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Beispiel für die Adressberechnung index --> "DB100".Rezepturdatensatz[index]
Code:
// DB100: Rezepturdaten : ARRAY[0..10] : UDT 1

// es soll von Rezepturdatensatz[1] in Rezepturdatensatz[index] kopiert werden

// AR2 sichern, falls Code in einem multiinstanzfähigen FB verwendet werden soll
TAR2 #Save_AR2  //(DWORD in TEMP)

[COLOR="#0000FF"]// Pointer Quell-Datensatz
L    P#10.0     //Anfangsadresse des Rezepturdatensatz[1] im DB100
LAR1            //in Adressregister AR1

// Pointer Ziel-Datensatz
L    #index     //0..10 (Array beginnt mit Index 0)
SLD  3          //--> P#index.0 (Byteadresse)
L    10         //Länge eines Datensatz (UDT1)
*D              //--> P#Array[#index].0 (Offset im Array)
L    P#0.0      //Anfangsadresse des Array "Rezepturdatensatz" im DB
+D              //--> P#Rezepturdatensatz[#index].0
LAR2            //in Adressregister AR2
// (ab hier kann in FB nicht mehr auf Instanzdaten im IDB zugegriffen werden!)

// Datensatz kopieren (10 Byte)
AUF  "DB100" 
L    DBD [AR1, P#0.0]
T    DBD [AR2, P#0.0]

L    DBD [AR1, P#4.0]
T    DBD [AR2, P#4.0]

L    DBW [AR1, P#8.0]
T    DBW [AR2, P#8.0][/COLOR]

// AR2 wiederherstellen, falls Code in einem multiinstanzfähigen FB verwendet werden soll
LAR2 #Save_AR2
// (ab hier kann in FB wieder auf Instanzdaten im IDB zugegriffen werden)
Anstatt 'AUF "DB100"' kann man auch 'L "DB100".Rezepturdatensatz[0].erste_Variable' schreiben - das gibt genauere Referenzdaten (Geschmacksfrage).

Harald
 
Guten morgen,

vielen Dank für die Information, werde mir das mal verinnerlichen und werde das mal am Wochenende ausprobieren. Werde dann mal berichten, was Stand der Dinge ist.;)

Wünsche Euch noch ein schönes Wochenende

anilo14
 
Zurück
Oben