Parallele Schleifen synchronisieren?

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

Parallele Schleifen synchronisieren?

Сообщение Andband »

Hallo,
ich habe hier z.b. drei parallele Schleifen.
Meine Idee solche Schleifen (die in meinem Fall auch keinen Datenaustausch untereinander haben) zeitlich zu synchronisieren, ist am Anfang des Programmes 'GetTime' zu verwenden und dann anhand der Zeitpunkte nach wievielen (milli-)Sekunden bestimmte Ereignisse eintreffen sollen, die Wait-Zeiten der einzelnen Schleifen auszurechnen.

Gibt es elegantere Methoden zum (softwarebasiertem) Timing von parallelen Schleifen ?

And
Sandman
beginner
beginner
Сообщения: 12
Зарегистрирован: 18 июн 2009, 17:00
Версия LabVIEW: 8.6
Контактная информация:

Re: Parallele Schleifen synchronisieren?

Сообщение Sandman »

Also ich glaub wenn die Schleifen einfach alle den gleichen Wait-Wert haben, laufen sie bereits synchron. Zumindest tun sie das in meinen Anwendungen.

Grüße
Аватара пользователя
Eugen Graf

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

Re: Parallele Schleifen synchronisieren?

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

Da würde ich ein Ocurence benutzen. Die eine Schleife macht Timing (normale Wartezeit) und erzeugt das Occurence und die anderen zwei warten aufs Occurence.
Andband
assistant
assistant
Сообщения: 132
Зарегистрирован: 26 окт 2009, 23:05
Версия LabVIEW: 7.1
Контактная информация:

Re: Parallele Schleifen synchronisieren?

Сообщение Andband »

Die Ocurence darf aber immer nur dann gesetzt werden, wenn die andere Schleife 'arbeiten' soll. Wenn das alle fuenf Minuten ist, waere, dann eben alle fuenf Minuten.

Also muss die Timingschleife zum einen Wissen, wann die andere Schleife etwas machen sollen und zum anderen in jedem Durchlauf eine If-Abfrage machen, ob denn der Zeitpunkt erreicht (bzw. groesser gleich) wurde, an dem die andere Schleife arbeiten muss. If (True) -> Occurence setzen.

Hab ich das richtig verstanden?
Аватара пользователя
Eugen Graf

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

Re: Parallele Schleifen synchronisieren?

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

Ich habe es so gemeint, wobei die obere Schleife der Taktgeber für die unteren zwei ist. Alle drei laufen syncron.
Вложения
Occurence.png
Occurence.png (7.51 КБ) 11285 просмотров
Andband
assistant
assistant
Сообщения: 132
Зарегистрирован: 26 окт 2009, 23:05
Версия LabVIEW: 7.1
Контактная информация:

Re: Parallele Schleifen synchronisieren?

Сообщение Andband »

Jo danke - da wuerden alle immer gleichzeitig ausgefuehrt werden. Vielleicht muss ich meine Frage etwas umformulieren:

Wenn man einen echten Zeitmesser haben moechte, der die Zeit mitzaehlt, die seit Programmstart vergangen ist, verwendet man da dann gettime? Oder wie macht man dass?

i * SchleifenWartezeit wuerde zumindest sehr schnell ungenau werden, weil da ja die eigentlichen Operationen welche die Schleife ausfuehrt nicht mitgestoppte werden wuerden.
Аватара пользователя
Eugen Graf

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

Re: Parallele Schleifen synchronisieren?

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

Ja, sicher mit dem Zeitstempelunterschied (Zeit vor dem Schleifenbeginn und Zeit der aktuellen Iteration) kannst du es rausfinden.
Andband
assistant
assistant
Сообщения: 132
Зарегистрирован: 26 окт 2009, 23:05
Версия LabVIEW: 7.1
Контактная информация:

Re: Parallele Schleifen synchronisieren?

Сообщение Andband »

Super, war eben nur nicht sicher ob gettime DIE gaengige Methode fuer Zeitstempel ist oder ob Labview intern da irgendwas anderes in petto hat. Danke dir.
Аватара пользователя
Eugen Graf

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

Re: Parallele Schleifen synchronisieren?

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

Du kannst dir vielleicht noch die Timed-Loop anschauen, da gibt es tolle Features, die ich aber nicht kenne :think:
Andband
assistant
assistant
Сообщения: 132
Зарегистрирован: 26 окт 2009, 23:05
Версия LabVIEW: 7.1
Контактная информация:

Re: Parallele Schleifen synchronisieren?

Сообщение Andband »

Ich hab mir die Timed-Loop noch nicht angeschaut - steht aber irgendwo im unteren Abschnitt meiner to-do list :D

