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!
zur Zeit bearbeite ich die Messwerterfassung eines alkalischen Elektrolyseurs über SOAP und OPC. Die Daten sollen, versehen mit einem SubVI zur Zeitstempelerzeugung, jede Sekunde in ein TDMS-File geschrieben werden. Um die Daten mit konstanten Zeitabständen abzuspeichern erfasse ich am Anfang den Timer, lasse die Daten schreiben, leere die TDMS und bilde dann die Differenz zwischen dem aktuellen und dem Anfangstimer und diese Differenz wird dann von den 1000ms abgezogen. Somit wollte ich eigentlich sicherstellen, dass wenn der Code bspw. 200ms zur Abarbeitung benötigt, die Eventstruktur nur noch 800ms wartet. Die Eventstruktur deswegen, weil das Programm auf ein "Messung beenden" auf dem Frontpanel unmittelbar reagieren soll.
Das funktioniert soweit sehr gut, allerdings passiert es manchmal, dass derzweite Timer irgendwie sehr groß ist und nach meiner Differenzbildung schließlich ein negativer Timeout an der Eventstruktur anliegt. Dann war´s das natürlich mit meiner Messung.
Offensichtlich habe ich da ein grundsätzliches Verständnisproblem?
Ich hoffe, jemand von euch kann mir da weiterhelfen. Diese Intervallprogrammierung habe ich eigentlich bisher immer benutzt, nur ist mit meistens nichts aufgefallen, bis schließlich ein Student unseres Labors bei einem Versuch mit meinem Programm mich daauf hinwies, dass die Messung aufgrund des negativen Timeouts abbricht.
Anbei habe ich mal den Screenshot angefügt.
Danke schon einmal,
Jonas
Anzeige
27.08.2012, 08:13 (Dieser Beitrag wurde zuletzt bearbeitet: 27.08.2012 08:18 von Clyde.)
ist dir das "Wait until Next ms Multiple"-VI ein Begriff? Das macht eigentlich genau das, was du möchtest. Das könntest du zum Beispiel innerhalb deiner Case-Struktur mit einem Wert von 999(ms) platzieren und den Timeout-Eingang der Ereignisstruktur mit 1(ms) belegen.
So ist sichergestellt, dass die Case-Struktur immer 999 ms benötigt, bevor die Ereignisstruktur anfängt.
Ich hoffe, das hilft dir
Gruß
Christoph
Edit:
es sieht ja so aus, dass die Bearbeitung der Case-Struktur manchmal mehr als eine Sekunde benötigt (weshalb dann negative Werte am Timeout-Eingang resultieren). Negativer Wert heißt, dass kein Timeout vorgesehen ist. Wäre es nicht auch möglich negative Werte abzufangen und sie zu einer Null umzuwandeln, bevor man sie zur Ereignisstruktur weiterreicht? Natürlich wäre dann deine exakt sekündliche Messung hinüber.
Hallo,
gut, das könnte man natürlich so machen, aber wie du schon richtig bemerkt hast, ist das Hauptproblem der negative Wert an der Eventstruktur. Ich könnte eine Auswahl treffen und so den negativen Wert abfangen, aber genau das soll ja auch gar nicht erst passieren. Ich dachte, es gibt vielleicht eine Möglichkeit das eleganter zu implementieren, sodass mein Problem gar nicht erst auftritt...
(27.08.2012 09:07 )gm-axion schrieb: Ich könnte eine Auswahl treffen und so den negativen Wert abfangen, aber genau das soll ja auch gar nicht erst passieren.
Und woran scheiterts?
(27.08.2012 09:07 )gm-axion schrieb: Ich dachte, es gibt vielleicht eine Möglichkeit das eleganter zu implementieren, sodass mein Problem gar nicht erst auftritt...
Mit dem obigen Lösungsvorschlag wird der Timeoutanschluss nie negativ.
Beste Grüße,
NWO
9 von 10 Stimmen in meinem Kopf sagen: Ich bin nicht verrückt,
die andere summt die Melodie von Tetris.
NI schrieb:To use the abort button is like using a tree to stop a car!
Das Problem ist aber, dass deine Messung mehr als eine Sekunde benötigt; sonst würden keine negativen Werte auftreten.
Was ich damit sagen will: du solltest das Problem an der Wurzel anpacken und nicht versuchen das Drumherum zu verbessern. Du musst rausfinden warum die Verarbeitung manchmal mehr als eine Sekunde braucht und das beheben.
Die Zeit kann man auch mit der besten Programmierung nicht schneller oder langsamer laufen lassen
(27.08.2012 09:33 )Clyde schrieb: Das Problem ist aber, dass deine Messung mehr als eine Sekunde benötigt; sonst würden keine negativen Werte auftreten.
Was ich damit sagen will: du solltest das Problem an der Wurzel anpacken und nicht versuchen das Drumherum zu verbessern. Du musst rausfinden warum die Verarbeitung manchmal mehr als eine Sekunde braucht und das beheben.
Die Zeit kann man auch mit der besten Programmierung nicht schneller oder langsamer laufen lassen
Genau das war der Kern meiner Frage Das habe ich wohl nicht so gut ausgedrückt.
Am besten einfach mal ein paar Marken setzen und gucken. Allerdings lief das Programm sogar schon knapp 2 Tage ohne Probleme.
Gibts vielleicht etwas, was auf das Problem hinweist? Ob das leeren des Puffers zwischendrin mal mehr zeit benötigt? Das Cluster sollte für die TDMS-Befehle auch lesbar sein, wenn da die erzeugerschleife nachhängt. (?)
(27.08.2012 09:33 )Clyde schrieb: Das Problem ist aber, dass deine Messung mehr als eine Sekunde benötigt; sonst würden keine negativen Werte auftreten.
Was ich damit sagen will: du solltest das Problem an der Wurzel anpacken und nicht versuchen das Drumherum zu verbessern. Du musst rausfinden warum die Verarbeitung manchmal mehr als eine Sekunde braucht und das beheben.
Die Zeit kann man auch mit der besten Programmierung nicht schneller oder langsamer laufen lassen
Genau das war der Kern meiner Frage Das habe ich wohl nicht so gut ausgedrückt.
Am besten einfach mal ein paar Marken setzen und gucken. Allerdings lief das Programm sogar schon knapp 2 Tage ohne Probleme.
Gibts vielleicht etwas, was auf das Problem hinweist? Ob das leeren des Puffers zwischendrin mal mehr zeit benötigt? Das Cluster sollte für die TDMS-Befehle auch lesbar sein, wenn da die erzeugerschleife nachhängt. (?)
Hallo Jonas,
Deine "Intervallprogrammierung" ist nicht so mein Fall
aber trotzdem ein paar allgemeine Tipps:
- Der Zugriff mittels Property-Nodes und die Umwandlung nach dynamische Daten sind unnötig. Die Property Nodes-Werte (langsamer Zugriff auf die Werte+Frontpanel-Update) kannst Du bestimmt mit den echten Control-Werten ersetzen und gleich in Waveform schreiben, was die Dynamische-Daten-Wandlung überflüssig macht.
Das ganze dann schön kompakt in ein Datenarray mit dem Du in eine For-Schleife gehst und zum Speichern dann nur einen TDMS-Write benötigst.
- „Das Problem ist aber, dass deine Messung mehr als eine Sekunde benötigt; sonst würden keine negativen Werte auftreten.“ – Grund hierfür ist wahrscheinlich die Fragmentierung der TDMS-Datei. Dies ist sehr häufig zu beobachten wenn Einzelwerte geschrieben werden (so wie in Deinem Fall). Als Indikator für die Fragmentierung beobachte mal die automatisch angelegte *.tdms_index Datei. Diese ist dann nahezu gleich gross wie die eigentliche TDMS-Datei. Abhilfe schafft das TDMS- Defrag. Dazu musst Du jedoch das Schreib-Handling wie folgt umstellen: Die TDMS-Datei öffnen-Werte schreiben-TDMS-Datei schließen und anschließend defragmentieren. Du brauchst nicht jede Iteration zu defragmentieren.Hierfür bietet sich an „ausnahmsweise ein Express-Vi Verstrichene Zeit (elapsed Time)“ zu nehmen, bei der Du am Anschluß (Time Target (s)) z.B. 60s einstellt. Am Ausgang „Time has elapsed“ wertest Du den Boolean in einer case aus (TrueDefrag)—False (nix).
- Wenn das ganze wochenlang bzw. monatelang speichern soll, mache Dir schon einmal Gedanken für einen automatischen Dateisplit.
Hallo Ralf,
danke für die Tipps. Allerdings verstehe ich nicht ganz, was mit deinem folgenden Ansatz gemeint ist.
Soll heißen, ich sollte lieber den Cluster mit meinen Werten gleich direkt abspeichern, statt aufdröseln und einzeln abspeichern?
[/quote]
Hallo Jonas,
Deine "Intervallprogrammierung" ist nicht so mein Fall
aber trotzdem ein paar allgemeine Tipps:
- Der Zugriff mittels Property-Nodes und die Umwandlung nach dynamische Daten sind unnötig. Die Property Nodes-Werte (langsamer Zugriff auf die Werte+Frontpanel-Update) kannst Du bestimmt mit den echten Control-Werten ersetzen und gleich in Waveform schreiben, was die Dynamische-Daten-Wandlung überflüssig macht.
Das ganze dann schön kompakt in ein Datenarray mit dem Du in eine For-Schleife gehst und zum Speichern dann nur einen TDMS-Write benötigst.
Gruß
Ralf
[/quote]
(27.08.2012 16:13 )gm-axion schrieb: Soll heißen, ich sollte lieber den Cluster mit meinen Werten gleich direkt abspeichern, statt aufdröseln und einzeln abspeichern?
Dein Screenshot sieht so aus, als würde der Cluster nur DBL-Werte enthalten. Diese kannst du auch gleich komplett als Array speichern.
Hier ein mögliches Konzept:
Beste Grüße,
NWO
9 von 10 Stimmen in meinem Kopf sagen: Ich bin nicht verrückt,
die andere summt die Melodie von Tetris.
NI schrieb:To use the abort button is like using a tree to stop a car!
Hallo,
okay das bringt schon ein paar Millisekunden und ist übersichtlicher, danke!
Das Hauptproblem scheint nun tatsächlich die ständig wachsende Index Datei zu sein. Leider zeigt das Defragmentieren keinerlei Wirkung bei mir, im Gegenteil:
Sobald ich im Case True von "zeit verstrichen" schließe, defragmentiere und wieder öffne braucht meine Schleife auch mehr als eine Sekunde...
Das kann dich nicht so schwer sein, wie ich mir das hier mache