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


Positionen (Werte) in Matrix speichern - tahity94 - 05.01.2018 13:29

Guten Tag und ein frohes neues Jahr :-)

im Rahmen meiner Bachelor-Arbeit automatisiere ich mittels LabVIEW eine Stage für ein Mikroskop. Bei der Stage handelt es sich um eine ASI PZ-2000FT Series Automated Stage with Piezo Z-Axis Top Plate, die mittels des ASI MS-2000 Controllers angesteuert wird. Seitens des Herstellers gibt es einige LabVIEW Treiber, auf die ich zurückgreife. Das Scannen ist auf der x- und y- Achse beschränkt, jedoch soll die z-Koordinate mitgezogen werden.

Eine Probe soll eingespannt werden und mittels Joystick wird die Startposition eingestellt und diese Position wird dann als Null-Position gesetzt. Dann wird die Probe wie in der Skizze zu sehen abgescannt. Das läuft soweit auch alles.
Meine Frage ist jetzt, wie ich die Positionen (x,y,z) jedes einzelnen Steps in einer Datei (z.B. einer Matrix oder 2D Array) speichern kann. Es gibt ein VI des Herstellers, der die aktuelle Position in einen File schreibt (Anhang).
Also an der Stelle des Startpunktes soll in der Matrix z.B. (0,0,0) stehen. Und beim ersten Step soll an passender Stelle in der Matrix (0,1,0) stehen. Ich hoffe, dass es einigermaßen verständlich ist.
Die Größe der Matrix ist so nicht vorgegeben. Die Iterationen werden aus den einzugebenden X und Y- Größen des Samples und der gewünschten Auflösung berechnet.

Hat jemand eine Idee und kann mir weiterhelfen?

Vielen Dank im Voraus.

PS: Ich benutze LV 2017.


RE: Positionen (Werte) in Matrix speichern - GerdW - 05.01.2018 13:41

Hallo tahity,

Zitat:Die Größe der Matrix ist so nicht vorgegeben. Die Iterationen werden aus den einzugebenden X und Y- Größen des Samples und der gewünschten Auflösung berechnet.
Also weißt du doch, wie groß dein Array werden muss: eben hast du ja die Anzahl der Iterationen etc. berechnet!

Dann musst du doch einfach nur ein entsprechend großes Array initialisieren und jeweils per ReplaceArraySubset den Messwert an die richtige Stelle eintragen…


RE: Positionen (Werte) in Matrix speichern - tahity94 - 05.01.2018 14:11

Vielen Dank erstmal für die Antwort.
Da ich noch recht unerfahren im Umgang mit LabVIEW bin, ist mir das so noch nicht klar.
Also logisch, dass man dann ein entsprechend großes Array initalisieren muss.
Die Struktur ist ungefähr so, dass in zwei For-Schleifen (einmal y-aufwärts, einmal y-abwärts) und dazwischen jeweils ein Schritt in positive x-Richtung der Motor verfahren wird. Wie kann man jetzt dafür sorgen, dass die Werte automatisch an die richtige Stelle eingetragen werden?


RE: Positionen (Werte) in Matrix speichern - GerdW - 05.01.2018 15:04

Hallo tahity,

Zitat:Wie kann man jetzt dafür sorgen, dass die Werte automatisch an die richtige Stelle eingetragen werden?
Wenn deine Schleifen so nach und nach ablaufen, solltest du doch wissen, wo dein Scanner gerade steht.
Und wenn du das weißt, dann sollte es auch kein Problem sein, das richtige Arrayelement zu beschreiben…

So, wie du oben auf deinem Blatt Papier die Positionen mitgezählt hast, kannst du das doch auch in deiner Software machen!

Zitat:Da ich noch recht unerfahren im Umgang mit LabVIEW bin, ist mir das so noch nicht klar.
Diese Fragen haben bisher noch nichts mit LabVIEW zu tun: du hättest in jeder Programmiersprache das exakt gleiche Problem zu lösen.
Allgemeiner Tipp: erstmal auf einem Blatt Papier deinen Algorithmus entwerfen/skizzieren, bevor du mit programmieren anfängst!


RE: Positionen (Werte) in Matrix speichern - tahity94 - 05.01.2018 16:05

Genau, die Positionen kann man ja mittels der Schleifeniterationen bestimmen.
Allerdings habe ich diesbezüglich noch zwei Fragen.
Also der Scanvorgang läuft so ab, dass in einer While-Schlife mit einer For-Schleife y aufwärts gescannt wird, dann geht es einen Schitt in positive x-Richtung, dann wieder mittels For-Schleife in negative y-Richtung und dann wieder einen Schritt in positive x-Richtung. Und diese While-Schleife läuft so lange, bis das Sample auf gesamter X-Größe untersucht worden ist.
Das heißt, dass ich pro Iteration der While-Schleife zwei Spalten im 2D-Array erstelle, aber laut Iteration wäre es nur ein Durchgang (= eine Spalte). Und wenn in einer For-Schleife y aufwärts abgefahren wird, dann wäre die erste Iteration ja unten. Wenn ich allerdings den Zeilen-Index mit der Iteration verbinde, würde er bei eins, also oben, beginnen.

Und noch zu etwas anderem:
Das Array soll nicht auf dem Frontpanel angezeigt werden, sondern in einer Datei gespeichert werden. Wie macht man das? Super wäre eine Tabelle, in der pro Zelle die entsprechenden Positionen stehen.

Vielen Dank nochmal :-)


RE: Positionen (Werte) in Matrix speichern - GerdW - 05.01.2018 20:21

Hallo tahity,

