(11.03.2011 10:31 )onsight8c schrieb: - Producer-Loop liest mir die Daten aus der VISA aus
- Packt diese auf ne Queue
- Consumer Loop arbeitet mit verschiedenen States:
Prozesse, also Module, durch Queues zu entkoppeln, ist immer ein richtiger Weg.
In deinem Falle würde ich in den (ersten) Producer-Prozess bereits folgendes einbinden: Hier kann man möglicherweise eine Vorfilterung der Daten machen, insofern, dass ein Queue-Element ein sinnvoll zu bearbeitendes Datenpaket darstellt. Ein Zwischenschritt (also ein Zwischenmodul), das den VISA-Stream in sinnvoll zu bearbeitende Datenpakete umwandelt, würde ich im ersten Ansatz nicht vorsehen.
Zwischen den Zeilen kannst du lesen, dass es ohne weiteres sinnvoll sein kann, wenn sich ein Verarbeitungsweg über mehrere Queues erstreckt.
Zitat:Kann ich dann dort trotzdem noch Event-Cases einbauen, bpsw. wenn ein Schalter betätigt wird, um ein Ventil zu fahren? Und dass nach Abschluss der Interaktion wieder nur die Daten ausgelesen werden?
Gehen tut alles (nur die Frösch' hüpfen).
Man kann einen Ablauf (siehe deine Beschreibung) als Case-Struktur (also Schrittkette) in einer While-Schleife programmieren. Jeder einzelne Schritt sollte dann nur ganz kurz dauern. Nach der Case-Struktur (in der While-Schleife) kann man die Event-Struktur sequenziert einbauen und mit einem Timeout von (z.B. 5ms) laufen lassen. Wenn ein Event eintritt, kann man den synchron in die Case-Sequenz einführen.
Nichtsdestoweniger kann man natürlich auch eine eigenständige Event-Struktur nehmen und per Lokaler Variablen oder auch per Queue Daten an die Case-Struktur senden.
Zitat:Oder muss ich den Weg gehen, dass ich über ne Case-Struktur in der Producer-Loop anwähle ob Daten gelesen oder Befehle gesendet werden?
Das hängt von der Applikation und dem Aufbau des Programmes ab.
Ich mach's immer so (und das ist unabhängig von der Schnittstelle, also ob VISA oder DaqMX etc):
Es gibt ein Modul, das die komplette Schnittstelle bedient. Dieses Modul läuft kontinuierlich, ist also nicht in einen expliziten Datenfluss eingebunden. Gesteuert wird dieses Modul über eine Queue. Daten nach außen geben kann dieses Modul über Queues, Melder oder auch FGVs.
Über die Steuer-Queue kann man dem Modul mitteilen, was es jetzt machen soll: VISA initialisieren, Daten lesen, Daten schreiben, et. etc. Beachte, dass das Modul selbstsicher ist, und genau weis, was es gerade tut und was es daher gerade nicht tun kann: Liegt gerade ein laufender Lese-Zyklus an, muss ein Daten-Schreiben natürlich noch warten - das heißt aber nicht, dass der Befehl hierfür nicht angenommen wird.