LabVIEWForum.de - Multitasking

LabVIEWForum.de

Normale Version: Multitasking
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo

Ich sitze grade vor dem Problem, das ich 2 Sachen möglichst simultan machen muss, es aber nicht mit Rendezvous geht, bzw ich nicht weiß wie.
Das Problem sieht wie folgt aus:
Ich habe im eigendlichen Sinne 2 while-Schleifen in der einen ist eine Protokollinterpretierung und in der anderen Messwerterfassung. Jetz sieht das ungefähr so aus:
[attachment=17167]
Jeder abgerundete Kasten steht für eine while-Schleife (sind eigendlich mehr)
Die Drähte und Punkte sollen veranschaulichen das jeder mit jedem untereinander irgendwie kommuniziert.

Wie man sieht ist halt unten nur die Messung .. die läuft immer gleich ab. Oben ist das Protokoll das ausgewertet wird, je nach Eingaben. Diese bekomme ich über die Serielle Schnittstelle, das ist jedoch an der Stelle nicht wichtig.
Wie es wohl ersichtlich ist, läuft die Messung immer im gleich rythmus bei gleichem Takt(in etwa)
Jetzt ist die Sache, das im Protokoll er sich in der einen, oder der anderen while-Schleife mal kürzer mal länger aufhällt.
Die kommunikation zwischen den beiden Hauptschleifen bekomme ich mit Variablen hin. Eine Möglichkeit wäre, das ich es so realisiere:
[attachment=17168]
Das ist sehr sehr simpel:)aber hat es auch den Effekt den ich brauche?
Ist die Zeit für die untere Schleife einmal gestellt muss ich mir sicher sein, das es auch funktioniert, wenn ich 10s einstelle brauche ich auch wirklich alle 10s einen Messwert. Darin sind Toleranzen mess - Karten berücksichtigt.

Die eigendliche Frage ist also wenn ich bei der oberen Schleife mal für einen Durchlauf 0,2s oder auch 100s brauche, ist dann trotzdem gesichert das die untere in dem eingestellten Intervall die Messungen ausführt, ohne dass die obere Schleife das beeinflusst.

Ich hab zuerst gedacht ich könnte es über Multithreading lösen.. jedoch hab ich keine 2 Kerne / CPUs -.-

Ich hoffe ich habs nicht zu kompliziert ausgedrückt.^^

Thomas
Habe das nicht alles richtig verstanden. In der zweiten Graphik z.B. wird zwischen den beiden Schleifen nicht der geringste Versuch eine Datenkommunikation gemach - obwohl dieses das Thema ist.
Ich habe aber die Vermutung, daß sich Deine Probleme mit Queues, Erzeuger-Verbraucher-Strukturen lösen lassen. Hier und Hier Beispiele von mir.
Anmerkung dazu: Die Beispiele handeln vom Datenaustausch zwischen freilaufenden, unabhängigen VIs. Es funktioniert aber genau so zwischen frei laufenden, voneinander unabhängigen Schleifen in einem einzigen VI.
Vielleicht bringt das etwas mehr Licht.
Eine überarbeitete Version des 2. Bildes.
[attachment=17174]

Aber danke Lucki ich schau es mir an und werds ausprobieren.
' schrieb:Die eigendliche Frage ist also wenn ich bei der oberen Schleife mal für einen Durchlauf 0,2s oder auch 100s brauche, ist dann trotzdem gesichert das die untere in dem eingestellten Intervall die Messungen ausführt, ohne dass die obere Schleife das beeinflusst.
Im Prinzip ja.

Die beiden Schleifen laufen unabhängig. Es aber aber spezielle Fälle, da ist schon eine Beeinflussung vorhanden. Immerhin haben beide Schleifen das selbe Frontpanel. Besser ist es, den Messprozess unabhängig von einem FP in ein SubVI auszulagern.
Hallo,

ich habe ebenfalls eine Frage zum Thema Multitasking, bzw. habe ein Problem mal aufgebaut und getestet.

In meinem kleinen Beipiel toggeln 3 LED´s immer zwischen ON und OFF in verschiedenen Zeiten (10, 100 und 1000ms). Nun sind dies ja 3 verschiedene Prozesse, wo ich aber nicht glaube das Sie gleichzeitig abgearbeitet werden, sondern immernoch sequenziell, also nacheinander. Vom bloßen hinsehen kann man auch erkennen, dass der Takt der LEDS nicht ganz eingehalten wird, bei der 1000ms LED fällt es nicht mehr auf.

Eigentliches Ziel:
Ich möchte nämlich genau solch eine Problematik etwas umfangreicher Umsetzen, in meinem Hauptprogramm habe ich eine riesen Whileschleife in der allerhand passiert und wärend des gesamten Programmablaufs möchte ich einfach nur alle 100ms ein Signal auf high setzen und nach weiteren 100ms wieder auf LOW, alternierend immer so weiter. Allerdings sind bei mir immer schwankungen von 200-1200ms vorhanden. Meine Beiden Fragen sind also:

1. Wie kann ich es Umsetzen, dass mein Signal exakt alle 100 ms wechselt?
2. Wie kann ich die Prozesse alle mit einem Stop-Knopf wieder beenden?

Also wenn ihr direkte Antworten habt oder Links zu anderen Threads/Webseiten oder auch nur Stichwörter, wäre ich euch sehr Dankbar. Im Anhang habe ich einen Screenshot meines Beispielsprogrammes angefügt und das Programm selbst als Lv85_img

Schönen Abend euch allen.
Die Logik enthält Nonsens-Code: für die Invertierung gibt es den Inverter, mehr Logik braucht es nicht.
Wenn die 3 Schleifen alle im gleichen VI laufen. kann man das Stoppen der drei Schleifen einfach mit lokalen Variablen machen.
Mit 10 ms kann die Blinkanzeige nicht mehr richtig funtionieren: Die Blinkfrequenz ist 50Hz, mein Monitor macht 60 Hz. Man muss sich vorstellen, man beobachtet das 50Hz- Blinken nicht direkt, sondern mit einem 60Hz Stroboskop. Und wenn das nicht so wäre, dann wäre - unterschiedlich von Mensch zu Mensch - 50 Hz gerade die Grenze, ab der das Blinken nicht mehr wahrgenommen wird.

Im Bild 3 Verschiedene Methoden zu invertieren.

[attachment=30423]
Aja, da hab ich gar nicht drüber nachgedacht, gut das Du es erwähnst Lucki. Auch vielen Dank für die drei toll umgesetzten Lösungsprinzipien zum toggeln der LEDs, find ich richtig klasse. Dann kann ich auch von ausgehen, dass diese drei Prozesse voneinander unabhängig, bis auf die Stopbedingung, voneinander laufen und auch ihre Taktzeiten konstanz halten.

Nun habe ich ein Programm, was wie auf dem Bild (Beispielhafte Darstellung) im Anhang im meinemlv85Programm aufgebaut ist, wo aber keine LED in der oberen While-Schleife ist, sondern ein Output über einen PEAK PCAN-Dongle, also quasi nur ein Signal was immer ON / OFF wechselt. Dieses ist aber leider nicht konstant im Takt, Soll wären 100ms, aber IST-Wert sind mal 700ms, mal 1200 oder auch mal 150ms, bei jedem Takt auch andere zeitliche Abstände.

Woran kann das denn liegen, dass dieses Programm, was ich habe, die obere Whileschleife nicht im gewünschten Takt flakern lässt?
Eine präzise Taktung ist nur mit Hardware-Timing bei Verwendung einer Messkarte möglich. Aber die von Dir genannten Abweichungen sind schon krass. Offensichtlich wird die CPU manchmal mehrere 100ms zu 100% ausgelastet - dann könnte das schon passieren. Hast Du in allen Schleifen Waits drin? Oder konvertierst Du vielleicht, während das Programm läuft, einen Spielfilm von MPEG nach DivX/AVI?
Nein, ich mach eigentlich nichts weiter ausser einem Excel-Fenster und LabView. Habe herausgefunden, dass es daran liegt mit der Connection zum Dongle der Firma PEAK, jetzt habe ich jeder Schleife eine eigene Connection zugewiesen und ich liege quasi bei 100ms (99-101ms).. ABER, wenn ich die Maus bewege oder das FrontPanel öffne (mit vielen Anzeigen), dann variiert die Zeit zwischen 70-150 ms.

Edit: Ich habe auch noch Probleme mit dem Ausschalten per einem Knopf, bei mir kommt da ein Fehler, diesen habe ich mal als Bild mit angehangen. Vielleicht geht es unter Lv85_img eng/dt noch nicht auf diese Weise?
' schrieb:Edit: Ich habe auch noch Probleme mit dem Ausschalten per einem Knopf, bei mir kommt da ein Fehler, diesen habe ich mal als Bild mit angehangen. Vielleicht geht es unter Lv85_img eng/dt noch nicht auf diese Weise?

Einfachste Lösung - Umweg nutzen: Schreib in der oberen Schleife die Information aus dem Stop-Button in einen booleschen Dummy-Indicator, die nicht "latch" konfiguriert ist und nimm eine lokale Variable davon als Stop-Bedingung in der unteren Schleife!

Es ginge auch "eleganter", aber das funzt 1A...

A.
Seiten: 1 2
Referenz-URLs