03.04.2009, 11:52
|
IchSelbst
LVF-Guru
Beiträge: 3.690
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
Größe eines Cluster-Elements bestimmen (Sizeof)
Zitat:Im konkreten Fall betrug die Größe 30'000 x 4. Das hat dann die Zykluszeit um ca. 8ms vergrößert.
Naja, gut. 30'000*4*DBL ist jetzt noch noch nicht so groß. Allerdings würde ich derartige Arrays, die ja wahrscheinlich Sampledaten enthalten, nicht in Clustern transportieren. Auch die 8ms würden mich jetzt nicht so stören - mein Raster läge bei 50ms.
Zitat:Es enthält alle Referenzen der Bedienelemente des Hauptprogramms.
Mit anderen Worten lauter unnützes Zeug. Zumindest dann, wenn die Referenz nur sporadisch - also selten, also nie - verwendet wird.
Zitat:Damit können auch Sub-VIs z. B. Elemente deaktivieren.
Diese Funktionalität über Referenzen zu machen widerspricht grundlegenden Programmstrukturen: Kapselung, Modularität etc. Du würdest ja auch nicht in C dir eine Referenz auf ein Bedienelement einer anderen Klasse machen, nur um in dieser Klasse ein Element zu deaktivieren. Dort nimmst du ja auch Propertys. In LV geht das genau so.
[*grübel*]
Ich glaube du solltest mal deine Datenstruktur im allgemeinen überdenken.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
03.04.2009, 12:40
|
FEL
LVF-Gelegenheitsschreiber
Beiträge: 66
Registriert seit: Jun 2007
2015
2005
DE_EN
04229
Deutschland
|
Größe eines Cluster-Elements bestimmen (Sizeof)
' schrieb:Naja, gut. 30'000*4*DBL ist jetzt noch noch nicht so groß. Allerdings würde ich derartige Arrays, die ja wahrscheinlich Sampledaten enthalten, nicht in Clustern transportieren. Auch die 8ms würden mich jetzt nicht so stören - mein Raster läge bei 50ms.
Wenn ich in der Entwicklungsumgebung arbeite, habe ich immer eine Zykluszeit von 5ms. Da sieht man schnell wenn's
irgendwo harkt. Sonst arbeite ich mit 50ms. Wobei der Kunde 10ms haben wollte. Habe ihn schon auf 30ms
hochgehandelt.
Ich habe mich halt gewundert, dass nach einiger Zeit das Proggi eine höhere Zykluszeit hatte. Und wollte der Sache auf
den Grund gehen. Ein richtiges Problem ist es (noch) nicht.
' schrieb:Diese Funktionalität über Referenzen zu machen widerspricht grundlegenden Programmstrukturen: Kapselung, Modularität etc. Du würdest ja auch nicht in C dir eine Referenz auf ein Bedienelement einer anderen Klasse machen, nur um in dieser Klasse ein Element zu deaktivieren. Dort nimmst du ja auch Propertys. In LV geht das genau so.
Weiß nicht, ob wir aneinander vorbeireden? Aber wie soll man den sonst in LV in einem VI ein Bedienelement
eines anderen VI's manipulieren (deaktivieren o. ä.)? Man muß dem einen VI die Referenz des Elements übergeben
und kann dann dort via Property Node darauf zugreifen.
Gruß
|
|
|
03.04.2009, 18:16
(Dieser Beitrag wurde zuletzt bearbeitet: 03.04.2009 18:17 von IchSelbst.)
|
IchSelbst
LVF-Guru
Beiträge: 3.690
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
Größe eines Cluster-Elements bestimmen (Sizeof)
Zitat:Wenn ich in der Entwicklungsumgebung arbeite, habe ich immer eine Zykluszeit von 5ms. Da sieht man schnell wenn's irgendwo harkt. Sonst arbeite ich mit 50ms. Wobei der Kunde 10ms haben wollte. Habe ihn schon auf 30ms hochgehandelt.
Was meinst du denn mit Zykluszeit?
Abtastraster für Datensampling?
Das kannst du (locker) auf 1kHz stellen und trotzdem eine Programmdurchlaufzeit von 50ms einstellen. Das eine - Abtastrate - und das andere - Programmzykluszeit - sind komplett getrennt zu sehen. (Ebensolches gilt im übrigen auch für Vorgabekurven.)
Steuerst du Abläufe mit der LV-Software?
Und bist auf ein nach Möglichkeit genaues und wiederholbares Zeitraster im Bereich von 10ms (1ms..100ms) auf Applikationsebene angewiesen? Hm. Da würde ich den Kunden auch auf 50ms (bei manchen Sachen sogar bis 250ms) hochhandeln. Weil: Du weist nie, wann Win im Hintergrund mal so viel arbeitet, dass für anderen Applikationen nicht mehr genug Zeit ist.
Zitat:Ich habe mich halt gewundert, dass nach einiger Zeit das Proggi eine höhere Zykluszeit hatte. Und wollte der Sache auf den Grund gehen.
Letzteres ist natürlich sinnvoll: Wenn du ständig, also alle 10ms den großen, mit dem Array bestückten Cluster per Datenfluss hin und her schiebst, könnte ich mir vorstellen, dass durch das viele Kopieren schon mal langsam der Speicher vollläuft - und von LV im Hintergrund umstrukturiert werden muss. Hast du mal im Taskmanager gekuckt, was Speicher und CPU-Belastung machen?
Zitat:Man muß dem einen VI die Referenz des Elements übergeben und kann dann dort via Property Node darauf zugreifen.
Nicht zwangsläufig.
Du kannst auch eine Queue verwenden. Das eine VI (SubVI) schreibt Steuerbefehle in eine Queue, die vom MainVI ausgelesen wird. Das ist dann sowas Ähnliches wie das Message-System unter Win32.
Nachtrag:
Wo ist denn der "Antworten"-Button bei allen Eintragen außen meinen? Ich kann ja nicht mehr direkt antworten.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
03.04.2009, 20:06
|
jg
CLA & CLED
Beiträge: 15.864
Registriert seit: Jun 2005
20xx / 8.x
1999
EN
Franken...
Deutschland
|
Größe eines Cluster-Elements bestimmen (Sizeof)
' schrieb:Nachtrag:
Wo ist denn der "Antworten"-Button bei allen Eintragen außen meinen? Ich kann ja nicht mehr direkt antworten.
, es gab schon Überlegungen, wer diese Änderung als Erster bemerkt und sich als "beschwert".
Also gut, der Button ist aus folgendem Grund verschwunden:
In letzter Zeit haben die Threads zugenommen, bei denen immer "blind" der besagte Button zum Beantworten des vorhergehenden Beitrags benutzt wurde. Vielfach hat dabei aus unserer Sicht die Lesbarkeit sehr gelitten, da durch diesen Button automatisch der vorherige Beitrag als Zitat eingefügt wurde. Dies ist aber meistens völlig überflüssig. Ausnahmen bestätigen natürlich die Regel, z.B. wenn man wie bei dir auf ausgewählte Abschnitte antwortet.
Deshalb also in Zukunft: Zum Zitieren eines Beitrages ist aktiv der Zitieren-Button zu drücken, und dann der Antwort-Button am Anfang oder Ende des Beitrages.
Ich hoffe, du kannst damit leben.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
Einführende Links zu LabVIEW, s. GerdWs Signatur.
|
|
|
03.04.2009, 20:47
|
eg
LVF-SeniorMod
Beiträge: 3.868
Registriert seit: Nov 2005
2016
2003
kA
66111
Deutschland
|
Größe eines Cluster-Elements bestimmen (Sizeof)
Habe zwar nicht alles durchgelesen, sorry, aber:
Element unbundeln mit Type Cast in binäres String umwandeln umd mit String Length die Größe in Bytes ermitteln.
|
|
|
05.04.2009, 20:36
(Dieser Beitrag wurde zuletzt bearbeitet: 06.04.2009 07:47 von rolfk.)
|
rolfk
LVF-Guru
Beiträge: 2.305
Registriert seit: Jun 2007
alle seit 6.0
1992
EN
2901GG
Niederlande
|
Größe eines Cluster-Elements bestimmen (Sizeof)
' schrieb:Typecast ist ungünstig (funktioniert nicht immer). Ein Flatten to String (ohne Prepend Array size) mit stringlength danach funkioniert afaik immer.
Stimmt! Typecast funktioniert nur wenn der Datentype Flat ist. Flat heisst hier es ist entweder ein Skalar, Array oder String oder im Falle eines Clusters enthält er nur Skalars oder andere Cluster die nur Skalars enthalten.
Flatten To String gibt tatsächlich den ganzen Speicher den der Cluster momentan belegt als einen String zurück. Nur würde ich das sicher nicht zur Laufzeit in einem Programm machen nur um festzustellen wie gross der Cluster im Moment ist da Flatten To String alle Information aus dem Cluster in einen neuen linearen Speicherbereich kopieren muss und das kostet Zeit!!
Und zur Editierzeit nur so mal schnell zum sehen wie gross der eigene Cluster zur Laufzeit werden wird geht leider auch nicht, da zu dem Zeitpunkt die Arrays im Cluster wohl noch nicht alle in vollem Ornat alloziert sind und das wird wohl doch der Löwenanteil des gebrauchten Speichers ausmachen ansonsten hast Du einen wirklichen Monstercluster produziert. Das heisst der erhaltene Wert wird dem realen zur Laufzeit nicht annähernd entsprechen.
Alles in allem denke ich dass der OP doch einmal seine Datenstrukturen überdenken sollte. Ein Cluster der im ganzen Programm durchgereicht wird für Statusinformationen und dergleichen mag ja noch angehen aber darin auch alle Messwerte abzuspeichern verletzt so ziemlich jedes Designkriterium dass man Daten und Steuerung soviel möglich entkoppeln sollte um eine Software überschaubar und wartbar zu halten.
Das schreit ja gerade zu nach Objekten, entweder in der Form von Intelligenten Variablen (LV2 Style Globals) oder aber geich richtigem LVOOP oder seinen Vettern.
Rolf Kalbermatter
|
|
|
06.04.2009, 06:49
|
FEL
LVF-Gelegenheitsschreiber
Beiträge: 66
Registriert seit: Jun 2007
2015
2005
DE_EN
04229
Deutschland
|
Größe eines Cluster-Elements bestimmen (Sizeof)
Danke Leute, für die vielen Anregungen. Komme vermutlich erst in den nächsten Tagen zum Ausprobieren.
Von "Intelligenten Variablen (LV2 Style Globals) oder aber geich richtigem LVOOP oder seinen Vettern" habe ich
nicht nie was gehört. Da muß ich mich erst mal reinlesen.
Gruß
|
|
|
07.04.2009, 10:06
|
FEL
LVF-Gelegenheitsschreiber
Beiträge: 66
Registriert seit: Jun 2007
2015
2005
DE_EN
04229
Deutschland
|
Größe eines Cluster-Elements bestimmen (Sizeof)
' schrieb:Typecast ist ungünstig (funktioniert nicht immer). Ein Flatten to String (ohne Prepend Array size) mit stringlength danach funkioniert afaik immer.
Super, das ist genau das, was ich gesucht habe. Danke.
Kann es sein das "Intelligenten Variablen (LV2 Style Globals)", "funktionale SubVIs" bzw. "Old Style Globals" alles das gleiche meint?
Also ich habe mir ein VI gebastelt, wo die Datenarrays drin sind. Dazu eine Case-Struktur mit mehreren Cases ("Clear", "Init",
"Add Data", "Get Data"). Bei Aufruf des VI's muß man angeben, welche Funktion/Methode verwendet werden soll.
Habt ihr sowas gemeint?
Zumindest konnte ich damit einen positiven Effekt bezüglich Prozessorauslastung und Speicherbedarf feststellen.
Gruß Micha
|
|
|
| |