LabVIEWForum.de
Occurrence/Tasking/Timing - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Occurrence/Tasking/Timing (/Thread-Occurrence-Tasking-Timing)



Occurrence/Tasking/Timing - LLEA2 - 16.01.2009 14:12

hallo,

ich muss mir zurzeit Gedanken machen, wie ich ein bestimmtes Problem lösen kann. Ich möchte zwei Schleifen (später min 6) unabhängig voneinander also quasi parallel laufen lassen, nach n-Schritten soll eine Synchronisation erfolgen. Die Schleifen sind im Moment innerhalb eines Rahmens einer Sequenzstruktur untergebracht und dienen zur Ansteuerung mehrere Sondenverschiebegeräte mit jeweils zwei Achsen. Hierbei treten nun zwei Probleme auf. Aufgrund der gegegeben Struktur mit Sequenrahmen und einer While-Schleife können entweder alle gleichzeitg losfahren oder immer nur eine manuell pro Schleifendurchlauf. Hier sollen alle manuell und "quasi" parallel ansteuerbar sein (siehe hierzu das angehängte VI -Occurrence). Das viel größere Problem ist, dass es "schnelle" und "langsame" Sonden gibt. Im Moment wird mit jedem Durchlauf zunächst eine bestimmte Position mit der ersten Achse angefahren und im Anschluss die zweite Achse (Winkel) angesteuert. Schnelle Sonden fahren auf eine Höhe und einen Winkel und sind fertig, müssen aber im Moment auf die langsamen Warten, die sich ggf. in n-weiteren Schleifendurchläufen nach bestimmten Parametern ausrichten. In dieser Zeit könnte die schnelle Sonde schon weitere Winkel auf der selben Höhe anfahren, was aufgrund der gegebenen Programmstruktur nicht möglich ist, da darauf gewartet werden muss, dass die langsamen Sonden den Soll-Winkel auch wirklich (in mehreren Schritten, min. 2) erreicht haben. Meine Frage wäre nun, wie kann ich diese Probleme grundlegend am besten ändern. Die einzelnen Sonden müssen in eigenen Schleifen und nicht in einer großen angesteuert werden. Für die Synchronisation nach n-Schritten könnte ich Semaphoren oder Rendezvous-Elemente verwenden? Ich wäre für jeden Tipp dankbar.

In Bezug auf das manuelle und quasi parallele Ansteuern habe ich mich an Occurrence-Elementen versucht und hierbei das Problem, dass ich nur ein Ereignis zur Laufzeit generieren kann und demnach mein Zählbeispiel nicht erneut starten kann?! Des Weiteren kann ich bei dem VI nicht verhindern, dass die While-Schleifen das erste Mal durchläuft.

mfg


Lv85_img

[attachment=16172]


Occurrence/Tasking/Timing - jg - 16.01.2009 14:38

Ohne jetzt dein VI anzuschauen, beschäftige dich mal mit den anderen Elementen in der Sychonizations-Palette und schau dir dazu die Beispiele an.

Also, mach dich schlau über Notifier, Semaphores und Rendezvous-VIs. Damit geht wesentlich mehr als mit Occurences.

Gruß, Jens


Occurrence/Tasking/Timing - IchSelbst - 16.01.2009 15:17

' schrieb:Ich möchte zwei Schleifen (später min 6) unabhängig voneinander also quasi parallel laufen lassen, nach n-Schritten soll eine Synchronisation erfolgen.
Das VI hab ich jetzt nicht angekuckt.

Ich täte da folgendes machen: Ein ablaufinvariantes SubVI schreiben, dass einen kompletten Prüfablauf machen kann. Dieses SubVI wird dann zwei, drei oder auch sechs Mal parallel aufgerufen. Dieses SubVI wird von extern mittels einer Queue gesteuert. Das Synchronisieren an einer vorgesehenen Stelle ist im Prinzip ganz einfach. Irgendwann kommt ein SubVI an eine Position, an der synchronisiert werden soll. Jetzt sendet dieses SubVI (per Melder) an das allen SubVIs überlagerte Steuerungsprogramm eine Meldung "bin da, warte auf Synch". Wenn die Steuerung von allen diese Meldung hat, sendet es an alle "Jetzt weiter".


Occurrence/Tasking/Timing - LLEA2 - 28.01.2009 12:09

Ich hätte zwei weitere Fragen zu diesem Projekt. Es passt vielleicht nicht mehr ganz zu der Überschrift, aber ein neues Thema zu öffnen...^_^

Stand der Dinge ist, dass ich in Form von Cases zwischen zwei Sondentypen untescheiden werde. Für jede der sechs Sonden soll es eine Schleife geben, in der dann der/das jeweilige Case abläuft. Die 6 Einzelschleifen sollen in einer großen Schleife ablaufen, sodass eine "Gesamtmessung" ausgelöst werden kann, wenn alle sechs Schleifen abgearbeitet wurden. Zudem sollen noch neben der "Gesamtmessung" pro großen Schleifendurchlauf mehrere Einzelmessungen des zweiten Sondentyps möglich sein. Diese Sonden müssen dann untereinander synchronisiert werden. Dies ist hoffentlich mit der Rendezvous-Funktion umsetzbar. Ist es möglich, dass ich pro großen Schleifendurchlauf einen Rendezvouzpunkt mit der entsprechende Anzahl an vorhandenen Sonden des 2. Typs erstelle, aber in jedem der 6 Schleifen das Element "auf Rendezvous warten" einfüge. Könnten hierbei die Schleifen, die dann Sonden des 1. Typs abarbeiten zu Problemen führen im Bezug auf die Rendezvous-Funktion? Noch wichtiger wäre die Frage, wie ich Einzelmessungen auslösen kann ohne auch hier den entsprechenden Quellcode doppelt und dreiffach aufzuführen. Ich meine eq hätte da eine Bibliothek zur Verfügung gestellt, in der ein Hauptask mit mehreren Untertasks kommuniziert?!

Des Weiteren will ich zwischen einem Automatik-Modus und einem Manuell-Modus unterscheiden. Im Prinzip unterscheiden sich die beiden Modi nur durch Ereignisstrukturen, die dafür sorgen, dass alles Sonden quasi parallel angesteuert werden können. Der Quellcode könnte dann einfach sehr unübersichtlich werden, weil ich alles doppelt verwende. Kann man das irgendwie geschickt umgehen ohne auf das "parallele" Ansteuern verzichten zu müssen ???

mfg


Occurrence/Tasking/Timing - LLEA2 - 28.01.2009 17:41

Hallo nochmal,

ich habe ein Test-VI erstellt. Hierbei funktioniert die Übergabe der Rendezvous-Refnum per lokaler Variabel oder Referenz nicht bzw. die Rendezvous-Funktion an sich lässt sich nicht realisieren ohne alle Element miteinander zu verdrahten. Vielleicht kann mir jemand von euch weiterhelfen, wahrscheinlich kann man die Rendezvousfunktion so gar nicht einsetzten?


Vielen Dank !!!

Lv85_img

PS: Kann man den Titel des Themas vielleicht in etwas Rendezvous-spezifisches abändern?


Occurrence/Tasking/Timing - LLEA2 - 28.01.2009 19:02

Habe das VI ein bissel umgebastelt. Rendezvous-Treffpunkt an sich geht. Ein Fehler in dem VI bleibt, und zwar funktioniert die While-Schleife, welche den Rendezvous-Status abfragt, nicht so wie ich mir das erhofft habe. Das Abbruchkriterium Anzahl der Wartenden = Größe des Rendezvouspunktes tritt nicht ein bzw. es ergibt sich irgendwie eine zeitliche Diskrepanz zwischen dem Zeitpunkt, wo das Rendezvouz erfolgt und der parallel laufenden Statusabfrage. Hat vielleicht jemand eine Idee ?

Lv85_img


Occurrence/Tasking/Timing - IchSelbst - 28.01.2009 19:19

' schrieb:Das Abbruchkriterium Anzahl der Wartenden = Größe des Rendezvouspunktes tritt nicht ein bzw. es ergibt sich irgendwie eine zeitliche Diskrepanz zwischen dem Zeitpunkt, wo das Rendezvouz erfolgt und der parallel laufenden Statusabfrage.
JHier, ich. Siehe Anhang.

So wie du das gemacht hast geht es nicht. Da das Warten und nachfolgende Weitermachen (! dann gilt: Wartende=0) in den 6 parallenen Schleifen asynchron zu der Hauptschleife geht, ist auf keinen Fall gewährleistet, dass der Gleichheitszustand in der Hauptschleife festgestellt werden kann. Das weitermachen geht so schnell, da kommt die Hauptschleife überhaupt nicht nach.

Ich erlaube mir zu sagen, dass dein BD viel, viel zu groß ist. Hier darfst du dir ein Beispiel an meiner Ausführung nehmen.


Occurrence/Tasking/Timing - LLEA2 - 29.01.2009 17:18

vielen dank IchSelbst :DMusste es zunächst erstmal versuchen zu verstehen, aber danach hast du mir damit sehr geholfen. ich glaube, dass ich da ein "race-condition" problem gezaubert habe. Ich habe dein Beispiel jetzt für mein Projekt noch ein wenig erweitert, aber das Grundgerüst für die Synchronisation der Messung steht jetzt. Rolleyes

Bei weiteren Problemen melde ich mich dann einfach nochmal.