(24.11.2015 20:24 )IchSelbst schrieb: (24.11.2015 16:37 )m.werle schrieb: Was für ein zusätzlicher Case? Diese grundsätzlichen Funktionen "Auslesen" und "Reinschreiben" kann ich ja nicht umgehen.
Anstatt Daten aus der FGV zu lesen, im Cluster IDC_AVG zu ändern und den geänderten Cluster wieder zurückzuschreiben, machst du folgendes: Die FGV bekommt einen neuen Enumerator-Wert "Set_IDCAVG" und einen Variant-Eingang, an dem der double-Wert IDC_AVG angeschlossen wird. Im FGV bekommt die Case-Struktur einen neuen Case "Set_IDCAVG". In diesem Case wird der Variantwert in einen Double gecastet und im Datensatz, der im Schieberegister liegt, gespeichert. Selbstverständlich kann man anstelle nur eines double-Wertes auch einen Cluster machen aus den drei AVG-Werten.
Ok, jetzt hab ich die Umsetzung ganz kapiert.
Zitat:Zitat:Bei dem Bild "GanzBöseRaceCondition" ist es ja beispielsweise auch egal, ob zwischen diesen Aufrufen irgendein anderes VI auf das FGV zugegriffen hat.
Wenn zwischen diesen beiden Zugriffen auf die FGV jemand anders genau das selbe macht (Auslesen, Ändern, Reinschreiben irgendwelcher Daten aus dem selben Datensatz), dann ist die Arbeit des anderen umsonst: Dessen Daten werden vom ersten Prozess beim Zurückschreiben überschrieben.
Bei dem Bild "GanzBöseRaceCondition" wird nur die Clusterstruktur ausgelesen, also nur die Struktur in welcher die Daten im FGV gespeichert werden! Diese Struktur bleibt während der gesamten Programmlaufzeit konstant! Die Werte, die in der Struktur gespeichert sind, sind vollkommen egal. Ob ich meine einzulesenden Werte außerhalb des FGV in ein Cluster bundle und es ins FGV reinschreibe oder als Variant einlese und erst in der FGV per Caseauswahl in den entsprechenden Datentyp umwandle und ins richtige Schieberegister packe, ist doch im Prinzip egal.
Laufzeitfehler treten nur auf, wenn ich Werte(! nicht konstante Strukturen) aus dem FGV auslese, diese im Programm ändere und während dieses Prozesses, bevor ich die veränderten Werte wieder ins FGV geschrieben habe, ein anderes Programm die selben Werte (allerdings noch unverändert) aus dem FGV ausliest, verändert um sie anschließend ebenfalls wieder ins FGV schreiben möchte.
Edit: Die Werte werden doch entnommen, nicht nur die Struktur.
Der Rest dieses Beitrags ist zwar nicht direkt falsch, aber unwichtig...
Programm A liest Wert X aus FGV, inkrementiert ihn.
Programm B liest Wert X aus FGV, dekrementiert ihn.
Programm A speichert inkrementierten X-Wert ins FGV zurück.
Programm B speichert dekrementierten X-Wert ins FGV zurück. -> Laufzeitfehler.
Das Inkrementieren von Programm A wurde einfach übergangen und war nutzlos. X ist am Ende eins kleiner wie am Anfang. Wenn beide Programme hintereinander gearbeitet hätten, wäre X gleich geblieben.
Keine der Variablen, welche ich im FGV speichere, nutze ich auf diese Art und Weise. Ich habe lediglich Grenzwerte und Parameter gespeichert. Die werden vom User eingestellt und später während der Laufzeit ausgelesen. (Teilweise auch nur einmalig, deshalb müsste ich das Sample-VI auch schließen und neustarten, um eine Änderung gewisser Parameter auch wirksam werden zu lassen. Inline-Umsetzung könnte da komplizierter sein und ist auch gar nicht nötig.)
Ein paar andere Variablen, wie das Steuersignal zum Beispiel oder ein paar Messwerte, werden zwar auch gespeichert. Hier kann es aber meiner Meinung nach auch nicht zu Laufzeitfehlern kommen. Wenn ausgelesen wird, dann für andere Funktionen. Wenn reingeschrieben wird, dann unabhängig davon, was vorher drin stand.
Wenn deine vorgeschlagene Änderung die Performance verbessert, würde ich sie trotzdem gern umsetzen. Sonst spar ich mir die Arbeit.