Pointeradresse erhöhen

tino2512

Level-1
Beiträge
86
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leuts

Nun hab ich mich mal hier im Forum angemeldet, da ich nicht weiter weis.
Ich habe folgendes Problem:
Ich möchte eine indirekte Adressierung mittels Pointerzugriffs vornehmen.
Es sollen verschiedene Messwerte eingelesen und in einem Datenbaustein abgelegt werden.
In einer Schleife beginnt der Pinter z.B bei P#0.0
nun möchte ich, dass die Adresse des Pointers beim nächsten Schleifendurchlauf um 16 erhöht wird. (wichtig ist, dass die Bitadresse des Zeigers 000 bleibt)ich denke aber, dass das schon durch die Erhöhung um 16 garantiert wird.

Wer kann mir helfen?


Liebe Grüße Tino
 
Du brauchst einen Zähler.

Diesen musst du mit der Startadr. initialisieren. Nach dem Durchlauf der Schleife erhöhst du diesen um 16.

Code:
L 0
T Zähler
 
Loop: L Zähler
SLD 3
LAR1
 
L W[AR1,P#0.0]
T .....
 
L Zähler
L Abbruchbedinugn
>=D
spb ENDE
 
L Zähler
L L#16
+D
T Zähler
SPA Loop
 
ENDE: NOP 0

Die Abbruchbedingung habe ich jetzt nicht sauber geschrieben, denke dass du das kannst.

Gruß, pt
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Oder auch so:

Code:
      AUF   "STOERMELDUNGEN DB"
      L     P#0.0
      T     #pointer_1               //temp-Var DWORD
      L     0
      T     #ergebnis
 
      L     125                         //Anzahl Störmeldungen (Wortweise)
SC02: T     #zaehler
      L     DBW [#pointer_1]            // Lade Datenwort
      L     0                           // Lade 0
      ==I                               // keine Störmeldung !!!
      SPB   NUL2                        // Ergebnis nicht hochzählen
      L     #ergebnis                   // bei Erg <> 0 Ergebnis hochzählen
      L     1                           // um 1 erhöhen
      +I    
      T     #ergebnis
NUL2: NOP   0                           // Zeiger erhöhen aud nächstest DW
      L     #pointer_1
      L     P#2.0                         //hier kommt in deinem Fall P#16.0 rein
      +D    
      T     #pointer_1
      L     #zaehler
      LOOP  SC02                        // Schleife solange, bis #zaehler auf 0
      L     #ergebnis                   // bei Ergebnis <> 0 liegt Fehler vor
      L     0
      <>I   
      =     "M1.0 Sammelfehler"

Das Code-Fragment macht natürlich etwas anderes, es prüft ob in den 125 Worten ein Bit gesetzt ist. Etwas abgewandelt kannst du das aber verwenden.
 
die art wie plc_tippser das schreibt, nutze ich das in der regel auch.
so kann ich den zähler auch im weiteren prog, falls benötigt, noch als 'normale' variable nutzen.

grundsätzlich kannst du deinen pointer aber auch so erhöhen.
L P#16.0
+AR1

das entspräche diesen zeilen
L Zähler
L L#16
+D
SLD 3
LAR1
 
grundsätzlich kannst du deinen pointer aber auch so erhöhen.
L P#16.0
+AR1

das entspräche diesen zeilen
L Zähler
L L#16
+D
SLD 3
LAR1

Warum brauche ich den SLD 3 ?
verstehe das momentan nicht so richtig.

grüße tino
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Weil die "rechten" 3 Bit die Bitadresse darstellen.
Aus dem Grund das SLD3

Wenn du es ganz genau wissen willst einfach in der Hilfe von Step7 mal Pointer eingeben.

Mfg
 
grundsätzlich kannst du deinen pointer aber auch so erhöhen.
L P#16.0
+AR1
Richtig. halte ich auch für die schönere Methode.

L Zähler
L L#16
+D
SLD 3
LAR1

Warum brauche ich den SLD 3 ?
verstehe das momentan nicht so richtig.

grüße tino
In den rechten 3 Bits steckt die BITadresse (0..7), die wird damit ausgebendet. Esrt ab Bit 4 steckt die Wortadresse. (Tip: Ist in der S7 Onlinehilfe auch schön beschrieben)


edit:
@msb:
Huch, da war ich wohl etwas langsam mit dem tippen :)
 
Ja, das stimmt mit dem direkten erhöhen. Ich habe nur eine Variable durch eine Konstante für dieses Thema ersetzt. Ich versuche solche Sachen immer nur einmal zu schreiben.
Für einmalige Anwendungen ist das ohne SLD sicherlich einfacher.

Gruß, pt
 
Zurück
Oben