INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Tipps zur Übertragung großer Arrays



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!

05.05.2015, 09:18 (Dieser Beitrag wurde zuletzt bearbeitet: 05.05.2015 10:48 von mathez.)
Beitrag #1

mathez Offline
LVF-Neueinsteiger


Beiträge: 7
Registriert seit: Mar 2015

14
2014
DE



Tipps zur Übertragung großer Arrays
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?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
05.05.2015, 11:49 (Dieser Beitrag wurde zuletzt bearbeitet: 05.05.2015 11:50 von NoWay.)
Beitrag #2

NoWay Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 241
Registriert seit: Jul 2013

LV-2019
2013
EN


Deutschland
RE: Tipps zur Übertragung großer Arrays
(05.05.2015 09:18 )mathez schrieb:  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?
Je früher du deine Datenstrukturen auf das wesentliche reduzierst, umso weniger Daten musst du weiterVERarbeiten. Das spart zumindest theoretisch Rechenzeit.


Zitat: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?
FGV´s sind kein Hexenwerk. Dahinter steckt meist nichts weiter als der Aufruf eines SubVi´s mit einem oder mehreren Schieberegistern. Diese werden nicht mit Werten vorgeladen, weswegen sie dann ihren letzten Wert behalten. Dies kann man sich dann zu Nutze machen, indem man die FGV an verschiedenen Stellen im Programm aufruft um sie zu beschreiben, oder die Daten darin auszulesen.
Der Aufbau ist relativ simpel. Vereinfachtes Beispiel:
   


Zitat: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?
Weil diese Werte womöglich nicht in die Queue geschrieben wurden? Debugtime.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
08.05.2015, 08:33
Beitrag #3

mathez Offline
LVF-Neueinsteiger


Beiträge: 7
Registriert seit: Mar 2015

14
2014
DE



RE: Tipps zur Übertragung großer Arrays
Guten Morgen zusammen,

du hattest Recht, es lag tatsächlich an meinem Programm. Angel_not Seitdem ich nochmal alles von vorne programmiert und sinnvoll neu aufgebaut habe, funktioniert es nun. Aktuell gibt es nur noch ein Problem. Ich habe gestern eine Datenaufzeichnung über ca. 6 Minuten gestartet, alles funktionierte problemlos. Sobald ich jedoch am Laptop mal ein Fenster öffne oder schließe, bekomme ich sofort eine Fehlermeldung (Ich habe eine Art Kontrollfunktion eingebaut, die vergleicht ob der kleinste Wert des neuen Blocks nur genau einen Wert größer ist als der größte Wert des alten Blocks). Die While-Schleife wird dann scheinbar derart langsam, dass es LabView nicht schafft, mindestens einen Schleifendurchlauf innerhalb unserer 100 ms Pufferzeit abzuarbeiten und somit irgendetwas > 100 ms braucht.

Gibt es eine Möglichkeit hier irgendwelche Prioritäten festzulegen? Ich habe gelesen, dass mittels einer zeitgesteuerten While-Schleife ein Prozessor angewählt werden kann, habe aber letztlich immer die gleichen Symptome.

Kann man da irgendetwas machen oder steht und fällt es letztlich mit der Geschwindigkeit des Rechners?

Gruß, Mathes
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Modbus TCP Übertragung nicogtx1 3 5.377 03.03.2021 15:29
Letzter Beitrag: nicogtx1
  Erfassen großer Datenmengen auf einmal Desso21 3 3.669 05.11.2019 12:58
Letzter Beitrag: GerdW
  Modbus Übertragung von Coils Ben16 2 5.369 14.10.2016 13:24
Letzter Beitrag: Ben16
  FTP: Sporadische Fehler bei der Übertragung david.radakovits 3 5.540 14.07.2014 09:32
Letzter Beitrag: jg

Gehe zu: