Überprüfen: Programm mit Schleife zum Vergleich eines Werts mit Werten in DB

Zuviel Werbung?
-> Hier kostenlos registrieren
Ein DB kann doch nur max 64kB groß sein, oder???
In diese Gefilde kommt er mit dem +AR1 Befehl eh nicht.

Wie weit kann AR1/AR2 adressieren? Um jetzt nichts falsches zu schreiben,
mußte ich das erst nachlesen und ausprobieren.

Als Konstante Adresse kann man maximal P#65535.7 laden (LAR1 P#65535.7).
Mehr läßt der Step7-AWL-Editor nicht zu.
Man kann also schon weiter Adressieren, als ein DB überhaupt lang sein kann
(P#DBX65535.7 ist größer als 65534).

Über den Umweg Akku1 oder per +AR1 P#x.y (notfalls mehrmals) kann man die
AR-Register bis max P#2097151.7 (ca. 2MB) bringen.
Mehr geht nicht mit 24 Bit Adresse und 8 Bit Bereichskennung.
Wenn man dann noch etwas zum AR dazuaddieren will, dann wird die Addition
tatsächlich ausgeführt und das AR-Register hat einen klassischen Überlauf
(fängt wieder "unten" an).
Eine Adresse > P#65535.7 zeigt natürlich garantiert ins nirgendwo, ist aber
möglich.

Zum Programmentwurf von ibanesch:
Beim Aufruf mit der maximal möglichen DB-Länge und wenn #Can_msg nicht
gefunden wird wäre die Schleife 65536 mal durchlaufen worden und AR1 hätte
am Ende auf P#131072.0 gestanden (65536 * P#2.0).
(das wäre natürlich nur mit OB121 gegangen)

Harald
 
Wie Kollege online schon im Beitrag #3 bemerkte, macht man Schleifen eigentlich so, daß man
schon vor der Schleife die maximale Anzahl Schleifendurchläufe festlegt und dann mittels LOOP
den Schleifenzähler rückwärts bis 0 laufen läßt. (das macht sogar die Schleife etwas schneller)
Dann können solche berechenbaren unberechenbaren Programmabläufe gar nicht erst passieren.
Das würde dann so aussehen: (nun wird das Programm langsam perfekt;))
Code:
      L     P#0.0
      LAR1  
      AUF   #DB_nummer
      SET
      L     DBLG        // DB-Länge in Byte (0..65534)
      L     2
      /I                // auf Anzahl Words bringen ...
      SPZ   M003        //   Nix suchen, DB ist nur 0 oder 1 Byte lang!
M001: T     #S_ZAE      // und als maxAnzahl_Schleifenzähler zuweisen

      L     #Can_msg
      L     DBW [AR1,P#0.0]
      ==I   
      S     #treffer
      SPB   M002

      +AR1  P#2.0       // AR1 auf nächstes Word stellen
      L     #S_ZAE
      LOOP  M001        // --S_ZAE > 0 ? SPB M001 : Ende Schleife

M003: R     #treffer
      L     0           // Ersatzwert bei nicht gefunden
 
M002: T     #code

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke

Na wenn das hier mal keine qualifizierte Hilfe ist !
Dieser Thread hat ja das Niveau eines Siemens Lehrgangs. :s12:

@PN/DP
Ich hoffe der TE weiß deine Leistung zu schätzen!

Gruß
Toki
 
Zurück
Oben