LabVIEWForum.de
Positionen (Werte) in Matrix speichern - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: Datenbank & File IO (/Forum-Datenbank-File-IO)
+---- Thema: Positionen (Werte) in Matrix speichern (/Thread-Positionen-Werte-in-Matrix-speichern)

Seiten: 1 2 3 4


RE: Positionen (Werte) in Matrix speichern - tahity94 - 05.02.2018 15:04

Hallo Gerd,

leider bin ich immernoch nicht weiter gekommen. Und die Schwierigkeiten sind die gleichen geblieben.
ich habe in der Zwischenzeit für die z-Matrix (3D-graphen) bzw. für das 2D-Array für den Intensitätsgraphen ein entsprechendes 2D-Array initialisiert, in dem bei jeder Iteration an die richtige Stelle der Messwert geschrieben wird mittels "Teil-Array ersetzen". Das scheint auch zu funktionieren, denn der Intensitätsgraph zeigt pro Iteration dann das richtige Element an. Aber leider auch nur das und nichts anderes.
Beim 3D-Graph passiert gar nichts.

Das Visualisieren befindet sich jetzt im Inneren der Schleife. Ich denke, dass es schöner ist, wenn man in Echtzeit sieht, was passiert. Aber auch nachher wäre ok. Nur ich komme bei beiden Möglichkeiten nicht weiter. Beim Intensitätsgraphen sieht man, dass irgendwie nur die letzte Iteration dargestellt wird. Der 3D-Graph bleibt leer. Die entsprechenden Daten sieht man auch im Anhang. Eigentlich müsste doch mehr passieren? Woran liegt das? Und warum werden die Graphen nicht bei jeder Iteration aktualisiert?


RE: Positionen (Werte) in Matrix speichern - GerdW - 05.02.2018 16:03

Hallo Maik,

Zitat:ein entsprechendes 2D-Array initialisiert, in dem bei jeder Iteration an die richtige Stelle der Messwert geschrieben wird mittels "Teil-Array ersetzen". Das scheint auch zu funktionieren, denn der Intensitätsgraph zeigt pro Iteration dann das richtige Element an. Aber leider auch nur das und nichts anderes.
Weil du eben nur den einen Datenpunkt (Sample) in diesem in jeder Iteration neu initialisierten Array einträgst.
Dein VI macht genau das, was du programmiert hast!
LabVIEW-Grundlagen: wenn du Werte (z.B. dein Array) in einer Schleife für die nächste Iteration speichern willst, solltest du ein Schieberegister verwenden.

Zitat:Beim 3D-Graph passiert gar nichts.
Weil du auch hier nur genau einen Datenpunkt darstellen willst…


RE: Positionen (Werte) in Matrix speichern - tahity94 - 05.02.2018 18:23

Hallo Gerd,

das macht Sinn :-) Ich habe jetzt versucht, die Werte in Schieberegistern zu speichern. Das klappt allerdings nur bedingt.
Also wenn ich das 2D-Array in der äußeren Schleife initialisiere und die Werte der inneren Schleife dann im Schieberegister speichere, wird logischerweise am Ende nur die letzte innere Iteration angezeigt:
[attachment=58748]

Das ist soweit auch klar. Aber da ich ja auch alle äußeren Iterationen speichern möchte, brauche ich dann ja noch ein weiteres Schieberegister für die äußere For-Schleife. Wenn ich das jetzt alles analog mache, also das Array vor den beiden Schleifen initialisiere und die Werte dann in Schieberegistern speicher, ist das Resultat wieder leer. Muss ich da noch was anderes beachten?


RE: Positionen (Werte) in Matrix speichern - GerdW - 05.02.2018 20:32

Hallo Maik,

so schwer ist das alles doch gar nicht:
[attachment=58749]
Array außen initialisieren, in der innersten Schleife dann Elemente ersetzen…

Macht man doch sonst genau so:
Code:
dim array[x, y]
FOR i = 1 to x
  FOR j = 1 to y
   array[i, j] := wert
  NEXT j
NEXT i



RE: Positionen (Werte) in Matrix speichern - tahity94 - 05.02.2018 23:24

Guten Abend Gerd,

