Maximumabfrage

chivas

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


Ich habe folgendes Problem:
Ich habe eine Reihe von Eingabefelder für Zahlen (DB4.DBW2, DB4.DBW6, DB4.DBW10,....DB4.DBW86 )
Ich möchte jetzt aus dieser Reihenfolge die höchst eingegebene Zahl ermitteln.
Ich weis, wie man das in C++ mit einer for - Schleife löst, hab aber keine Ahnung wie ich das mit S7 und indirekter Adressierung lössen könnte.

Vielleicht könnte mir jemand einen Hinweis geben.

Beste Grüsse
Chivas
 
Guten Morgen,

vielen Dank für Euere Antworten und Denkanstösse.

Ich habe es einmal so versucht mit der indirekten Adressierung:

Code:
       L 0
       T DB1.MAXZAHL

        L 2
        T DB1.Abfragezähler

schl: L DB4.DBW[DB1.Abfragezähler]
        L DB1.MAXZAHL
        >
        SPBN ADDR  
 
        L DB4.DBW[DB1.Abfragezähler]
        T DB1.MAXZAHL

addr: L DB1.Abfragezähler
         L 4
         +I
         T DB1.Abfragezähler
         ==I
         SPBN schl

Da ich noch nie mit indirekter Adressierung zu tun hatte, würde ich mich freuen, wenn mir jemand sagen würde, ob diese Lösung funktionieren würde.

mfg chivas
 
Hallo Chivas,

der Pointer ist 32-bit groß und die Bits 0-3 repräsentieren die Bitadresse.
Es müsste also statt L 0, L 2 oder L 4 lauten:
L P#0.0, L P#2.0 oder L P#4.0;
oder nach den Ladebefehlen einen SLD 3-Befehl einfügen.
Bei der Arbeit mit Byte-befehlen muss die Bitadresse immer "0" sein.

Ich hoffe, ich habe mich verständlich ausgedrückt.

Gruß
raika
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hallöchen

hier dein verbesserte programm das es etwas verständlicher ist

die zeiger gleich als pointer angeben dann kannst du die 3 bits vergessen und er macht das von sich aus
 

Anhänge

  • s7_maxwert.jpg
    s7_maxwert.jpg
    36,9 KB · Aufrufe: 169
Vielen Dank für Euere Antworten!

Ihr habt mir beide weitergeholfen.
Eine Frage hätte ich noch zu dem Pointer, der mit die Abfrage macht, alle Datenwörter abgefragt. Mein letztes Datenwort ist DBD86. Wenn ich mit L P#86.0 abfrage hört er schon viel zu früh auf mit den Abfragen.

mfg chivas
 
Im Beispiel von KPeter werden Datenwörter ausgelesen (in Datenwort-Schritten, alle 2 Byte)

Du hattest folgendes geschrieben:
Ich habe eine Reihe von Eingabefelder für Zahlen (DB4.DBW2, DB4.DBW6, DB4.DBW10,....DB4.DBW86 )

Das L P#2.0 also durch L P#4.0 ersetzen.

Wenn ich mit L P#86.0 abfrage hört er schon viel zu früh auf mit den Abfragen

Überprüfe das nocheinmal, er hört auf, wenn der Zeiger P#86.0 erreicht hat. Da du momentan in DW-Schritten abfragst, sollte das eigentlich um das Doppelte zu oft sein und nicht zu wenig.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
chivas schrieb:
Vielen Dank für Euere Antworten!

Ihr habt mir beide weitergeholfen.
Eine Frage hätte ich noch zu dem Pointer, der mit die Abfrage macht, alle Datenwörter abgefragt. Mein letztes Datenwort ist DBD86. Wenn ich mit L P#86.0 abfrage hört er schon viel zu früh auf mit den Abfragen.

mfg chivas
1. Um wieviel früher? Wenn es um 1 zu früh stoppt (bei DBD82), brauchst du > statt >=.
2. Du kannst dir einen Schleifendurchlauf sparen, indem du MAXZAHL auf den 1.Wert statt auf 0 setzt und mit dem 2. Element beginnst.
3. Wenn du immer eine feste Anzahl Werte hast, kannst du natürlich auch die Schleife sparen und Code für 42 Vergleiche schreiben. Das ist zwar lang, aber schneller :)
 
Im Beispiel von kpeter habe ich gemerkt, dass die Reihenfolge anders ist als wie ich es brauche. Dies habe ich bereits geändert.

Die Schleife wurde um 1 früher beendet. Der Grund war, weil ich am Schluss den Zähler um 4 erhöht habe und danach den Endwert abgefragt habe - deshalb hat er den letzten Vorgang nicht mehr abgearbeitet.

@Zottel:

Da ich mich jetzt ein kleinwenig auskenne mit der indirekten Adressierung bin ich wohl schneller damit als mit der ganzen Tipperei ;)

Danke an ALLE!

eine Frage noch: Als was definiere ich den Pointer in einem DB?
Wenn ich Ihn als Pointer anlegen will, lässt es Step 7 nicht zu

mfg chivas
 
Zurück
Oben