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
10.08.2009, 13:29
Beitrag #22

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:..
Seht ihr, und genau das will ich auch wissen. ^_^
..

Genau so wie Du in LV Variablen benutzt: Leitung ziehen.

Also im Blockdiagramm das Klassen-Ctl ablegen und Leitung zur ersten Klassenmethode ziehen.
In textbasierten Programmiersprachen muss man Objekte auch erst erzeugen, bevor man sie verwenden kann.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
10.08.2009, 13:45 (Dieser Beitrag wurde zuletzt bearbeitet: 10.08.2009 13:47 von IchSelbst.)
Beitrag #23

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.692
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Objektorientiertes Programmieren mit LV
' schrieb:Genau so wie Du in LV Variablen benutzt: Leitung ziehen.
Für komplexte Variablen ziehe ich nicht unbedingt Leitungen. Meistens verwende ich FGVs.

Kann ich die Instanz, die ja durch die Leitung repräsentiert wird, in eine FGV legen? Ist dann der Ausgang der FGV immer genau diese eine Instanz? Ich will nämlich in parallelen Prozessen auf ein und die selbe Instanz zugreifen. Und da liegt dann eben das Problem darin, dass es hier keine Leitungsverbindung gibt.

Zitat:In textbasierten Programmiersprachen muss man Objekte auch erst erzeugen, bevor man sie verwenden kann.
Das ist richtig, aber nicht meine Frage.

In textbasierten Programmiersprachen schreibe ich in jedem parallelen Prozess den Namen der Instanz hin und schon kann ich darauf zugreifen.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
10.08.2009, 14:00
Beitrag #24

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:Für komplexte Variablen ziehe ich nicht unbedingt Leitungen. Meistens verwende ich FGVs.

Kann ich die Instanz, die ja durch die Leitung repräsentiert wird, in eine FGV legen? Ist dann der Ausgang der FGV immer genau diese eine Instanz? Ich will nämlich in parallelen Prozessen auf ein und die selbe Instanz zugreifen. Und da liegt dann eben das Problem darin, dass es hier keine Leitungsverbindung gibt.

Ja.

Es wird mit FGVs vielmehr schwierig/aufwändig mehrere Instanzen zu haben.

' schrieb:Das ist richtig, aber nicht meine Frage.
..
Der Satz davor liefert auch keine Antwort? Dann verstehe ich die Frage nicht richtig.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
10.08.2009, 14:07
Beitrag #25

eg Offline
LVF-SeniorMod


Beiträge: 3.868
Registriert seit: Nov 2005

2016
2003
kA

66111
Deutschland
Objektorientiertes Programmieren mit LV
' schrieb:Es wird mit FGVs vielmehr schwierig/aufwändig mehrere Instanzen zu haben.

Aus diesem Grund nutze ich sie nicht. Ich versuche so zu programmieren, wie es vom Jeff Kodosky ursprünglich gedacht war. Also keine unsichtbaren Leitungen und uninitialisierten Schieberegister.

Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
10.08.2009, 14:08
Beitrag #26

Y-P Offline
☻ᴥᴥᴥ☻ᴥᴥᴥ☻
LVF-Team

Beiträge: 12.612
Registriert seit: Feb 2006

Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN

71083
Deutschland
Objektorientiertes Programmieren mit LV
Offtopic
Krass, wie man sich die an sich recht einfache und intuitive LabVIEW-Programmierung künstlich erschweren kann...... O
Da bin ich froh, dass ich LVOOP nicht verwende. Huh

Gruß Markus

--------------------------------------------------------------------------
Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
10.08.2009, 14:29
Beitrag #27

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.692
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Objektorientiertes Programmieren mit LV
' schrieb:Es wird mit FGVs vielmehr schwierig/aufwändig mehrere Instanzen zu haben.
In bestimmten Fällen will ich nicht mehrere Instanzen, sondern genau eine. Die dann aber überall. Also auch dort, wo keine Leitung hinverlegbar ist.
Die Antwort "Ja" reicht mir aber vorerst aus.

