Daten zwischenspeichern??? - Druckversion +- LabVIEWForum.de (https://www.labviewforum.de) +-- Forum: LabVIEW (/Forum-LabVIEW) +--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein) +--- Thema: Daten zwischenspeichern??? (/Thread-Daten-zwischenspeichern) Seiten: 1 2 |
RE: Daten zwischenspeichern??? - JoeCain - 01.04.2014 07:33 Die sauberste Lösung ist mit Sicherheit an dieser Stelle ein Ringspeicher der mindestens 5 Sekunden Daten vorhält. Bei Abschaltung wird dieser dann ausgelesen und ausgewertet. Den Ringspeicher baut man im besten in Form einer Functional Global Variable (vielleicht auch als Old Style Global bekannt) Beispiel und Erklärung: https://decibel.ni.com/content/docs/DOC-2143 Auch wenn das jetzt evtl. für die Anforderung zu weit geht ist das eine Grundtechnik der LabVIEW Programmierung die man sich aneignen sollte. RE: Daten zwischenspeichern??? - GerdW - 01.04.2014 07:52 Hallo Jontef, Zitat:Wenn du alles durch lokale Variablen übersichtlicher gestalten willst, solltest du dein Blockdiagramm in Sequenzen aufteilen.Du willst also ein Design, welches dem DATAFLOW widerspricht, dadurch verschlimmbessern, dass du die parallele Datenverarbeitung auch noch durch massiven Einsatz von Sequenzen praktisch unterbindest? RE: Daten zwischenspeichern??? - Jontef - 01.04.2014 11:04 (01.04.2014 07:52 )GerdW schrieb: Hallo Jontef, Ist erstmal die einfachste Lösung aber nicht unbedingt die sauberste Lösung um Race Conditions zu vermeiden. Über Sequenzen wird aber klar ersichtlich, welcher Rechenschritt als erstes erfolgt und welche danach usw. Über FGV's kann dies natürlich auch bewerkstelligt werden, aber hier hast du dann auch keine parallel Datenverarbeitung mehr. (http://zone.ni.com/reference/en-XX/help/371361H-01/lvconcepts/using_local_and_global/ Using one functional global variable instead of multiple local or global variables ensures that only one operation executes at a time, so you never perform conflicting operations or assign conflicting values to stored data.) RE: Daten zwischenspeichern??? - JoeCain - 02.04.2014 08:10 (01.04.2014 11:04 )Jontef schrieb: Über FGV's kann dies natürlich auch bewerkstelligt werden, aber hier hast du dann auch keine parallel Datenverarbeitung mehr. Die parallele Datenverarbeitung ist glaube ich eine Ansichtssache. Bei einer FGV's kann ich mir zumindest sicher sein das die Daten die ich lese im Moment auch die aktuellen Daten sind, bei einer lokalen Variable kann ich z.B. eine Speicherkopie lesen die nicht mehr aktuell ist weil beim Lesevorgang der Ursprung meiner Kopie überschrieben wird. Und wenn ich eine zeitlich aufwendige Auswertung habe, dann hat die nichts in einer FGV zu suchen und ich darf die FGV nur als Datencontainer (Old Style Global) benutzen. Nach dem auslesen oder schreiben ist die FGV dann ja wieder frei für den anderen Prozess. RE: Daten zwischenspeichern??? - GerdW - 02.04.2014 08:13 Hallo Joe, ich will nicht mit dir über die Vorzüge von FGVs diskutieren, die dürften uns beiden bekannt sein… Mein Kritikpunkt war, dass im VI des OP lokale Variablen missbraucht wurden, weil man anscheinend von einer textbasierten Programmierung die Verwendung von Variablen gewohnt ist. Hier geht es schlicht um DATAFLOW-Programmierung mit Drähten, die im gezeigten VI ganz klar missachtet wurde… RE: Daten zwischenspeichern??? - JoeCain - 02.04.2014 10:36 (02.04.2014 08:13 )GerdW schrieb: Hallo Joe, Hallo Gerd, das ging auch nicht an dich sondern an den Vorposter Aber zum eigentlichen Problem: Zitat:Ich habe einen Modellaufbau Wenn ich das so richtig verstehe ist das doch dann kein Problem der Auswertung, sondern ein Problem das du noch Daten erfasst nach der Abschaltung und diese noch auswerten lässt. In diesem Fall musst du verhindern das deine erfassten Daten in die Auswertung übergeben werden bzw. die Aufwertung darf nach der Abschaltung nicht mehr ausgeführt werden und muss dir eigentlich das letzte gültige Ergebnis von vor der Abschaltung liefern. Einfachster Weg zum testen ob dann das gewünschte Ergebnis herauskommt: Den gesamten Inhalt der While Schleife im Distanzschutz.vi in eine Case Structur. - Im True Fall ist die Messung aktiv, dort werden die Berechnungen durchgeführt und alle Ergebnisse werden in "nicht Initialisierte" Shift-Register geschrieben. - Im False Fall (Abschaltung durchgeführt) werden die Shift-Register einfach durchverdrahtet. Somit werden die ungültigen Messwerte nicht ausgewertet und die Ergebnisse der letzten gültigen Messwerte werden beibehalten. Man musst jetzt von außen vorgeben wann deine Abschaltung aktiv ist bzw. wann die Messung noch gültig ist. Da die Shift Register nicht initialisiert sind, stehen da beim ersten Durchlauf noch die alten Ergebnisse drin, was aber nur ein Problem wär wenn bei einem Neustart der Messung die Abschaltung direkt aktiv wäre, sollte aber eigentlich nicht auftreten. Das könnte man dann noch verhindern indem man den Case über ein Enum steuert welches 3 States beinhaltet (init = Initialisierung der Shiftregister, Messung = Berechnung der Daten, Abschaltung = Mach nichts und gebe alte Daten aus) |