LabVIEWForum.de - Chart mit relativer Zeit bei Null beginnen lassen für Spezialfall

LabVIEWForum.de

Normale Version: Chart mit relativer Zeit bei Null beginnen lassen für Spezialfall
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

für ein Projekt soll ich zwei unabhängige LabVIEW-Programme in ein Programm schreiben, da die Programme beide auf einen A/D-Wandler zugreifen und daher nur ein DAQ Assistant benutzt werden kann (für DAXmx ist das Problem dasselbe wenn ich das richtig getestet habe). Bei diesen Programmen werden Drücke in Form von Spannung ausgelesen und abgespeichert - dabei werden auch elektro-pneumatische Ventile geschaltet (Das ist wahrscheinlich für die Problemstellung nicht so wichtig, aber ich wollte das trotzdem kurz erwähnen). Vorher wurde die Zeitnahme so realisiert, dass durch Drücken des Start-Buttons einer Messung in eine For-Schleife gewechselt wurde und die Startzeit des Charts über "Get Date/ Time in seconds" als Datenfluss von außerhalb der Schleife in die Schleife auf 0 gesetzt wurde. Ich hoffe das ist einigermaßen richtig ausgedrückt... Jetzt habe ich mir gedacht ich könnte die einzelnen Experimente ablaufen lassen, indem ich Case-Strukturen einbaue, die über zwei Start-Buttons aktiviert werden.
Nun weiss ich aber nicht wie ich die Zeitnahme realisieren soll, sodass die Messungen
1. bei Null starten, wenn ich einen der Start-Buttons drücke,
2. bei jeder neuen Messung wieder auf Null gesetzt sind und
3. eine neue Datei bei jeder Messung ausgewählt wird.

Ich hoffe hier kann mir irgendjemand weiterhelfen oder mir den einen Schubs in die richtige Richtung geben Smile
Das Haupt-VI sowie einen Ordner mit allen VIs habe ich angehängt.

Viele Grüße
BrowniesYay
Hallo Brownie,

herzlich willkommen im Forum!

Gleich mal eine Anmerkung vorneweg: Crosslinks bitte immer selbst anmerken!
Es ist blöd, wenn man sich mit Problemen beschäftigen soll, die anderswo vielleicht schon gelöst wurden…

Was hälst du davon, dein VI mal aufzuräumen? Und auf die ganzen lokalen Variablen weitestgehend zu verzichten?
Dann bekommst du nämlich deutlich weniger Raceconditions wie in diesem Ausschnitt hier:
[attachment=59852]

Zitat:Nun weiss ich aber nicht wie ich die Zeitnahme realisieren soll, sodass die Messungen
1. bei Null starten, wenn ich einen der Start-Buttons drücke,
2. bei jeder neuen Messung wieder auf Null gesetzt sind und
3. eine neue Datei bei jeder Messung ausgewählt wird.
Das ist jetzt aber eine reine Logik-Frage und hat wenig mit spezieller LabVIEW-Programmierung zu tun!
Code:
1. IF RisingEdge(Start) THEN Time := 0
2. Wie 1.
3. IF RisingEdge(Start) THEN FileDialog()

Noch ein Nachtrag:
- Wenn du schon ein ZIP erstellst, dann packe doch einfach alle VIs dort hinein (inkl. Main-VI). Und es schadet auch nicht, die Projektdatei mit dazu zu legen. Also am besten gleich deinen Projektordner zippen…
- LV2011 reicht eigentlich aus, wenn du schon (sinnvollerweise!) runterkonvertierst. LV2011 ist alt, aber LV8.5 ist dann doch schon sehr alt…
Hallo GerdW,

vielen Dank schon einmal für deine Antwort und die Begrüßung! Den Crosslink hätte ich einfügen sollen da hast du Recht - leider hatte ich in dem Forum das Gefühl, dass nicht wirklich auf das Problem eingegangen wurde, auch wenn die anderen Anmerkungen bestimmt richtig waren und ich mich zu gegebener Zeit mit DAQmx beschäftigen sollte.