genau so hatte ich das vor. Und habe es natürlich auch versucht umzusetzen. Allerdings wurde dann automatisch zusätzlich zu den Schieberegistern ein Rückkopplungsknoten erstellt, weil ich die Dimensionen mit den entsprechenden Zählanschlüssen der For-Schleifen verbunden habe. Wenn ich das weglasse, sieht das wesentlich besser aus :-)
Hast du eventuell noch einen Tipp, wie man umsetzen kann, dass die x- und y-Achse den "wirklichen" Positionen entspricht? Mit einem Eigenschaftsknoten?
Ich habe den Eigenschaftsknoten xAchse.Faktor und yAchse.Faktor erstellt, die beiden in Schreiben geändert und jeweils mit der passenden Scanresolution verbunden. Dadurch erhoffe ich mir, dass die Schrittweite der x- und y-Achse direkt der Scanresolution entspricht, sodass man ergo direkt die Position ablesen kann. Ist das so zielführend?


RE: Positionen (Werte) in Matrix speichern - GerdW - 06.02.2018 08:24

Hallo Maik,

Zitat:Hast du eventuell noch einen Tipp, wie man umsetzen kann, dass die x- und y-Achse den "wirklichen" Positionen entspricht? Mit einem Eigenschaftsknoten?
Ich habe den Eigenschaftsknoten xAchse.Faktor und yAchse.Faktor erstellt, die beiden in Schreiben geändert und jeweils mit der passenden Scanresolution verbunden. Dadurch erhoffe ich mir, dass die Schrittweite der x- und y-Achse direkt der Scanresolution entspricht, sodass man ergo direkt die Position ablesen kann. Ist das so zielführend?
Genau das wäre jetzt auch mein Tipp gewesen! Big Grin
Wie schon mal geschrieben: das klappt natürlich nur "korrekt" für äquidistante Schrittweiten, du hast ja nur einen festen Faktor vergeben.
Wenn deine echten Positionen aber nur gering vom Sollwert abweichen, kann man in der Darstellung aber wohl damit leben…


RE: Positionen (Werte) in Matrix speichern - tahity94 - 07.02.2018 17:03

Wir sind fast am Ziel angekommen :-)
Allerdings bestehen noch ein, zwei "kleine Probleme".

Problem 1: Bei der inneren Schleife, in der einmal der Messwert an die richtige Stelle des Arrays gesetzt wird und einmal die Positionen und der Messwert in eine Tabelle geschrieben werden, stimmt wohl etwas nicht. Denn wie in dem CSV-File zu sehen, wird die erste Position doppelt gespeichert und ganz am Ende fehlt ein Step. Bei den Iterationen dazwischen funktioniert aber alles tadellos. Das hat zur Folge, dass der y-Array, der mit dem 3D-Graphen verbunden wird, fehlerhaft ist. Für den x-Array (eigentlich komplett analog) gibt es dieses Problem nicht.
Und wenn man die Messwerte aus der Tabelle (4. Wert) mit den Einträgen des z-Arrays vergleicht, fällt auf, dass der erste Messwert nicht im Z-Array erscheint. Weiterhin sollte der "letzte" Messwert (letzte Iteration) des ersten inneren Schleifendurchgangs 20 sein und nicht 0. Ich weiß nicht, wo die 0 herkommt. Und dann ist da ein Sprung drin. Der Wert "20" erscheint dann plötzlich da, wo eigentlich der Wert "60" erscheinen sollte (bezieht sich auf das zweite Bild). Da habe ich aktuell keine Idee, woran das liegen könnte. Prinzipiell scheint es ja zu stimmen/funktionieren.

[attachment=58762]

Problem 2:
Wenn man das Z-Array mit dem Intensitätsgraphen vergleicht, fällt auf, dass da etwas mit der Zuordnung nicht stimmt. Die Nullen sind eigentlich oben links und rechts, befinden sich im Graphen jedoch unten.

[attachment=58761]


Die beiden Bilder zeigen genau das gleiche Problem, es handelt sich aber um 2 unterschiedliche Messungen. Velleicht ist das so ersichtlicher.


Hier sind einmal die Soll-Positionen und die Ist-Positionen im direkten Vergleich:

[attachment=58763]




Vielen Dank.


RE: Positionen (Werte) in Matrix speichern - GerdW - 08.02.2018 08:13

Hallo Maik,

Bilder vom UI sind ja nett - nur wie soll man daran die Programmierfehler erkennen?


RE: Positionen (Werte) in Matrix speichern - tahity94 - 08.02.2018 17:16

Hallo,

ich habe eine Vermutung, weshalb die erste Position doppelt in die Tabelle geschrieben wird und die letzte Position fehlt. Und zwar handelt es sich dabei wohl um ein Timing-Problem.

[attachment=58773]

