Step 7 Tabelle auslesen

Zuviel Werbung?
-> Hier kostenlos registrieren
Du mußt dich entscheiden, ob in deinem #Index eine Integer oder ein Pointer stehen soll.

Wenn du eine Integer nimmst (die Adresse als Int), dann steht im #Index

z.Bsp. 0, 4, 8,12 usw. wenn du auf Adresse 0.0, 4.0, 8.0, 12.0 im DB zugreifen willst.
Dann kannst du für die nächste Adresse +4 rechnen. Bevor du allerdings diese Int als Pointer verwenden kannst (also dies in das AR1 laden kannst) mußt du mit der Int ein SLD 3 durchführen (das entspricht einer Multiplikation mit 8 ), denn das Pointerformat enthält in den 3 letzten Bit die Bitadresse.

Int 4 --> SLD 3 macht daraus P#4.0

Wenn du immer mit Pointern in #Index arbeiten willst geht das auch, dann addierst du einfach immer P#4.0 zu deinem Index, aber nicht Int 4, das ergibt sonst Mist!

Also immer bei einem bleiben, Pointer oder Int!
 
Danke Borromeus.

Und mit einer IF-SChleife alle Werte abfragen bis ich meinen gefunden habe.
Binäre Suche geht so:

Angenommen du suchst Materialnummer 1234 in deiner Liste von 280 Einträgen.
Untergrenze für die Nummer des Eintrags (Arrayindex) ist 0, Obergrenze 279.

In der MItte liegt der Eintrag (279-0)/2 = 139 (abgerundet).

Du vergleichst das Gesuchte mit dem Eintrag in der Mitte, d.h. dem auf Platz 139.
Angenommen, der ist 1330.
Weil die Liste aufsteigend geordnet ist, weißt du jetzt, dass auch alle nachfolgenden Einträge danach größer sind.
Du brauchst nur noch in der unteren Hälfte zu suchen, von 0 bis 138.
Du setzt die Obergrenze auf 139-1

In der MItte liegt der Eintrag (138-0)/2 = 68 (aberundet).
Du vergleichst du mit diesem Eintrag.

Angenommen, der ist 630.

Weil die Liste aufsteigend geordnet ist, weißt du jetzt, dass auch alle vorhergehenden Einträge kleiner sind.

Du setzt die Untergrenze auf 68+1

Das machst du, bis du deinen Eintrag gefunden hast oder bis die Ober- und Untergrenze des Suchbereichs sich nur noch um 0 oder 1 unterscheiden.
 
Zuletzt bearbeitet:
Der TE kommt doch aus der Hochsprachenwelt.
Deshalb habe ich ihn gefragt, wie er das in C machen würde. Da wollte er auch mit allen Einträgen vergleichen.
Die Aufgabe kann man mit SCL wunderbar lösen.
Warum nicht mit SCL?
Klar. Aber SCL hat ja nicht jeder.

Wenn er sich aber schon einmal durch den Arrays-Zugriff in AWL quält, dann kann er auch gleich einen "guten" Algorithmus benutzen.

Das eine ist binäre Suche (Aufwand ceil (log2 n)) gegenüber dem Vergleich mit allen Werten (Aufwand n). Die andere Frage ist, ob man in ein SPS-Programm Schleifen einbauen soll. Es verlängert die Zykluszeit, aber schlimmer noch, es erschwert das Testen enorm: Hier im Beispiel hängt es von den Daten ab, ob die Suche einen oder die maximale Zahl oder etwas dazwischen Schleifendurchläufe erfordert.
Nun stellt euch vor, dass dasselbe Programm eine Positionieraufgabe enthält, wo eine Schaltfahne einen Endschalter betätigt.
Wenn nun die Suche nach einem Datum am Ende der Liste mit der Positionierbewegung im selben Zyklus zusammentrifft, wir der Endschalter überfahren...
Und nun such mal den Fehler!

Selbst wenn alles gut geht: Was ist, wenn im Laufe der Zeit mehr Daten hinzukommen?

Wahrscheinlich ändert sich der zu suchende Wert nicht sehr oft.

Unter dieser Vorraussetzung bietet es sich an, pro Zyklus nur einen Durchlauf der Schleife auszuführen.
Dazu braucht man einen Merker, der besagt, dass die Suche noch läuft.
Ist er 0, kann eine neue Suche gestartet werden.
Wenn eine Suche gestartet wird, setzt man den Schleifenzähler auf den Startwert und den neuen zu suchenden Wert.
Dann setzt man den Merker "Suche läuft"
Pro Zyklus wird nun eine Vergleich ausgeführt.
Wird der Wert gefunden, so setzt man den Merker "Suche läuft" zurück.
Das Ergebnis der Suche (Index auf Daten) ist nun gültig.
Wird das Ende der Liste erreicht, ohne dass der Wert gefunden wird, so kann man einen Fehlermerker setzen und man setzt den Merker "Suche läuft" ebenfalls zurück.
 
Zuletzt bearbeitet:
@Zottel
Die Problematik mit den Schleifen muß man natürlich beachten und entsprechend abschätzen.
Kleine Schleifen (so bis 30), die etwas suchen oder iterieren (also nicht zuviel Code enthalten), mache ich durchaus auch einmal, ansonsten gehe ich da ebenfalls vor wie du das vorschlägst.
Hängt auch ein wenig von der Geschwindigkeit ab, die die SPS vorlegt!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Morgen Zusammen,

Zu dem SCL, ich kann es nicht benutzen da wir es nicht haben:-(. Wäre mir auch lieber gewesen, aber was nicht da ist kann man nicht benutzen.


Wenn das Binäre Suche ist, dann hab ich das so ähnlich vorher versucht. Ich versuche mich gleich nochmal an der Schleifen geschichte.
Danke euch schonmal:)
 
Morgen zusammen,
nochmal vielen Dank für die Hilfe.
Ich habe es zum laufen gebracht, ein Fehler war das ich das verschieben um 3 nach links vergessen hatte.
Und zum anderen waren noch fehler in der "Grammatik".

Gruß
Dennis
 
Zurück
Oben