Die lokalen Variablen sind teilweise noch aus einem "Vorgänger-Programm", das auch für die Steuerung der elektro-pneumatischen Ventile geschrieben wurde. Ich habe das sicherlich etwas gemacht, was man nicht tun sollte, nämlich sie aufgrund von Unwissenheit sicherheitshalber so übernommen. Man könnte die ganzen Reinit to Default auch weglassen und dann das komplette VI auf Reinit stellen, meinst du das?

Die Einstellung der Zeit wollte ich vorher über Ereignis-Strukturen aufbauen, also beim Drücken des Start-Buttons "Get Time/Date in seconds" einmalig als Startzeitpunkt festlegen lassen. Das hat leider so nicht funktioniert. Ich habe noch nie etwas von dem Begriff Rising Edge gehört und werde mich jetzt auf die Suche begeben, wie man das in LabVIEW umsetzen kann, und mich (hoffentlich) mit einem Update zurückmelden.

Viele Grüße
BrowniesYay
Hallo Yay,

Zitat:Das hat leider so nicht funktioniert.
Da du nicht das VI anhängst, welches "nicht funktioniert", können wir dir auch nicht sagen, wo der Fehler lag…

Zitat:Ich habe noch nie etwas von dem Begriff Rising Edge gehört und werde mich jetzt auf die Suche begeben, wie man das in LabVIEW umsetzen kann,
RisingEdge = steigende Flanke
Es gibt da die Funktion PtByPt-BooleanCrossing, die zur Erkennung von Flanken vorgesehen ist…
Hallo GerdW,

Ja das stimmt natürlich, ich probiere viel aus und speichere nicht alles ab, was nicht funktioniert. Ich glaube sonst wäre es in meinen Ordnern jetzt noch unübersichtlicher... Aber in dem Fall hätte ich es nochmal gerade rekonstruieren können.

Danke, dass du mir die Funktion genannt hast. Jetzt wollte ich eine Elapsed Time Funktion benutzen und sie über die Rising Edge auf Null setzen, falls der Start-Button gedrückt wird. Die Zeit wird aber immer nur für eine Sekunde gemessen und dann fängt der Chart wieder von Vorne an. Wahrscheinlich mache ich einen total trivialen Fehler, aber ich sehe ihn nicht...

Viele Grüße
Brownie




EDIT:
Okay das war wirklich doof ich habe jetzt als Time Target unendlich angegeben, das habe ich vergessen. So läuft die Zeit immer weiter, bis der Stop-Button gedrückt wird. Allerdings startet die Messung bei 00:01:00 ... Das wird an einer falschen Zeiteinstellung liegen und ich versuche jetzt herauszufinden, wo man das umstellen kann.
Könntest du mir noch einen Tipp geben, wie ich den Pfad bzw. die Datei so mit der Rising Edge einbinden kann, dass direkt die nächste verfügbare Datei gewählt wird, wenn man eine neue Messung startet?
Hallo Yay,

Zitat:Könntest du mir noch einen Tipp geben, wie ich den Pfad bzw. die Datei so mit der Rising Edge einbinden kann, dass direkt die nächste verfügbare Datei gewählt wird, wenn man eine neue Messung startet?
Mit "nächste verfügbare Datei" meinst du wohl den nächsten Dateinamen, der keine alte Datei überschreibt, oder?
Guck doch mal nach der Funktion "Create File with incrementing suffix"…

Warum hast du bei BooleanCrossing ein Integer angeschlossen - anstatt den korrekten Enum zu verwenden?
Hallo GerdW,

Genau, ich meinte damit den nächsten verfügbaren Datei-Namen, vielen Dank für die genaue Bezeichnung der Funktion so konnte ich das sehr schnell finden! Ich habe jetzt auch ein Enum an den BooleanCrossing angeschlossen. In der Help-Funktion war eine Tabelle mit 0 für either, 1 für false-true und 2 für true-false angegeben, deshalb dachte ich es wäre so gedacht, dass man auch einen Integer angeben kann. Das habe ich jetzt korrigiert.

Leider funktioniert das mit dem Zurücksetzen der Zeit und dem neuen Datei-Pfad nicht. Mache ich da grundsätzlich etwas falsch mit der BooleanCrossing-Funktion?


