LabVIEWForum.de
LEDs serielle beleuchten - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: Instrument IO & VISA (/Forum-Instrument-IO-VISA)
+---- Thema: LEDs serielle beleuchten (/Thread-LEDs-serielle-beleuchten)

Seiten: 1 2


LEDs serielle beleuchten - stillalive - 05.11.2007 15:53

Servus, Monoceros84

ich habe noch ein problem bei error-Anzeige

Da es nur 8 LEDs gibt, kann der Wert max. bis zum 255, wenn es größer als 255 ist, kann es nicht komplett anzeigen.

Deswegen habe ich eine Case-Schleife in For-Schleife eingefügt mit einem extern <=.vi.

Wenn ich einen Wert z.B. 257 eintippe, zeigt es das error. Aber es läuft weiter, bis 257 auftritt.

Gibt es eine Möglichkeit, dass die Schaltung komplett ausschalten kann, oder der Intial Value zurück auf 0 setzt?


LEDs serielle beleuchten - monoceros84 - 05.11.2007 17:22

Irgendwie ist mir alles ein bisschen unklar, aber folgendes:

Die Indexing-Tunnel bewirken, dass alle sich anstauenden Daten in der For-Schleife an ein Array angehängt werden. In deinem Fall bekommst du also ein Array mit 8 Elementen am Ausgang der For-Schleife. Deshalb musst du das Index Array.vi danach anwenden, um einen speziellen Wert aus diesem Array auszulesen. Wenn du nur den letzten Wert aus deiner For-Schleife (also den letzten vom Port gelesenen Wert) haben willst, dann macht einen Rechtsklick auf den Indexing Tunnel und wähle Disable Indexing. Dann bekommst du kein Array mehr, sondern wirklich nur den letzten Wert. Und in diesem Fall entfällt auch das Build Array.vi im False case und die Index Array.vi am Schluss.

Außerdem würde ich das 32bitread_to_dsub.vi mit in die Case-Structure einfügen - du willst doch nur Daten senden, wenn du auch vorher welche gelesen hast, oder?

Da ich nicht wirklich weiß, was deine SubVIs machen und was dein eigentliches Ziel ist, kann ich dir aber weniger Hinweise zum logischen Programmablauf geben.

Zum zweiten Post: Ich weiß nicht, was ein <=.vi ist, ich verstehe nicht, wie du das mit der Case-Struktur in der For-Schleife meinst... Bitte Poste nochmal dein aktuelles VI oder einen Screenshot, der das Problem zeigt (VI wäre besser).


LEDs serielle beleuchten - stillalive - 06.11.2007 14:13

Du hast recht! Das "32bitread_to_dsub.iv" muss in der For-Schleife liegen, weil sonst die 8 LEDs nach jeweiligen Wert nicht beleuchten!

<=.vi ist eigentlich "klein gleich als"-Funktion. Ich habe es nur schnell geschrieben. Nicht der Pfeil!!

Weil es nur 8 LEDs besteht, falls der Wert größer als 255 (8 mal die Eins) ist, kann es nicht komplett angezeigt.

Deshalb habe ich noch eine Case-Schleife in For-Schleife eingestzt. Aber ich will, dass entweder setzt der Wert zurück auf 0 oder die Schlatung hört auf.

Mit Case-Schleife läuft es immer weiter.

Gestern habe ich auch While-Schleife, die zum Schluss mit Stop verbunden ist, benutzt, leider auch fast gleich wie mit Case-Schleife.

Mein Ziel ist:

8-bit Data eingeben, LEDs richtig beleuchten, der Wert (Dezimal) in 7-Segment-Display anzeigen.

z.B. Eingabe: Dezimal 7 ==>> Binäre 0000 0111
Binäre Wert|||| LEDs leuchten |||| Display (Dezimal):
0000 0001 |||| NNNN NNNJ |||| 1
0000 0010 |||| NNNN NNJN |||| 2
0000 0011 |||| NNNN NNJJ |||| 3
................ |||| .................. |||| ...
0000 0111 |||| NNNN NJJJ |||| 7
(N: LEDs Nicht beleuchten, J: LEDs beleutchen)

(VI LV 7.1)


LEDs serielle beleuchten - monoceros84 - 06.11.2007 16:21

Ja, ich versteheSmile