Und zwar soll sich für i=0 der Motor nicht bewegen, damit die Startposition auch aufgenommen wird. Jetzt für i=1 soll sich der Motor um einen Step bewegen und danach die Position in die Tabelle geschrieben werden. Aber anscheinend funktioniert das so nicht, sondern beinahe instantan wird der Messwert in die Tabelle geschrieben. Und das so schnell, dass der Motor den Befehl noch nicht verarbeitet hat. Deswegen befindet sich in der Tabelle zweimal der Wert der Startposition. Und für i_1=N_1(äußere Schleife) i_2=N_2 (innere Schleife) wird der letzte Befehl an den Motor gesendet und direkt danach die Position gespeichert. Aber die Position entspricht dann eigentlich die der i_2=N_2-1. Iteration.

Und "mitten drin" funktioniert es, weil sowohl in der inneren als auch in der äußeren Schleife jeweils ein Timer ist. Der dann aber am Ende logischerweise nicht mehr zur Geltung kommt. Soweit macht das Sinn, oder?

Also kann man das beheben, indem man überprüft, ob der Motor in der Position angekommen ist. Deswegen hatte ich vorher schonmal ein SubVI angefertigt, das mittels State Machine abfragt, ob der Motor in der endgültigen Position angekommen ist. Das hat in der Praxis aber leider gar nicht funktioniert.
Ich hänge es nochmal an zur Überprüfung, ob das soweit stimmt oder fehlerhaft ist.

[attachment=58775]
[attachment=58774]

Das hat vermutlich nicht funktioniert, weil, wenn das Intervall zur Überprüfung zu genau ist, und der Motor eine Ungenauigkeit hat, die größer ist, als das eingegebene Intervall, ist die State-Machine im State "Wait" gefangen. Wie man der Tabelle entnehmen kann, sind Ungenauigkeiten von 0,1 um möglich, was eben auch die minimale Resolution sein soll. Wenn ich das Intervall jetzt auf +- 0,1 um setze, dann ist bei einer Auflösung von 0,1 um der boolesche Wert immer true, die Bedingung also immer erfüllt. Was dann nichts bringen würde. Gibt es da zu vielleicht Anregungen?

In der Palette "Timing" habe ich die Funktion "Datenfluss aufhalten" gefunden. Kann das eventuell eine Alternative sein?

[attachment=58776]

Wenn ich den Datenfluss an dieser Stelle aufhalten würde, sollte das Problem ja nicht mehr sein. Klar, für die Performance ist es defintiv nicht die schönste Lösung, allerdings sind mir fehlerfreie Werte aktuell lieber. Und den Timer in der inneren Loop könnte ich dann einfach an diese Stelle mit "Datenfluss aufhalten" setzen.

Allerdings erklärt das noch nicht wirklich, weshalb in der Tabelle (siehe oben) der erste Messwert 10 beträgt und im Z-Array 70. Und den anderen Ungereimheiten bzgl. des Z-Arrays bin ich auch noch nicht auf die Schliche gekommen.
Aber generell ist da ja das gleiche Problem: Der Messwert soll wie die Positionen erst aufgenommen werden, wenn der Motor seine Position erreicht hat. Denn nur so kann man das ja eindeutig zuordnen.


RE: Positionen (Werte) in Matrix speichern - GerdW - 08.02.2018 20:17

Hallo Maik,

Zitat:Und zwar soll sich für i=0 der Motor nicht bewegen, … Soweit macht das Sinn, oder?
Das hört sich sinnvoll an.
Du machst folgendes:
- du schickst dem Motor einen Stellbefehl
- unmittelbar danach fragst du die aktuellen Positonen XYZ ab
- im Anschluss daran werden eben diese Werte XYZ in die Datei geschrieben
Dummerweise wird sich der Motor in den Mikrosekunden zwischen Stellbefehl und Positionsabfrage noch nicht (wesentlich) bewegt haben…

Zitat:ob das soweit stimmt oder fehlerhaft ist.
Da ist immer noch ein unverdrahteter Tunnel, der einen Wert auf "Default" zurücksetzt. Alle wichtigen Werte immer verdrahten!

Zitat:Funktion "Datenfluss aufhalten"
Das ist im Grunde auch nur eine Wartezeit. Kannst ja selbst in die Funktion hineinschauen!

Zitat:Aber generell ist da ja das gleiche Problem: Der Messwert soll wie die Positionen erst aufgenommen werden, wenn der Motor seine Position erreicht hat. Denn nur so kann man das ja eindeutig zuordnen.
Deswegen hatte ich ja schon einmal ein ordentliche Statemachine vorgeschlagen.
Und zwar nicht nur zum Zwecke des Prüfens, ob der Motor angekommen ist, sondern eben für alles States deines Programmablaufs…
Aber genau hier musst du ansetzen!