05.05.2015, 09:18
Hallo,
ich habe eine Frage zur Übertragung großer Arrays. Zunächst ein paar Rahmenbedingungen: Um aus einer SPS bis zu 200 Variablen im Millisekundentakt auslesen zu können, habe ich im Zuge meiner Masterarbeit ursprünglich versucht über einen Puffer in LabView die Daten zu übertragen. Da dies nicht den gewünschten Erfolg gebracht hat bin ich dazu übergegangen die Daten schon in der SPS zu puffern und LabView die Daten dann blockweise übertragen zu lassen. Diese Blöcke beinhalten dann mehrere Millisekunden mit je 200 Variablen als 1D-Array, dessen Größe abhängig von der in LV eingestellten Wartezeit (derzeit 30 ms) ist. Diese Blöcke werden anschließend in Textdateien (allerdings mittels Express-VI, hier ist vermutlich auch nochmal einiges an Geschwindigkeit reinzuholen?!) geschrieben und ich kann kontrollieren, ob auch alle Daten aus der SPS angekommen sind. Soweit funktioniert alles.
Nun zum Problem: Ich möchte versuchen nur Teile dieses großen Arrays an ein SubVi zu übertragen. (Also zum Beispiel: Der Anwender wählt 3-4 Variablen aus und kann diese als Signalverlauf anzeigen lassen). Dazu hatte ich mich zunächst globaler Variablen bedient. Das ist zwar bequem, offensichtlich jedoch zu langsam. Nun bin ich dazu übergegangen, die Arrays in eine Queue zu schreiben und im SubVi wieder zu entnehmen. Das Ergebnis ist besser, allerdings bleiben auch hier einige wenige Daten hängen (ich spreche von ca. 100 Werten auf 20000 Millisekunden). Da ich bisher nicht feststellen konnte, ob es immer wieder die gleichen Daten sind, die verloren gehen, nehme ich an, dass dieser Schreibprozess an sich zu viel Zeit in Anspruch nimmt und es nicht irgendein Programmierfehler im Umgang mit den Arrays ist.
Meine Fragen sind nun:
Was ist schneller: Die Daten schon im eigentlichen VI auseinander zu nehmen und dann nur den gewünschten Teil in die Queue zu schicken oder lieber das ganze Array in die Queue und im SubVI dann die gewünschten Daten entnehmen?
Gibt es noch andere Tipps? Ich habe noch etwas von funktionalen globalen Variablen gelesen, leider sind an dieser Stelle meine bisherigen Programmierfähigkeiten begrenzt. Oder bin ich gar völlig auf dem falschen Weg?
Meine LabView Version ist 2014.
Vielleicht habt ihr ja ein paar Tipps
Gruß, Mathes
P.s.: ich habe mir jetzt mal den Queue Status anzeigen lassen, dabei bleiben die in der Queue vorhandenen Elemente sowie die noch zu löschenden Elemente 0. Das heißt für mich, dass das SubVi die Elemente so schnell entnimmt, wie sie hinzugefügt werden. Warum werden dann bestimmte Werte nicht übertragen?
ich habe eine Frage zur Übertragung großer Arrays. Zunächst ein paar Rahmenbedingungen: Um aus einer SPS bis zu 200 Variablen im Millisekundentakt auslesen zu können, habe ich im Zuge meiner Masterarbeit ursprünglich versucht über einen Puffer in LabView die Daten zu übertragen. Da dies nicht den gewünschten Erfolg gebracht hat bin ich dazu übergegangen die Daten schon in der SPS zu puffern und LabView die Daten dann blockweise übertragen zu lassen. Diese Blöcke beinhalten dann mehrere Millisekunden mit je 200 Variablen als 1D-Array, dessen Größe abhängig von der in LV eingestellten Wartezeit (derzeit 30 ms) ist. Diese Blöcke werden anschließend in Textdateien (allerdings mittels Express-VI, hier ist vermutlich auch nochmal einiges an Geschwindigkeit reinzuholen?!) geschrieben und ich kann kontrollieren, ob auch alle Daten aus der SPS angekommen sind. Soweit funktioniert alles.
Nun zum Problem: Ich möchte versuchen nur Teile dieses großen Arrays an ein SubVi zu übertragen. (Also zum Beispiel: Der Anwender wählt 3-4 Variablen aus und kann diese als Signalverlauf anzeigen lassen). Dazu hatte ich mich zunächst globaler Variablen bedient. Das ist zwar bequem, offensichtlich jedoch zu langsam. Nun bin ich dazu übergegangen, die Arrays in eine Queue zu schreiben und im SubVi wieder zu entnehmen. Das Ergebnis ist besser, allerdings bleiben auch hier einige wenige Daten hängen (ich spreche von ca. 100 Werten auf 20000 Millisekunden). Da ich bisher nicht feststellen konnte, ob es immer wieder die gleichen Daten sind, die verloren gehen, nehme ich an, dass dieser Schreibprozess an sich zu viel Zeit in Anspruch nimmt und es nicht irgendein Programmierfehler im Umgang mit den Arrays ist.
Meine Fragen sind nun:
Was ist schneller: Die Daten schon im eigentlichen VI auseinander zu nehmen und dann nur den gewünschten Teil in die Queue zu schicken oder lieber das ganze Array in die Queue und im SubVI dann die gewünschten Daten entnehmen?
Gibt es noch andere Tipps? Ich habe noch etwas von funktionalen globalen Variablen gelesen, leider sind an dieser Stelle meine bisherigen Programmierfähigkeiten begrenzt. Oder bin ich gar völlig auf dem falschen Weg?
Meine LabView Version ist 2014.
Vielleicht habt ihr ja ein paar Tipps
Gruß, Mathes
P.s.: ich habe mir jetzt mal den Queue Status anzeigen lassen, dabei bleiben die in der Queue vorhandenen Elemente sowie die noch zu löschenden Elemente 0. Das heißt für mich, dass das SubVi die Elemente so schnell entnimmt, wie sie hinzugefügt werden. Warum werden dann bestimmte Werte nicht übertragen?