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 

Statemaschine zwingender Sprung? Diskussion bitte!



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!

04.02.2010, 10:39 (Dieser Beitrag wurde zuletzt bearbeitet: 04.02.2010 10:42 von Lableo.)
Beitrag #1

Lableo Offline
LVF-Grünschnabel
*


Beiträge: 37
Registriert seit: Jan 2010

LabVIEW 2010
2008
kA

20357
Deutschland
Statemaschine zwingender Sprung? Diskussion bitte!
Hi

So ich wusste jetzt nicht wirklich wohin mit dem Thema - deswegen einfach mal hier.

Anbei sind 2 Beispielprogramme für eine kleine Statemaschine. Das ganze kann noch durch mehrere States ausgebaut werden und somit ziemlich effektiv eingesetzt werden.

Die Programme unterscheiden sich nur durch die "Queue-Funktion" (Element Einfügen) und (Element am Anfang Einfügen) im State (Dateibearbeitung).

Wenn ich nun im Frontpanel die Taste (nächste Messung) z.B. 10 mal schnell hintereinander drücke möchte ich das der "State" (Messwertvorgabe) immer zwingend nach dem "State" (Dateibearbeitung) abläuft. Deswegen auch die "Queue-Funktion (Element am Anfang Einfügen).
Beim Statemachine.vi funktioniert das auch so was man am blinken der LED's sieht. Zum Vergleich bei Statemachine2.vi läuft das völlig unkoordiniert ab.

Meine Frage nun zur Diskussion:

Wie kann ich mit solch einer Struktur sicherstellen das ein bestimmter State "immer" und "zwingend" nach einem anderen State abläuft. Es könnten ja theoretischer Weise bei größeren Programmen noch weitere Elemente in die Queue verschoben werden die dann auch wieder die Reihenfolge durcheinander bringen.
Ist das überhaupt möglich oder muss man solchen Code besser in einen State programmieren - z.B. als Sequenzstruktur?

Bei einem weit komplexeren Code - denn ich hier leider nicht einstellen kann - hab ich nämlich genau das Problem das die State unkoordiniert angefahren werden was nicht der Fall sein darf.

Ok - hoffe ich habe mich deutlich ausgedrückt und freu mich auf eure Antworten.

Viel Spass mit denn Codes. Ist vielleicht auch so für den ein oder anderen nützlich.

Lv09_img2


Sonstige .vi  Statemachine.vi (Größe: 18,89 KB / Downloads: 260)


Sonstige .vi  Statemachine2.vi (Größe: 18,86 KB / Downloads: 207)


Das braucht Ihr eventuell noch -
Sonstige .ctl  StateEnum_short_.ctl (Größe: 4,25 KB / Downloads: 206)


Gruß Martin
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
04.02.2010, 11:07
Beitrag #2

SeBa Offline
LVF-Guru
*****


Beiträge: 2.025
Registriert seit: Oct 2008

09SP1 & 10 FDS
2008
DE

65xxx
Deutschland
Statemaschine zwingender Sprung? Diskussion bitte!
Also ohne jetzt den Code angesehen zu haben...

ich mache das immer so, dass ich einen IDLE State habe in den sie Statemachine springt, wenn der aktuelle State abgearbeitet wurde.

Möchte ich jetzt z.B. zwingend einen State nach einem Anderen ausführen, dann springt die Statemachine halt nicht in den IDLE State sondern in den, den ich brauche. Ist dieser State fertig, gehts wieder in den IDLE State oder zum nächsten zwingenden State.

Hab das in einem basic mp3 Player so gemacht. Such mal im Forum nach "play mp3 mit winapi winmm.dll" da solltest du das finden, wenn dich das als Beispiel interessiert.

Dort ist es erforderlich, dass vor dem Play-State der Open-State ausgeführt wird. Und nach dem Stop-State der Close-State.


Gruß SeBa

Dieser Beitrag soll weder nützlich, informativ noch lesbar sein.

Er erhebt lediglich den Anspruch dort wo er ungenau ist, wenigstens eindeutig ungenau zu sein.
In Fällen größerer Abweichungen ist es immer der Leser, der sich geirrt hat.

Rette einen Baum!
Diesen Beitrag nur ausdrucken, wenn unbedingt nötig!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
04.02.2010, 13:06
Beitrag #3

Lableo Offline
LVF-Grünschnabel
*


Beiträge: 37
Registriert seit: Jan 2010

LabVIEW 2010
2008
kA

20357
Deutschland
Statemaschine zwingender Sprung? Diskussion bitte!
Hi

Das Prinzip der Statemachine mit Idle State gibt es hier ja auch.
Das Problem liegt vielmehr darin wie die Queue Funktion die Elemente anordnet denke ich.

Die Statemachine hier ist in Verbindung mit der Ereignisstruktur nicht so sehr prozessorlastig. Deswegen hab ich mich ja auch für diese Variante entschieden.
Werde mir dein Beispiel jetzt gleich einmal ansehen.

