18.02.2009, 12:32
' schrieb:Ich habe noch den Eindruck, dass das sehr viel Funktionalität an einem Ort vereint, was auch meiner Programmiererfahrung (ok, nicht LabVIEWMit "einem Ort" meinst du jetzt z.B. ein einziges SubVI. So gesehen hast du Recht. Viel in einem SubVI/Function ist schlecht. In wie weit man aber die vielen Sachen in SubVIs auslagert, steht auf einem anderen Blatt. Meine Intension ging eher dort hin, zu sagen: Für das Viele unterhalb einer bestimmten Ebene gibt es nur einen einzigen Einsprungpunkt - nämlich z.B. die Instanz.) meistens eher von Nachteil ist.
Zitat:Allerdings würde ich eher nicht dazu tendieren, das eine "Klasse" zu nennen, denn (zumindest, wie ich das bisher verstehe) es fehlen hier elementare Dinge, die für mich eine Klasse ausmachen, wie Vererbung, Polymorphie, late binding, etc. Für mich ist das eher ein Modul, ein bisschen wie das, was man in C in einer Datei kapselt ohne dass man dafür OOP verwenden würde. Aber letztlich kommt das wahrscheinlich auf die Definition an.Ich gebe dir hier prinzipiell Recht: Warum sollte ich aber eine Klasse im Sinne von OOP/LVOOP machen, wenn ich die vorerst nie wieder so verwenden werde.
Zitat:Könnte man ein solches permanent laufendes VI jetzt eigentlich auch reentrant machen und damit z.B. gleichzeitig auf verschiedenen COM-Ports operieren lassen? Ich bin mir noch nicht sicher, ob ich das brauchen würde, aber es klingt verlockend.siehe eg.
Zitat:Das Beispiel, dass Du gepostet hast führt ja - wenn ich das richtig verstehe - immer nur eine Funktion aus und wartet dann wieder, bis ein neuer Befehl reinkommt, bevor es wieder was tut. Mein Programm müsste ja permanent samplen.Das Beispiel sampled kontunuierlich (soll's zumindest) - und zwar im Raster von 50ms. Alle 50ms werden also die Queue überprüft und die in der vergangenen Zeit aufgelaufenen Samples gelesen und weiterverarbeitet. Ob von diesen 50ms-Raster nun z.B. mal 10 Stück wes wegen auch immer ausfallen, spielt für das Samples keine Rolle. Die Daten werden - ob Daq oder VISA - im Hintergrund gespeichert.
Zitat:Trotzdem müsste das Sampling auf die Daten zugreifen, die auch von den anderen Methoden manipuliert würden. Ich könnte jetzt natürlich immer, wenn kein Befehl anliegt in den Sample-State gehen, aber das hätte den Nachteil, dass das Sampling unterbrochen würde wenn eine andere Funktion länger bräuchte, was auch nicht schön wäre. Kann man das irgendwie geschickt parallelisieren?Bei der Unterbrechung kommt es darauf an. Kommen die Daten z.B. vom Daq, sampelt eigentlich nicht das SubVI, sondern der Daq. Der macht das im Hintergrund, also parallel. Das SubVI holt sich lediglich die bereitgestellen Daten. Daher ist das Zeitverhalten im SubVI eigentlich unkritisch.
Zitat:- Wo würde man die Parameter- und Result-Queues halten? Wenn ich Deinen Code richtig verstehe, holst Du sie Dir nach Namen, oder?Eigentlich muss man die nirgens halten. Eine Queue bekommt einen "logischen Namen". Alleine die Tatsache, dass du ein "Queue anfordern" mit diesem Namen an Eingang verwendest, reichst bereits, dass alle, die das so machen, die selbe Queue verwenden. Oberflächlich betrachtet sieht es also aus, als ob die Queue(Referenz) nirgens gehalten würde. Tatsächlich gehalten wird sie im Hintergrund in LV.
Ich hab das mit dem SubVI, das die Queue erstellt und für alle Verwender die gleiche Referenz zurück gibt, ja nur deswegen gemacht, damit ich nicht 100mal in den SourceCode den String "MeineQueue" schreiben muss. Außerdem kann ich jetzt Suchen lassen, wer denn nun genau diese eine Queue verwendet.
Zitat:Gibt es zu der Sprache eigentlich schon irgendwelche akademischen Abhandlungen, die die Paradigmen mal im Lichte der Informatik betrachten? Mir waren aus dem Studium funktionale Sprachen bekannt (wenn auch mehr theoretisch als praktisch), aber mit Datenflusssprachen bin ich vor LabVIEW noch nie in Berührung bekommen.Keine Ahnung.
Nochwas zu OOP/LVOOP:
Das ist ja alles schön und gut. Einen richtigen OOP-Ansatz zu machen für z.B. eine Sample-Klasse kommt für mich aber nicht in Frage. Selbst in der anderen Programmiersprache, also in Delphi, hab ich das in 10 Jahren nicht in dieser Art gebraucht. Dort hab ich natürlich auch Klassen erstellt mit Propertys, Events etc. etc. Aber warum Aufwand machen, für ein Sodoku-Einzelfeld eine Klasse schreiben und die wieder in die Sodoku-Klasse einbinden, wenn die Sodoku-Klasse die Einzelfelder auch in einen Array selbst verwalten kann.
Und zu Instanzen:
Instanziert wird in LV, indem ein SubVI auf das Blockdiagramm plaziert wird.