Zitat:in einer While-Schlife mit einer For-Schleife y aufwärts gescannt wird, dann geht es einen Schitt in positive x-Richtung, dann wieder mittels For-Schleife in negative y-Richtung und dann wieder einen Schritt in positive x-Richtung. Und diese While-Schleife läuft so lange, bis das Sample auf gesamter X-Größe untersucht worden ist.
Wozu die While-Loop?
- Eine FOR-Loop für alle X-Schritte.
- Darin eine FOR-Loop für die Y-Schritte.
- Dazu ein boolscher Wert, der die Y-Richtung angibt. Dieser wird nach der inneren FOR-Loop jeweils negiert.

Zitat:Das heißt, dass ich pro Iteration der While-Schleife zwei Spalten im 2D-Array erstelle, aber laut Iteration wäre es nur ein Durchgang (= eine Spalte). Und wenn in einer For-Schleife y aufwärts abgefahren wird, dann wäre die erste Iteration ja unten. Wenn ich allerdings den Zeilen-Index mit der Iteration verbinde, würde er bei eins, also oben, beginnen.
Das dürfte mit den 3 Gedankenstrichen erledigt sein…

Zitat:Das Array soll nicht auf dem Frontpanel angezeigt werden, sondern in einer Datei gespeichert werden. Wie macht man das? Super wäre eine Tabelle, in der pro Zelle die entsprechenden Positionen stehen.
Warum zeigst du das Array nicht einfach während der Messung an, dann freut sich der User an ständig aktualisierten Messwerten!
Und nach der Messung wird dann das komplette Array in eine Datei gespeichert…

LabVIEW bringt jede Menge BeispielVIs mit, die solltest du dir mal anschauen!
Tipp: schau dir die Funktion WriteSpreadsheetFile (in neueren Versionen "Write Delimited Textfile") mal an.


RE: Positionen (Werte) in Matrix speichern - tahity94 - 06.01.2018 13:57

Die drei Gedankenstriche sind super. Vielen Dank dafür. Ich bin gerade dabei das zu ändern. Allerdings hänge ich gerade an der Stelle mit dem boolschen Wert, der die Y-Richtung angeben soll. Also in der inneren For-Loop soll eine Case-Struktur sein, die bei "true" in positive Y-Richtung fährt und bei "false" in negative Y-Richtung. Aber wie kann ich das mit dem Selektoranschluss machen? Im Endeffekt soll dieser ja immer wechseln zwischen True und False nach jedem Durchgang. Aber wie kann ich die true-Konstante dann negieren?

Das Problem mit der While-Schleife ist somit tatsächlich gelöst. Allerdings verstehe ich dann noch nicht so ganz, wie das mit dem Teilarray ersetzen machen soll. Denn im TRUE-Fall fährt der Motor in positive Y-Richtung und wenn ich dann die Schleifeniteration mit dem Zeilenindex verbinde, fängt dieser ja bei 1 an, also "oben", obwohl der Motor ja "unten" startet. Das heißt ich hätte die Werte genau verkehrt. Oder habe ich da einen Denkfehler?

Mit dem Anzeigen des Arrays ist eine gute Idee, wenn nur die aktuelle Position angezeigt wird und nicht das ganze 2D-Array, denn dafür wird es zu groß sein. Wenn ich den Scanvorgang entsprechend geändert habe, werde ich mir diese Funktion anschauen. Danke für den Tipp :-)


RE: Positionen (Werte) in Matrix speichern - GerdW - 06.01.2018 14:50

Hallo tahity,

Zitat:Aber wie kann ich das mit dem Selektoranschluss machen? Im Endeffekt soll dieser ja immer wechseln zwischen True und False nach jedem Durchgang. Aber wie kann ich die true-Konstante dann negieren?
Zwei Gedankenstriche:
- boolsche Werte negiert man mit NOT
- Werte speichert man in Schieberegistern, wenn man sie in der nächsten Iteration einer Schleife benötigt…

Zitat:wenn ich dann die Schleifeniteration mit dem Zeilenindex verbinde, fängt dieser ja bei 1 an, also "oben", obwohl der Motor ja "unten" startet. Das heißt ich hätte die Werte genau verkehrt. Oder habe ich da einen Denkfehler?
Wer hat gesagt, dass du dafür den Schleifeniterator verwenden sollst oder gar musst?
Man kann auch seinen eigenen "Index" berechnen - und sich diesen wiederum in einem Schieberegister merken…


RE: Positionen (Werte) in Matrix speichern - tahity94 - 06.01.2018 18:56

Ich habe den Scanvorgang jetzt entsprechend geändert. Dabei habe ich das abwechselnde Ausführen von True und False in der inneren For-Loop mittels Rückkopplungsknoten umgesetzt. Ist das zielführend? Im Anhang sind zwei Bilder dazu.
Und jetzt geht es ans Speichern der Positionen im Array :-)
Also dafür initialisiere ich dann ein entsprechend großes 2D-Array und schreibe bei jeder Iteration mit Teilarray ersetzen die Positionen an die entsprechenden Stellen. So von der Theorie hört sich das ganz gut an. Jetzt muss ich es nur noch richtig umsetzen.


RE: Positionen (Werte) in Matrix speichern - GerdW - 07.01.2018 18:29

Hallo tahity,

Zitat:Dabei habe ich das abwechselnde Ausführen von True und False in der inneren For-Loop mittels Rückkopplungsknoten umgesetzt. Ist das zielführend?
Ja.
Aber warum jetzt ein Rückkopplungsknoten anstatt eines Schieberegisters in der äußeren Schleife? (Das fände ich übersichtlicher.)

- Warum programmierst du beim "Stop Scanning" eine RaceCondition?
- So, wie du "Stop Scanning" abfragst, wird es in der inneren Loop nicht wirklich beachtet. THINK DATAFLOW!
- Der Fehlerdraht sollte auch in einem Schieberegister verwaltet werden, um darüber Errorhandling zu betreiben…