Zitat:Der Satz davor liefert auch keine Antwort? Dann verstehe ich die Frage nicht richtig.
Du verstehst mich schon richtig. Und ich dich auch. Wink

Offtopic2
' schrieb:Ich versuche so zu programmieren, wie es vom Jeff Kodosky ursprünglich gedacht war. Also keine unsichtbaren Leitungen und uninitialisierten Schieberegister.
Queues/Melder sind aber nichts weiter als unsichtbare Leitungen.
Wäre mein parelleles SubVI eine Klasse, müsste ich die Daten nicht per Queue verschicken, sondern könnte sie per Property holen.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
10.08.2009, 14:32
Beitrag #28

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:Aus diesem Grund nutze ich sie nicht. Ich versuche so zu programmieren, wie es vom Jeff Kodosky ursprünglich gedacht war. Also keine unsichtbaren Leitungen und uninitialisierten Schieberegister.


' schrieb:Offtopic
Krass, wie man sich die an sich recht einfache und intuitive LabVIEW-Programmierung künstlich erschweren kann...... O
Da bin ich froh, dass ich LVOOP nicht verwende. Huh

Gruß Markus

SO meinen Lieben,

wie würdet Ihr denn vorgehen, wenn Ihr eine Bildreihe mit 600 Bilder à 658 x 496 Bildpunkten (SGL) verarbeiten wollt? Und zwar nicht nach fester Vorschrift sondern sequentiell nach Benutzerwunsch. Es gibt also so Funktionen wie Projektdatei öffnen, Neue Projektdatei anlegen, Bilder hinzufügen, Bilder drehen, Bilder glätten, Regionen auswählen und Mittelwerte der Pixel bestimmen, und etc. pp.

Also man hat eine umfangreiche Event-Struktur in einer Schleife und ziemlich viele verschiedene unterschiedlich komplexe Bildverarbeitungsfunktionen, die in SubVIs stecken, damit das Blockdiagramm nicht 3000 x 3000 Bildpunkte groß wird.

Würdet Ihr das alles mit sichtbaren Leitungen machen wollen?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
10.08.2009, 14:38
Beitrag #29

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:..
Du verstehst mich schon richtig. ..

Sorry, leider nicht.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
10.08.2009, 14:39
Beitrag #30

Y-P Offline
☻ᴥᴥᴥ☻ᴥᴥᴥ☻
LVF-Team

Beiträge: 12.612
Registriert seit: Feb 2006

Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN

71083
Deutschland
Objektorientiertes Programmieren mit LV
Ich würde wohl einen (oder mehrere) Cluster nehmen, weil ich LVOOP auf jeden Fall vermeiden möchte. Hehe

Gruß Markus

' schrieb:SO meinen Lieben,

wie würdet Ihr denn vorgehen, wenn Ihr eine Bildreihe mit 600 Bilder à 658 x 496 Bildpunkten (SGL) verarbeiten wollt? Und zwar nicht nach fester Vorschrift sondern sequentiell nach Benutzerwunsch. Es gibt also so Funktionen wie Projektdatei öffnen, Neue Projektdatei anlegen, Bilder hinzufügen, Bilder drehen, Bilder glätten, Regionen auswählen und Mittelwerte der Pixel bestimmen, und etc. pp.

Also man hat eine umfangreiche Event-Struktur in einer Schleife und ziemlich viele verschiedene unterschiedlich komplexe Bildverarbeitungsfunktionen, die in SubVIs stecken, damit das Blockdiagramm nicht 3000 x 3000 Bildpunkte groß wird.

Würdet Ihr das alles mit sichtbaren Leitungen machen wollen?

--------------------------------------------------------------------------
Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
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
  Objekt-Orientiertes Programmieren mit LV8.5 robertow 1 9.291 16.08.2008 23:10
Letzter Beitrag: eg

Gehe zu: