Auf DB-Inhalt zugreifen

delacasa

Level-1
Beiträge
48
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

derzeit bastele ich an einem FB herum und habe augenblicklich folgendes Problem:

Unter anderem kann man am Eingang meines FB's als Input-Variable einen Global-DB verknüpfen. Wie kann ich nun innerhalb des FB's auf die einzelnen Adressen des verknüpften DB's zugreifen? Mir z.B die Adresse 2.0 holen und weiterverarbeiten. Ich möchte eine Art Pointer programmmieren, der innerhalb einer Schleife immer auf die nächste Adresse im angeschalteten DB springt, bzw. hochzählt. Es wäre schön, wenn mir diesbezüglich einer weiterhelfen könnte...

Danke!

Grüsse delacasa
 
Hallo Kollege,

anbei ein Programmbeispiel wie man so etwas bewerkstelligen kann.

Kurze Erläuterung dazu:

1. Das Adressregister 1 muss gesichert werden, da wir es in unserem FB
selber verbiegen werden.

2. Da der FB wahrscheinlich Multiinstanzfähig werden soll muss der Adressoffset des aufrufenden FB´s ermittelt werden.

3. Der übergebenen Zeiger wird mit dem Adressoffset verrechnet.

4. Der Zeiger wird in seine Bestandteile DB-Nummer und Adresse zerlegt

5. Die Adresse wird in das Adressregister geladen

6. Der ermittelte DB wird aufgeschlagen

7. Im Schleifenbeispiel wird pro Aufruf 15 mal die Schleife ausgeführt.
Dabei werden jeweils 2 aufeinanderfolgende Worte geladen.
Nach jedem Schleifendurchlauf wird das Adressregister um 4 Byte erhöht,
somit werden beim nächsten Durchlauf die 2 nächsten Worte geladen.
Innerhalb der Schleife können die geladenen Worte dann beliebig weiterverarbeitet werden.

8. Zum Schluss muss das Adressregister wieder zurückgesichert werden

Ich hoffe Dir damit geholfen zu haben ;)
 

Anhänge

  • indirekte Adressierung s7.txt
    2,5 KB · Aufrufe: 156
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab mir grad eben einen Baustein geschrieben mit dem ich mir REAL-Werte in einen DB schreiben kann, angetriggert mit einem Impuls.
Vielleicht kannst du ja damit was anfangen :)

Hier die AWL-Quelle:
 

Anhänge

  • awl.txt
    1,2 KB · Aufrufe: 97
Danke Euch beiden. Schon einmal ein Anfang. Bin nämlich ein Neuling in Sachen indirekter Adressierung. Morgen mache ich weiter. Den DB habe ich schon. Er sieht folgender Maßen aus:

0.0 dummy
2.0 xxxx vom Typ int
4.0 xxxx vom Typ int
6.0 xxxx vom Typ Word
8.0 xxxx vom Typ Word
10.0 xxxx vom Typ int
12.0 xxxx vom Typ int
14.0 xxxx vom Typ Word
16.0 xxxx vom Typ Word
'
'
V
usw

Der Pointer soll nun solange die Zeilen abklappern, bis die erste Int-Variable eine 0 enthält. Er soll immer 4 Zeilen lesen und jeweils auf vier interne Variablen im FB schreiben. Ich benötige dafür eine Art Schleifenprogrammierung. Vielleicht kann mir noch Einer von Euch auf die Sprünge helfen.

Danke!
delacasa
 
Such in Step7 mal nach LOOP, das ist der Schleifenbefehl, ein Beispiel ist auch dabei. Zu indirekter Adressierung hast du ja schon etwas, bei Step7 mal unter 'indirekt' suchen (Nimm den Reiter "SUCHEN" in der Hilfe, dann findest du auch die Beispiele dazu.).

Hier mal noch ein einfaches Beispiel mit Schleife und indirekter Adressierung:

Code:
      AUF   "STOERMELDUNGEN DB"
      L     P#0.0
      T     #pointer_1
      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
      +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"
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So in etwa könnte das aussehen, da müsstest du jetzt noch was dran machen weil die statischen Variablen durch die Schleife immer wieder überschrieben werden bis die besagte 0 kommt.

Code:
      UN    #Enable                     // keine Freigabe
      BEB                               // Baustein beenden
      AUF   #Arbeits_DB                 // DB aufschlagen
      L     #Offset                     // Anfangsadresse in Byte
      SLD   3                           // 3Bit links 
      LAR1                              // Pointer in Adressregister 1
loop: L     DBW [AR1,P#0.0]             // wenn erste INT = 0
      L     0                           // *
      ==I                               // *
      BEB                               // Ende
      L     DBW [AR1,P#0.0]             // Anfangsadresse
      T     #INT_1                      // statisch 1
      L     DBW [AR1,P#2.0]             // +2 Byte
      T     #INT_2                      // statisch 2
      L     DBW [AR1,P#4.0]             // +4 Byte
      T     #WORD_1                     // statisch 3
      L     DBW [AR1,P#6.0]             // +6 Byte
      T     #WORD_2                     // statisch 4
      TAR1                              // Adressregister in Akku
      L     P#8.0                       // hochzählen zum nächsten 
      +D                                // 4er Paket
      LAR1                              // neue Adresse Register
      SPA   loop                        // Schleife

Den DB würde ich in STRUCt´s von jeweils deinen 4 Werten aufteilen
 
Zuletzt bearbeitet:
Zurück
Oben