Indirekte Adressierung in AWL

Bensen83

Level-1
Beiträge
777
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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
 
Hallo Bensen,

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

Code:
   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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Paule,

dachte eher an so was...

Code:
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
 
Zuletzt bearbeitet:
Code:
UN #SK_fertig
SPB END1
 
AUF DB5
 
L DB50.dbd66
T dbd [MW 490]   [COLOR=red]// OL LA LA das geht schon mal in die Hose ;)[/COLOR]
[COLOR=#ff0000]// Da ist doch glatt der falsche DB auf.[/COLOR]
 
L MW490
L 4
+D
T MW490  // [B][COLOR=#ff0000]Zeiger[/COLOR][/B] erhöhen

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 :D
 
Du merkst aber auch alles!

hier die korrigierte Fassung:

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
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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.

Code:
// 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. :)
 
@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!
 
@ RALLE:

Mach mich nicht schwach...

Laut Handbuch sollten es Doppelwörter sein...

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

dtsclipper
 
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:)
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
Code:
  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
 
Hat sich erledigt.
Lösung : zu hoher Merkerbereich hab jetzt MD 190 statt MD490 und es klappt.

Danke nochmal.
Gruß Kleiny
 
Zurück
Oben