nochmal zu dem Thema:
Nehmen wir an, es gibt ein Masterloop das die Kontrolle ueber das Timing hat und das eine Steuerdatei einliest welche Informationen enthaelt, wann diverse andere Schleifen gestartet werden muessen. Darueber hinaus enthaelt sie Parameter, die zum Start der anderen Schleifen noetig sind.

Ist ein Notifier die beste Methode hierfuer?

(Ich lese immer "Variablen und Property-Value vermeiden". Der Grund solchige zu vermeiden ist lediglich die Gefahr von Race-Conditions (oder?) - also wenn man es wirklich ordentlich macht, waere es kein Problem. Oder gibt es noch andere Nachteile?
Аватара пользователя
Eugen Graf

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

Re: Parallele Schleifen synchronisieren?

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

Notifier oder Queue wäre das beste dafür. Ich habe auch ein ähnliches Projekt gemacht, alles mit Queues aufgebaut und sogar eine Library daraus gemacht (suche nach "Tasking" in unserem Forum).

Variablen und Property-Value sind asynchron, wenn du an einer Stelle zu spät ausliest, kann es passieren, dass der Wert sich inzwischen schon zwei Mal geändert hat, somit Informationsverlust oder auch Race Conditions.

Gruß, eg
Andband
assistant
assistant
Сообщения: 132
Зарегистрирован: 26 окт 2009, 23:05
Версия LabVIEW: 7.1
Контактная информация:

Re: Parallele Schleifen synchronisieren?

Сообщение Andband »

habs gefunden, brauch Labview 8.2 dafuer
wird Zeit des die Leute hier mal ein Upgrade kaufen :D

Queues sind eine Art Notifier mit Buffer nehm ich an?
Ich hab grad mal das :vi: im Anhang zusammengebaut.

Ist das grob von der Herangehensweise richtig? Interessant ist, dass die For-Schleife zu warten anfaengt, wenn die Queue voll ist. Die neuen Elemente verfallen also nicht, bzw. ersetzen auch keine alten.

Warum funktioniert der Stop-Button nicht mehr, nachdem alle Queue Elemente abgearbeitet worden sind?
Вложения
queueexample.gif
queueexample.gif (5.8 КБ) 11243 просмотра
Аватара пользователя
Eugen Graf

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

Re: Parallele Schleifen synchronisieren?

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

Sieht gut aus. Die untere Schleife braucht keine Wartezeit, die synchronisiert sich automatisch zu der oberen. Stop funktioniert nicht, weil das Enqueue :vi: nun hängt und auf die Daten wartet. Da es keine Daten gibt, hängt die komplette Schleife nach dem Datenflußprinzip.
Andband
assistant
assistant
Сообщения: 132
Зарегистрирован: 26 окт 2009, 23:05
Версия LabVIEW: 7.1
Контактная информация:

Re: Parallele Schleifen synchronisieren?

Сообщение Andband »

Wenn du anstatt von enqueue dequeue meinst, versteh ich die Erklaerung mit dem Stop-Button. ;)

Die 500 ms sollten nur irgendeinen langwierigen Berechnungsvorgang oder aehnliches simulieren, damit die Queue voll wird. Andernfalls wuerde ein Notifier ja dieselbe Funktion erfuellen :)
Andband
assistant
assistant
Сообщения: 132
Зарегистрирован: 26 окт 2009, 23:05
Версия LabVIEW: 7.1
Контактная информация:

Re: Parallele Schleifen synchronisieren?

Сообщение Andband »

Du musst einfach dequeue gemeint haben.

Aber wie wuerde man die untere Schleife denn sauber beenden?

1.
Jedesmal mit 'Queue Status' pruefen ob die Anzahl der Elemente in der Queue groesser 0 ist bevor man 'Dequeue' verwendet und wenn nicht die Schleife abbrechen:
Das wuerde so nicht gehen, denn es kann ja sein, dass die Schleife die die Queue auffuellt langsamer ist als die, die sie ausleert/ausliest und somit die Verarbeitung der Daten zu frueh gestoppt wird.

2.
'Queue Status' kombiniert mit einem Notifier, der geschickt wird, wenn die fuellende Schleife fertig ist:
Hier wuerde die lesende Schleife ja dann erst anfangen zu arbeiten, wenn die Fuellende fertig ist -> schlecht, da koennte man von vorne herein in ein Array schreiben und das danach verarbeiten.

3. TimeOut von Dequeue verwenden: Das koennte gehen wenn man ungefaher weiss, wie lang es dauert bis neue Daten kommen, wenn welche kommen wuerden. Ich schaetze also, dass ist die gaengie Variante...
Ответить

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