Step 7 Datenbaustein mit Pointer durchsuchen

Günni1977

Level-1
Beiträge
232
Reaktionspunkte
25
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo an alle,
ich habe ein Problem mit Pointern. Mache dies auch eher zum ersten mal.
Ich habe einen DB mit 10 REAL-Werten ab Wort 0.
Nun will ich einen Eingangswert lesen und den nächst größeren bzw. nächst kleineren Wert aus dem DB wissen (beide).
Gleichzeitig will ich wissen, auf welchem Wert mein Pointer zeigt, um einen anderen DB mit dem Pointerwert zu durchsuchen.

Bsp:
Im DB1 steht im DW 20 der Wert 40.
Im DB1 steht im DW 24 der Wert 50.

Als Eingang lese ich 45.

Nun brauche ich die Werte 40 (<Eingang), 50 (>Eingang) und den Wert 24 (Doppelwort im DB).

Erstmal geht es mir nur um die Pointerposition, im Beispiel das DW 24. Diese soll erstmal in #Kennwert stehen.

Mein Code sieht so bisher aus:
L 0
SLD 3
LAR1

L 10 // Durchläufe Schleife
loop: T #LoopCounter // Schleifenzähler
AUF "DB7 Array Pointer"
L DBD [AR1,P#0.0] // Wert im DB größer/gleich
L #x_IN // dem gegebenem X-Wert?
>=R
SPB MAX
L P#4.0 // Adressregister um 4 Byte erhöhen
+AR1 // -> nächster REAL-Wert im DB
L #LoopCounter // Schleifenzähler
LOOP loop // Schleife fortsetzen
MAX: NOP 0
LAR1
T #Kennwert // Ausgang


sorry wenn es schlecht lesbar ist. Ich weiß nicht, wie ich den Code hier sonst leserlich anzeigen soll.
 
OK ... wo ist jetzt das Problem ?

Wenn du den Code in ein Extra-Fenster setzen willst so nimmst du dafür die Code-Tags - die werden z.B. gesetzt über das Feld mit dem "#" im Antwort-Fenster.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
1. AUF DB vor der Schleife, das spart Zeit
2. um den Inhalt des Adressregisters in den Akuu 1 zu laden benutze TAR1 (bzw. TAR2)
3. um die Position dann richtig lesen zu können ist die Division durch 8 bzw. das Schieben nach Rechts um 3 notwendig
4. die Zeilen L P#4.0; +AR1; kann man abkürzen in +AR1 P#4.0
 
5. da du sowieso bei 0 starten möchtest erübrigt sich das SLD 3 bei Verwendung einer L#0 bzw. kannst du dein Adressregister gleich mit LAR1 P#0.0 vorbelegen
 
Danke. Hat mir alles sehr geholfen bisher.
Noch eine Frage: Pointer geht nur erhöhen und nicht erniedrigen, oder?

Also wenn ich einen Wert gefunden habe, kann ich nicht z.B. 4 Byte abziehen, um den vorherigen Wert zu bekommen?
Diesen müsste ich dann vorher schon zwischenspeichern.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Doch, du kannst auch erniedrigen, aber wenn du "unter" P#0.0 kommst, dann greift er sehr hoch in den DB, denn dann ist die Adresse eine sehr hohe positive!
 
Zurück
Oben