LabVIEWForum.de - Erzeuger-Verbraucher Entwurfsmuster und Errorcluster

LabVIEWForum.de

Normale Version: Erzeuger-Verbraucher Entwurfsmuster und Errorcluster
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo,
ich arbeite mit dem Erzeuger-Verbraucher Entwurfsmuster undLv86_img.

Es geht mir um die Verbraucherschleife.
Nehmen wir an, ich habe ein Gerät, das ich öffnen-beschreiben-schliessen kann.
öffnen-beschreiben-schliessen ist in einem SUB-VI mit errorclustern, also habe ich öffnen.vi-beschreiben.vi-schliessen.vi mit den Errorclustern durchverbunden.

Das will ich nun so in die Verbraucherschleife packen, dass das öffnen.vi vor Ausführen des restlichen Programms initialisiert wird. Daher platziere ich das links ausserhalb der verbraucher-while und verkabele den Errorcluster auf ein Schieberegister der while.

Nach beenden des Programms soll schliessen.vi aufgerufen werden, daher ist es rechts von der verbraucher-while, und erhält den Errorcluster aus dem Schieberegister.

In der Mitte der Verbraucherschleife habe ich nun mehrfach mein beschreiben.vi - je nach Befehl schreibe ich da halt was anderes. Die Idee ist zu Beginn einmal das Gerät öffnen, dann zig mal beschreiben, und am Ende einmal das ganze wieder schliessen.

Was mir nun zu denken gibt, ist ja die Möglichkeit das irgend ein schreibbefehl in beschreiben.vi ja fehlschlagen kann, und der Errorcluster auf Fehler geht. Der Fehler kommt aber nicht korrekt an vor dem nächsten beschreiben.vi-case an, da ja das Schieberegister aussen auf der while sitzt, und die Erzeigerschleife ja innen in den case rotiert.

Auf dem case kann ich kein Schieberegister setzten, das scheint nicht zu gehen.

Wie krieg ich den Errorcluster wieder an den Eingang des beschreiben.vi.

Mit Feedbackknoten hab ich probiert, aber es nicht hinbekommen.

Gibt es da einen Standardweg, es ist doch eigentlich üblich und schön so eine Kette aus n VIs per errorcluster zu verbinden, das muss doch logisch irgendwie in so eine Verbraucherschleife einzubauen sein ???

Wer kann mir da ein schönes Beispiel nennen ?

Werner
Könnte es sein, dass du etwas falsch verstehst? Oder verstehe ich deine Frage nicht, kann auch gut sein...

Also, im Case "Queue-Status" entsteht ein Fehler. Das geht dann zwecks dem Schieberegister in den nächsten Durchlauf der Schleife. Hier wird dann erst einmal auf das nächste Queue-Element gewartet. Und nur wenn bei diesem Dequeue ein Fehler auftritt, dann springst du in den "Error-Case" der Case-Struktur. Ansonsten wird der Case "No Error" abgearbeitet, bloß dass der Error-Cluster, der an deine "Queue-Status" Case-Struktur geht, eine Fehlermeldung enthält.
Wie du diesen Fehler behandelst, dass musst du selber wissen.

Gruß, Jens
Habe jetzt nicht alles verstanden, aber vielleicht passt das:
Ein universelle Methode zur Fehlerbehandlung - insbesondere auch für solche Erzeuger- Verbraucher-Strukturen - ist im Buch von Johnson/Jennings im Kapitel 8 "Building an Application" beschrieben.
Danach gibt es eine extra Queue nur für den Fehlertransport. Im Top-Level-VI hat man eine eigene unabhängige Schleife, in der sich das Dequeue-Element befindet. Hier werden alle Fehler empfangen und behandelt.
Habs mal rauskopiert:
[attachment=24274]
Zur Erläuterung:
Fig 8.18 ist das "Error Queue subVI" (= dieses komische ganz kleine Symbol. welches in den anderen Bildern vorkommt) Es es nimmt die Fehler entgegen und bringt sie in die "Error Queue"
Fig 8.17 ist die Schleife im HauptVI für die Fehlerbehandlung ( die hier bewußt primitiv gehalten ist)
Fig 8.19 zeigt das Ganze in Aktion.
Meine Meinung: Einfach und Genial.
Offtopic2
' schrieb:Meine Meinung: Einfach und Genial.
Queues sind immer eine sehr gute Wahl. Die haben nämlich mehrere Vorteile: Man kann sie verwenden wie das Message-System in Win32 => Eventgesteuert. Und: sie durchbrechen das Datenflußprinzip: Die explizite Sequenzierung, die eigentlich einem modularen System entgegensteht, ist manchmal doch recht unerwüncht.
Aha, danke an alle.