Viele Grüße
Brownie
Hallo Gerd,

Jetzt endlich funktioniert das VI (fast) so wie ich möchte! Ich musste die Funktion außerhalb der Case-Struktur platzieren und jetzt erkennt er das Umschalten des Start-Buttons. Allerdings werden bei jeder Ausführung eine Menge Dateien erzeugt, was mich etwas überrascht... Wenn ich den Dateinamen "Test" verwende wird beim ersten Drücken Test.lvm und Test_1.lvm erzeugt. Nach drücken von Stop und erneutem Starten dann sogar 3 Dateien (Test2.lvm, Test3.lvm und Test_2.lvm). Nur die Dateien mit _# kommen von der neuen Funktion, richtig?

Die letzte, ziemlich aufwendige Sache, die mir jetzt noch fehlt, ist die beiden Experimente in eigenen Fenstern anzeigen zu lassen. Der Hintergrund ist, dass die Experimente gleichzeitig und unabhängig voneinander ablaufen und auch auf unterschiedlichen Monitoren dargestellt werden sollen. Bisher habe ich dafür nur Lösungen gefunden, die über SubVIs realisiert werden. Da hier aber ein Analog-zu-Digital Wandler benutzt wird, ist es nicht möglich das so umzusetzen. Hat jemand da eine Idee?

Viele Grüße
Brownie
Hallo Yay,

Zitat:Ich musste die Funktion außerhalb der Case-Struktur platzieren und jetzt erkennt er das Umschalten des Start-Buttons.
Na siehste. Wenn du jetzt noch auf die lokale Variable verzichtest und einfach Draht verwendest…

Zitat:Allerdings werden bei jeder Ausführung eine Menge Dateien erzeugt, was mich etwas überrascht... Wenn ich den Dateinamen "Test" verwende wird beim ersten Drücken Test.lvm und Test_1.lvm erzeugt. Nach drücken von Stop und erneutem Starten dann sogar 3 Dateien (Test2.lvm, Test3.lvm und Test_2.lvm). Nur die Dateien mit _# kommen von der neuen Funktion, richtig?
Vielleicht, weil du in deinem ExpressVI ebenfalls noch "use next available filename" aktiviert hast? Jetzt erzeugst du eben gleich an zwei verschiedenen Stellen im Code neue Dateinamen…

Zitat:Die letzte, ziemlich aufwendige Sache, die mir jetzt noch fehlt, ist die beiden Experimente in eigenen Fenstern anzeigen zu lassen.
Ein VI hat ein Frontpanel. Wenn du zwei Frontpanel benötigst, brauchst du zwei VIs - logisch, oder?
Was soll daran "aufwendig" sein?

Zitat:Bisher habe ich dafür nur Lösungen gefunden, die über SubVIs realisiert werden.
Du weißt also, wie es geht…

Zitat:Da hier aber ein Analog-zu-Digital Wandler benutzt wird, ist es nicht möglich das so umzusetzen.
Warum nicht?

Zitat:Hat jemand da eine Idee?
Verwende einfach ein subVI pro "Messaufgabe"…
Vorher musst du aber deine lokalen Variablen aufräumen - aber das weißt du ja schon.

Etwas abgewandelte Idee: verwende eine Producer-Consumer-Struktur (Beispiel-Projekte in LabVIEW!): ein VI holt die Messdaten und schickt sie in Queues. Deine Consumer (aka deine Messaufgaben) zeigen die Messdaten an und verarbeiten sie…

Grundsätzlicher Hinweis: Üblicherweise überlegt man sich erst eine Programmstruktur und fängt dann mit Programmieren an!

Zitat:Ich habe jetzt auch ein Enum an den BooleanCrossing angeschlossen. In der Help-Funktion war eine Tabelle mit 0 für either, 1 für false-true und 2 für true-false angegeben, deshalb dachte ich es wäre so gedacht, dass man auch einen Integer angeben kann. Das habe ich jetzt korrigiert.
Ich meinte eher eine Enum-Konstante. Und die erzeugt man, wie nahezu alle anderen Konstanten, am einfachsten per Rechtsklick auf den jeweiligen Eingang des subVIs/der Funktion…
Referenz-URLs