Zum groben Verständnis habe ich mal 2 Bilder, einmal das HauptVi und das SubVi für die Messwerterfassung angefügt...
In dem Programm geht es darum 3 Messwerte während eines Prüflaufes aufzunehmen, gleichzeitig in einem XYGraphen darzustellen und die Werte schließlich in ANSI format als textdatei abzuspeichern.
Zunächstmal sei gesagt das die beiden Bilder nur grobe Nachbauten des eigentlichen Programms darstellen um einfach nur zu zeigen wie das Programm ungefähr aussieht und abläuft...
Folgendes Problem ist nun aufgetaucht. Die Messwertaufnahme sowie in eine Datei schreiben funktioniert im Prinzip gut, nur bekomme ich unrhythmisch öfters Zeitaussetzer während dem Prüflauf, bzw. während dem Messwerteaufzeichnen...
Diese Aussetzer gehen teilweise an die 200ms. Während es aussetzt bekomme ich keine Istwerte bzw. werden auch keine Werte ins Array gespeichert... das äußert sich dann im XYGraphen mit Treppchen und teilweise mit längere Balken...
Zu den Aussetzern kommt hinzu das das Programm stetig langsamer wird (bis auf 45ms Zykluszeit). Dies kann eigentlich nur am "ins Array schreiben" liegen... da das Programm erst dann stetig langsamer wird wenn der Prüflauf beginnt und das Array befüllt wird. Sobald ich das Array dann lösche ist die Hauptschleife wieder auf seiner stabilen 3-5ms.
Das würde mir ausserdem erklären das ich am ende eines Prüflaufs nur ca. 3500 Messwerte im Array sitzen habe bei einer Prüflaufzeit von ca. 1,3 min. Das mir viel zu wenig erscheint.
Versuchsweise hatte ich mal die selbe Messwertaufzeichnung getrennt ablaufen lassen wo ich allerdings nur eine Zufallszahl ins Array schreiben liess, und da hatte ich am ende über 40000 Messwerte... wobei da auch bestimmt noch mehr gehen würde..
Wie dem auch sei ich hoffe ich konnte mein Problem genügend veranschaulichen.
Ich möchte auch hinzufügen das ich kein LabVIEW Profi bin und eigentlich mit mir schon soweit zufrieden bin das ich das überhaupt soweit geschafft habe... aber jetzt komm ich an einem Punkt der Verzweiflung für die ich keine schnelle Lösung finde...
Bedanke mich schonmal im voraus...
Jou, ich schätze dein "Insert into Array" und das folgende "Build Array" werden mit größer werdendem Array immer langsamer. Kennst du die maximale Array-Größe? Dann könntest du mit "Replace" arbeiten, das ist wesentlich schneller!
ah ok das könnt sein, weil nämlich das XYGraph Anzeigeelement auch in der Hauptschleife liegt.
Aber wie würde ich denn die Arraywerte von der Hauptschleife in die links daneben bekommen,
wenn ich angenommen den Graph in die linken Schleife lege die nur alle 250ms abgefragt wird.
Über lokale Var würd ich das nicht probieren, oder wär das in dem Fall egal?
Die Arraygröße ist mir im prinzip nicht bekannt, das programm soll ja soviel messwerte aufnehmen können wie geht... aber müsste doch in so einer kurzen zeit doch keine Auswirkung auf die gesammte schleife haben oder?
' schrieb:ah ok das könnt sein, weil nämlich das XYGraph Anzeigeelement auch in der Hauptschleife liegt.
Aber wie würde ich denn die Arraywerte von der Hauptschleife in die links daneben bekommen,
wenn ich angenommen den Graph in die linken Schleife lege die nur alle 250ms abgefragt wird.
Über lokale Var würd ich das nicht probieren, oder wär das in dem Fall egal?
Die Arraygröße ist mir im prinzip nicht bekannt, das programm soll ja soviel messwerte aufnehmen können wie geht... aber müsste doch in so einer kurzen zeit doch keine Auswirkung auf die gesammte schleife haben oder?
Hast du den Link mal angeschaut? Du kannst deine XY-Anzeige in der Hauptschleife lassen, nur aber in einer Case-Struktur verstecken und halt nicht mit jedem Schleifendurchlauf erneuern.
eg
also es hat geholfen die Graphanzeigen während des Prüflaufs zu deaktivieren und erst nach Ende des Prüflaufs zu aktivieren... der nachteil ist halt leider keine online anzeige während dem prüfen... der vorteil keine aussetzer mehr!...
Ich hatte wie oben im Link beschrieben versucht die Anzeigen zeitlich mal zu aktivieren und deaktivieren aber einige aussetzer kamen dennoch...
jetzt beobachte ich folgendes...
Wenn ich das programm starte und mache ein prüflauf, dann erhalte ich so ca. 8000 messwerte... (im prinzip gerade so ausreichend!!)
beim 2. durchgang nur noch 7500... usw. das habe ich soweit getrieben bis ich nur noch 4300 messwerte pro prüflauf erhielte... Es ist schon wichtig das ich meine konstante Anzahl an Messwerten erhalte...
Ich gehe sicherlich davon aus das ich irgendwas während dem Array schreiben falsch mache...
zumal während der prüfzeit die zykluszeit sich von stabilen 2-3ms auf 4-5 ms ansteigen... sobald ich das array wieder lösche habe ich meine stabile 2-3 ms wieder...
Jetzt wurde weiter oben angemerkt nicht build array sondern in array ersetzen oder so ähnl. zu benutzen aber dadurch müssen man die array größe kennen... wie ist das zu verstehen?
Wenn ich 20 000 Werte haben möchte, bekomme ich die dann auch?
vielleicht verstehe ich auch was falsch?!
Wie sollen wir das jetzt wissen?
Du hast noch kein Wort darüber verloren, was bei dir "Messdatenerfassung" heisst.
Woher bekommst du deine Messdaten? DAQ? Bilder? Seriell? GBIB? Fragen über Fragen!
Denn in dein Datenerfassung(bzw. DatenIO)-VI kann ich hier per Hellseherfunktion nicht reinschauen.
MfG, Jens
Die Hauptgründe, warum es nicht gut funktioniert, wurden ja schon genannt:
1.) Funktion Ersetzen statt Anhängen bei den Arrays verwenden
2.) Man kann/soll ein Diagramm nicht 1000mal in des Sekunde Updaten.
Das Übel beginnt hier schon bei der Datenerfassung. (Auch ich kann allerdings nicht hellsehen, wie das bei Dir genau ist. Aber so viel steht fest: Die Optimierung der Datenerfssung ist das wichtigste)
Folgendes sollte da beachtet werden:
1) Die Datenerfassungs VI, und nicht die übergeordnete Schleife, sollte den Takt bestimmen. Der Takt sollte von der Hardware der Messkarte getriggert sein, und nicht wie bei Dir, wo jeder einzelen Messwert von der übergeordneten Schleife ausgelöst wird. Wenn man das VI DAQmx Lesen verwendet, bestimmt dieses automatisch den Takt, da es immer so lange wartet, bis die gewünschte Anzahl von (hardwaregeriggerten) Werten im DAQ-Buffer erreicht ist
2) Bei einer Rate von 1000Sampes/sec ist es der helle Wahnsinn, jeden Wert einzeln aus dem DAQ-Buffer auszulesen und zu verarbeiten. Sinnvoll währe z.B eine Bufferlänge von 200 Samples. Dann würde auch das Diagramm nicht 1000 mal ind er Sekunde, sondern nur noch 5 Mal upgedatet. Natürlich muß da manches in der Organisation geändert werden.
2 kleine Hinweise:
a) Die Timer in der Eventschliefe ist überflüssig. Das Timeout ist bereits auf Unendlich eingestellt, d.h ein Schleifendurchlauf findet überhaupt nur dann statt, wenn ein Ereignis anliegt.
b) Der Stop-Taster muß spätesten beim Neustart des Pragramms mit eine lokalen Variablen auf false rückgesetzt werden.
Wenn man mich fragen würde, wie ich es machen würde, dann würde ich dies sagen:
Signalverlaufsdiagramm statt XY-Garaph verwenden. Dort ist eine Rinpuffer schon eingebaut, Du brauchst Dich nicht mit dem Sammeln und Aufbewahren aller Daten (Inserte oder Replace) im Vorfeld herumzuschinden. Außerdem hast Du nur dort die Möglichkeit Stapelplots zu verwenden (Deine Signalbezeichnungen "Hub", "Lastwert", "Kraft" sehen mir nicht so aus, als ob man sie in einem Diagramm mit einer einheitlichen Y-Achse konfortabel darstellen könnte)
@ Jens G
Die Frage war auf das "Ersetzen anstatt Anhängen" bezogen.
Schließlich muss ich dann meine Arraygröße kennen, was mich jetzt fragen lässt ob diese angegebene Arraygröße analog zu dem ist, was ich dann später an Werte in dem Array erhalten werde...
aber gut ich werds einfach mal ausprobieren...
@Lucki
danke für die Hinweise...
Wenn ich das Signalverlaufsdiagramm benutze dann darf ich/kann ich sozusagen meine Istwerte dort anschließen und die werden automatisch gepuffert und angezeigt?
Dann würde aber noch offen bleiben wie ich die Daten dann in eine ANSI Datei bekomme...
Naja ich probier mal beide Varianten vielleicht lösen sich ja gleich alle Probleme auf...
Vielen Dank soweit...
' schrieb:Wenn ich das Signalverlaufsdiagramm benutze dann darf ich/kann ich sozusagen meine Istwerte dort anschließen und die werden automatisch gepuffert und angezeigt?
Ja, so ist es, aber wenn Du mit "automatisch" meinst, das jeder Anfänger das ohne Probleme hinbekommt, dann muß ich Dich enttäuschen. Schon wenn es mehr als ein Kanal ist wird es schwieriger. Ich habe recht lange gebraucht, bis ich alle Möglichkeiten von Signalverlaufsdiagrammen auschöpfen konnte.
Wenn Du nicht klar kommt: funktionsfähiges VI posten, wobei die darzustellenden Daten (updates) in eine normale Anzeige gehen. Dann kann Dir hier weitergeholfen werden.