LabVIEWForum.de - Synchronisation

LabVIEWForum.de

Normale Version: Synchronisation
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo Leute,

ich habe mehrere Tasks zur Datenverarbeitung:

1) Daten asynchron mit VISA über serielle Schnittstelle auslesen und in eine Queue reinschreiben
2) Daten aus dieser Queue auslesen und mit Concantenate Strings in einen Parser (Schiftregister) dazuhängen. Dieser Parser holt das Paket aus dem Schieberegister, nach dem das Paket alle Prüfungen bestanden hast, raus.
3) Das geparste Paket wird in eine neue Queue reingeschmissen.
4) Diese Queue wird ausgelesen und das entsprechende Paket wird angezeigt.

Dabei kommen zwei Pakete mit 100 Hz und andere 15 mit 10 Hz.

Das Problem ist, wenn die Pakete viel zu schnell kommen, wird meine zweite Queue irgendwann mehr als ein Paket hat, weil meine Nachfolgertasks mit der Berechznung und Darstellung nicht nachkommen. Z.B. hat diese 100 Pakete, die angezeigt werden sollen. Diese werden aber zu langsam angezeigt, weil ich einen Timeout von 100 ms in meinem Parser habe, aber die Queue mit Rohdaten keine Elemente mehr hat, weil auch keine Daten an der seriellen Schnittstelle (wenn ich diese trenne) anliegen. Somit läuft meine Parsetask und auch alle nachfolgenden Tasks zu langsam.

Was könnt ihr vorschlagen? Ich denke dabei an eine Case-Struktur, die z.B. die Queuegrösse überprüft und abhängig davon meinen Timeout vergrössert oder verkleinert.

Gruss, Eugen
Hier ein Screenshot und Beispiel für LV 8.0 , bitte anschauen.

Danke, Eugen
Vielleicht so.
So wartet die schleife länger wenn nixlosist. wens was zum arbeiten giebt ist sie schneller.
Grüße
Achimedes
[attachment=4154]
Danke erstmal für die Antwort.

Aber nein, gerade umgekehrt, wenn ich deinen Vorschlag richtig verstanden habe. Wenn keine Daten in der Queue mit Rohdaten sich befinden, soll die Task in der Mitte schnell den Schieberegister abarbeiten. Sorry, dass ich micht vielleicht nicht klar ausgedrückt habe.

P.S. mir ist gerade noch aufgefallen, dass man Task1 und 2 vereinigen könnte, aber das löst das Problem trotzdem nicht. Wenn ich das mach muss ich auf VISA startt auf die Queue mit Rohdaten warten.

Gruss, Eugen
OK.
Jetzt aber.

Erste Schleife holt Daten und legt sie in die 1Q.
Zweite Schleife - wenn was in der 1Q dann, rausholen und in das Schieberegister reinlegen, schieberegister
weiterverarbeiten.
- wenn nix in der 1Q dann, nur schieberegister weiterverarbeiten und in die 2Q eintragen.

dritte schleife - liest 2Q aus und zeigt sie an..


Sollte es so funktionieren?
[attachment=4162]
Ja, so wie du es vorgeschlagen hast wird funktionieren. Mir gefällt aber nicht, dass wenn in der Q1 keine Daten sind, aber auch im Schieberegister nichts zu verarbeuiten ist, dann läuft die Task2 viel zu schnell und frisst die CPU.

Gruss, Eugen
jetzt wird das schieberegister noch ausgewertet.

den vergleich musst du ja noch anpassen.
musst halt mal schauen was denn so, in deinem string, übrig bleibt. Null wird der nicht werden weil du ja immer wenigstens das letzte [attachment=4167] im String hast.



[attachment=4166]
Habe es so gelöst:

1) Schauen wie viele Bytes am Port anliegen
2) Wenn mehr als 0, dann in den Schieberegister dazuhängen und parsen
3) Wenn 0, dann schauen ab mein Schieberegister Daten hat, wenn
4) Daten im Schieberegister, dann parsen
5) Wenn keine Daten im Schieberegister, dann auf VISA Event warten

Gruss, Eugen
Wenn es jemand noch nicht verstanden hat.
Man kann also sagen:

wenn keine Zeichen am Port anliegen und keine Daten zum verarbeiten gibt, dann auf VISA Event warten, ansonsten parsen, parsen und parsen.

Gruss, Eugen
Referenz-URLs