LabVIEWForum.de - 2 Schritte parallel abarbeiten

LabVIEWForum.de

Normale Version: 2 Schritte parallel abarbeiten
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

ich habe momentan folgendes Problem, bei dem ich nicht weiß wie ich vorgehen soll.

Mit einer Verfahreinheit verfahre ich meinen Messkopf von A nach B, d.h. ich gebe den Befehl zum starten, das VI gibt nach erreichen von B eine Statusmeldung mit True aus (sozusagen eine negative Fehlermeldung). Ich möchte jedoch die Zeit nutzen, um parallel Daten aufzunehmen, d.h. beim Start vom Verfahren soll mein Messkopf in einer Dauerschleife Messwerte aufnehmen, bis Punkt B erreicht ist.

Ist es möglich, dies umzusetzten (z.B. durch eine Parallele struktur) wobei Fall 1 (meine Bewegung) wenn Status fertig meinen Fall 2 (Messung) beendet. Habe schon mal überlegt mit Rendevous vorzugehen (bringt meines erachtens nichts). Auch eine Sequenz hat nicht den gewünschten Erfolg (da ich so nur zum Messen komme, sobald Punkt B erreicht ist.


Hoffe jemand kann mir helfen bzw. kennt einen Ansatz für mein Problem

Viele Grüße
sumsi
Hallo sumsi,

Zitat:Ist es möglich, dies umzusetzten
Ja.

Zitat: (z.B. durch eine Parallele struktur)
Auf alle Fälle!

Zitat:wobei Fall 1 (meine Bewegung) wenn Status fertig meinen Fall 2 (Messung) beendet
Kann man machen...

Zitat:Habe schon mal überlegt mit Rendevous vorzugehen (bringt meines erachtens nichts).
Wenn du meinst...

Zitat:Auch eine Sequenz hat nicht den gewünschten Erfolg (da ich so nur zum Messen komme, sobald Punkt B erreicht ist.
Hattest du nicht weiter oben selbst schon "parallele Strukturen" ins Spiel gebracht? Wo willst du die mit einer Sequenz haben?

Allgemeine Antwort auf deine allgemeine Frage:
Nimm parallele Schleifen. Tausche Daten zwischen den Schleifen aus, da gibt es vieles von lokalen/globalen Variablen, FGVs, Meldern/Queue, SharedVariables,...
Hallo Sumsi,

du könntest z.B. in einer Schleife die Verfahrung starten und vorher eine Meldung an eine andere parallele Schleife schicken, dass die Verfahrung gestartet wird. Dann liest die 2. Schleife während des Verfahrens Messdaten ein und zwar so lange, bis sie wieder eine Nachricht von der Verfahrschleife bekommt, die den Status Verfahren beendet beinhaltet.
Zwischen Startmeldung senden und Verfahrung starten könntest du noch einen Offset setzen, damit die Messung garantiert läuft, wenn die Verfahrachse loslegt.

Gruß, Marko
Hallo zusammen,
ich schließe mich hier mal an, um das eröffnen eines neuen Threads zu vermeiden.

Ich habe ein ähnliches Problem in Richtung Multitasking/ zwei Schleifen parallel laufen zu lassen.
Bisher sieht meine VI so aus: Es werden ständig die Temperaturen vom Thermoelement reingegeben. Sind die richtigen Bedingungen erfüllt, so wird eine VI aufgerufen, die das Widerstandsmessgerät aufruft. Das Widerstandsmessgerät braucht allerdings gute 10s zum Messen. In dieser Zeit wird ansonsten natürlich nichts weiter aufgenommen. Da ich parallel von den Temperaturwerten einen Graphen aufnehmen möchte, ist es recht doof, wenn zu den Zeiten, wo gemessen wird, Lücken entstehen.

Nun ist meine Frage, wie lasse ich das restliche Programm laufen, während ich die Messung aufrufe und auf deren Abarbeitung warte?
Ich hab hier und da vieles gelesen über Queues, Melder und Semaphore, allerdings wüsste ich bei keiner Funktion, wie ich das umsetzte.

Die Frage ist, ist dies, so wie ich es vorhabe, überhaupt umsetzbar? Mein Hauptprogramm hat eine Durchlaufzeit von unter einer Sekunde und die Messung liegt bei ca 10s.
Wenn ich mir diesen Post so durchlese
Erfolgreiche Multicore-Programmierung
dann bin ich mir nicht sicher, ob mein Vorhaben durchführbar ist. "Braucht also Schritt 2 eine Minute, die Schritte 1, 3 und 4 aber jeweils nur 10 Sekunden, dauert der gesamte Durchlauf eine Minute."

Könnte jemand da etwas zu sagen und ggf, ein Schemahaftes VI zeigen?
Ich habe meine VI jetzt nicht hochgeladen, da in ihr gute 10 SubVIs enthalten sind. Ich hoffe mein Anliegen ist auch so vorstellbar :-)
Gruß Tobias
So wie du das beschreibst ist es wohl das sinnvollste (fast) alles so zu lassen wie es ist. Eine parallele Schleife ins BD in der die Widerstandsmessung bei jedem Durchlauf einmal durchgeführt wird. Dort wo du vorher die Widerstandsmessung gestartet hast, fügst du stattdessen das mittel deiner Wahl zur Kommunikation mit der anderen Schleife ein.
Als Beispiel: Du holst dir eine (z.B. boolsche) Queue und dort wo vorher die Widerstandsmessung gestartet wurde, schreibst du in die ein True rein. In der parallelen Schleife steht ein queue lesen (ohne Timeout). Entsprechend wird die Widerstandsmessung immer genau dann ausgeführt wenn du (im Prinzip irgendwas) an die Queue sendest. Dann musst du dir nur noch überlegen, wo die Widerstandsmesswerte landen sollen; sprich: ob du die zum Beispiel nur auf ein Anzeigelement schreibst; dann kannst du das auch in der anderen parallelen Queue machen; oder ob die in der Hauptschleife weiterverarbeitet werden sollen (auch dann wieder: Lokale Variablen; Queues etc.).

Gruß Kiesch
Hi,
danke für deinen Lösungsansatz.
Soweit läuft der Teil, dass die Temperaturen weiterhin laufen während die Widerstandsmessung läuft.
Perfekt.
Alles weitere wird sich in den nächsten Tagen zeigen :-)
Hallo nochmal,

Soweit war der Tipp super. Die Temperaturen werden aktualisiert, während die Widerstandsmessung läuft. Die Daten der Widerstandsmessung bekomme ich auch in mein Array geschrieben mit einer weiteren Queue.
Nun habe ich nur ein Problem, ich nehme an, es hat in irgendeiner Weise mit dem Dataflow zu tun, kann es mir aber nicht erklären. Folgendes passiert:

Sind die Messbedingungen erfüllt, so geht er über die Queue in die obere Schleife und misst den Widerstand, registriert die Messung über den Messfortschritt und übergibt den Wert an das Array über die zweite Queue. Nun wiederholt sich das ganze jedoch noch einmal. Er misst bei jeder ersten Messung jeder Messstelle den Widerstand 2 Mal direkt hintereinander, sprich er misst 1, 1, 2, 2, 3, 3...
Theoretisch ist das nicht verkehrt, solange die Temperatur von der ersten zur zweiten Messung der selben Messstelle, näher am Sollwert liegt. Ist aber nicht der Fall.
Da die Temperatur ziemlich konstant ist, müsste er eigentlich 1, 2, 3, 4.. messen.

Weiterhin ist merkwürdig, dass der Boolsche Wert vom Messfortschritt auch bei der wiederholten Messung ein zweites Mal registiert wird, auch wenn vorher ja schon gemessen wurde und es eigentlich nicht zählen dürfte.

Beim schreiben ist mir ein weiterer möglicher Fehler eingefallen, woran es liegen könnte. Ich habe es schon versucht aber es blieb ergebnislos. Momentan ist das Schreiben des neuen Wertes hinter der Abfrage, ob und welche Messstelle gemessen werden soll. Ich habe also das Dequeue der zweiten Queue vor die For-Schleife gesetzt um schon in der Schleife mit dem aktuelleren Wert zu arbeiten.

Ich denke mein Anliegen ist recht komplex für Außenstehende also hoffe ich, dass ich es ansatzweise verständlich erklärt habe.
Falls jemandem gravierendes am Umgang mit den Queues auffällt, dann wäre ich demjenigen sehr dankbar für einen Rat Blush
Vielen Dank
Gruß Tobias


edit:
ok ich hab nach lagem Suchen den Fehler gefunden.
Nicht nur das Schreiben muss vor der For-Schleife passieren, sondern auch erst dann die Freigabe, dass er wieder messen darf. Scheinbar hat er in den paar Millisekunden von der Freigabe oben bis zum Schreiben unten einen Durchlauf ohne die neuen Werte gemacht.

Aber ein generelles Queue-Problem bleibt.
Wenn ich auf "Abbrechen" drücke, dann gibt mir das Enqueue nach der Widerstandsmessung einen Fehler aus. "Fehler 1" angeblich nicht zugelassene Zeichen wenn z.B. Pfäde in der Queue sind. Sind aber nicht.
Ich habe mir einen Indicator davor gemacht und es kommen auch beim Abbruch genau so plausible Werte.
Muss ich noch ein anderes Queueelement davor oder dahinter hängen?
Gruß Tobias
Die Race-Condition hast du selber schon entdeckt, da ich aber parallel eine Variante ohne Indikator zur Kommunikation zwischen den Loops erstellt habe, hier das verbesserte VI:
[attachment=53328]
Nach den weiteren Unterschieden (und IMHO Verbesserungen) darfst du selber suchen.

Dann noch zu deinem Queue-Fehler beim "Abbrechen": Problem ist, dass du die Queue mglw. zu einem Zeitpunkt zerstörst, während sich die obere Loop in einer Messung befindet. Dann kommt da natürlich ein Fehler raus, da die Queue nicht mehr existiert.

Mgl. Lösung: Sorge per Datenfluss dafür, dass beide Queues erst nach Beendigung BEIDER Loops zerstört werden.

Gruß, Jens
Hallo Jens,

vielen Dank für die verbesserte VI Dais

Gruß Tobias

Nachtrag:
an sich läuft die VI problemlos. Ein Problem hab ich jetzt nur mit dem Feedback Node. Beim ersten VI Aufruf geht er und die Messung läuft, da er beim ersten Aufruf mit True initialisiert wurde. Breche ich nun die Messung ab, wähle z.B. eine andere Messreihe aus, weil ich mich vertan habe und starte wieder den Messvorgang, so steht nun oftmals leider ein False im Feedback Node und er kann nicht mehr messen und somit auch kein True mehr bekommen.
Ich bin hier zum ersten mal mit dem Feedback Node in Berührung gekommen. Soweit verstehe ich seine Funktion, aber wie kann ich das "ändern", dass er nicht beim Neustart des Programms, sondern nur beim Aufruf der SubVI initialisiert wird?

Danke für die Hilfe
Grüße Tobias
Referenz-URLs