Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
28.06.2015, 14:01 (Dieser Beitrag wurde zuletzt bearbeitet: 28.06.2015 14:15 von Hasenfuss.)
ich möchte gerne Messwerte effizient in einem Graphen darstellen. Damit der PC nicht so langsam wird, möchte ich die Graphenanzeige nur einmal pro Sekunde aktualisieren.
Ich habe mir ein kleines Testprogramm geschrieben, dass mir Messwerte erzeugt, wie ich sie von meinem Datenerfassungsgerät bekomme. Diese Messwerte werden in einer FGV zwischengespeichert. Die FGV ist dabei als Fifo angelegt.
Im Fifo liegen die Messwerte für meherere Kanäle als 1D-Array vor. Für den Graphen muss ich das Datenarray neu umformen und transponieren.
In meinem richtigen Programm sind Datenerfassung (also Schreiben in die FGV) und das Anzeigen in einem Graphen (also Lesen von der FGV) in unterschiedlichen VIs.
Könntet ihr mir ein paar Tipps geben, wie ich mein Programmentwurf verbessern könnte? Gibt es Stellen, an denen ich etwas falsch gemacht habe? Ich würde mich sehr darüber freuen.
Zitat:Könntet ihr mir ein paar Tipps geben, wie ich mein Programmentwurf verbessern könnte?
- In deiner FGV das Befehls-Enum ebenfalls als Typdefinition anlegen. So viele CoercionDots machen mich immer nervös…
- Um mehrere Messkanäle in einem Graph anzuzeigen, sollten die Daten als 2D-Array vorliegen. Du dagegen mixt die Samples mehrerer Kanäle in einem 1D-Array zusammen. Leg doch in der FGV gleich einen 2D-Buffer an...
>> So viele CoercionDots machen mich immer nervös…
Das hab ich noch nicht richtig intus, ich werde mich bemühen, in Zukunft besser darauf zu achten. Schade, dass sich nicht das ganze VI-Bild lila oder so färbt, sondern nur ein winzig kleiner Punkt erscheint, wenn die Datentypen verschieden sind.
>>- In deiner FGV das Befehls-Enum ebenfalls als Typdefinition anlegen
Normalerweise mach ich das auch, weil ich vor längerer Zeit mal viel Arbeit hatte, als ich die Befehle für die FGV geändert hatte und dann manuell in zig VIs das Enum neu anhängen musste, weil Änderungen nicht übernommen wurden. Diese FGV mit dem Testprogramm ist noch im Entwicklungsmodus, aber ich werde auf alle Fälle daraus auch eine strikte Typdefinition machen.
>>Leg doch in der FGV gleich einen 2D-Buffer an...
Ich habe es bisher noch nicht hinbekommen, einen 2D-Buffer zu erstellen. Ich werde nochmal meinen Kopf etwas anstrengen und es versuchen, aber ich war schon mal dran gescheitert.
kannst Du mir vielleicht mal einen Tipp geben, wie man gut ein 2D-Array rotiert, also z.B. Spalten nach links oder rechts verschiebt? Ich habe jetzt von OpenG eine Funktion Reverse2DArray.VI gefunden. Die Funktion gefällt mir aber nicht so gut. Würdest Du diese Funktion zum Rotieren von 2D-Arrays benutzen oder hättest Du eine andere Idee?
2D-Array rotiert man zeilen-/spaltenweise per Autoindizierung und FOR-Loop…
Du hast doch eine FGV: da kannst du doch Datenkapselung betreiben ("OOP-light") und in der FGV für jeden Masskanal ein eigenes 1D-Array verwalten. Ich mache sowas gern mit Variantattributen, da bekommt man gleich noch eine Referenzierung über den Messstellennamen frei Haus dazu…
>> 2D-Array rotiert man zeilen-/spaltenweise per Autoindizierung und FOR-Loop…
Meinst Du das so, wie in dem Bild - ich hab jetzt einfach eine indizierte for-Schleife genommen und dort das 1D-Rotatations-VI eingebastelt (siehe Bild mit dem blauen Kringel). Ich hab versucht, das gleiche auch mal mit dieser inplace-Struktur hinzubekommen, weil ich da gelesen habe, dass die vielleicht besser sein sollen? Aber ich hab das nicht hinbekommen.
>> Du hast doch eine FGV: da kannst du doch Datenkapselung betreiben ("OOP-light") und in der FGV für jeden
>> Masskanal ein eigenes 1D-Array verwalten.
Leider hab ich das noch nicht richtig verstanden. Also, ich erzeuge mir für jeden Messkanal ein eigenes 1D-Array.
Ich hab das mal grad versucht umzusetzen, die beiden Bilder dazu heissen FGV_1 und FGV_2. Geht das so in die richtige Richtung, wie Du es meinst? Beim case Init habe ich auch mal einen Wert mit dabei geschrieben. Ich weis nur nicht, ob diese Information bei write dann ggf. wieder verloren geht?
Anzeige
29.06.2015, 21:46 (Dieser Beitrag wurde zuletzt bearbeitet: 29.06.2015 21:48 von GerdW.)
Zitat:Meinst Du das so, wie in dem Bild - ich hab jetzt einfach eine indizierte for-Schleife genommen und dort das 1D-Rotatations-VI eingebastelt (siehe Bild mit dem blauen Kringel).
Ja, so macht man das…
Zitat:Ich hab versucht, das gleiche auch mal mit dieser inplace-Struktur hinzubekommen, weil ich da gelesen habe, dass die vielleicht besser sein sollen?
Inwiefern sollen die "besser" sein? "Besser" sollte man in Bezug auf Software immer genau (besser ) definieren…
Zitat:Aber ich hab das nicht hinbekommen.
Und warum wohl?
Mit dieser InPlace-Struktur indizierst du ein einzelnes Arrayelement - und wunderst dich, warum du das dann nicht mehr rotieren kannst…
Etwas nicht durch entsprechende Links belegbares Halbwissen:
Die Inplace-Struktur wurde eingeführt, als LabVIEW noch einen anderen Compiler nutzte. Damals hatte sie wirklich Vorteile!
Mittlerweile wurde der Compiler geändert und wesentlich besser auf LabVIEW "trainiert": er erkennt jetzt selbständig "in place"-Operationen und optimiert diese entsprechend. Als ich das letzte mal Benchmarks damit durchführte, war die Kombination IndexArray/ReplaceArraySubset jedenfalls schneller als die Inplace-Struktur…
Zum Vorschlag mit den Variant-Attributen kann ich dieses Nugget empfehlen…
vielen Dank für die vielen Antworten von Dir. Ich habe versucht, jetzt eine neue FGV zu erstellen mit einem Minitestprogramm. Die FGV ist nicht so schön geworden, weil sie noch im Versuchsstadium ist (z.B. die Ein- und Ausgänge für den Fehlercluster oder die noch nicht als strikte TypDef gesetzte Befehls-Enum-Elementestruktur). Aber ich kann Daten aus der Datenstruktur herausholen und in einen Graphen schreiben und ich kann mit der von Dir genannten Funktion mit den Variantattributen Namen z.B. in einen Plot setzen. Und das Einfügen von Daten klappt auch.
Geht das so schon in die Richtung, wie Du das auch machst? Ich hab die beiden VIs mal angehängt an diese Message. Mit test.vi wird datafgv.vi getestet.
>> Zum Vorschlag mit den Variant-Attributen kann ich dieses Nugget empfehlen…
Dieses Nougat lese ich mir morgen mal in Ruhe durch, vielen Dank für den Link.
Ich habe mal eine Frage zu einem Array, dass in einem Attribut gespeichert ist, bearbeitet wird und die Änderungen wieder gespeichert werden. Ich habe dazu mal ein kleines Testprogramm geschrieben. In dem Block in der Funktion mit dem blauen Kringel wird an den Stellen 1 und 2 das Array gelesen und wieder neu gesetzt.
Meine Frage dazu ist jetzt - wird dazu das Array komplett aus dem Speicher "entfernt" und durch ein neues Array ersetzt - also ein langsamer Prozess, weil eine Kopie des Array im Speicher erzeugt wird? Oder ist das so eine gute Vorgehensweise, um ein Array, dass als Variantattribut vorliegt, bearbeitet wird? Ich habe mir das Nugget mehrmals durchgelesen und bin mir nicht sicher, ob ich es richtig umgesetzt habe an der Stelle, ich würde mich deshalb sehr über eine Antwort von Dir freuen.
(PS - ich weis, dass die Datentypen nicht konstant sind in dem Array - einmal sind es Integerwetere, dann mal wieder Double - aber das liegt daran, dass ich aus Testgründen kurz das [i] aus den for-Schleifen darangehängt habe).