Hallo Jens,
das mit der State Machine ist eine sehr gute Idee! Ich habe mein Programm auch gleich versucht in eine solche Form anzupassen (siehe VI), allerdings bekomme ich noch Fehler (no case fore some vector values). Ich glaube das liegt daran, dass meine Schleife bei 3 anfängt. Wenn ich allerdings "Add Case Before" klicke, bekomme ich nur Cases mit noch höherer Wertigkeit.
Vielleicht könnt ihr mal darüberschauen.
Ist die Auswertung der Messwerte so richtig positioniert?
Viele Grüße,
Labview-Anfänger Martin ;-)
Hallo Martin,
Zitat:Ich glaube das liegt daran, dass meine Schleife bei 3 anfängt.
Jein. Die Schleife selbst fängt mit Null an, deine Case-Struktur bietet aber nur die Fälle 3 und 4 an...
Zitat:Wenn ich allerdings "Add Case Before" klicke, bekomme ich nur Cases mit noch höherer Wertigkeit.
Und was passiert, wenn du im neu erstellten Case auf die Case-Angabe klickst und dann selbst einen Wert eintippst?
Zitat:Ich habe mein Programm auch gleich versucht in eine solche Form anzupassen
"Versucht" ist das richtige Wort...
Definiere echte "States". Erstelle ein (typdefiniertes) Enum mit diesen States. Entscheide anhand des Ergebnisses eines States, welchen du als nächstes aufrufst. Nutze ein Schieberegister, um den nächsten State bereitzustellen...
Zitat:Ist die Auswertung der Messwerte so richtig positioniert?
Wenn die Auswertung nach jedem Abarbeiten eines States passieren soll, dann ja...
Warum du aber bei State "4" den Offset nach Zahl und nicht die Zahl selbst auswertest, bleibt wohl dein Geheimnis...
- Warum wird eine TCP-Abfrage gemacht, wenn ein TCP-Fehler 56 angezeigt wird? (Parallele Case-Struktur zur While-Loop mit dem TCP-Read)
- Warum wird die TCPRead-Loop abgebrochen, wenn keine Antwort gelesen wurde? (Abbruch bei Stringlänge=0)
- Warum wird ein String nach String typegecastet?
- Warum werden U8-Konstanten in Arrays gebaut & diese U8-Arrays dann zu Strings konvertiert? Warum nicht gleich eine Stringkonstante in Hex- oder \-Code-Anzeige?
So, die kleineren Dinge habe ich nun bereinigt, doch der Fehler bleibt...
(02.04.2013 13:55 )GerdW schrieb: [ -> ]Definiere echte "States". Erstelle ein (typdefiniertes) Enum mit diesen States. Entscheide anhand des Ergebnisses eines States, welchen du als nächstes aufrufst. Nutze ein Schieberegister, um den nächsten State bereitzustellen...
Entschuldigt bitte mein Unwissen, aber den Zustandsübergang kann ich doch weglassen da ich unabhängig vom Ergebnis immer alle States durchlaufen möchte?
Was unterscheidet "echte" States von meinen. Ich dachte, dass jede Case-Struktur im Prinzip für einen State steht?!
Die TCP-Abfrage habe ich aus dem Beitrag der ersten Seite übernommen und noch nicht richtig angepasst. Daher ist das noch etwas im "unreinen"...
Viele Grüße,
Martin
Hallo Martin,
Zitat:aber den Zustandsübergang kann ich doch weglassen da ich unabhängig vom Ergebnis immer alle States durchlaufen möchte?
Auch im Fehlerfall, wenn keine Antwort vom Gerät kommt?
Zitat:dass jede Case-Struktur im Prinzip für einen State steht?
Die einzelnen Cases sind deine States...
Zum Fehler mit den fehlenden Cases:
Die Case-Struktur muss alle möglichen Eingangswerte am Selektor abdecken. Wenn du ein Boolean anschließt, brauchst du die 2 Fälle FALSE und TRUE. Wenn du ein I32 (wie "i") anschließt, musst du alle Zahlen von -2^31 bis +2^31 abdecken! Wenn du dir die
Hilfe zur Case-Struktur (mitsamt weiterführender Links!) durchliest, siehst du aber, dass das ganz einfach ist: als Case musst du "..0" und "1.." angeben... Mit einem Enum könntest du dagegen sehr sauber die States auswählen und anlegen!
Stimmt, im Fehlerfall bekomme ich da jedoch Probleme.
Okay, ich werde das jetzt mal nacharbeiten und melde mich dann wieder.
Schon einmal besten Dank!
Viele Grüße, Martin
Ich habe das Programm nun mit Enum und Schieberegister angepasst.
Allerdings weiß ich nicht, was ich am Ausgang des Schieberegisters anschließen soll?!
Besser gesagt habe ich das Problem, dass sich der Inhalt meiner Case-Struktur ändert wenn ich was falsches anschließe...
Anscheinend hab ich da noch was grundsätzlich nicht verstanden...
Hallo johnywalker,
ich habe mir vor kurzem auch das NET IO bei Pollin gekauft, spreche es aber vorwiegend mittels Python an. Aber egal. Grundsätzlich würde ich dir allerdings folgendes empfehlen. Das Öffnen/ Schließen der Netzwerkverbindung zum Modul mache außerhalb der Schleife, sprich zuerst die Verbindung öffnen und die erhaltene "connection id" an die Schleife verdrahten. Innerhalb der Schleife kannst du mittels dieser dann Daten an das Gerät senden bzw. vom Gerät empfangen. Nach Beendigung, sprich nach dem verlassen der Schleife schließt du dann die Verbindung wieder.
Anbei mal ein schnelles und nur rein schematisches Beispiel.
Schöne Grüße
Falk
Hallo johny,
Zitat:Allerdings weiß ich nicht, was ich am Ausgang des Schieberegisters anschließen soll?!
Eine Statemachine soll verschiedene States nacheinander abarbeiten. Du musst also den nächsten State dort vorgeben. Meist macht man das in Abhängigkeit von irgendwelchen Randbedingungen, die den Statewechsel auslösen...
Zitat:Besser gesagt habe ich das Problem, dass sich der Inhalt meiner Case-Struktur ändert wenn ich was falsches anschließe...
??? Das in der Case-Struktur programmierte soll sich ändern, wenn du was anderes an den Case-Selektor anschließt?
Tipp: Deinem VI würde ein Klick auf den Aufräumknopf (definitiv!) nicht schaden!
Hallo Freunde,
erst einmal vielen Dank für die Antworten!
@Falk:
Okay, ich glaube ich verstehe dein Konzept, ich habe es mal ein wenig angepasst. Leider sind die ausgegebenen Werte noch viel zu klein (Faktor ca. 100-200).
Ich kann mir keinen Reim daraus machen, woran das liegt. Hat diessbezüglich jemand eine Idee?
@Gerd:
Ich habe das mit dem Ausgang des Schieberegisters bzw. das mit dem Statewechsel jetzt kapiert. Falk hat das ja in seinem Beispielprogramm anschaulich gemacht. Ich wusste halt nicht, wie ich das Enum am Ausgang erzeugen sollte, bzw. gab es dabei Probleme, wenn ich einfach ein neues erstellt und angeschlossen habe. Vermutlich haben die Zustände nicht übereingestimmt. Dadurch hat dann meine Case-Struktur die Werte/Zustände des Enums am Ausgang angenommen, vermute ich mal.
Zwei Frage noch:
Die Wartefunktion in der Hauptschleife (milliseconds to wait), wofür wurde diese eingebaut? Um der TCP-Kommunikation genügend Zeit zu geben?
Wie groß wählt man die Timeout-Zeiten? Woran muss ich mich da richten?
Viele Grüße,
Martin
Hat jemand eine Idee, warum ich so kleine Werte rausbekomme? Ich komme mit meinen eigenen Ansätzen nicht mehr weiter...