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!
19.08.2013, 19:22 (Dieser Beitrag wurde zuletzt bearbeitet: 19.08.2013 19:23 von Hasenfuss.)
Beim Signalverlaufsdiagramm besteht die Möglichkeit, durch Festlegen einer Historienlänge die Größe des "Arrays" in dem Diagramm zu begrenzen. Neue Werte werden im Array hinten angefügt und die vorigen einfach vorne abgeschnitten.
Bei den anderen Diagrammtypen geht das nicht, je mehr Werte ich an die Anzeige übergebe, um so größer wird das Array mit den Datenwerten. Also muss ich das Array auf eine maximale Größe begrenzen.
Mein bisheriger Ansatz geht dahin, dass ich Vergleiche durchführe, darin sind:
max: Maximalgröße Array
ist: Anzahl aktueller Werte im Array
neu: Anzahl neuer Werte, die hinzukommen
leereArray(Anzahl): Die Elemente im Array werden von Null bis Anzahl im Array von vorn abgeschnitten
Im Pseudocode:
if neu <= max
if (max-ist) > neu
leereArray(neu-ist)
else
nichts
endif
else
leereArray(max)
kürze neu auf max-Länge
endif
Die drei Bilder von meinem LabVIEW-Programm zeigen das, wie ich es umgesetzt habe. Es scheint auch so soweit zu funktionieren, denn ich kann die Daten mir so in einem Signalverlauf anzeigen lassen (tut mir leid, dass ich nur die Bildausschnitte zusenden kann, aber dafür hab ich versucht, im Pseudocode kurz zu erklären, was ich dort konstruiert hab).
Meine Frage - gibt es vielleicht eine simplere Lösung für mein Problem? Ich habe dann noch versucht herauszufinden, wie man einen FiFo in LabVIEW realisieren kann, bis mir dann aber bewusst wurde, dass ich ja keinen FiFo brauche, sondern das Array in seiner größe begrenzen muss, denn bei jedem Aktualisierungsvorgang für die Anzeige wird ja das ganze Array neu geschrieben (da ich nicht mehr den Signalverlaufsgraph mit der Historienlänge verwende). Somit ist ein FiFo (der sich einfach mit einer Queue realisieren ließe) für meinen Anwendungsfall nicht zu gebrauchen.
Falls mir von Euch jemand einen Tipp hat, nach welchen anderen Stichworten ich suchen könnte, würde ich mich sehr freuen.
Du hast Queue ja schon selbst erwähnt...
und ich weiß nicht warum du die Idee verwirfst?
Funktioniert doch... du musst nur die Zeitachse deinen Wünschen entsprechend nachführen,
da die nur beim SVD automatisch weiterläuft.
Gruß SeBa
Dieser Beitrag soll weder nützlich, informativ noch lesbar sein.
Er erhebt lediglich den Anspruch dort wo er ungenau ist, wenigstens eindeutig ungenau zu sein.
In Fällen größerer Abweichungen ist es immer der Leser, der sich geirrt hat.
Rette einen Baum!
Diesen Beitrag nur ausdrucken, wenn unbedingt nötig!
Dafür gibt es die Funktion "Daten Queue Punkt für Punkt" - von NI allerdings sehr sorgfältig in der Palette versteckt. Habe jetzt auch die Suchfunktion bemüht, weil ich nicht mehr wußte wo. Und auch jetzt weiß ichs nicht, habe einfach "in das Blockdiagramm einfügen" geklickt. Aber: es gibt sie, ihr müßt es mir glauben.
20.08.2013, 08:03 (Dieser Beitrag wurde zuletzt bearbeitet: 20.08.2013 08:05 von GerdW.)
Das kann man natürlich mit vielen IF-THEN-ELSE erledigen, aber eigentlich auch ganz ohne:
Ansonsten gelten natürlich die Hinweise zu den Möglichkeiten mit Queues! (Luckis Beispiel macht im Grunde das gleiche wie mein Snippet, ist außerdem ein gutes Einstiegsbeispiel für eine FGV und liegt unter Signalverarbeitung->PtByPt->Weitere Funktionen...)
Ein kleiner Unterschied ist schon zwischen der Funktion QueueP2P und Gerds VI. Bei QueueP2p werden die neuen Punkte von hinten angehängt, bei Gerd vorn. Das Anhängen von vorn ist vielleicht eher gewünscht, wird aber erkauft mit einer 1000mal schlechteren Perfomanze. Einfügen eines neuen Elementes in einen Array am Index Null ist nach meinen Erfahrungen aber einer gewissen Arraygröße unvorstellbar langsam. Oder hat sich da in LV2013 etwas entscheidend geändert?
20.08.2013, 09:02 (Dieser Beitrag wurde zuletzt bearbeitet: 20.08.2013 09:09 von GerdW.)
Um Luckis Bedenken zu zerstreuen, kann man die Reihenfolge von ArraySubset und Build Array auch umkehren:
Oder man arbeitet mit einem Array fester Größe:
(evtl. noch die Initialisierung anpassen)
Auch hier kann man wieder beide Varianten haben: am Anfang oder Ende des Arrays neue Werte eintragen...
Ich danke Euch allen für die anderen Möglichkeiten, wie ich mein Problem lösen kann und freue mich, so weitere neue Funktionen kennenzulernen, auf die ich bisher noch nicht gestoßen bin.
(20.08.2013 09:02 )GerdW schrieb: Um Luckis Bedenken zu zerstreuen, kann man die Reihenfolge von ArraySubset und Build Array auch umkehren:
Leider funktioniert dies so nicht, da beim Erreichen der endgültigen Array-Größe das Array nicht "durchgeschoben" sondern nur das letzte Element ausgetauscht wird. Da sollte man stattdessen am Indexeingang was verschalten, z.B. Arraysize(nach dem 'build array') minus (Maxsize-1)