Pointer und Arrays

SolSna

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich möchte einen Wert mit Hilfe vom Pointer und Array bei jedem neuen Zyklus in den nächsten Array- Bereich speichern/schreiben.
Dabei sollen z.B. 30 Werte in DB150 Adresse +100.0 ARRAY[0..29] (DWORD) gespeichert werden


Das Programm sieht z.B. wie folgt aus:

Code:
U "Fl_Lernen_aktiv"
S #id_LernenAktiv
UN #id_LernenAktiv
SPB m001

L 100
SLD 3
LAR1

U "Takt_100"

L 220
SLD 3
TAR1
>=D

R #id_LernenAktiv

AUF DB90
AUF DI150

L DB90.DBD14
T DID [AR1,P#0.0]

TAR1
INC  32
LAR1

m001: .....
Das Problem dabei ist, dass mein AR bei jedem Zyklus wieder mit dem Wert 100.0 überschrieben wird, anstatt bei 104.0 weiter zu machen.
Wie könnte ich dies geschickt lösen?
 
Zuletzt bearbeitet:
Ohhh, da ist aber ne Menge durcheinander. Schau dir mal den Beitrag hier an, besonders Volkers!

http://www.sps-forum.de/showthread.php?t=6364&highlight=LOOP

Dann bau deinen Code um und stell ihn wieder ein ;) .

PS: Ladebefehle sind nicht VKE-Abhängig. Deshalb ist

U M 10.0
L XY
T Z
R M10.1

nur für R M10.1 wirksam, Laden und Transferrieren erfolgt bei diesem Stück Code immer.

PS2: In deinem Fall wäre der SFC20 (BLK_MOVE) oder auch der LOOP-Befehl ganz sinnvoll. Suche mal im Forum nach diesen Begriffen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
grundsätzlich verstehe ich deinen code nicht so wirklich.
zu meinem verständnis.
du wilst im beim
ersten mal 30 dword in den db150 ab dbd 100 schreiben.
bei zweiten ab dbd 130. im dritten ab dbd 160. usw

Das Problem dabei ist, dass mein AR bei jedem Zyklus wieder mit dem Wert 100.0 überschrieben wird, anstatt bei 104.0 weiter zu machen.
Wie könnte ich dies geschickt lösen?
wieso 104.0?

1.logisch klappt das so nicht. du erzeugst ja durch den festwert immer den gleichnen pointer
L 100
SLD 3
LAR1

2. ich vermisse die schleife für den datenblock. du musst doch die words 0-29 in einem zyklus übertragen. dafür benötigst du einen schleifenzähler.
einfacher für komplette blöcke ist der sfc20 (blockmove)

so ganz scheinst du den pointer noch nicht verstanden zu haben.

schau in die FAQ.
die beiträge
Pointer Zeiger FIFO LIFO
Any-Zeiger für Datentypen

lies dir die mal intensiv durch und dann sehen wird weiter
 
Zuletzt bearbeitet:
ich möchte einen Wert mit Hilfe vom Pointer und Array bei jedem neuen Zyklus in den nächsten Array- Bereich speichern/schreiben.
Dabei sollen z.B. 30 Werte in DB150 Adresse +100.0 ARRAY[0..29] (DWORD) gespeichert werden

Also ich verstehe das Problem so:

Im DB150 befindet sich ab DBW100 ein ARRAY[0..29].

In jedem Programmzyklus wird nun ein Wert in ein Feld von dem ARRAY geschrieben.

Programmzyklus 1: Wert => ARRAY[0]

Programmzyklus 2: Wert => ARRAY[1]

...

Programmzyklus 30 : Wert => ARRAY[29]

Programmzyklus 31 : Wert => ARRAY[0]

Programmzyklus 32 : Wert => ARRAY[1]

...

Gruß Kai
 
Hallo!

Du brauchst nur ein Byte/Word in jedem Zyklus um 1 hochzählen mit einem Vergleicher der dir bei erreichen von 30 den Zählwert wieder auf Null setzt. Mit dem Zählwert bildest du dir einen Pointer mit dem du auf deine Werte und auf dein Array zugreifen kannst.

