LabVIEWForum.de - Numeric-Control Wert mit Radio-Button presetten

LabVIEWForum.de

Normale Version: Numeric-Control Wert mit Radio-Button presetten
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

Ich benutze ein VI mit While-Loop um Frequenz Generator Hardware über eine serielle Schnittstelle anzusteueren. Die Schnitstelle und das eigentliche ansteuern funktionieren.

Der Ausgangsparameter wird ganz einfach berechnet: (User-Eingabe x Constant) + Offset.

User-Eingabe ist mittels Numeric Control.

Mit Radio-Buttons selektiert der User einen Frequenz Bereich. Bei anklicken eines Buttons wird einen Preset-Wert in den Numeric Control geladen, und werden Constant und Offset (neu)initialisiert. Der Preset-Wert, Constant, und Offset werden aus einer Datei eingelesen.

Und jetzt wird's (für mich) schwierig... Der Num Control sollte beim anklicken eines Buttons nur 1 mal ge-preset werden - sonnst wird die User-Eingabe dauernd überschrieben. Deshalb habe ich die Radio-Buttons und presetten vom Num Control in einer Event-Structure untergebracht, mit Time-Out Event (ohne Time-Out benimmt es sich genau so wie ohne Event Structure).

Das funktioniert - fast! Beim anklicken eines Buttons werden tatsächlich Num Control, Constant, und Offset korrekt initialisiert. Aber... bei jeder Iteration der While-Loop, in der kein Button angeklickt wird, ist der aktuelle Button-Wert ausserhalb der Event-Structure nicht verfügbar (nur der default Wert = Button 1), und werden Constant und Offset mit dem falschen Wert überschrieben.

Was sollte ich ändern, damit es richtig funktioniert?

VI anbei (einlesen der Datei und COM-Schnittstelle habe ich rausgestrippt).
Hallo Tallyho,

Zitat:mit Time-Out Event (ohne Time-Out benimmt es sich genau so wie ohne Event Structure). ... bei jeder Iteration der While-Loop, in der kein Button angeklickt wird, ist der aktuelle Button-Wert ausserhalb der Event-Structure nicht verfügbar (nur der default Wert = Button 1), und werden Constant und Offset mit dem falschen Wert überschrieben.
Genau dieser TimeOutEvent ist dein Problem!
1) "ohne Timeout benimmt es sich wie ohne Event-Struktur" kann ich nicht nachvollziehen. Ohne TimeOut ist es immer noch eine Eventstruktur, die auf registrierte Events reagiert...
2) Im Timeout-Event gibst du leider keinen "richtigen" Wert aus, sondern verwendest "default if unwired". Ändere dieses und dein VI wird bedienbar...
3) Statt eines TimeOut solltest du lieber ein "Stopp-Button"-Event berücksichtigen.
4) Im "Band Selection"-Event solltest du die anderen Anzeigen setzen. Und nur im Event, nicht danach!
5) Tipp: LV speichert Werte in Schieberegistern...
6) Tipp: Es gibt auch "normale" Value-Properties und es gibt auch lokale Variablen, in die man Werte schreiben kann...
Hallo Gerd,

danke für die schnelle Antwort!

Deine Vorschläge 1, 2, 4 implementiert. Damit beim Time-Out die alten Werte am Ausgang der Event Structure erscheinen, habe ich dem While-Loop 2 Shift-Register hinzugefügt. Im Time-Out Fall werden die Register Ausgänge einfach 1:1 an die Event Strcuture Ausgänge weitergeleitet. Funktioniert einwandfrei. Vielleicht nicht die sauberste Lösung, aber: if it works, don't fix it!

Dein 3. Punkt verstehe ich nicht ganz. Time-Out ist hier kein Fehlerfall...

Bez. Punkt 6: anfangs habe ich versucht den Num Control mittels "Value" zu pre-setten, aber das hat irgendwie nicht funktioniert - mit "Value(Signal)" ging es dann...

Frank
Hallo Tallyho,

noch ein paar Anmerkungen:
[attachment=41059]
- es ist keine gute Idee, die PropertyNode des Bedienelements "Manual freq input" umzubenennen in "Dial freq input": es verwirrt den Betrachter und ich habe schlechte Erfahrungen damit gemacht (ältere LV-Versionen neigten dann zu Abstürzen)
- ich persönlich halte es für eine schlechte Idee, Zeilenumbrüche im Label eines Controls zu verwenden: der Eintrag in der Eventstruktur wird verstümmelt und man kann dafür immer die Caption verwenden
- es ist Unsinn, sowohl ein TimeOut von 200ms als auch ein zusätzliches LoopIntervall von 200ms vorzugeben. Der TimeOut reicht aus, um die Schleife warten zu lassen
- dieses Wandeln von Array nach DDT und gleich wieder zurück nach Array ist natürlich auch unnötig
- schon mal über die Verwendung von Arrays für deine Anzeigen (Pre, IF, mult, Band) nachgedacht?

Zitat:Deine Vorschläge 1, 2, 4 implementiert.
- Leider nicht. Du setzt die verschiedenen Dinge immer noch nach der Event-Struktur...
- Der Timeout ist immer noch unnötig. Diese Schleife wartet (momentan) nur auf zwei Dinge: Änderung der Bandauswahl und Stopp-Button. Falls die anderen Eingaben auch wichtig sind, mache weitere Events oder erstelle ein Event für mehrere Bedienelemente...
Hallo Gerd,

"Manual freq input" gibt es nur in dem vereinfachten VI der Anlage. In dem kompletten VI ist es OK.

Die Zeilenumbrüche werde ich beseitigen.

Die Array --> DDT --> Array Umwandlungen sind da, weil ich in dem vereinfachten VI keine Init-Datei einlese (und die Datei mitschicken müsste), die einzulesenen Werte aber brauche.

Zitat:Der Timeout ist immer noch unnötig.
Timer-Constant = 0 setzten statt X mSek funktioniert. Tatsächlich den Time-Out Event Case entfernen aber nicht.

Zitat:Du setzt die verschiedenen Dinge immer noch nach der Event-Struktur...
Habe den "Manual frequency input" Num Control in einem zusätzlichen Event Case untergebracht (+ 3. Shift Register), und die Stopp-Taste ebenso in einem zusätzlichen Event Case gesteckt.

Und funktioniert immer nochMetal
Hallo Tallyho,

bei Eventstrukturen ist es (fast) immer schlecht, wenn man "default if unwired"-Ausgänge benutzt...
Der Timeout-Case ist und bleibt unnötig, ebenso die zusätzliche Wartezeit in der Schleife...
OK, Time-Out Case jetzt auch weg; geht, kein Problem Beer.

Less is more!

Danke Gerd!
Kleiner Tip am Rande:
Diese vielen gleichartigen Strickmuster:
[attachment=41074]
lassen sich problemlos durch Cluster mit vordefinierten Werten ersetzen:
[attachment=41075]
was noch den Vorteil hätte, dass sich die Werte im Konfig-Tab editieren lassen.
[attachment=41086]
Referenz-URLs