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!
ich habe ein kleines Problem mit der Event Struktur. Oder einfach nur ein Verständisproblem.
Wenn ich einen Button habe und da draufdrücke, wird ein Event erzeugt. Wenn der True Fall durch eine Berechnung oder mit einem Signal erzeugt wird, funktioniert es nicht.
Der Grund für das Programm ist: Wenn z.B. beim Signal einlesen eine Grenze überschritten wurde soll er genau 1 hochzählen. Egal wie lange die Überschreitung dauert. DAs mit dem größeren Wert ist kein AKt. Aber egal was ich anstelle, wenn ich eine Tru schleife nehme zählt er solange durch wie das True anliegt. Ein Event zählt auch zweimal bei Wertänderung, 0->1 und 1->0. Gibt das irgendein Trick dabei.
Sorry wenn etwas unverständlich formuliert ist, Hänge irgendwie heute :-)
Danke für eure Hilfe
Arno
It's not a Bug. It's a Feature.
13.12.2009, 15:24 (Dieser Beitrag wurde zuletzt bearbeitet: 13.12.2009 15:27 von IchSelbst.)
' schrieb:Wenn ich einen Button habe und da draufdrücke, wird ein Event erzeugt. Wenn der True Fall durch eine Berechnung oder mit einem Signal erzeugt wird, funktioniert es nicht.
Wenn du den Event programmatisch auslösen willst, so musst du das Property "Wert (signalisierend)" beschreiben.
Zitat:Ein Event zählt auch zweimal bei Wertänderung, 0->1 und 1->0. Gibt das irgendein Trick dabei.
Ja.
Links an den Parametern am Event kann man sich den "Neuer Wert" und "Alter Wert" holen. Wenn also neuer Wert gleich TRUE und ungleich Alter, dann ...
Hinweis:
Die Vorgehensweise mit dem Benutzerereignis musst du nur dann machen, wenn sich Event-Programm (also die Ereignisstruktur) und Event-Quelle (also z.B. das Boolsche Element) in unterschiedlichen VIs befinden. Wenn sich beide im selben VI befinden, erstellt du einfach einen Element-abhängigen Eventcase.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
' schrieb:Wenn z.B. beim Signal einlesen eine Grenze überschritten wurde soll er genau 1 hochzählen. Egal wie lange die Überschreitung dauert.
Für dieses Verhalten ist mir kein fertiger Baustein bekannt. Aber:
Kann man ganz leicht selber machen. Dort wo das Signal überprüft wird, baust du eine Struktur ein, die immer dann ein True erzeugt bei einer Flanke von False => True. Im Event-Case inkrementierst du nur dann, wenn im Boolschen Element der Wert true übergeben wird.
Die Struktur selbst ist auch ganz einfach: Boolscher Wert in einem Schieberegister einer While-Schleife. Alter und neuer Wert werden per - und hier muss ich jetzt raten - Implikation (siehe boolsche Palette) verbunden. Das Ergebnis ist die gewünschte Flanke.
(Bild folgt. Bin gerade am Standortwechsel.)
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
' schrieb:Mit den Referenzen arbeite ich deswegen, weil es später in ein kleines Vi soll und das will ich dann im anderen Programmen mitbenutzen :-)
Das wird ja immer komplizierter. Erst Events verwenden, obwohl die eigentlich primär für Bedienereignisse konizipert sind, und dann noch das Event in ein Sub-VI verlegen. Könnte es vielleicht sein, daß Du nur nicht weißt, wie man positive Flanken ganz einfach in einer Schleife ohne Event-Schnickschnack zählen kann?
' schrieb:wie man positive Flanken ganz einfach in einer Schleife ohne Event-Schnickschnack zählen kann?
Vielleicht will er ja doch in dem anderen VI zählen. Allerdings wäre das Zählen eher doch dort sinnvoll, wo das zu zählende Ereignis stattfindet. Den Zählerwert würde ich dann per Melder veröffentlichen.
Hier das Muster mit Implikation.
Hinweis:
Mit Inverter ist die Logik positiv, damit denkt es sich einfacher. Ohne Inverter geht's auch, halt mit negativer Logik.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Dein vi Funzt supi, aber leider Zählt es weiter wenn länger Zeit ein Highpegel anliegt und ich brauch, egal wie lange es anliegt, nur einen Zählimpuls pro Highpegel. Aber sonst genial einfach.
@IchSelbst
Also bei implikation sehe ich nicht Richtig durch :-)
Habe damit bissel gespielt, aber das scheint zu hoch für mich :-)
Weil die Frage aufkam warum ich ein Event verwenden möchte. Wenn das vi mal länger braucht, könnten ja Highpegel übersehen werden. Bei einem Event wird da halt ne Pause gemacht und das erstmal abgearbeitet.
Ausserdem komme ich aus der Textprogrammierung und da wird das halt meistens per Interupt oder so gemacht.
Deswegen stell ich in LabVIEW viele blöde Fragen :-)
thx Arno
Mal ein PS zum Schluß: Gibts schon LV9? Is das noch ne Beta oder schon käuflich erwerbbar? Weil wir auf Arbeit ne Updatevertrag haben, aber noch mit 8.6 spielen dürfen :-)
' schrieb:Habe damit bissel gespielt, aber das scheint zu hoch für mich
Bau's nach.
Drückst du den Button von False auf True erscheint für 250ms nach Implikation ein True. Bei allen anderen Zuständen - also True, False (das sind statische Zustände, die ewig dauern können) und bei False=>True (das ist eine Flanke, die 250ms dauert) erscheint false.
Zitat:Wenn das vi mal länger braucht, könnten ja Highpegel übersehen werden. Bei einem Event wird da halt ne Pause gemacht und das erstmal abgearbeitet.
LV arbeitet nach dem Verfahren des Datenflusses. Und beachte: Der Event verursacht nirgends eine Pause! Der läuft parallel! Ist also nicht mit eventgesteuert einer textbasierten OOP zu vergleichen!
Zitat:Gibts schon LV9?
Da gibt es schon das Update f2!
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
13.12.2009, 21:46 (Dieser Beitrag wurde zuletzt bearbeitet: 13.12.2009 21:46 von jg.)
' schrieb:Mal ein PS zum Schluß: Gibts schon LV9? Is das noch ne Beta oder schon käuflich erwerbbar? Weil wir auf Arbeit ne Updatevertrag haben, aber noch mit 8.6 spielen dürfen :-)
In Ergänzung zu IchSelbst:
LabVIEW(ja, es heißt jetzt LV 2009) gibt es seit August (seit der NI-Week in Austin).
' schrieb:aber leider Zählt es weiter wenn länger Zeit ein Highpegel anliegt und ich brauch, egal wie lange es anliegt, nur einen Zählimpuls pro Highpegel.
Das ist schlichtweg falsch: gezählt wird nur bei einer Änderung des Pegels, und zwar bei Anderung von false nach true.
Zitat:Weil die Frage aufkam warum ich ein Event verwenden möchte. Wenn das vi mal länger braucht, könnten ja Highpegel übersehen werden. Bei einem Event wird da halt ne Pause gemacht und das erstmal abgearbeitet.
Damit das nicht passiert, maß natürlich die Wartezeit in der Schleife kleiner sein als die kürzeste Pegeldauer des Signals. Praktisch heißt das, daß die Pegeldauern größer als 1ms sein müssen, um überhaupt messen zu können. Sind sie kleiner, dann wird aber auch bei Auwertung mit Events die Grenze der Möglichkeiten schnell erreicht sein. Die Lösung ist dann: den Counter der Messkarte zur Flankenzählung zu verwenden. Damit geht es bis in den MHz-Bereich hinein.