Nebenbei:
Kann man in AWL ein Array nicht indirekt adressieren wie in SCL?
zb: T "Daten".MY_ARRAY[#Zaehlwert]

godi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Du brauchst nur ein Byte/Word in jedem Zyklus um 1 hochzählen mit einem Vergleicher der dir bei erreichen von 30 den Zählwert wieder auf Null setzt. Mit dem Zählwert bildest du dir einen Pointer mit dem du auf deine Werte und auf dein Array zugreifen kannst.

Nebenbei:
Kann man in AWL ein Array nicht indirekt adressieren wie in SCL?
zb: T "Daten".MY_ARRAY[#Zaehlwert]

godi

Nein, geht nicht, nur Konstanten kann man da einsetzen und das bringt je dann nichts. Daher braucht man ja immer die indirekte Adressierung.

Noch ein Besp.: L "Test".Test[1, 1] geht, aber für die 1 kann man keine Variable einsetzen. Das wär schön, wenn es ginge!
 
Zuletzt bearbeitet:
ja, leider geht das nicht.

aber so schlimm ist das bilden des zeigers nun auch wieder nicht

l zählwert
l 4
*i
l 100
+i
sld3
lar1

l db10.dbd100
auf db150
t dbd[ar1,p#0.0]
 
@Kai: Genauso hatte ich es gemeint!


Hab das jetzt mal so gelöst (hoffe dass es so stimmt, falls nicht bitte ich um Verbesserungsvorschläge)

Code:
      U     "Spindel_EIN"
      U     "Programm_START"
      U     "LERNEN"
      FP    M      1.0
      =     "Fl_Lernen_aktiv"       // Merker Pos.Flanke Lernen  

      U     "Fl_Lernen_aktiv"
      S     #id_LernenAktiv             

      UN    #id_LernenAktiv
      SPB   LEND                        

      UN    "Fl_Lernen_aktiv"
      SPB   AKT

      L     500                    //Beginn der Adresse in der sich Array befindet
      T     #id_Zeiger

AKT:  NOP   0

      UN    "f_Takt_100"       //Taktzeit 100ms
      SPA   LEND

      L     #id_Zeiger                  
      SLD   3                           // Wert in Pointerformat umwandeln
      LAR1  

      AUF   DB    90       
      AUF   DI   150                    

      L     DB90.DBD14                    // aktueller Wert
      T     DID [AR1,P#0.0]            

      TAR1                              
      SRD   3
      INC   4                                  //Poniterwert um 4 erhöhen
      T     #id_Zeiger

      L     2100
      >=D                                    //Wenn Wert 2100 erreicht -> Array Voll
      R     #id_LernenAktiv             //...Sprung in "Aktueller-Wert- Kurve"

      SPA   LEND

LEND: NOP   0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
U     M      0.7                  //Bedingung
      FP    M      1.0                  //Flanke
      SPBN  LEND
      L     #count
      L     120
      <D                                //30 Werte schreiben
      SPBN  zero
      L     500                         //Anfangsadresse
      L     #count
      +D    
      T     #adresse
      SLD   3
      LAR1  
      L     DB90.DBD   14               // aktueller Wert
      AUF   DB   150
      T     DBD [AR1,P#0.0]
      L     #count
      L     4
      +D    
      T     #count
      SPA   LEND
zero: L     0                           //Zähler nullen
      T     #count
LEND: NOP   0
so besser...

kannst aber den Pointer gleich weglassen und indirekt addresieren:
L DB90.DBD 14 // aktueller Wert
AUF DB 150
T DBD[#adresse]
 
Zuletzt bearbeitet:
Ich wollte mal noch an das Thema indirekte Adressierung eine Frage anknüpfen:

Ich habe in meinem FB ein ARRAY (DLMS) deklariert und eine Integer (i_CRC) Variable. Zuerst wollte ich dieses Array durchlaufen mit
L DLMS[i_CRC]

Wie ich hier weiter oben gesehen habe funktioniert das ja so nicht wirklich. Leider habe ich nur Beispile emit DB Zugriffen gesehen. Wie funktioniert das hier?
 
Zurück
Oben