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!
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).
' 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.)
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).
' 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!
' 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.
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.
' 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.