Das heisst also, wenn in meiner Verbraucherschleife in dem Case Queue-Status (nur als beispiel) ein Fehler in einem VI entsteht (hier tell current position) dann muss ich da lokal direkt reagieren.

Ich sehe 2 Möglichkeiten:

1.) Global vorher eigens eine ERROR-Queue anlegen, und da alle Errorcluster reinlaufen lassen und behandeln
2.) bei einem Error ein Event abfeuern und beispielsweise meine Applikation anhalten

zu Jens G:

Zitat:bloß dass der Error-Cluster, der an deine "Queue-Status" Case-Struktur geht, eine Fehlermeldung enthält.
Wie du diesen Fehler behandelst, dass musst du selber wissen.

Genau darum gehts, wenn mein vi tell current position einen Error erzeugt, dann hat der Error-Cluster, der beim nächsten Durchlauf an meine "Queue-Status" Case-Struktur geht, leider eben keinen Fehler... ich hätte gerne, dass der Fehler sich gemerkt wird, weiss aber nicht wie ich das anstellen soll.

Werner
' schrieb:2.) bei einem Error ein Event abfeuern und beispielsweise meine Applikation anhalten
Bei dieser Methode sehe ich allergrößte Probleme.
Zwischen Fehler feststellen und Applikation anhalten kann soviel Zeit vergehen, dass trotz des Fehlers Sachen gemacht werden, die aufgrund des Fehlers eigentlich nicht gemacht werden dürfen.

Diese Methode entspricht in etwas dem Vorgehen mit Exceptions bei Win32. Nur: Dort hält in Folge des Auslösens einer Exception der aktuelle Prozess sofort an. Der kann dann gecancelt werden. In LV würde der Prozess aber weiterlaufen. Außerdem: Was tun mit parallelen Prozessen? Mit Gewalt anhalten oder nicht?
Zitat:Zwischen Fehler feststellen und Applikation anhalten kann soviel Zeit vergehen, dass trotz des Fehlers Sachen gemacht werden, die aufgrund des Fehlers eigentlich nicht gemacht werden dürfen.

Das leuchtet mir ein, und ist ein gutes Argument.

Vermutlich ist es besser (obwohl unelegant) einfach im Fehlerfall SOFORT einen Fehlerdialog aufzumachen.

Werner
' schrieb:Vermutlich ist es besser (obwohl unelegant) einfach im Fehlerfall SOFORT einen Fehlerdialog aufzumachen.
Was angemessen ist, kommt auf den tatsächlichen Fehler an.

Wenn dir die Platte crashed, darfst du machen wie mit Exception: brachial allea schließen. Wenn dein Prüfling zu heiß wird (was auch im Sinne eines Fehlers ein solcher ist), sollte das Programm ganz normal darauf reagieren in der Art, dass das kein Fehler ist, sondern ein ganz normaler Zustand. Weil deine COM-Schnittstelle Fehler bringt, weil du eine falsche Baudrate zugelassen hast - bis du selber Schuld.
Hallo zusammen,

ich habe versucht, Abb. 8.18 zu erstellen, die Lucki in Beitrag #4 angehängt hat.

Der Eingang "Element" des SubVIs "Element einfügen" akzeptiert bei mir nur einen String.
Laut Abbildung müsste der der Error-Cluster hin. Klar, da dieser im Fehlerfall in die Queue eingetragen werden soll.

Was mache ich falsch?

[attachment=27469]

Nachtrag:
Wenn ich den Umweg über das SubVI "Queue anfordern" gehe und dort als Eingang einen Error-Cluster platziere und dann davon die Referenz erstelle, geht es.Wink
Ich habe die Referenz zuerst direkt vom SubVI "Element einfügen" erstellt.

Ich habe jedoch eine Verständnisfrage dazu:
Zunächst erscheint mir eine Schleife mit Schieberegister, die nur einmal durchlaufen wird, weniger sinnvoll.
Dieses SubVI aus Abb. 8.18 platziere ich doch mehrmals in meinem Programm, jeweils am Ausgang einer "Fehlerkette" oder nur einmal?
Ich verstehe nicht ganz, wieso das Schieberegister hier Wirkung zeigt.
Seiten: 1 2
Referenz-URLs