25.02.2010, 17:48
|
IchSelbst
LVF-Guru
Beiträge: 3.696
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
Analogmessung auf einem Kanal im Hintergrund
' schrieb:Ich muss aber trotzdem an der "deutschen" Benennung der Anschlüsse rumnörgeln:
Da bist du nicht der erste und wirst auch nicht der letzte sein. Ich bin ja der Meinung, so manche Sachen gehören einfach nicht übersetzt. Und von denen gibt es in LabVIEW viele.
Zitat:aber man muss meiner Meinung nach bei LabVIEW schon viele Konzepte kennen, und alle kombinieren.
Das siehst du richtig.
Deswegen tun sich Anfänger, die von den Verkäufern hören "ach, geht alles mit Klick, Klick", plötzlich extrem schwer, wenn's ans Eingemachte geht.
Zitat:(sehe ich als C-Programmierer wie einen Interrupt an)
Genau so sollten die Events auch funktionieren. Die Frage ist nur, ob LabVIEW respektive seine Entwickler das so wollen (und können). Ich hätte auch gerne, dass manche Sachen so mit "asynchronen Interrupts" gehen würden. Aber ist halt nicht.
Zitat:Events hingegen ( vorausgesetzt gut in LV implementiert, was ich aber stark annehme) verbrauchen nur dann CPU-Zeit, wenn Sie auftreten.
Zu Events gemäß einer Event-Sequenz musst man auch noch folgendes beachten: Auch eine Event-Seqeunz ist immer in einen Datenfluss eingebunden. Außerdem, was viel schlimmer ist: Ein VI hat zwei "Main-Threads": einen "BD-Thraed" und einen "FP-Thread" (UI-Thread). Wenn also bei einem VI das FP aktiviert ist, geht auch ein Teil der Rechenzeit an den UI-Thread - und ob der sich durch einen Event beenden lässt, bezweifle ich. Es wäre also besser, den DAQmx-Event in einem parallelen SubVI ohne FP zu betreiben.
Mal zwei gute Aspekte zu LabVIEW: Multitasking ohne Ende, ohne das der Anwender davon was merkt oder sich darum kümmern müsste. Außerdem wird das System von Version zu Version besser. Und da fällt bestimmt auch das Handlen von Events drunter. Events können nämlich auch in einer Datenflusssteuerung manche Sachen erheblich vereinfachen.
Zitat:Würde man das selber machen müssen, dann, ja dann: wären meine Events viel besser.
Klar. Ich hab das mit Delphi und der DAQ-Library nicht anders gemacht.
Wenn du erkannt, verstanden und akzeptiert hast, dass LabVIEW ein Datenfluss-orientiertes System ist und das ganze prinzipiell alleine mit einem in einen Datenfluss eingebundenen DAQmx-Read geht - dann darfst du auch alles in Events machen - sollen die LabVIEW-Spezis in Austin doch sagen was sie wollen.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
25.02.2010, 17:52
|
wernerIBN
Datenflussumgeher
Beiträge: 124
Registriert seit: Sep 2009
8.6 und 2011
2000
DE
52425
Deutschland
|
Analogmessung auf einem Kanal im Hintergrund
' schrieb:Ich mach das so.
Könnte ich das Beispiel von dir, auch dazu bringen, per Button zu starten, und dann eine Sekunde lang zu messen und sich dann wieder zu idle wechseln. Ich tu mich schwer, diese Ablaufzeit in die State-machine zu integrieren...
Erfahrung ist die Summe der gemachten Fehler
KISS - Keep it simple and stupid
Walking on water and developing software from a specification are easy if both are frozen. – Edward V Berard
|
|
|
25.02.2010, 19:19
(Dieser Beitrag wurde zuletzt bearbeitet: 25.02.2010 22:35 von dimitri84.)
|
|
|
04.03.2010, 12:12
|
wernerIBN
Datenflussumgeher
Beiträge: 124
Registriert seit: Sep 2009
8.6 und 2011
2000
DE
52425
Deutschland
|
Analogmessung auf einem Kanal im Hintergrund
Hallo und danke an alle,
ich danke ich habe alle euren guten Vorschläge verarbeitet, und das Programmgerüst macht alles was ich brauche. Das Blockdiagramm ist aber für meine Begriffe etwas groß geworden, darf ich mal um euren Rat
Labview_Document.pdf (Größe: 176,71 KB / Downloads: 288)
bitten, ob das so noch durchgeht, oder um Vorschläge, wie ich es eleganter und schöner machen kann...
Erfahrung ist die Summe der gemachten Fehler
KISS - Keep it simple and stupid
Walking on water and developing software from a specification are easy if both are frozen. – Edward V Berard
|
|
|
04.03.2010, 14:08
|
wernerIBN
Datenflussumgeher
Beiträge: 124
Registriert seit: Sep 2009
8.6 und 2011
2000
DE
52425
Deutschland
|
Analogmessung auf einem Kanal im Hintergrund
' schrieb:Hast du denn mal versucht, die While-Schleifen in SubVIs auszulagern? Zumindest mit der für's Datenspeichern sollte das gar kein Problem sein.
Ja, hab ich versucht, aber bin da nicht weitergekommen, weil ich zig lokale variablen verwende, und die tun es (oder lieg ich da falsch?) nur in dem VI, wo auch das Frontpanel ist. Beispielsweise bei der Datenspeicherung verriegle ich den Button zum Anzeigen der TDMS-Datei bis die Datendatei geschlossen ist, usw.
Ein SUB-VI, in das 30 Kabel reinlaufen, ist auch nicht wirklich schöner anzusehen.
Es ist nur so, ich hab ein relativ kleines Frontpanel
Labview_Document.pdf (Größe: 57,02 KB / Downloads: 260)
, aber dazu halt ein schon recht großes Blockdiagramm.
Von Bierdeckel kann also gar keine Rede mehr sein.
Ich habe 2 Bildschirme, aber für das Blockdiagramm bräuchte ich alleine 2 Bildschirme übereinander. Natürlich kann ichs noch was zusammenschieben, aber wenn ichs dann erweitere, fehlt mir vermutlich wieder Platz...
Von der Struktur her bin ich total zufrieden, es ist wunderbar modular erweiterbar durch Erzeuger-Verbraucher und State-Maschines und läuft total performant (wegen der Queues und Events).
Ich wollte hier nur mal die Rückmeldung hören: Ja, so machen wirs auch, oder: NEIN, das geht viel besser.
Erfahrung ist die Summe der gemachten Fehler
KISS - Keep it simple and stupid
Walking on water and developing software from a specification are easy if both are frozen. – Edward V Berard
|
|
|
04.03.2010, 15:22
|
IchSelbst
LVF-Guru
Beiträge: 3.696
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
Analogmessung auf einem Kanal im Hintergrund
' schrieb:weil ich zig lokale variablen verwende
Achja. (<= mal was neues).
Zitat:und die tun es (oder lieg ich da falsch?) nur in dem VI, wo auch das Frontpanel ist.
Ja, du liegst nicht falsch.
Zitat:Beispielsweise bei der Datenspeicherung verriegle ich den Button zum Anzeigen der TDMS-Datei bis die Datendatei geschlossen ist, usw.
Das Problem, was ganz allgemein auftritt, ist, dass parallele Abläufen ggf. synchronisiert werden müssen. In einem VI kann man das sehr leicht und einfach mit Lokalen Variablen machen. VI-übergreifend ist das jetzt nicht mehr so einfach. - Naja, eigenlich doch: Dafür gibt es die Synchronisations-Palette (in deinem Falle: Semaphoren?).
Eine weitere Möglichkeit, ohne den Algorithmus ändern zu müssen, wären Referenzen. Du übergibst also eine Referenz auf TDMS-View in das SubVI und kannst dann im SubVI per Referenz auf TDMS-View zugreifen. (Sowas z.B. mach ich.)
Zitat:Ein SUB-VI, in das 30 Kabel reinlaufen, ist auch nicht wirklich schöner anzusehen.
Auch hier hast du wieder recht: Pack die 30 Elemente in einen Cluster (den es nur im BD gibt: bundlen ohne Name) und gib den an das SubVI. Oder leg die 30 Elemente in einen Cluster am FP und übergib diesen Cluster.
Zitat:Es ist nur so, ich hab ein relativ kleines Frontpanel, aber dazu halt ein schon recht großes Blockdiagramm.
Ja, auch hier muss ich dir wieder Recht geben: Finde ich auch.
Zitat:aber wenn ichs dann erweitere, fehlt mir vermutlich wieder Platz...
Zitat:Ja, so machen wirs auch, oder: NEIN, das geht viel besser.
Eigenlich hab ich nie so viele parallele Schleifen. Eigenlich immer drei Stück: Eine mit einer Event-Struktur. Eine, in der nur Anzeigeelemente zyklisch refresht werden (z.B. aus Meldern). Und eine, in der die Statemachine für die Steuerung läuft. Dieser Aufbau ist applikationsunabhängig. Alles, was applikationsbedingt keinen direkten Zugang zum Frontpanel hat/braucht, ist in einem ggf. parallelen SubVI ausgelagert. Das würde jetzt bedeutet: Kleines FP - kleines BD.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
08.03.2010, 09:05
|
wernerIBN
Datenflussumgeher
Beiträge: 124
Registriert seit: Sep 2009
8.6 und 2011
2000
DE
52425
Deutschland
|
Analogmessung auf einem Kanal im Hintergrund
' schrieb:Beispiel:
Je länger die auslesende Schleife wartet, desto mehr muss sie aus der Queue lesen.
[attachment=53118:BD.png]
Gruß SeBa
Nochmal danke für dein Beispiel, funktioniert wunderbar. Ein Detail tuts sogar besser als erwartet, ich versteh nur nicht ganz warum es so "gut" funktioniert, und zwar: Die untere while-Schleife holt ja alle Daten aus der Queue und zeigt diese auch absolut korrekt an. Was aber, wenn die Queue leer ist und gar keine Daten drinn sind ? Es ist tatsächlich so, das dann auch nichts passiert, was völlig super ist, ich frage mich nur warum ? Ich hätte eher vermutet, man müsste in einem True/false auswerten, ob Daten drinn sind. Selbst wenn die for-Schleife hinter dem , Queue leeren VI fehlt und das warte_n_ms-vi , funktioniert das ganze immer noch wunderbar. Ich nehme an, wenn man einen leeren Signalverlauf einfach in ein Signalverlaufsdiagramm reinlaufen lassen kann, und es passiert dann einfach nichts, oder was ist die Erklärung, die eben kein Error-Case für eine leere Queue nötig ist ?
Erfahrung ist die Summe der gemachten Fehler
KISS - Keep it simple and stupid
Walking on water and developing software from a specification are easy if both are frozen. – Edward V Berard
|
|
|
| |