LabVIEWForum.de
Schieberegister -> array-Kopie in jedem Durchlauf? - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Module (/Forum-LabVIEW-Module)
+---- Forum: LabVIEW RealTime (/Forum-LabVIEW-RealTime)
+---- Thema: Schieberegister -> array-Kopie in jedem Durchlauf? (/Thread-Schieberegister-array-Kopie-in-jedem-Durchlauf)

Seiten: 1 2


Schieberegister -> array-Kopie in jedem Durchlauf? - basweber - 12.11.2010 11:37

Hallo,

ich habe mal eine grundsätzliche Frage vor folgendem Hintergrund:
Ich initialisiere einen array (2d) außerhalb einer Schleife. Damit initialisiere ich dann ein Schieberegister einer zeitkritischen Schliefe (10ms, soll auf einer cRIO laufen).

In der Schleife will ich dann in den Array schreiben, wobei der Index erst während der Schleifenausführung berechnet wird. Das ganze ist ein Ringspeicher.

Jetzt habe ich festgestellt, dass die Ausführungszeit der Schleife von der Arraygröße abhängt. Das erscheint mir erstmal unlogisch, es sei denn das Schieberegister sorgt dafür, dass in jedem Schleifendurchlauf eine Kopie des Arrays angelegt wird.

Die Frage lautet:
Ist das so?
Und wenn ja: wie kann man das umgehen?
Vielleicht mit einem FIFO, oder einer Queue?

Schon mal Danke.
Bastian.


Schieberegister -> array-Kopie in jedem Durchlauf? - IchSelbst - 12.11.2010 12:17

' schrieb:In der Schleife will ich dann in den Array schreiben, wobei der Index erst während der Schleifenausführung berechnet wird. Das ganze ist ein Ringspeicher.
So mach ich das auch. Die Operation heißt dann "In Array ersetzen".

Zitat:Jetzt habe ich festgestellt, dass die Ausführungszeit der Schleife von der Arraygröße abhängt.
Diese Zeit muss ja nicht zwangsläufig durch das Schieberegister bedingt sein.
Es könnte in der Schleife Code stehen, der selbst je nach Arraygröße kürzer oder länger dauert. Außerdem folgendes: ggf. wird für 1D-Ersetzen Speicher für die zu kopierenden 1D-Daten benötigt.

Genauere Aussagen kann man nur mit Kenntnis des Schleifeninhaltes machen.


Schieberegister -> array-Kopie in jedem Durchlauf? - basweber - 12.11.2010 13:41

Zitat:Diese Zeit muss ja nicht zwangsläufig durch das Schieberegister bedingt sein.
Es könnte in der Schleife Code stehen, der selbst je nach Arraygröße kürzer oder länger dauert. Außerdem folgendes: ggf. wird für 1D-Ersetzen Speicher für die zu kopierenden 1D-Daten benötigt

Hmm, dass glaube ich nicht. In der Schleife wird nur der Index hochgezählt.

Ich habe mal alles irrelevante rausgeschmissen (der Code hing aber auch nicht von vom Array ab sondern hat andere Sachen gemacht).


Schieberegister -> array-Kopie in jedem Durchlauf? - IchSelbst - 12.11.2010 14:01

' schrieb:In der Schleife wird nur der Index hochgezählt.

Ich sach mal so: 1000*5*dbl ist ja eigentlich gar nichts. Ich mach sowas mit 180.000*40*dbl. Ich hab da nie Probleme. Unsure

Was so ein cRIO allerdings alles macht (respektive anders macht als ein PC) weis ich nicht.

Im übrigen rate ich anstelle der globalen Variablen zu einem Melder (respektive zwei: einen für den Stopp, einen für die Daten) wenn das denn mit cRIO geht.


Schieberegister -> array-Kopie in jedem Durchlauf? - basweber - 12.11.2010 17:00

Zitat:Ich sach mal so: 1000*5*dbl ist ja eigentlich gar nichts.
Denke ich eigentlich auch, aber die ZyklusZeit ist nur 10ms.
Mit 1000 geht es auch noch. Bei 6000 hatte ich Probleme bekommen.

Die Schleife führt sonst noch einen Matlab-Skriptknoten aus, der (bisher) aber auch noch nichts aufwendiges macht. Ein paar Bedingungen prüfen paar skalara Berechnungen.
Diese Berechnungen sollen aber noch deutlich ausgebaut werden.

Die Sache mit Meldern hatte ich auch schon überlegt, aber das erschien mir erstmal umständlicher als mit globalen Variablen. Was ist denn der Vorteil von Meldern?


Nochmal zurück zur eigentlichen Frage:

Wird nun durch die Schieberegister-Konstruktion jedesmal eine Kopie des arrays angelegt? Weiß das jemand, bzw. wo kann man darüber was nachlesen?


Schieberegister -> array-Kopie in jedem Durchlauf? - GerdW - 12.11.2010 17:12

Hallo,

Zitat:jedesmal eine Kopie
Das Schieberegister selbst erzeugt keine Kopie. Das ist ja gerade der Vorteil eines SR (oder auch FeedbackNode). Wenn du mittendrin auch keine Kopien erzeugst (wonach es aussieht), ist alles ok.

