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!
11.05.2011, 11:34 (Dieser Beitrag wurde zuletzt bearbeitet: 11.05.2011 11:35 von HSK-Michael.)
Mein Programm bricht bei einer hohen Abtastrate immer mit dem Fehler - 200279 ab. Begründung ist, so wie ich das verstanden habe, das mein Programm gerne Daten aus einem Puffer lesen möchte dieser Pufer aber schon mit neuen Daten gefüllt ist. Als Lösung wir von NI Vorgeschlagen die Daten schneller auszulesen oder den Puffer zu erhöhen.
Wie erhöhe ich den Puffer?
Kann ich mein Programm schneller machen indem ich auf Express VI verzichte?
Muss ich auf das LIVE anschauen (Ausgabe durch Diagramme) meiner Daten verzichten?
Danke erstmal für die schnelle Antwort. Ich habe mein Programm angehängt, es ist ein Entwurf für ein Programm in dem später noch weiter Berechnungen folgen.
Ziel des programmes soll es sein eine Werkzeuspindel zu überwachen welche mit ca. 30000 min^-1 läuft daher ist auch die Abtastrate von 1,5kHz gefordert.
Zitat:Bei 1kHz kommt ein Standard-LV-Programm mit einen 1000-Sample-Puffer zuerst.
Kannst du mir das vielleicht genauer erklären?
Gruß Michael
11.05.2011, 14:45 (Dieser Beitrag wurde zuletzt bearbeitet: 11.05.2011 14:54 von Lucki.)
Der Fehler heißt, daß die Datenverarbeitung mit der Datenerzeugung nicht mehr Schritt hält, so daß sich der Datenpuffer immer mehr auffüllt.
Um das zu prüfen, kann man die Datenverarbeitung erst mal in eine Deaktivierungsstruktur setzen, so daß die Daten zwar noch gelesen werden, aber keine Zeit mehr für die Verarbeitung verloren geht.
Häufige Anfängerfehler sind:
Wait-Funktion in der Verarbeitungsschleife
Die Daten werden - trotz hoher Datenrate - 1-stückweise aus dem Datenpuffer gelesen und 1-stückweise verarbeitet.
Zu häufiges Updaten von Diagrammen (Der Mensch mit seinem trägen Auge und Gehirn ist mit 10 Updates/sec sehr gut bedient). Ganz schädlich ist auch das Platzieren von Anzeigen etc. in das Plotfeld eines Graphen.
Zu viele Eigenschaftsknoten in der zeitkritischen Haupschleife
Erst danach, wenn das alles das OK ist, würde ich Express-VIs mit in die Lister der Verdächtigen hineinnehmen - wobei dann auch noch zu klären ist, ob das VI als solches oder nur eine dämliche Konfiguration daran schuld ist.
11.05.2011, 15:09 (Dieser Beitrag wurde zuletzt bearbeitet: 11.05.2011 15:10 von HSK-Michael.)
Punkt 1. und 4. treffen glaub ich für mein Programm nicht zu.
Der 2. Punkt das Stückweise lesen und verarbeiten? - Wie kann ich das Überprüfen, ob die Daten 1-stückweise behandelt werden und wie kann ich das ganze abstellen?
Der 3. Punkt, ja 10 Udates pro Sekunde würden mir reichen auch nur 5. Wie kann ich das denn am elegantesten umsetzen? Durch eine Zeitlicheabfrage, Schleife oder ähnliches?
Gruß Michael
11.05.2011, 15:57 (Dieser Beitrag wurde zuletzt bearbeitet: 11.05.2011 16:01 von IchSelbst.)
(11.05.2011 15:09 )HSK-Michael schrieb: Punkt 1. und 4. treffen glaub ich für mein Programm nicht zu.
Stimnmt.
Zitat:Der 2. Punkt das Stückweise lesen und verarbeiten? - Wie kann ich das Überprüfen, ob die Daten 1-stückweise behandelt werden und wie kann ich das ganze abstellen?
Im ExpressVI für das Datenlesen steht unter "Zu lesende Samples" 1.
Zitat:Der 3. Punkt, ja 10 Udates pro Sekunde würden mir reichen auch nur 5. Wie kann ich das denn am elegantesten umsetzen? Durch eine Zeitlicheabfrage, Schleife oder ähnliches?
Eigentlich ganz einfach:
Einfach "Zu lesende Samples" mal auf 375 stellen. Abtastrate auf 1500 Hz. (375 Sample bei 15000 Hz machen 250ms Refreshrate am Bildschirm). Dein Programm (respektive die komplette While-Schleife) hat jetzt 250ms Zeit alles abzuarbeiten.
Du musst nur noch eine Sache machen: Das ExpressVI liefert dir zur Zeit ein 1D-Array mit den 6 Messwerte. Nach der Umstellung liefert es ein 2D-Array der Größe 375*6. Das komplette nachfolgende Programm muss also so gestaltet werden, dass es mit einem 1D-Array (pro Sensor) zurechtkommt anstelle eines einzelnen Wertes.
Du kannst dein VI grundsätzlich so beibehalten wie es ist und das mit den 375 Samples mal probieren.
Ich selbst würde aber abraten, ein Programm so aufzubauen, wie du es getan hast. Ein Grund ist: das Blockdiagramm ist zu groß und damit unübersichtlich. Ein zweiter Grund ist: Ich trenne gerne das Samplen der Daten von der Verrechnung und der Anzeige der Daten.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Anzeige
11.05.2011, 16:38 (Dieser Beitrag wurde zuletzt bearbeitet: 11.05.2011 16:40 von HSK-Michael.)
Also Abrastrate auf 15000 Hz und zu lesende Samples" auf 375 stellen. Das heißt mein Programm nimmt nur noch jeden 375ten Wert für einen durchlaufen. Das bedeutet wenn ich die vollen 1.5kHz aufzeichen will, geht das nur wenn ich direkt am DAQ-Assistenten die Werte abgreife und auf das aufzeichnen meiner durch das Programm umgerechneten Werte verzichte, bzw. das ich nur alle 250ms einen Wert mitschreiben lasse?
Eventuell eine naive Frage, was wäre wenn ich einen schnelleren Rechner benutze, oder spielt das eine untergeordnete Rolle?
Zitat:Du musst nur noch eine Sache machen: Das ExpressVI liefert dir zur Zeit ein 1D-Array mit den 6 Messwerte. Nach der Umstellung liefert es ein 2D-Array der Größe 375*6. Das komplette nachfolgende Programm muss also so gestaltet werden, dass es mit einem 1D-Array (pro Sensor) zurechtkommt anstelle eines einzelnen Wertes.
Das habe ich noch nicht verstanden?
Zitat:Ich trenne gerne das Samplen der Daten von der Verrechnung und der Anzeige der Daten.
Die Größe und Unübersichlichkeit? Ist es besser subVIs zu verwenden? Wie trennt man soetwas am besten?
Entschuldigt die vielen Anfängerfragen; durch eure Beiträge bin ich wieder voll motiviert worden.
Gruß Michael
11.05.2011, 16:57 (Dieser Beitrag wurde zuletzt bearbeitet: 11.05.2011 16:59 von IchSelbst.)
(11.05.2011 16:38 )HSK-Michael schrieb: Das heißt mein Programm nimmt nur noch jeden 375ten Wert für einen durchlaufen.
Nein, das heißt das nicht.
Das heißt: Pro Aufruf des Express-VIs bekommst du 375 Samples zurück.
Zitat:Das bedeutet wenn ich die vollen 1.5kHz aufzeichen will, geht das nur wenn ich direkt am DAQ-Assistenten die Werte abgreife und auf das aufzeichnen meiner durch das Programm umgerechneten Werte verzichte, bzw. das ich nur alle 250ms einen Wert mitschreiben lasse?
Letzteres ("alle 250ms mitschreiben") ist richtig.
Du musst auf gar nichts verzichten. Du kannst auch das ganze Array (also 375) mit 50 multiplizieren und einen Offset abziehen. Statt eines Wertes gibst du dann ein Array auf das Anzeigeelement (Graph).
Zitat:Eventuell eine naive Frage, was wäre wenn ich einen schnelleren Rechner benutze, oder spielt das eine untergeordnete Rolle?
Das spielt eine sehr, sehr untergeordnete Rolle (wobei ich davon ausgehe, dass du einen Rechner Stand der Technik hast: I5, 4GB, XP etc).
Zitat:Das habe ich noch nicht verstanden?
Schau mer mal (2010 ist ungünstig, hab ich hier nicht.)
Zitat:Ist es besser subVIs zu verwenden? Wie trennt man soetwas am besten?
Sehr, sehr viel besser.
Einfach alle Eingabe-Elemente in einen Cluster legen. Elemente wie die einzelnen IF-Strukturen kann man dann in ein SubVI auslagern, das dann z.B. den Cluser als Eingang hat. Usw.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Habe mal einen Blick auf das VI geworfen, und als erstes fielen mir die Mammutgebilde zur Erstellung von Protokolltext auf. (Das hat aber jetzt nichts mit Deinem Problem zu tun).
Das geht viel einfacher mit "In String formatieren"
In den Formatstring schreibt man den ganzen Protokolltest hinein (es darf auch eine ganze A4-Seite sein) , und dort, wo Werte hingehören, schreibt man Formatierungscodes, also z.B "%f", hinein.
Zur Erzeugung von Tab muß man entweder temporär auf "\" Code umschalten. oder man benutzt einen externen Editor zur Erstellung des Formattextes.
11.05.2011, 22:44 (Dieser Beitrag wurde zuletzt bearbeitet: 11.05.2011 22:47 von HSK-Michael.)
Zitat:Das heißt: Pro Aufruf des Express-VIs bekommst du 375 Samples zurück.
Ich habe das ganz mal getestet, das Programm läuft einwandfrei durch euch!!! Aber nocheinmal zu der 375 Sampel-Geschichte. Wenn ich 1 angebe gibt es 1 Wert pro Aufruf, bei 375 gibt es 375 pro Aufruf und "Kanal"? Das bedeutet in dem Array sind 375 Werte zwischengespeicht. Wenn ich nichts an meinem bissherigen Programm verändere nimmt das Programm den ersten oder letzten Wert aus dem Array und rechnet mit diesem Wert weiter. Dann wird der Array von den nächsten 375 überschreiben und das ganze beginnt erneut?
Sollte das richtig sein könnte ich wahrscheinlich auch den Array mit den 375 Wert nach dem maximum durchsuchen und mit diesem Wert meine Programm laufen lassen?
Das Programm nimmt Daten aus einem Bearbeitungszenrtum auf und soll auch zur Erbrobung von Startegien zum NOTAUS benutzt werden und ich habe bei der 375 Geschicht bedenken ob mir durch die "fehlenden Werte" nicht ein "Ausweiser" nach oben abhanden kommt. Wenn das so ist habe ich glaub ich auch das mit dem 1-stückweise verarbeiten geschluckt.
Das mit "In String formatieren" formatieren werde ich aufjedenfall umsetzen; danke für den Tip! Das mit den Sub VIs werde ich ebenfalls versuchen, hier vielleich noch eine Frage zur Geschwindgkeit; wenn ich z.B. 10 Kanäle habe, die in einen Cluster pake und dann über eine Leitung zu einen Ausgang schicke, ist das schneller als wenn ich jeden Kanal einzeln mit dem Ausgang verbinde? Eigentlich nicht weil ich den Cluster ja packen und entpacken muss, oder?