Wenn in deinem Beispiel der Wert 11 erreicht wird, wird er auf 0 zurück gesetzt, das Programm läuft aber weiter. Zählt dann halt wieder bis 11...

Umgehen kannst du das, wenn du den kompletten Inhalt der For-Schleife in die Case-Struktur einbettest und im False-Case den Wert NICHT auf Null zurück setzt. Siehe dazu den Screenshot im Anhang. Im False-Case sind die Eingänge einfach mit den Ausgängen verbunden...

Allerdings verstehe ich nicht, wieso du den Loop Value nicht auf maximal 255 setzt, dann kommst du doch nie über diesen Wert drüber, wenn der Initial Value immer 0 ist... Aber du wirst das schon wissen;)So jedenfalls wie im Anhang geht es immer...


[attachment=9533]


LEDs serielle beleuchten - stillalive - 07.11.2007 13:21

Servus! Monoceros84

Na, klar, ich habe mit deiner Methode noch mal versucht. Ja! der läuft alles in Ordung, wie ich gewünscht habe.

der Wert soll von Kunden eingegeben werden, deswegen habe ich der Loop-Wert nicht definiert und nur einen Max. Wert beschränkt.

Weil es nur einen Beispiel ist, habe ich der Max.-Wert auf 10 eingesetzen. Bevor ich es in exe-file umwandle, werde ich den Max. Wert auf 256 statt 255 festlegen und den Loop-Wert freigeben.

Danke Dir!!!

weißt du, warum muss es den max.-Wert 11 statt 10 in diesem Beispiel eingeben? Woher kommt die 11th Schleife?

d.h. wenn ich max. Wert auf 10 und Loop-Wert auf 11 einsetzt, zeigt es keinen Fehler. Nur wenn ich den Loop-Wert auf 12 einsetzt, dann gibt es eine Reaktion von Error Anzeige.

Ich habe das Inkremetieren.vi vor die Case-Schleife gelegt, dann kann ich den max.Wert auf 10 setzten.

klasse!! ich kann mich immer noch nicht vorstellen, dass es so wunderbar laufen kann!!! Noch mal Dank!!!

aber weißt du, wie kann die Error-Anzeige nur einmal anzeigen?
z.B. max.=10, wenn Loopwert=11, dann zeigt es ein mal den Fehler. Aber wenn Loopwert=12, dann 2 mal, und so weit und so fort.
Hast du eine schöne Idee???

gruß, dan


LEDs serielle beleuchten - monoceros84 - 07.11.2007 17:03

' schrieb:weißt du, warum muss es den max.-Wert 11 statt 10 in diesem Beispiel eingeben? Woher kommt die 11th Schleife?

d.h. wenn ich max. Wert auf 10 und Loop-Wert auf 11 einsetzt, zeigt es keinen Fehler. Nur wenn ich den Loop-Wert auf 12 einsetzt, dann gibt es eine Reaktion von Error Anzeige.

Das liegt daran, dass 'Initial Value' bei 0 los geht, 'Loop Value' aber die absoluten Schleifendurchläufe zählt. Das heißt, wenn du 11 Durchläufe haben willst, dann zählt dein Zähler von 0 bis 10 - ohne Fehler. Wenn du 12 Durchläufe willst, dann zählst du von 0 bis 11 mit einem Fehler.
Also entweder 'Initial Value' auf 1 setzen oder vor dem Case inkrementieren, wie du selbst schon vorgeschlagen hast. Oder die Anzahl der Schleifendurchläufe um 1 reduzieren...

' schrieb:aber weißt du, wie kann die Error-Anzeige nur einmal anzeigen?
z.B. max.=10, wenn Loopwert=11, dann zeigt es ein mal den Fehler. Aber wenn Loopwert=12, dann 2 mal, und so weit und so fort.
Hast du eine schöne Idee???

Die einfachste (wenn auch keine "schöne") Lösung ist, wenn du innerhalb der Case-Struktur (im False-Case) noch eine Case-Struktur einfügst. Mit dieser fragst du ab, ob dein Schleifenwert 11 ist (dann Fehler anzeigen) oder nicht 11 (dann nichts machen). Also hast du folgende Abfragen:
Wert<=10? -> Nein -> Wert=11? -> Ja -> Fehleranzeige
Wert<=10? -> Nein -> Wert=11? -> Nein -> Nichts

Freut mich, dass ich helfen konnte!