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!
Hallo,
ich habe ein eher allgemeines Programmierproblem:
Ich habe eine Statemachine gebaut "Anfang" "Vergleich" "Ende". In "Anfang" wird überprüft, ob zwei Werte gleich sind. Sind diese gleich wechsel ich in den Zustand "Vergleich". Wenn nicht durchlaufe ich wieder "Anfang".
In "Vergleich" soll überprüft werden, ob die Werte für eine Zeitspanne von 5 Minuten gleich bleiben, danach wechsel ich zu Ende und mein Ursprungsprogramm läuft weiter.
Nun mein Problem mit dem Vergleich: Die Bedingung ist, dass die Werte gleich bleiben. Solange soll eine Schleife laufen. Ist das Ende der Zeitspanne erreicht soll der Wert True ausgegeben werden um in den nächsten Modus zu wechseln. Sollte der Wertevergleich eine Abweichung ergeben (False) soll insgesamt ein False ausgegeben werden um in den Modus "Anfang" zu wechseln. Ich habe jetzt mit diversen While- und Case-Konstruktionen rumgebastelt, aber ich bekomme es nicht hin....
Mein Problem bei Case ist, dass Case immer nur einmal am Anfang ausgelesen wird. Ich überlege jetzt ob ich zwei Whileschleifen benutze. In der einen läuft die Zeit und wird beendet wenn die Zeit abgelaufen ist. Ich habe dies mit der Funktion "Zeit in ms" und Schieberegistern gelöst. In der Zweiten Schleife wird Verglichen. Wenn der Vergleich False ist wird False ausgegeben, ist der Vergleich True und die Zeit True wird ein True ausgegeben, ist der Vergleich True und die Zeit ist True läuft die äußere Schleife um die beiden Schleifen weiter...
Geht das so? Geht das einfacher? Irgendwelche ideen? Gibt es ein VI für solche Fälle?
Gruß thomas
12.03.2010, 10:44 (Dieser Beitrag wurde zuletzt bearbeitet: 12.03.2010 10:45 von GerdW.)
eine while-Schleife sollte reichen. Abbruchbedingung für die Schleife ist halt (Zeit abgelaufen) OR (Werte sind ungleich).
Welchen Wert du aus der Schleife rausgibst, bleibt dir überlassen. In deinem Fall müsste es ausreichen, das Ergebnis von (Zeit abgelaufen) weiterzureichen...
Also kurz zusammengefasst: du verknüpfst 2 Bedingungen, um deine Schleife zu beenden, gibst aber nur eine davon als Ausgabe weiter...
Danke!
Ich hab mal wieder viel zu kompliziert gedacht....
Gruß Thomas
Kommando zurück... so geht es nicht. Denn wenn ich das so mache wird die Schleife ja sofort beendet, weil die Werte gleich sind. Ich muss nur wissen, ob sie es im Verlauf von 5 Minuten immer noch sind. Ich versuch das Problem mal zu schildern:
Ich frage von einem Messgerät einen Durchfluss ab. Im Anfahrbetrieb nähert er sich immer mehr dem eingestellten Sollwert. In meiner Funktion möchte ich überprüfen, ob dieser Fluss auch innerhalb von 5 Minuten konstant ist. Die Folge ist dann, dass meine Anwendung in den Prozessbetrieb überwechselt. Daher der Aufwand. Ich müsste die Schleife also beenden, wenn die Zeit abgelaufen ist, muss aber erneut in die Schleife einsteigen, wenn der Durchfluss doch nochmal abweichen sollte.
Das war die einfache Version, in Wirklichkeit prüfe ich einen ganzen Bereich +-3% vom Sollwert ab, aber das hat mit dem eigentlichen Problem ja nichts zu tun.
Gruß Thomas
12.03.2010, 13:19 (Dieser Beitrag wurde zuletzt bearbeitet: 12.03.2010 13:22 von GerdW.)
also zwei ineinander geschachtelte Schleifen.
Innere Schleife: Abbruch nach Zeit; gibt Flag aus, ob Werte innerhalb Sollbereich oder nicht
Äußere Schleife: Abbruch, falls Werte im Sollbereich
Hab ich auch schon mal gehabt, damals mit einem Ofen, der eine bestimmte Temperatur einstellen sollte. Hatte ich gelöst mit einer allgemeinen Wartezeit vorneweg (der Ofen war etwas träge) und einer Schleife, die eine maximale Zeit aufs Einstellen wartet. Wenn der Ofen nach 1 Stunden immer noch nicht den Zielbereich erreicht hatte, war definitiv was kaputt gegangen
Edit:
Du verwendest doch schon eine State-Machine. Da kannst du doch einfach nach deiner Zeitschleife entscheiden, ob du in den "Ende"-State weitergehst oder nochmal in den "Vergleiche"-State... Brauchst also nur eine Schleife!
Hallo,
also ich nehme eine While-Schleife, die - solange der Vergleich True ergibt - läuft. In der inneren Schleife lasse ich die Zeit laufen. Das Problem was ich jetzt habe ist, dass ich immer erst die Zeit komplett durchlaufen lassen muss, bis ich auf eine Abweichung reagieren kann. Daher würde ich gerne einen Ansatz mit einer äußeren und zwei parallel ablaufenden inneren Whileschleifen ausprobieren. Die innere Vergleichsschleife ist auf "Ausführen, solange True" und die Zeitschleife auf "Abbruch wenn True" gestellt. Wenn die Vergleichschleife abbricht und die Zeitschleife noch läuft muss ich "zurück", also in die äußere Schleife neu einsteigen, damit der Zeitzähler zurückgesetzt wird. Wenn die Zeit abgelaufen ist (True) und an der Vergleichsschleife auch ein True anliegt beende ich die äußere Schleife....
Mal schauen, ob ich das hinbekomme und ob da logische Fehler enthalten sind....
Dieser Beitrag soll weder nützlich, informativ noch lesbar sein.
Er erhebt lediglich den Anspruch dort wo er ungenau ist, wenigstens eindeutig ungenau zu sein.
In Fällen größerer Abweichungen ist es immer der Leser, der sich geirrt hat.
Rette einen Baum!
Diesen Beitrag nur ausdrucken, wenn unbedingt nötig!
Hallo!
Danke für den Beitrag. Jetzt habe ich endlich mal die Zeit gefunden mich mit dem VI auseinanderzusetzen. Früher hätte wenig Sinn gehabt, da mir die Zeit gefehlt hat. . Mir ist noch nicht alles klar aber ich glaube ich könnte es schaffen damit zurecht zu kommen. Vielen Dank auf jeden Fall schon mal vorab.