Parallele Schleifen synchronisieren?

Signal -erfassung, -verarbeitung und -ausgabe
Andband
assistant
assistant
Сообщения: 132
Зарегистрирован: 26 окт 2009, 23:05
Версия LabVIEW: 7.1
Контактная информация:

Re: Parallele Schleifen synchronisieren?

Сообщение Andband »

..nein nein nein nein, des is alles irgendwie net des Wahre.
Die Frage von zuvor bleibt noch offen. Und hier ist die naechste :)

Ich habs versucht in eine schoene Geschichte mit bereits vorgefertigten Vermutungen zu packen. Wenn jemand seinen Senf dazu geben koennte, ob er es genauso machen wuerde oder anders bzw. ob die Vermutungen richtig oder falsch sind waere ich sehr dankbar :)

Szenario (schaut laenglich aus, ist aber zumindest nicht kompliziert):

Im Mainloop vom Programm wird ein Drehknopf (der einen Winkel mit einem Motor einstellen soll) ausgelesen, den der Anwender drehen kann. Drueckt er auf 'Uebernehmen', soll der Motor die Schritte fahren, die noetig sind, um den eingestellten Winkel zu erhalten.


Loesung:
Wenn der Drehknopf auf 40 steht und auf 80 gedreht wurde, muessen also 40 Schritte gefahren werden. Das ist eine Subtraktion die das Mainloop ausfuehrt. Dann schicke ich einen Notifier mit Anzahl der Schritte an ein paralleles Loop, dass immer laueft, aber mit 'WAIT for Notifier' hingehalten wird. Wenn dieser ankommt wird fuer jeden Schritt ein Puls erzeugt (also ein For-Loop mit N=Schrittzahl im parallelen Loop gestartet).
Das kann ich dann ja beliebig oft machen: jedes Mal wenn der Anwender einen anderen Winkel einstellt, wird der Notifier vom Main Loop ja neu gesendet und mein paralleles wartendes Loop startet jedesmal das Motordreh-For-Loop.

Problem A:
Das Hauptprogramm ist irgendwann wenn der Anwender keinen Bock mehr hat den Motor zu drehen zu Ende :). Der Anwender drueckt also z.B. STOP. Das externe Loop laueft aber nach wie vor. Das soll nicht so sein.

Loesungsvorschlag zu A:
Beim Beenden des Mainloops den Notifier erneut schicken mit z.B. (-1) als Schrittzahl. In das parallele Loop muss dazu dann eine Abfrage eingebaut werden, die prueft ob der Motor gedreht werden soll, oder im Fall (-1) dass Loop gestoppt (und der Notifier aufgeloest) werden soll. Das waere darueber hinaus eine weitere Antwort auf die Frage von zuvor, wie man eine Queue sauber beenden koennte. Vielleicht ist das ja sogar die richtige?


Problem B:
Der Motor ist langsam, der Anwender entscheidet sich fuer einen anderen Winkel, noch waehrend das Motordreh-For-Loop laueft. Der Notifier wird also wieder geschickt, aber kommt nicht an, da momentan keiner auf ihn "wartet".

Loesungsvorschlag zu B:
Der Labviewprogrammierer ist zu unwissend. Der Notifier kommt an, sobald das For-Loop zu Ende ist. Denn der zuletzt gesendete Notifier bleibt "in der Leitung". Er wird lediglich jedes Mal von neu gesendeten Notifications Ueberschrieben. Das hab ich gerade ausprobiert :)

Zwischenfrage 1: Wie lange bleibt er in der Leitung? Solange bis irgendwo 'Wait for Notifier' getriggert wird? Oder so lange bis ein neuer Notifier gesendet wird?

Antwortvorschlag zu Zwischenfrage 1:
Nachdem man mehrere Loops mit ein- und demselben Notifier triggern kann, wahrscheinlich so lange bis ein neuer gesendet wird. Also ist ab dem Moment an dem ein Notifier gesendet wurde immer einer in der Leitung, es sei denn es wurde 'cancel notifier' aufgerufen.
Warum wird dann 'Wait for Notifier' nicht dauernd neu getriggert? Wahrscheinlich weil sich Wait for Notifier merkt, auf welche interne Notifier-Nummer letztes mal ausgeloest worden ist, und auf diese wird nicht nochmal ausgehloest. Nur eine Vermutung.

Problem C:
Der Anwender ist uebereifrig und drueckt ein paar Mal waherend dem laufenden Drehvorgang. Es werden also Notifier gesendet, von denen diesmal wirklich welche verloren gehen. Nachdem das Mainloop nicht weiss wieviele Schritte sich der Motor in der Zeit schon gedreht hat geht es zur Schrittberechnung immer vom zuletzt gesetzten Wert aus. Der letzte Notifier der in der Leitung steht und gelesen wird enthaelt also eine voellig falsche Schrittzahl.

Loesungsvorschlag zu C:
Eine Queue anstatt dem Notifier verwenden.
Последний раз редактировалось Andband 04 фев 2010, 01:41, всего редактировалось 2 раза.
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Parallele Schleifen synchronisieren?

Сообщение Eugen Graf »

Es gibt noch zwei weitere Varianten:
4. Schleife beenden, wenn die Queue von der oberen Schleife zerstört wird. Diese Variante verwende ich nur zu Testzwecken.
5. Richtiges beenden durch ein Befehl über die Queue. Du kannst die Daten mit einem Befehl-ID unterscheiden.
Andband
assistant
assistant
Сообщения: 132
Зарегистрирован: 26 окт 2009, 23:05
Версия LabVIEW: 7.1
Контактная информация:

Re: Parallele Schleifen synchronisieren?

Сообщение Andband »

Hm.
Ich verstehe 4. nicht.
Wie soll dass gehen? Bei dem von mir vorhin geposten VI hat man da z.B. keine Chance. Die oebere Schleife zerstoert die Queue noch bevor die untere ueberhaupt anfangen hat, diese abzuarbeiten. Die Funktion etwas zwischen zupuffern geht damit doch voellig verloren. Aber gut zu Testzwecken kann man damit sicher irgendwas testen :D :D

zu 5.) 'Labview Befehl-Id' und 'Labview Command-Id' liefert irgendwie keine brauchbaren ergebnisse bei google :)
Was genau meinst du damit? So etwas wie ich gerade beschrieben habe? -1 oder etwas anderes Signifikantes schicken und dann jedesmal beim Dequeuen zuvor eine If-Abfrage?
Andband
assistant
assistant
Сообщения: 132
Зарегистрирован: 26 окт 2009, 23:05
Версия LabVIEW: 7.1
Контактная информация:

Re: Parallele Schleifen synchronisieren?

Сообщение Andband »

Ok vielleicht war das doch etwas zu viel erwartet gewesen :)

Hm, also ein konkretes Beispiel:
Waere das hier gute Paxis in der Umsetzung ?
Вложения
notifier.gif
Ответить

Вернуться в «Signalverarbeitung»