Gruß

Martin
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
04.02.2010, 13:20
Beitrag #4

RoLe Offline
LVF-Guru
*****


Beiträge: 1.236
Registriert seit: Jul 2007

-
1997
en

0
Schweiz
Statemaschine zwingender Sprung? Diskussion bitte!
Du könntest deine Queue als Array von Enums erstellen und die entsprechenden States nacheinander setzen.


Angehängte Datei(en) Thumbnail(s)
   

.·´¯)--> Leben ist das, was dir passiert, wenn du eifrig dabei bist andere Pläne zu machen <--(¯`·.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
04.02.2010, 14:14 (Dieser Beitrag wurde zuletzt bearbeitet: 04.02.2010 14:22 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
Statemaschine zwingender Sprung? Diskussion bitte!
Die richtige alternativen Status-Reihenfolge hast Du doch, wenn Du den Status "Messwertvorgabe" gleich oben im Ereigniscase erzeugst und nicht erst unten.
(Bei dem ähnlichen Vorschlag von Role gibt es Komplikationen wegen der erforderlichen Änderung des Queue- Datenfomates von "Enum" zu "Array of Enum")
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
04.02.2010, 16:22
Beitrag #6

Lableo Offline
LVF-Grünschnabel
*


Beiträge: 37
Registriert seit: Jan 2010

LabVIEW 2010
2008
kA

20357
Deutschland
Statemaschine zwingender Sprung? Diskussion bitte!
Hi

Danke für die Inspirationen. Also das mit denn Arrays macht bei großen Programmen alles wieder unübersichtlich.
Bei dem Beispiel von Lucki hab ich aber auch noch das Problem das nicht garantiert ist das der Status am Ende der queue gesetzt wird. Da ist die Variante mit "Element am Anfang einfügen" doch die bessere!?!

Hab das ganze bei meinem großen Programm übrigens jetzt hinbekommen. Hab in denn Stadien welche zwingend hintereinander laufen sollen immer mit "Element am Anfang einfügen" gearbeitet. Allerdings trau ich dem ganzen noch nicht so.

Was auch noch Interessant wär (z.B. für einen Not-Aus) eine höhere Priorität hinzuzufügen. Aber das würd ich jetzt einfach mit "Queue löschen" und dann neuen State "Ende" oder so erledigen. Oder geht das auch besser?

Kann man die Queue eigentlich irgendwie darstellen. Ich glaub da fehlt mir noch ein bisschen das Verständnis wie die organisiert sind.

Gruß

Martin
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
04.02.2010, 17:52 (Dieser Beitrag wurde zuletzt bearbeitet: 04.02.2010 23:27 von Lucki.)
Beitrag #7

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

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
Statemaschine zwingender Sprung? Diskussion bitte!
' schrieb:Danke für die Inspirationen. Also das mit denn Arrays macht bei großen Programmen alles wieder unübersichtlich.
Bei dem Beispiel von Lucki hab ich aber auch noch das Problem das nicht garantiert ist das der Status am Ende der queue gesetzt wird. Da ist die Variante mit "Element am Anfang einfügen" doch die bessere!?!
Das vertehe ich nicht. Es wird überhaupt kein Queue-Status abgefragt, und ich behaupte dass es wasserdcht funktioniert. Übertroffen würde diese Sicherheit nur noch, wenn Du, wie du schon sagtest, beide Tasks in eine einzige Sequenz reinpacken würdest.
Vergiss "Element am Anfang einfügen", das ist als wenn sich jemand in der Schlange ganz nach vorn drängelt und hat hier bei Dir nichts zu suchen.

Zitat:Kann man die Queue eigentlich irgendwie darstellen. Ich glaub da fehlt mir noch ein bisschen das Verständnis wie die organisiert sind.
Das unnötige 100ms Wait ist mir z.B. ein Indiz, daß Du die Funktionsweise der Queues noch nicht richtig verinnerlicht hast. "Element aus der Queue holen" wartet nämlich von selbst, solange die Queue noch leer ist. Das Wait ist überflüssig oder sogar schädlich.
Die Queues sind doch so einfach zu verstehen: Was neu hinzukommt, stellt sich hinten an, abgeholt wird vorn. Hast Du selbst noch nie Schlange gestanden? Mellow
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
04.02.2010, 19:30
Beitrag #8

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
Statemaschine zwingender Sprung? Diskussion bitte!
Offtopic2
' schrieb:So ich wusste jetzt nicht wirklich wohin mit dem Thema - deswegen einfach mal hier.
So, mit RT hat das aber nichts zu tun.:verschoben12:

Gruß, Jens

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
05.02.2010, 09:56 (Dieser Beitrag wurde zuletzt bearbeitet: 05.02.2010 10:07 von Lableo.)
Beitrag #9

Lableo Offline
LVF-Grünschnabel
*


Beiträge: 37
Registriert seit: Jan 2010

LabVIEW 2010
2008
kA

20357
Deutschland
Statemaschine zwingender Sprung? Diskussion bitte!
Hi

Zitat:Bei dem Beispiel von Lucki hab ich aber auch noch das Problem das nicht garantiert ist das der Status am Ende der queue gesetzt wird. Da ist die Variante mit "Element am Anfang einfügen" doch die bessere!?!
Da habe ich mich wohl falsch ausgedrückt. Sollte heißen "Status am Anfang der ..." usw.

Zitat:Vergiss "Element am Anfang einfügen", das ist als wenn sich jemand in der Schlange ganz nach vorn drängelt und hat hier bei Dir nichts zu suchen.
Also ich denke das sich eher beim normalen Einfügen jemand vordrängelt. Funktioniert tut das Ganze ja nicht mit dem "hinten Anstellen". Zur Erklärung:
Bei dem großen Programm hab ich z.B. fogenden Ablauf.

1. "State" "Messwerte abholen" - hier werden Daten von einem LCR Meter erfasst
2. "State" "Dateibearbeitung" - hier werden die Messdaten zusammengefasst und in eine Datei geschrieben.
3. "State" "Tabelle erstellen" - hier wird eine Tabelle im Frontpanel aktualisiert.

Das Problem. "State" "Messwerte abholen" wird durch ein Signal von einer Antriebseinheit ausgelöst. Kommt nun dieses Signal und der "State" wird in die Queue geschoben wenn 2. und 3. noch nicht abgearbeitet ist verliere ich die Messdaten da diese nur temporär (Schieberegister) gespeichert werden. In der Queue drängelt sich dann ja 1. vor.
Deswegen das mit der zwingenden Folge. Wie im letzten Post geschrieben kann man das auch mit einer langen Ereignisstruktur abarbeiten.
Ich wollte eigentlich nur eure Meinung hören was denn nun geschickter ist?!? Ist es grundsätzlich falsch so zu programmieren?

Zitat:Das unnötige 100ms Wait ist mir z.B. ein Indiz, daß Du die Funktionsweise der Queues noch nicht richtig verinnerlicht hast
Deswegen frag ich hier ja nach - MellowWär eine meiner nächsten Fragen gewesen.

Zitat:So, mit RT hat das aber nichts zu tun. verschoben1.gif
Sorry aber ich hab leider keinen besseren Bereich gefunden...

Nun gut - Da es jetzt erstmal läuft geb ich mich halt zufrieden - allerdings würd ich mich freuen noch ein paar Tips zu bekommen eine ordentliche Struktur hinzubekommen. Schließlich soll der Code ja noch erweitert werden und da will ich besser keine bösen Überraschungen erleben.

Gruß

Martin

P.S. Das mit dem Notaus und der Funktion "Queue löschen" funktioniert einwandfrei.
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
05.02.2010, 10:14
Beitrag #10

Achim Offline
*****
*****


Beiträge: 4.222
Registriert seit: Nov 2005

20xx
2000
EN

978xx
Deutschland
Statemaschine zwingender Sprung? Diskussion bitte!
' schrieb:Das Problem. "State" "Messwerte abholen" wird durch ein Signal von einer Antriebseinheit ausgelöst. Kommt nun dieses Signal und der "State" wird in die Queue geschoben wenn 2. und 3. noch nicht abgearbeitet ist verliere ich die Messdaten da diese nur temporär (Schieberegister) gespeichert werden. In der Queue drängelt sich dann ja 1. vor.

NEIN!

"Messwerte abholen" drängelt sich nur dann vor, wenn die Antriebseinheit mit "Element am Anfang einfügen" arbeitet

Du musst es eben so organisieren, dass im Schritt "Messwerte abholen" gleich die nächsten zu bearbeitenden Schritte nacheinander in die Queue geschrieben werden!

"Is there some mightier sage, of whom we have yet to learn?"

"Opportunity is missed by most people because it is dressed in overalls and looks like work." (Thomas Edison)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  UML Diagramm für Ereignisgesteuerte Statemaschine Hydrogencarbonat 1 2.881 11.05.2016 12:53
Letzter Beitrag: Freddy
  Bitte um Konvertierung LV2011 auf 8.6 HH99 4 4.135 01.04.2014 12:11
Letzter Beitrag: HH99
  eine kleine Bitte Julia500 3 3.520 14.02.2013 17:52
Letzter Beitrag: jg
  Bitte um Hilfe Sami82 6 4.399 24.05.2011 04:41
Letzter Beitrag: Sami82
  Wert von numer. Bedienelement kontinuierlich erhöhen (Sprung vermeiden) lemmo 3 5.342 28.04.2011 18:14
Letzter Beitrag: Lucki
  was ist bitte ein Nullfenster gottfried 8 10.526 10.09.2010 06:40
Letzter Beitrag: robtech1978

Gehe zu: