INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Dieses Thema hat akzeptierte Lösungen:

Queued State Machine Zeitverzögerung



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

02.06.2015, 17:13
Beitrag #1

NISI Offline
LVF-Neueinsteiger


Beiträge: 6
Registriert seit: May 2014

2013
2014
DE



Queued State Machine Zeitverzögerung
Hallo zusammen,

da ich erst seit kurzem mit Queued State Machine arbeite (hierbei habe ich viel von dem QSM PC EXAMPLE gelernt und abgekupfert) und das ganze erst noch zu verstehen probiere wollte ich wegen einer Ungereimtheit zu dem Datenaustausch zwischen VI´s nachfragen.

Ich habe ein Main VI (VOC_Cuvette_5_00.vi) und mehrere sub VI´s wobei für mein Problem eigentlich nur das VOC_Arduino_5_00.vi benötigt wird.
Zur Erklährung das VOC_Arduino VI händelt die Kommunikation zu meinem Mikrocontroller list jede Sekunde Daten aus und sendet diese Daten u.a. zu dem Main Vi um Graphisch dargestellt zu werden.
Nun ist es so, dass die Daten auch ankommen, jedoch Zeitverzögert und die Verzögerung erweitert sich immer mehr und mehr, je länger das Programm läuft, sodass es schon nach wenigen Minuten soweit ist, sobald keine Daten mehr gelesen werden das Main Vi immer noch Daten empfängt (welche empfangen wurden, jedoch in einer Warteschleife hängen). Dies Verzögerung ist auch von der Wait[ms] funktion abhängig, denn je länger gewartet wird umso größer die Verzögerung, und das obwohl alle Programmteile zu 90% im IDLE Modus warten.
Wenn ich jedoch die 100ms Verzögerung aus meinem Main VI rausnehme (zulasten der CPU, diese geht von 1% auf 25% Auslastung) passiert das nicht, auch wenn ich über Nacht das Programm durchlaufen lasse.Bahn

Ich hoffe, dass mir jemand weiterhelfen kann denn ich habe keine Ahnung wo ich jetzt noch anfangen soll.

Gruß

Simon
lv13_img


Angehängte Datei(en)
0.0 .rar  VI example.rar (Größe: 933,27 KB / Downloads: 158)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
02.06.2015, 18:07 (Dieser Beitrag wurde zuletzt bearbeitet: 02.06.2015 18:11 von jg.)
Beitrag #2

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
RE: Queued State Machine Zeitverzögerung

Akzeptierte Lösung

Du fügst einfach viel zu oft das Kommando "Idle" zu deiner Main-Queue hinzu, wie einfaches Debugging zeigt:
   
Dadurch wird deine Queue immer länger, frisst Speicher, alles wird langsamer (übrigens auch beim Entfernen deines Waits).

Meine Empfehlung:
Verzichte auf das explizite Hinzufügen des Kommandos "Idle" (im Screenshot nur zu sehen im IDLE Case, aber ich habe es in allen Cases entfernt), werte stattdessen den Time-Out-Ausgang der Dequeue Funktion aus und springe nur in diesem Fall in den Idle Case:
   
Dasselbe solltest du dann in deinen Prozess VIs ebenso machen.

Gruß, Jens

EDIT & P.S.: Ansonsten Respekt für den sauberen Source-Code, sieht man leider viel zu selten hier.

Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)

!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
02.06.2015, 18:12 (Dieser Beitrag wurde zuletzt bearbeitet: 02.06.2015 18:48 von Lucki.)
Beitrag #3

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
RE: Queued State Machine Zeitverzögerung
Ist ja klar, im Idle-State hast Du die Wartezeit drin, und von fast jedem Status aus, auch aus dem Idle-Status selbst, fütterst du immer die Queue, um den Idle-D status erneut auszuführen. Das hat zur Folge, dass in der while-Schleife nur höchstens all 100ms etwas "Vernüftiges" aus der Queue abgearbeitet werden kann - und das ist zu wenig, die Queue wird im Lauf der Zeit immer voller.
Wozu überhaup der Idle-Status? Die Funktion "Element aus Queue entfernen" wartet doch, wenn nichts mehr in der Queue ist, und das ist dann gewissermaßen der Idle-Zustand. Du kannst den Idle-Status von mir aus auch lassen, aber dann nicht von da aus erneut immer wieder die Queue mit "Idle" füttern - und natürlich ohne Wartezeit.
Die Waits in der oberen Schleife sind auch überflüssig: Weg mit dem 10ms Wait, und weg mit dem ganzen Timeout-Case.

Edit: Die Doppelbelastung, von Jens und von mir annähernd dasselbe lesen zu müssen, macht Dir doch hoffentlich nichts aus? Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
03.06.2015, 08:33
Beitrag #4

NISI Offline
LVF-Neueinsteiger


Beiträge: 6
Registriert seit: May 2014

2013
2014
DE



RE: Queued State Machine Zeitverzögerung
Erstmal vielen Dank für eure schnellen Rückmeldungen.

@Jens
Ich habe deinen Vorschlag umgesetzt und es funktioniert einwandfrei. Vielen Dank. Und auch danke für dein Kompliment, es ist immer eine Freude, wenn man eine saubere Arbeit abliefern kann. (Dieses Forum hat auch wesentlich dazu beigetragen.)

@Luki
Der IDLE Status wird eigentlich nur in manchen Prozess VI´s benötigt, deshalb habe ich ihn, falls vielleicht doch gebraucht, noch in allen VI´s gelassen.
Ja die 10ms Waits in der oberen schleife sind wirklich überflüssig, habe sie auch schon entfernt.
Den Timout Case kann ich nicht entfernen, da ich den Timout brauche um das Programm ordentlich zu schließen. Denn nur so wird alle 100 ms (können auch mehr sein) die gesamte Case Strukture verlassen und meine Globale Variable abgefragt. Sonst würde das gesamte Programm nur beendet werden sobald in jedem Fenster ein Knöpfchen gedrückt wird. Diese Erkenntnis hatte auch lange auf sich warten lassen. Gäbe es dazu auch eine andere Möglichkeit?

Auf alle Fälle Vielen Dank euch beiden.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
03.06.2015, 12:39 (Dieser Beitrag wurde zuletzt bearbeitet: 03.06.2015 12:59 von Lucki.)
Beitrag #5

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
RE: Queued State Machine Zeitverzögerung
(03.06.2015 08:33 )NISI schrieb:  .. das gesamte Programm nur beendet werden sobald in jedem Fenster ein Knöpfchen gedrückt wird. Diese Erkenntnis hatte auch lange auf sich warten lassen. Gäbe es dazu auch eine andere Möglichkeit?
Es gibt ein sehr elegante Lösung, die aber etwas umständlich daherkommt - was Dich nicht abhalten sollte das so zu machen.
Schau Dir dazu mal das Beispielprojekt "Handler für Nachrichten Queues" an.
Die Schrittfolge beim Programmabbruch ist dort genau so wie bei Dir, nur der letzte Schritt wird anders ausgeführt:
Die Ereignisschleife (oben) wird nicht über die Abfrage einer lokalen Variablen beendet, sondern es wird von der unteren Schleife ein benutzerdefiniertes Ereignis ausgelöst.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
03.06.2015, 16:39
Beitrag #6

NISI Offline
LVF-Neueinsteiger


Beiträge: 6
Registriert seit: May 2014

2013
2014
DE



RE: Queued State Machine Zeitverzögerung
Ja diese Lösung ist wesentlich eleganter.

Danke für den Tipp.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Machine learning Hubert R. 3 2.611 29.08.2023 10:10
Letzter Beitrag: Hubert R.
  Programm beenden State Machine simcum 3 3.485 17.10.2020 20:57
Letzter Beitrag: BNT
  Queued State Machine: IDLE Optimierung ALuehmann 3 5.000 14.02.2017 14:00
Letzter Beitrag: HVo
  State machine und Typdefinition meta_ir 4 4.503 09.01.2017 12:47
Letzter Beitrag: meta_ir
Question Frage zu "queued state machine" Architektur joptimus 4 6.054 05.08.2016 14:34
Letzter Beitrag: joptimus
  Queued Message Handler Design galilio 3 6.274 14.07.2016 15:34
Letzter Beitrag: Freddy

Gehe zu: