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!
Ich habe hier ein kleines Problem mit Referenzen, bei dem ich nicht weiter weiß. Ich hab hier auch schon etwas im Forum gesucht, aber meistens wurden nur Lösungen in Form von VIs für LabVIEW 8+ gepostet, ich verwende jedoch nur 7.1. Daher erlaube ich mir mal, ein neues Thema zu erstellen.
Folgendes: Ich möchte gerne 36 unterschiedliche vorzeichenbehaftete 16Bit-Werte histogrammieren. Da mir die LV-eigenen Histogrammfunktionen nicht so sehr zusagen, will ich mir was eigenes bauen. Und zwar will ich in die Histogramme Wert für Wert reinschieben (und das mit 500Hz), und gleichzeitig etwas gemächlicher die Histogramme bei Bedarf plotten lassen.
Dazu habe ich mir ein Array mit 64k Einträgen gemacht, es mit zwei weiteren Zahlen verclustert, und die Referenz zu dem Cluster gebildet. Dies geschieht innerhalb eines SubVIs.
Ich rufe das SubVI nun in einer Schleife 36 mal auf, um ein Array von 36 Referenzen für meine 36 Messwerte zu erhalten.
Das Problem: Dieses Array enthält nun 36 Referenzen zu einem einzigen Cluster.
Hat da wer nen heißen Tipp, wie man das lösen kann?
Ich habe mal ein Minimalbeispiel in LV7.1 angehängt
So ganz bin ich noch nicht schlau, was du eigenzlich machen willst.
Ich weiß nur, Referenzen so wie du sie verwendest, sind alles andere als Datenfluß-gerecht. Ich bin der Meinung, was du machen willst, geht mit einem "funktionalen SubVI".
Guck dirs mal an. Es soll LV7.0 sein.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Das Füttern meiner Cluster bzw deren Arrays ist kein sonderliches Problem, und geht auch z.B. so, wie du es als Beispiel gepostet hast. Ich möchte nur gleichzeitig in einem anderen Zeitintervall die Daten aus dem Array auch auslesen können.
Nochmal zum eingentlichen Sinn des ganzen:
Nun habe ich 36 dieser Cluster, und die Arrays darin haben jeweils 64k Einträge. Bei jeder Messung gibt es für jeden Cluster neue Zahl. Diese Zahl beschreibt einen Index im Array, Der Wert bei dem Index wird um 1 vergrößert. Das ganze passiert für alle Cluster 500x pro Sekunde.
Ich möchte nun den Inhalt der Arrays in xy-Graphen visualisieren, und zwar, während die Messung läuft. Ich werde nie alle Array gleichzeitig zeigen, aber zumindest 9 werden stets zu sehen sein. Nun ist zum einen die Datenrate selbst viel zu hoch, die Anzeige sollte eher jede Sekunde aktualisiert werden, zum anderen stirbt LabVIEW auch daran, 64k xy-Paare im Graphen darzustellen, hier ist u.a. noch ein Resampling o.ä notwendig.
Im Endeffekt will ich also zwei Schleifen haben. Eine läuft so schnell, wie die Daten kommen und packt sie in die Cluster / Arrays, und die zweite holt sich die Daten recht gemächlich und zeigt sie an.
Im Sinne konventioneller Programmiersprachen wäre es vorteilhaft, wenn man einen einzigen Speicherbereich hätte, wo die eine Funktion reinschreibt, währen die andere liest, denn die Gesamtmenge an Daten beträgt etwa 5MB. Übertragen auf LV hieße das, daß man mit Referenzen arbeiten müßte.
Mein Beispiel hatte nun nur das Phänomen vorgeführt, der Sinn des ganzen blieb aber außen vor.
Ich danke dir für die Mühe, allerdings bin ich weiterhin für Vorschläge für mein Problem offen.
' schrieb:Ich möchte nur gleichzeitig in einem anderen Zeitintervall die Daten aus dem Array auch auslesen können.
Mach halt.
Das SubVI einfach in einer anderen Task aufrufen. Am Ausgang stehen alle Daten bereit.
Von einer Lösung per Referenz rate ich ab.
Nichtsdestoweniger würde es prinzipiell gehen. Referenzen haben aber einen Nachteil: Wenn der Speichermanager irgendwann mal der Meinung ist, seinen Speicher aufräumen zu wollen, geht das Referenzziel verloren. Ohne Referenz, also mit normalem Zugriff, kann nichts passieren.
Zitat:die Anzeige sollte eher jede Sekunde aktualisiert werden,
Zitat:zum anderen stirbt LabVIEW auch daran, 64k xy-Paare im Graphen darzustellen,
Hä? 64.000 Wertepaare? Kauf dir ein neues LV. 300.000 gehen ohne Probleme.
Zitat:Im Endeffekt will ich also zwei Schleifen haben. Eine läuft so schnell, wie die Daten kommen und packt sie in die Cluster / Arrays, und die zweite holt sich die Daten recht gemächlich und zeigt sie an.
Zitat:Im Sinne konventioneller Programmiersprachen wäre es vorteilhaft, wenn man einen einzigen Speicherbereich hätte, wo die eine Funktion reinschreibt, währen die andere liest, denn die Gesamtmenge an Daten beträgt etwa 5MB.
Der gemeinsame Speicher heißt Melder.
Zitat:Übertragen auf LV hieße das, daß man mit Referenzen arbeiten müßte.
Müssen nicht. Das Sample-Programm kann die Daten per Melder/Queue weiterschicken. Wer Daten haben will, hole sie sich ab.
Wie samples du denn deine Daten? Max oder eigene DLL?
Zitat:allerdings bin ich weiterhin für Vorschläge für mein Problem offen.
Was wolltest du nochmals haben? 36 Referenzen? Das müsstest du manuell machen. Also 32 Elemente anklicken, Referenz erstellen, und mit ArrayErzeugen zu einem Array machen.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
28.01.2009, 14:45 (Dieser Beitrag wurde zuletzt bearbeitet: 28.01.2009 14:49 von jg.)
Um mal etwas weiter auszuholen, wo die Daten her kommen:
Die Hardware besteht aus einem PIC18F4455 Microcontroller von Microchip, der von Hause aus USB spricht und sich als COM-Schnittstelle einnistet. Sehr praktisch das.
Nun gibt es eine DLL (nicht von mir), die über Queues die Kommunikation mit dem PIC regelt, und das geht eigentlich extrem fix.
Der PIC schickt mir Datensätze von 36 16bit-Werten (von einem ADC), die ich im Vorfeld in solche Arrays mit 36 Einträgen packe. Die so formatierten Datensätze werden in einer Queue zur weiteren Verarbeitung bereitgestellt.
Ich bekomme grade nur etwa 280 Datensätze pro Sekunde, weil der PIC nicht mehr schafft, aber da kann noch optimiert werden, um auf eine Zielrate von etwa 500 Sätzen pro Sekunde zu kommen.
Meine Auswertung holt sich nun einen Datensatz nach dem anderen aus der Queue und soll diese 36 Werte in die 36 Cluster einsortieren, sodaß Histogramme raus kommen.
Nun hab ich noch ein wenig rumprobiert:
Wenn ich diese Histogrammierung mit den Referenzen erledige (was ja halbwegs funktioniert, es gibt hinterher nur ein einziges Histogramm ), habe ich eine Systemlast von 40-60%, womit ich recht zufrieden bin, wenngleich ein C-Programm den Job erledigt, ohne daß die CPU das merkt.
Wenn ich nun sowas in der Art mache (Man möge sich oben die Queue vorstellen):
habe ich 100% Systemlast, und statt 280 Datensätze verarbeite ich nur noch 18 pro Sekunde. Das ist armselig.
Wenn ich die Queue einfach mal auslese, ohne die Datensätze weiter zu verarbeiten, komme ich auf eine Systemlast von etwa 3-4%.
Das ganze natürlich noch OHNE Anzeige im xy-Graphen.
' schrieb:Um mal etwas weiter auszuholen, wo die Daten her kommen:
Ja. Gut.
Zitat:habe ich eine Systemlast von 40-60%,
Das ist sehr schlecht. Entweder machst du was falsch, oder benutzt ein falsches Verfahren.
Zitat:Wenn ich nun sowas in der Art mache
Kein Wunder.
Da wird ja auch mit dem Memorymanager gearbeitet. Und der ist ein Zeitfressen ohne Gleichen. Überall, wo du autoindizierte Arrays erstellst, vergeht Zeit ohne Ende. Hier benutzt du also ein falsches Verfahren. Stell von autoindiziert auf Schieberegister um und überlege dir, wie es in der Schleife aussehen muss.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).