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 

Objektorientiertes Programmieren mit LV



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!

10.08.2009, 13:21
Beitrag #21

unicorn Offline
LVF-Freak
****


Beiträge: 680
Registriert seit: Jul 2009

8.6.1, 2010 - 2012
1994
EN

10xxx
Deutschland
Objektorientiertes Programmieren mit LV
' schrieb:Guten morgen,

um meinen Standpunkt genauer zu erklären:

Ich komme eigentlich aus der Welt der OO. Sequentielle Programmierung wie sie normalerweise in C oder LabVIEW ohne SubVI gemacht wird war bei uns immer verboten.

nicht desto trotz werden die einzelnen Zeilen eine Programmstücks nacheinander verarbeitet.

' schrieb:Aus diesem Grund habe ich auch einige Schwierigkeiten mit der LabVIEW Programmierung. Mein Problem besteht derzeit darin,
dass ich ein riesen Array ([100]x[100.000] Einträge) verarbeiten muss. Ich muss die Array Werte verarbeiten um so am Ende ein neues Array mit veränderten Werten zu erhalten.

Was mir halt bei dieser sequentiellen Programmierung dann ständig passiert ist, dass ich die verränderten Arrays, es sind mehrere Zwischenschritte nötig um ans End-Resultat-Array zu kommen, zwischenspeichere als Anzeigeelement, da der nächste Schritt erst 3-5 Sequenzen weiter ist. Ich möchte dann nicht den Datenfluss vom Array über mehrere Sequenzen weitergeben, weil ich dann sowieso nicht mehr weiß, wozu gehörte der Datenfluss. Ich erstelle mir also dann eine lokale Variable vom neuen Anzeigeelement und verarbeite diese weiter in den weiter hinten liegenden Sequenzen. Manchmal benötige ich aber dann doch noch das UrsprungsArray mit den nicht verränderten Daten und muss dann quasi das wieder heranholen mittels Lokaler Variable.

Aber so etwas machst Du in textbasierten Programmiersprachen auch nicht: Das Array bearbeiten und das Ergebnis in einer neuen Variable speichern. Dann ein paar Zeilen weiter das neue Array nehmen wieder bearbeiten und das Ergebnis in einer dritten Variable speichern. Eine neue Variable ist nur nötig, wenn die alten Daten noch mal gebraucht werden. Und in LabVIEW ist die Variable eine Leitung, die vom Ausgang von VI A zum Eingang von VI B geht. Wenn Du den Wert Deines Array von vor x Arbeitsschritten noch mal brauchst, dann ziehe eine Leitung von diesen Punkt (Leitung oder VI Ausgang) zu den Eingang wo es gebraucht wird. Du brauchst dazu keine Variable definieren wie in textbasierten Programmiersprachen noch ein Anzeigeelement in LV anlegen.

Beachte immer, dass ein SubVI erst dann ausgeführt wird wenn an allen Eingängen ein gültiger Wert anliegt. Die Reihenfolge der Ausführung von SubVIs kann durch die Verkettung mit dem Error-Cluster erfolgen aber auch alleine durch das Weiterreichen von Daten.

' schrieb:Man kann sich vorstellen, dass dabei die Übersicht verloren geht, grad wenn man noch Anfänger ist und massiv von FlatSequenz etc gebrauch macht.

Aufjedenfall hatte ich gedacht, dass ich mit der LVOOP wie folgt hätte lösen können:

Eine Klasse "MeineMessdaten" die das Ursprungsarray als private "Member" hat.
Eine Methode, die mir das Ursprungsarray zurückgibt.
Eine Methode, die mir das gefilterte Array zurückgibt.
Jetzt wollte ich mir eine Instanz vom Objekt machen und dieses Objekt immer wieder verwenden. Wenn ich also mal mein Ursprungsarray benötige rufe ich:
MeineMessadaten.Usrpungsarray
auf und wenn ich mal das gefilterte Array brauche:
MeineMessdate.gefiltertesArray

Es hätte auch den Vorteil, das das gefilterte Array erst berechnet wird und nicht ganze Zeit im Speicher liegt.

Das ist Überhaupt kein Problem. Das LV Klassen Control enthält ein Daten-Array. Auf das können nur die Methoden der Klasse zugreifen. (durch unbundle by name).

Natürlich musst Du die VI der Klasse miteinander verbinden in dem jedes ein Klassen Control als Eingang und Ausgang hat. Das ist so, wie Du auch immer einen Namen des Objektes angeben musst, wenn Du eine Methode einer Klasse aufrufst. Da LabVIEW Datenfluss orientiert ist muss das Objekt der Begierde im rein und wieder raus, sonst stehen Änderungen an dem Objekt den nachfolgenden VI nicht zur Verfügung.

Mit Goop ist das anders. Hier wird mit Referenzen gearbeitet und man braucht die Referenz nur in die VIs reinstecken. Sie kommen der Übersichtkeit der Blockdiagramme halber aber auch wieder raus.

' schrieb:Dies ist stark an der OOP von Java/.NET/und Co angelegt. Funktioniert aber (noch) nicht wirklich, da ich derzeit keine Ahnung habe wie mein instanziertes Objekt, in anderen FlatSequences verwenden kann. Sobald man den Cluster von der Klasse ja nicht weiterleteitet, kann man ja gar nicht mehr drauf zurückgreifen. Man muss ja scheinbar wirklich den Datenfluss immer weiterleiten und kann nicht einfach ein Objekt erstellen in Sequenz1 und dann in Sequenz999 wieder aufrufen. Was meiner Meinung nach eigentlich von der OO ja ein Muss ist.
Man stelle sich ein normales Java Programm vor. Ganz oben irgendwo definiert man "Point EinPunkt =new Point(x,y,) ". Diesen EinPunkt kann ich dann jederzeit überall in der Klasse verwenden, indem ich den Namen verwende.
Wie das ist in LVOOP gehen soll...weiß ich noch nicht? Ihr?

Die Aussage hier, dass es eigentlich nichts anders ist als SubVIs würde ich eigentlich auch schon so sehen. Der einzige Vorteil/Nachteil von Methoden gegenüber SubVIs wäre, dass diese an ihre Klasse gebunden sind und dieses nochmal ein bisschen mehr Übersicht fördert.

Ich hoffe ich habe euch nicht allzu verwirrt. Ich bin es nämlich selbst noch mit LV :-D

VIs (Methoden) einer LV-Klasse können auch überladen werden. Dazu muss die Vererbung gesetzt werden (Welche LV-Klasse erbt von welcher) und zusätzlich bei allen VIs die Ein- und Ausgänge des Klassen-Control als "dynamic dispatch" gesetzt werden. Oder einfach bei der Klasse New > VI from Dynamic Dispatch Template wählen.

Also alles was Du brauchst geht; leider habe ich im Moment nicht viel Zeit alles im Detail zu erklären, oder Beispiele zu posten.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
Antwort schreiben 


Nachrichten in diesem Thema
Objektorientiertes Programmieren mit LV - unicorn - 10.08.2009 13:21

Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Objekt-Orientiertes Programmieren mit LV8.5 robertow 1 8.857 16.08.2008 23:10
Letzter Beitrag: eg

Gehe zu: