Hallo,
bei einem Teststand habe ich verschiedene Geräte mit unterschiedlichen Auslesezeiten anzusteuern. Das ganze ist noch nicht programmiert, daher kann ich an dieser Stelle keine Beispiele liefern, aber mir geht es zunächst auch nur ein Gedankenexperiment um Probleme vorzubeugen.
Prinzipiell arbeite ich mit eine Producer Consumer Struktur mit 5 parallelen Schleifen (Eventstruktur, Abarbeitung der Events, Datenerfassung, Datenanzeige, Datensicherung).
Im Teststand sind unter anderem ein Keithley 2701 und ein ifm periodisch auszulesen. Das soll innerhalb der Datenerfassungsschleife parallel mit allen Messgeräten geschehen. Aufgrund der internen Schaltvorgänge benötigt der Keithley bekanntlicher weise jedoch seine Zeit zum Messen.
Der ifm controller soll deutlich schneller ausgelesen werden, als der Keithley. Jedoch erwarte ich, dass die minimale Iterationszeit der Datenerfassungschleife der Messzeit des "schwächsten Gliedes" entsprechen wird und damit den ifm Controller ausbremst.
Eine Möglichkeit die ich sehe, ist den Keithley in eine eigene, weitere parallele Schleife auszulagern, jedoch möchte ich das nur ungern tun. Ist es möglich die Datenerfassung des Keithleys innerhalb der Datenerfassungsschleife anzustoßen, ohne sie durch den langen Ausleseprozess auszubremsen?
Beste Grüße und vielen Dank
Ronny
Hallo Ronny,
Zitat:Eine Möglichkeit die ich sehe, ist den Keithley in eine eigene, weitere parallele Schleife auszulagern, jedoch möchte ich das nur ungern tun.
Warum? Das wäre die einfachste und eleganteste Lösung!
Zitat:Ist es möglich die Datenerfassung des Keithleys innerhalb der Datenerfassungsschleife anzustoßen, ohne sie durch den langen Ausleseprozess auszubremsen?
Wenn du die Datenerfassungsschleife nicht ausbremsen willst, musst du das Keithley parallel dazu abfragen.
Ansonsten gilt THINK DATAFLOW: eine Struktur (=deine Schleife) wird dann abgearbeitet, wenn alle internen Nodes (=VISARead des Keithley) abgearbeitet wurden…
(26.09.2016 10:11 )spacz schrieb: [ -> ]Ist es möglich die Datenerfassung des Keithleys innerhalb der Datenerfassungsschleife anzustoßen, ohne sie durch den langen Ausleseprozess auszubremsen?
Möglich sicherlich, aber das wird IMHO unnnötig kompliziert. Entweder ist die Keitley-Abfrage ein unabhängiges VI, dann kannst du es jederzeit anstoßen. Das läuft aber auf dasselbe hinaus wie eine eigene Schleife dafür. Oder du muss VISA-Write und VISA-Read voneinander trennen, VISA-Read mit einem sehr geringen Timeout ausstatten und am Ende nur dann auswerten, wenn du eine komplette Antwort erhalten hast. Wahrscheinlich darfst du für sowas schon vorhandene Keithley Treiber VIs komplett umprogrammieren. Hast du dazu Lust?
Gruß, Jens
Du kannst ein VI über einen Methodenknoten der Klasse VI aufrufen und ausführen. An der Stelle kann man angeben, ob man die Ausführung des aufgerufenen VIs abwarten soll oder nicht!
Aber was genau Spricht gegen eine weitere Schleife? Ich verwende oft eine Ähnliche Struktur wie du sie beschreibst, allerdings ohne die Datenerfassungsschleife. Dafür gibts für jedes Gerät ein VI mit innerer Statemachine. Die States werden über ne FGV verteilt und gelten für alle Geräte gleichermaßen. Da gibts dann einen State "Datenerfassung". Ist der aktiv, kann jedes Gerät selbst bestimmen, wie schnell es arbeiten möchte.
States:
Warten -> prüfen ob ein neuer Sate da ist, ansonsten erneut warten
Datenerfassung -> einen Wert lesen, anschließend aktuellen State auslesen
Exit -> selbsterklärend
So ganz grob! Bei mir gibts meißt noch ein INIT (Vor der Datenerfassung) oder FINALIZE (nach der Datenerfassung).
Hallo Gerd,
dank dir für deine schnelle Antwort.
Ich glaube mir missfällt der Gedanke von meiner geplanten Struktur abweichen zu müssen und dem Keithley diese "Extrawurst" geben zu müssen. Wenn ich es auf die Spitze treiben
würde, hätte ich am Ende dann bei all den Geräten eine menge parallel laufender Erfassungsschleifen + die vier weiteren Schleifen...
Bei weiteren Testspielereien mit dem Geräte habe ich gerade festgestellt, dass die schleife nicht ausgebremst wird, sobald ich von der direkten Messung zur gebufferten Messung wechsle. Ich hoffe nun damit das Problem umgehen zu können.
Wenn man nun beispielsweise 10 verschiedene Geräte auszulesen hat, kommt man für eine schnelle Datenaquise also um 10 parallele Schleifen nicht herum?
Beste Grüße
Ronny
Hallo Ronny,
Zitat:Wenn man nun beispielsweise 10 verschiedene Geräte auszulesen hat, kommt man für eine schnelle Datenaquise also um 10 parallele Schleifen nicht herum?
Wenn ich bei mir am Prüfstand was messen will, habe ich folgende Geräte:
- DAQmx, bis 1kHz
- Waage an serieller Schnittstelle, ca. 2Hz
- CAN-Bus, meist 10Hz
- CANopen, on demand mit 1Hz…10Hz
- UDP-Botschaften, ~1Hz
- TCP/IP, ~2Hz
Glaubst du wirklich, ich mache das alles in nur einer Schleife?
Jede Schnittstelle/jedes Gerät in seiner eigenen Schleife!
(26.09.2016 10:43 )spacz schrieb: [ -> ]Ich glaube mir missfällt der Gedanke von meiner geplanten Struktur abweichen zu müssen und dem Keithley diese "Extrawurst" geben zu müssen. Wenn ich es auf die Spitze treiben würde, hätte ich am Ende dann bei all den Geräten eine menge parallel laufender Erfassungsschleifen + die vier weiteren Schleifen...
Wo liegt das Problem?
Das Argument heißt nicht "eine menge parallel laufender Erfassungsschleifen", sondern:
- Lesbarkeit des Sourcecodes
- Modularer Aufbau
- Datenkapselung
- Wiederverwendungsfähigkeit
- Debugfähigkeit
- usw.
Alles klar! Werde eure Ratschläge beherzigen und eigene Schleifen für die Geräte implementieren!
Dank euch
Ronny
Hallo zusammen,
die Argumente für mehrere Schleifen sind schlüssig.
Obwohl ich das Thema nicht gestartet habe, habe ich eine Frage zur konkreten Ausführung des Aufbaus mit mehreren Schleifen:
Angenommen ich nutze das Framework "continuous measurement and logging" .
Nun füge ich eine oder mehrere Data Acquisition Schleifen hinzu.
Die erfassten Daten aus allen Data Acquisition Schleifen sollen nun der Logging-Schleife und der Anzeigeschleife zur Verfügung gestellt werden.
Wie macht man das am Besten?
Sicherlich über Queues. Aber wie schaffe ich es die "schnellen" Daten (Analog in, ect) mit den "langsamen Daten" (Modbus) sinnvoll in der Logging Schleife zu verbinden?
Und wie verhindere ich, dass die Anzeigenfreuenz gleich der langsamsten Datenerfassungsfrequenz ist?
Gruß
LichterLichtus
Code:
Die erfassten Daten aus allen Data Acquisition Schleifen sollen nun der Logging-Schleife und der Anzeigeschleife zur Verfügung gestellt werden.
Sende aus jeder Erfassungsschleife eine Nachricht auf die Logging und Anzeige Schleife mit den jeweiligen Ergebnissen.
Gruß
Freddy