Zitat:Die Schleife führt sonst noch einen Matlab-Skriptknoten aus, der (bisher) aber auch noch nichts aufwendiges macht. Ein paar Bedingungen prüfen paar skalara Berechnungen.
Schon mal überlegt, diese "nicht aufwendigen" Dinge direkt in LabVIEW zu erledigen? Der Matlab-Knoten gehört nicht zu den schnellsten Konstrukten in LabVIEW...


Schieberegister -> array-Kopie in jedem Durchlauf? - Matze - 14.11.2010 09:33

' schrieb:Im übrigen rate ich anstelle der globalen Variablen zu einem Melder (respektive zwei: einen für den Stopp, einen für die Daten) wenn das denn mit cRIO geht.
Davon rate ich ab. Wobei man hier abwägen muss, worum es geht.

Melder und Queues funktionieren auf dem cRIO. Was viele jedoch nicht wissen: Diese sind nicht deterministisch.

Werden hin und wieder Aktionen ausgeführt, wie eine Anforderung, Daten zu speichern o.ä., was sowieso nicht deterministisch ist, dann ist das in Ordnung. Werden jedoch fortlaufend Messdaten von einer Schleife in eine andere übertragen, empfehle ich den Einsatz von Meldern und Queues nicht!
Hier sollte auf die RT-FIFOs zurückgegriffen werden. Es lässt sich dort auch eine FIFO-Größe von 1 einstellen und die Option, dass Daten überschrieben werden, falls der FIFO voll sein sollte. Somit kann man hier auch die Melder-Funktion umsetzen.

Grüße
Matze


Schieberegister -> array-Kopie in jedem Durchlauf? - Lucki - 14.11.2010 10:27

' schrieb:Das Schieberegister selbst erzeugt keine Kopie. Das ist ja gerade der Vorteil eines SR (oder auch FeedbackNode). Wenn du mittendrin auch keine Kopien erzeugst (wonach es aussieht), ist alles ok.
Die Betonung bei dieser richtigen Antwort liegt auf dem Wörtchen "selbst". Wenn nämlich der Inhalt des Schieberegisters bei jedem Durchlauf durch ein Sub-VI geschleußt wird, werden schon Kopien erzeugt. Ich würde auf jeden Fall mal probieren, ob sich die Geschwindigkeit ändert, wenn man das bissel Zeugs im SubVI direkt im HauptVI macht.


Schieberegister -> array-Kopie in jedem Durchlauf? - Matze - 14.11.2010 10:59

' schrieb:Wenn nämlich der Inhalt des Schieberegisters bei jedem Durchlauf durch ein Sub-VI geschleußt wird, werden schon Kopien erzeugt. Ich würde auf jeden Fall mal probieren, ob sich die Geschwindigkeit ändert, wenn man das bissel Zeugs im SubVI direkt im HauptVI macht.
Jupp, die Idee ist gut. Es könnte natürlich sein, dass der Kompiler so clever ist und erkennt, dass das Array nur durchgereicht wird. Dann würde keine Kopie erstellt werden (ich hoffe zumindest, dass keine erstellt wird). Aber probieren geht über studieren.
Da der Themenersteller LabVIEW 2010 nutzt, geht das sogar ganz einfach:

SubVI öffnen - Datei: VI-Einstellungen - Ausführung: Haken bei "SubVI inline einfügen" (und die entsprechend markierten Häkchen setzen/entfernen)

Das nur als Tipp, bevor da groß Code kopiert wird.

Edit: Ach Mist, verlesen. LV-Erfahrung seit 2010 und LV-Version 9. Sorry, dann geht das so meines Wissens doch nicht.


Schieberegister -> array-Kopie in jedem Durchlauf? - Lucki - 14.11.2010 11:36

' schrieb:Es könnte natürlich sein, dass der Kompiler so clever ist und erkennt, dass das Array nur durchgereicht wird. Dann würde keine Kopie erstellt werden (ich hoffe zumindest, dass keine erstellt wird). Aber probieren geht über studieren.
Optimal wäre natürlich, wenn der Compiler so clever wäre zu erkennen, daß das SubVI nur ein einziges Mal verwendet wird und er die Hierarche dann einebnet, so daß also der "Machinencode" gar keinen SubVI-Aufruf enthält.
Ich erinnere mich ganz dunkel an so eine Compiler-Option ("$Inline") bei Turbo-Pascal. Da wurde dann der entsprechende SuVI-Code direkt in das Haupt-VI eingebettet, so daß es keine SubVI-Aufrufe mehr gab, der Code aber (bei mehrfacher Verwendung des SubVIs) länger wurde.
Was Du für LV2010 erwähntes, wird wohl genau das sein.

OFFtopic zum Sonntag: Du bist ja noch gar noch so lange im LV-Forum, und bei Dir bin ich am meisten erstaunt über die Steilheit Deiner Lernkurve seit dieser Zeit. Wie hast Du das nur gemacht? Hattest Du vielleicht das Glück, daß Deine Firma Dir tausende von Euro für NI-Lehrgänge spendiert hat?