DB schnell durchsuchen

Gerri

Level-1
Beiträge
822
Reaktionspunkte
37
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, ich habe eine Aufgabe bei der mir irgendwie der Ansatz fehlt.

Ich habe einen DB der eine Struktur besitzt in der 2 Positionen (Längs und Höhe) gespeichert sind. (von einer Kamera aufgenommen)

Wenn ich nun mit meinem Werkzeug auf der Längsposition bin (ca 300mm nach der Kamera) muss ich die entsprechende Höhenposition anfahren.

dazu muss ich die Längsposition die gespeichert wurde aus einen DB auslesen.

Der DB ist nach FIFO aufgebaut.

Ich kann die Geschwindigkeit der Längsbewegung nicht beeinflussen da es sich um einen Wagen handelt der auch die Kamera mit sich trägt. Ausserdem handelt es sich bei dem Werkzeug um einen Schweissbrenner.

____________________________________________________________

um nun Schnell die richtige X-Position (die nächst grössere) zu finden muss ich den DB schnell durchstöbern.

Hat jemand einen Tipp?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Gerri,
ich kann dir leider nicht so recht folgen.
Wird der DB online aktualisiert (weil du von FIFO sprichst) oder ist es eine reine Lookup Tabelle? Also wenn du bissle genauer wirst, helf ich gerne.
Watchdog hat dich schon auf binäre Suche gebracht wenn die Daten sortiert sind. Vielleicht geht bei dir auch Interpolationssuche oder ist vielleicht sogar eine Indizierung möglich?

Du schreibst "schnell durchsuchen" also ist die Zykluszeit der Knackpunkt?
Vielleicht kannst du schon vorher anfangen den Start und Endindex einzugrenzen, also die Rechenzeit auf mehrere Zyklen aufteilen? Also wie gesagt, für mich bitte nochmal ausführlich beschrieben :)
Gruß von Andy
 
Hallo Gerri,

ich glaube ich verstehe was du vorhast. Bist du immer noch an dem SINAMICS-Projekt dran?
So etwas ähnliches musste ich bei mir auch realisieren.
Code:
DB1.DBD0        Wert_Höhe_0mm
DB1.DBD4        Wert_Höhe_1mm
DB1.DBD8        Wert_Höhe_2mm
.
.
.
DB1.DBD1200     Wert_Höhe_300mm
Du nimmst die Länge als "Index" für den Pointer und greifst damit dann auf den DB zu.

Code:
      L     Laenge
      SLD   4                         // für Pointernutzung
      LAR1  

      AUF   DB1
      L     DBD [AR1,P#0.0]            // P#0.0 - kein Offset im DB
      T     #benoetigte_Hoehe
Wenn mich nicht alles täuscht gibt es ein Problem wenn die Pointergröße 4096 übersteigt (also im AR1 ein Wert größer P#4096.0 steht).
Falls das der Fall sein sollte musst du mit einem ANY-Pointer arbeiten.
Wenn ich damit falsch liege, so korrigiere mich bitte jemand!!!

Ich weiß auch gerade aus dem Kopf nicht ob das SLD4 richtig ist oder ob es SLD3 war.

Gruß
Matthias
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würd da sogar mit 32 multiplizieren wollen (SLD5) ...

Grüße von HaDi

[edit]
SLD3 für Pointer-Format und nochmal SLD2 (mal 4), damit man das richtige DBD im DB trifft.
Zu beachten wäre dann noch, ob der Index bei 0 oder bei 1 startet.
[/edit]
 
Zuletzt bearbeitet:
Danke für die Korrektur HaDi hatte es gerade nicht mehr im Kopf!
Im Beispiel DB oben habe ich den Eintrag bei 0 anfangen lassen.
Sonst müsste er halt noch den Pointer um 1 dekrementieren. Mache ich
persönlich eher ungern weil im Fall das der Pointer auf 0 steht hast du danach -1 drin stehen
und müsstet diesen Fehlerfall wieder abfangen.
 
Zuletzt bearbeitet:
... um nun Schnell die richtige X-Position (die nächst grössere) zu finden muss ich den DB schnell durchstöbern.

Hat jemand einen Tipp?

Ob mein Vorschlag schnell ist, das ist wahrscheinlich Ansichtssache ...
Ich würde hier ein SCL-Script erstellen - allein der Übersichtlichkeit und Verständlichkeit wegen ...
 
Schade, dass sich Gerri nicht mehr zu Wort meldet...
Die letzten Posts beziehen sich fast alle auf den indizierten DB Zugriff. Dies hat aber nix mit "durchsuchen"(siehe Startthread) zu tun. Und auch der Satz "Der DB ist nach FIFO aufgebaut." lässt nicht darauf schließen, dass es so einfach wie oben beschrieben ist.
Also lieber Gerri, bitte sag uns was :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Schade, dass sich Gerri nicht mehr zu Wort meldet...
Die letzten Posts beziehen sich fast alle auf den indizierten DB Zugriff. Dies hat aber nix mit "durchsuchen"(siehe Startthread) zu tun. Und auch der Satz "Der DB ist nach FIFO aufgebaut." lässt nicht darauf schließen, dass es so einfach wie oben beschrieben ist.
Also lieber Gerri, bitte sag uns was :)
*ACK*
Da hat der wwwandy wohl nicht ganz unrecht ;)
 
Morgen zusammen, ich war etwas eingedeckt mit Arbeit.

Also, ich habe einen Wagen aud dem eine Kamera montiert ist, die mir diverse Korrekturwerte eines Spaltes auf einer Seitenwand eines Zuges misst.

Nun fahre ich mit dem Wagen diese Seitenwand entlang und nehme die Korrekturwerte sowie meine Achsenpositionen auf.

Die Korrekturwerte sind etwas Zeitversetzt da die Kamera für die Auswertung etwas Zeit benötigt, die Achsenpositionen jedoch sind wirklich von dem Zeitpunkt zudem ich die Daten empfange. Das soll hier aber keine Rolle spielen.

Ca. 300mm dahinter befindet sich mein Schweissbrenner auf dem Wagen.

Ich nehme also die Längsposition des Seitenwagens des Brenners und vergleiche diese mit den zur Messung der Kamera aufgenommenen Längspositionen.
Durch interpolieren kann ich nun alle Werte aus dem DB holen.

Da ich nun jedes Array nach der Längsposition durchsuchen muss mache ich es folgneder massen:

// ----------------------------------------------------

agai: NOP 0

L Count // Array Zähler für die durchsuchung
L 28
*D
SLD3
LAR1

AUF DBXY

L #act_X
L DBD[AR1,p#0.0]
>
...
...

L Count
L 1
+D
T Count

U #gefunden

spbn agai // again


// -----------------------------------------------------------

Wenn ich gefunden habe nehme ich mir meinen aufgemotzten SFC20 her (mit 2 Anypointern bestückt) und schiebe die Daten der Längswerte die ich noch nicht passiert habe nach oben beginnend beim ersten Array.
Dadurch habe ich keinen Überlauf.

Wenn ich nach 100 Arrays nichts gefunden habe beende ich den FC um nicht eine Zykluszeitüberschreitung zu bekommen.
(Immerhin sind es 1000 Arrays; die konnte ich bis jetzt aber noch nicht testen weil auf meiner Test-CPU zu wenig Speicher ist).

Im Prinzip sind es zwei Arrays da ich die Achsenpositionen zwar Aufnehme, die Messwerte aber nur durch Interpolieren ermitteln kann da die Aufnahme nicht zur selben Zeit statt fand.

Jetzt habe ich erfahren dass der Abstand zum Brenner sich ändern kann da die Kamera nicht senkrecht zur Seitenwand misst, sondern in einem Winkel.

Wenn der Abstand zum Wagen sich nun ändert, dann ändert sich auch die Distanz der Kamera zum Brenner.
Also muss ich nun die Distanzwerte ebenfalls Aufnehmen sowie die Geschwindigkeit um mit einer Winkelfunktion zurück rechnen zu können.

Ich habe es nun Geschafft das soweit zu programmieren, nur bekomme ich die interpolierten Werte alle 1-1,5 sekunden geupdatet was zwar bei dieser Art der Schweisstechnologie nicht das Problem ist, aber wenn man schon so ein perverses Konzept für eine Maschine erstellt sollte es so gut wie möglich arbeiten.

Da mein Zyklus nun auf 25ms angeschwollen ist und das Korrekturupdate so lange dauert, dachte ich mir auf die Microbox umzusteigen da die den Speicher sowie die Schnelligkeit hat.
Wenn jedoch jemand eine bessere Lösung hat, um den DB zu durchsuchen, dann würde mir das natürlich extrem weiterhelfen.

So, wer es nun geschafft hat bis hier her, dem möchte ich für die Hilfestellung danken!
 
Zuletzt bearbeitet:
Zurück
Oben