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 Projekt, bei dem mir ein Teil des LabVIEW-Programms gerade ziemlich Kopfzerbrechen vereitet. Ich habe Bilder dazu angehängt.
Zwar geht es darum, dass eine While-Schleife ausgeführt wird mit einer bestimmten Abfolge und zwei inneren While-Schleifen. In denen wird immer für eine gewisse Zeit der Ausgang Power und PowerLamp eingeschaltet, danach, wird Power für kurze Zeit ausgeschaltet und und PowerLamp blinkt (das passiert in der Abfolge mit den inneren While-Schleifen, die äussere wiederholt das ganze einfach noch mal). Das Funktioniert auch alles prima. Was mich jetzt aber stört: Sobald ein bestimmter Eingang gesetzt wird, wird das sog. PowerFailureStopSignal auf 1 gesetzt, was die Abbruchbedingung ist. Das Signal wird auch korrekt gesetzt. Was ich jetzt aber nicht begreiffe: Das Signal wird irgendwo mitten in der Schleife gesetzt, z.B. als Power gerade on ist. Es wird korrekt erkannt, springt aus der ersten inneren Schleife raus, geht weiter, schaltet Power aus, springt aus der zweiten inneren Schleife raus und ist am Ende der Abfolge. Jetzt Überprüft er die äussere Schleife und stellt fest, dass die Abbruchbedingung der äusseren Schleife erfüllt ist. So weit so gut. Nur läuft jetzt aus irgend einem Grund die ganze äussere Schleife noch einmal durch. Und das ist das, was ich nicht verstehe. Kann mir das jemand erklären?
Wenn ich jetzt nämlich den Power-Ausgang messe, zeigt sich das durch einen Peak, es wird noch mal kurz eingeschaltet, bevor komplett ausgeschaltet wird. und das will ich eigentlich nicht. Ich begreiffe nur nicht, wieso das passiert. Ich habe an einem anderen Ort eine fast gleiche Schleife und dort passiert das nicht.
an welche rstelle setzt du denn PowerFailureStopSignal auf True?? Das Problem ist, das du LabVIEW zwei Möglichkeiten gibst.
1. (so wie du es willst) wird der schleifen inhalt ausgeführt mitsamt allen unterschleifen und so weiter. anschließend wird die lokale variable PowerFailureStopSignal ausgelesen und danach entschiden ob die äußere schleife weiter läuft.
2. es ist genau anders herum, zuerst wird die lokale variable ausgelesen und dann der schleifeninhalt abgearbeitet. wenn du innerhalb der schleifeninhaltes nun den wert der variablen PowerFailureStopSignal änderst, interessiert das die abbruchbedingung nciht mehr, sie hat ja schon ihren wert.
LG
Torsten
"Über Fragen, die ich nicht beantworten kann, zerbreche ich mir nicht den Kopf!" (Konrad Zuse)
Aber eigentlich sollte das ja keine Rolle spielen.
Der Unterbruch wird irgendwann innerhalb der Schleife sein. Wenn er nun am Ende überprüft und feststellt, dass die Variable gesetzt ist, bricht er daraufhin ab. Wenn jetzt am Anfang überprüft wird, läuft die Schleife zu Ende, danach wird sie wieder gestartet, überprüft die Variable, stell fest, dass sie gesetzt ist und führt die Schleife auch nicht aus. Sollte meiner Meinung nach ja aufs Gleiche rauslaufen.
evtl wäre es gut wenn du dein VI mal hochlädst (so dass man es laufen lassen kann).
so wie ich dich verstanden habe, schaltest du irgendwann die abbruchbedingung auf TRUE. danach sollte die schleife nciht erneut durchlaufen. tut sie aber trotzdem. meine idee war, dass die lokale variable für die abbruch bedingung ausgelesen wird, bevor sie gesetzt wird. dann läuft die schleife auch ein weiteres mal durch.
"Über Fragen, die ich nicht beantworten kann, zerbreche ich mir nicht den Kopf!" (Konrad Zuse)
Hmm, glaube nicht, dass dir nur das vi was bringen würde, bräuchtest wahrscheinlich das ganze Projekt, oder?
Soll ichs einfach zipen und hochladen? Weil nur das vi-File hat dann weder die entsprechenden SubVI noch die ganze FPGA-Struktur.
Glaube aber nicht, dass es daran liegt, weil das komische war, dass ich im Debugmodus geschaut habe und da wurde der richtige Wert gesetzt, aber trotzdem wurde die schlaufe noch mal ausgeführt.
Aber ich lade es gerne hoch, wenn du mir sagst, was du alles brauchst.
naja wenns zu umfangreich ist, wirds wahrscheinlich schwer.
was genau meinst du denn mit "da wurde der richtige Wert gesetzt"?? wurde wirklich ein TRUE an die abbruchbedingung der schleife übergeben? oder wurde die Variable "PowerFailureStopSignal" gestezt?
Verscuh doch einfach mal, an deine Sequenzstruktur einen weiteren rahmen anzuhängen. In diesen Rahmen legst du nur die lokale Variable "PowerFailureStop" und verdrahtest diese mit dem roten Beenden der äußeren Schleife.
Hier mal schemenhaft angedeutet:
LG
Torsten
"Über Fragen, die ich nicht beantworten kann, zerbreche ich mir nicht den Kopf!" (Konrad Zuse)
Naja, beim debuggen steht ja immer der Wert, der übergeben wird, und da stand bei PowerFailureStop in der Schleife true.
Aber danke für die Antwort, ich probiere es morgen mal aus.
MFG Corono
14.07.2009, 17:15 (Dieser Beitrag wurde zuletzt bearbeitet: 14.07.2009 19:11 von Lucki.)
' schrieb:an welche rstelle setzt du denn PowerFailureStopSignal auf True?? Das Problem ist, das du LabVIEW zwei Möglichkeiten gibst.
1. (so wie du es willst) wird der schleifen inhalt ausgeführt mitsamt allen unterschleifen und so weiter. anschließend wird die lokale variable PowerFailureStopSignal ausgelesen und danach entschiden ob die äußere schleife weiter läuft.
2. es ist genau anders herum, zuerst wird die lokale variable ausgelesen und dann der schleifeninhalt abgearbeitet. wenn du innerhalb der schleifeninhaltes nun den wert der variablen PowerFailureStopSignal änderst, interessiert das die abbruchbedingung nciht mehr, sie hat ja schon ihren wert.
Theoretisch ist das richtig, aber zu 99.99999% tritt immer die zweite Möglichkeit ein.
Beim Eintritt des Programmes in eine Struktur (hier: in die große while-Schleife) werden immer zuerst die Bedienelemente und lokalen Variablen gelesen, und erst dann bearbeitet das Programm die Strukturen, Funktionen und SubVIs innerhalb der Struktur. Das steht nirgendwo, aber ich habe es nie anders erlebt. Das heißt: Das Programm läuft also nie wie gewünscht. Da nützt es auch nichts, wenn die lokale Variable weit rechts in der While-Schliefe positioniert ist, so daß für uns als "Links-nach-Rechts-Leser" der visuelle Eindruck entsteht, diese wird zuletzt gelesen. LabVIEW liest aber nicht so.
Die Korrektur ist hier ganz einfach: Die lokale Variable 1 cm nach oben verscheiben, so daß sie sich dann in der letzen Sequenz der Sequenzstruktur befindet. Dann funktionierts wie gewünscht.
würde er die lokale variable einfach in den vorhandenen sequenzrahmen setzen, wäre das selbe problem da. nur eben reduziert auf den letzten rahmen. deswegen hatte ich vorgeschlagen, einen neuen rahmen hinten anzufügen.
LG
Torsten
"Über Fragen, die ich nicht beantworten kann, zerbreche ich mir nicht den Kopf!" (Konrad Zuse)
' schrieb:würde er die lokale variable einfach in den vorhandenen sequenzrahmen setzen, wäre das selbe problem da. nur eben reduziert auf den letzten rahmen. deswegen hatte ich vorgeschlagen, einen neuen rahmen hinten anzufügen.
Im Prinzip hast Du recht, aber wenn Du mich fragst, dann würde ich hier keinen einzigen Sequenzrahmen verwenden.(Oder nur mal einen winzig kleinen für eine lokale Veriable). Die exzessive Verwendung von Sequenzrahmen ist immer das perönliche Signum, mit der sich der Poster mit seinem VI als Anfänger ausweist - so auch hier.
Gruß Ludwig