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 

Analogmessung auf einem Kanal im Hintergrund



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!

24.02.2010, 19:48 (Dieser Beitrag wurde zuletzt bearbeitet: 24.02.2010 19:51 von dimitri84.)
Beitrag #21

dimitri84 Offline
Astronaut
*****


Beiträge: 1.496
Registriert seit: Aug 2009

2020 Developer Suite
2009
DE_EN

53562
Deutschland
Analogmessung auf einem Kanal im Hintergrund
Der "wahre" Grund für die eventgesteuerte Datenerfassung scheint mir also dieser zu sein Wink
' schrieb:Erstens habe ich in C als DLL bereits daq-mx mit DAQmxRegisterEveryNSamplesEvent erfolgreich benutzt, ...
Was man halt schon kennt ... nimmt man dann auch.


@IchSelbst: Warum ist es ein Vorteil den Puffer sampleratenunabhängigen zu leeren/lesen? Ich benutz 'ne ganz normale Schleife und die Iterationszeit ergibt sich automatisch aus Sampling Rate * Anzahl der Samples.

„Sag nicht alles, was du weißt, aber wisse immer, was du sagst.“ (Matthias Claudius)
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
24.02.2010, 20:55
Beitrag #22

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.696
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Analogmessung auf einem Kanal im Hintergrund
' schrieb:Warum ist es ein Vorteil den Puffer sampleratenunabhängigen zu leeren/lesen
Bei 1MHz Samplerate und 100 Samples wäre die Schleifendauer 100µs. Das ist aber schon sehr, sehr, sehr knapp. Willst du eine akzeptable Schleifendauer haben, muss du immer die Sampleanzahl an die Samplerate anpassen. Vorteil dieser Methode: Die Datenpakete sind immer gleich lang.

Benutzt du aber den Algorithmus "alle 50ms alles, was da ist, lesen", ist die Schleifendauer unabhängig. Außerdem musst du hier nicht warten, bis der Puffer die erforderliche Anzahl von Daten enthält. Für meine Weiterverarbeitung ist es unerheblich, ob die Datenpakete 10, 100 oder 1000 Datensätze enthalten.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.02.2010, 11:46
Beitrag #23

wernerIBN Offline
Datenflussumgeher
**


Beiträge: 124
Registriert seit: Sep 2009

8.6 und 2011
2000
DE

52425
Deutschland
Analogmessung auf einem Kanal im Hintergrund
Erst mal vielen Dank an alle, momentan lerne ich viel.

dimitri84 wie machst du das, dass bei deinen Zitaten so schön steht von wems ist ?

Zitat:Bei 1MHz Samplerate und 100 Samples wäre die Schleifendauer 100µs. Das ist aber schon sehr, sehr, sehr knapp. Willst du eine akzeptable Schleifendauer haben, muss du immer die Sampleanzahl an die Samplerate anpassen. Vorteil dieser Methode: Die Datenpakete sind immer gleich lang.

Benutzt du aber den Algorithmus "alle 50ms alles, was da ist, lesen", ist die Schleifendauer unabhängig. Außerdem musst du hier nicht warten, bis der Puffer die erforderliche Anzahl von Daten enthält. Für meine Weiterverarbeitung ist es unerheblich, ob die Datenpakete 10, 100 oder 1000 Datensätze enthalten.

Ich habe immer längere Zeiten als 100uS im Kopf wenn ich was mit Windows mache, ich halte daher deine 50ms, besser noch 100ms für gut. Natürlich lese ich die Samples nicht einzeln, sondern Blockweise. Ich wollte aber je nach verwendeter Hardware (PCI, USB oder RS232...) im Benutzerinterface die Blockgröße einstellbar machen, also Samplerate und Blockgröße (=Eventfrequenz) sinnvoll einstellen (100ms für mich absolut ausreichend, selbst sekündlich ist ok). Gerade so ein Graph braucht lang, 50ms können da je nach Inhalt schon zu kurz sein, es muss daher vorher sinnvoll reduziert (z.B.: Datenmittelung etc) werden.

Zitat:Das weis man (also ich) nicht. Der Event könnte eine richtige Message sein - einschließlich Daten. D.h. zum Zeitpunkt des Auftretens wird eine Message gemacht mit den Daten eines Samples. Wäre dem so (und ich befürchte so) gehen keine Daten verloren.

Glaub ich nicht, dass mit dem generieren des Event schon Daten aus dem DAQ-MX Device ausgelesen werden. Event ist etwas, das vom Betriebssystem unterstützt wird, und von daher performant und CPU-schonend. Es ist aber meines wissens nach nur so eine Art Flag, ohne Daten. Daher müssen die Daten ja mit einer Art DAQ-MX-read funktion als Reaktion auf das event gelesen werden.

Zitat:Zum Koppeln gibt es Queues.

Erwischt. Daran habe ich mich bisher nicht getraut. Ich verwende ja Queues beim Erzeuger-Verbraucher-Modell, wie in meinem geposteten Beispiel-code zu sehen, besteht die Queue bei mir aus einem ENUM (Nachrichtenart) und 4 Strings (quasi um Argumente als text kodiert übertragen zu können). Aber ich habe keine Ahnung wie ich es anstellen könnte, eine Queue zu bauen, die aus variabel großen Messdatenblöcken besteht. Gibts da ein BeispielTalk?

Erfahrung ist die Summe der gemachten Fehler
KISS - Keep it simple and stupid
Walking on water and developing software from a specification are easy if both are frozen. – Edward V Berard
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.02.2010, 11:55
Beitrag #24

dimitri84 Offline
Astronaut
*****


Beiträge: 1.496
Registriert seit: Aug 2009

2020 Developer Suite
2009
DE_EN

53562
Deutschland
Analogmessung auf einem Kanal im Hintergrund
Den "Danken" Button hast du doch schon gefunden. Der daneben ist, wie der name schon sagt, zum "Zitieren". Einfach drücken (er wird rot) und dann antworten und der Text erscheint im Antwortfenster.

Queues musst du nicht selbst bauen. Die gibts fertig. Einfach mal die SyncPalette anschauen.

„Sag nicht alles, was du weißt, aber wisse immer, was du sagst.“ (Matthias Claudius)
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.02.2010, 12:14
Beitrag #25

wernerIBN Offline
Datenflussumgeher
**


Beiträge: 124
Registriert seit: Sep 2009

8.6 und 2011
2000
DE

52425
Deutschland
Analogmessung auf einem Kanal im Hintergrund
' schrieb:Queues musst du nicht selbst bauen. Die gibts fertig. Einfach mal die SyncPalette anschauen.

Und so eine Queue kann als Datentyp Signalverlauf, und diese sogar unterschiedlich Groß, mal mehr und mal weniger Samples ? Das ist ja toll...

Erfahrung ist die Summe der gemachten Fehler
KISS - Keep it simple and stupid
Walking on water and developing software from a specification are easy if both are frozen. – Edward V Berard
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.02.2010, 12:39
Beitrag #26

SeBa Offline
LVF-Guru
*****


Beiträge: 2.025
Registriert seit: Oct 2008

09SP1 & 10 FDS
2008
DE

65xxx
Deutschland
Analogmessung auf einem Kanal im Hintergrund
Beispiel:

Je länger die auslesende Schleife wartet, desto mehr muss sie aus der Queue lesen.

Lv80_img
Sonstige .vi  QueueGraph_WFM.vi (Größe: 28,77 KB / Downloads: 204)


   

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
25.02.2010, 15:07
Beitrag #27

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.696
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Analogmessung auf einem Kanal im Hintergrund
' schrieb:Event ist etwas, das vom Betriebssystem unterstützt wird, und von daher performant und CPU-schonend.
Oh! Zwei Sachen:
Du gehörst jetzt als LabVIEW-Programmierer einer höheren Kaste an. In dieser Kaste zählen Denkweisen, die man sich als C++- respektiver OOP-Programmierer angeeignet hat, nicht mehr viel. Hier zählen Datenfluss und Error-Cluster-Sequenzierung. Von vorne herein also zu denken, ich nehm ein Event, ist falsch, viel zu viele Ebenen zu tief. Zuerst muss du denken: Wie bekomme ich meine Daten per Datenfluss von der Karte auf das Osci-Bild? ... Ein Teil dieses Datenflusses ist das Verwenden von Queues. Queues stellen einen imaginären Datenflus dar.
Wenn du sagt, Event ist etwas vom Betriebssystem Unterstütztes, dann unterschlägst du die LV-Runtime. Es ist noch lange nicht gesagt, dass ein Event vom Betriebssystem kommt. LV respektive seine RT bohren sich dermaßen tief ins Betriebssystem ein, da glaube ich gerne, dass so mancher Event am Betriebssystem vorbei alleine von der LV-RT gemanagert wird.

Zitat:Daher müssen die Daten ja mit einer Art DAQ-MX-read funktion als Reaktion auf das event gelesen werden.
Hab ich kein Problem mit. Es gibt also solche und solche Events. Nur:
Wenn dem jetzt so ist, ist das ja noch schlimmer: Was ist denn, wenn die Eventbearbeitung (aus welche Gründen auch immer, sag ich immer) zu spät kommt: dann läuft der Puffer über. Und dann ist aber das Verfahren, die Task explizit in einer eigenen, parallelen Loop zu bearbeiten und die Daten per Queue zu verschicken, prinzipiell sicherer. Den ganzen Zusatzaufwand mit der Event-Sequenz und dem Bereitstellen des DAQmx-Events kann ich mir also sparen.


Noch geschwind ein weiteres Wort zu "sampelratenunabhängig":
"Samplerate" ist eine Eigenschaft einer bestimmten Ebene innerhalb einer hierarchischen Struktur. Und zwar der Ebene "Daten Samplen und in Puffer ablegen". Diese Ebene befindet sind (weit?) unterhalb der Ebene, die für das Auslesen des Puffers (DAQmx-Read) zuständig ist. Auch in LV gilt das Prinzip der Kapselung, zu deutsch: Was interessieren mich Parameter, die einer anderen Ebene gehören (von Initialisieren diverser Ebenen mal abgesehen)? Ich (eine beliebige Ebene) brauch die nicht! So gesehen, sollte die Ebene "DAQmx-Read" also sampelratenunabhängig sein. Eine solche Denkweise resultiert aus der Überlegung, dass meine Probleme, die ich mit Entwicklung und Debugging habe, mit der Anzahl der Parameter steigen (respektive sinken).

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.02.2010, 15:39
Beitrag #28

dimitri84 Offline
Astronaut
*****


Beiträge: 1.496
Registriert seit: Aug 2009

2020 Developer Suite
2009
DE_EN

53562
Deutschland
Analogmessung auf einem Kanal im Hintergrund
Vielleicht sehe ich das falsch aber ...

... Ebenen parameterunabhängiger zu gestalten bedeuetet doch auch immer einen gewissen Mehraufwand respektive ( Big Grin ) eine komplexere Struktur. Hier z.B.: Normale Schleife gegen Timed-Loop mit Erzeuger Verbraucher Struktur. Wenn man also mit den Nachteilen der parameterabhängigereren Struktur leben kann, oder sogar gut Leben kann, oder sogar Vorteile darin sieht, ist das Prinzip der Kapselung zu hinterfragen respektive nicht pauschal als vorteilhaft anzusehen.

„Sag nicht alles, was du weißt, aber wisse immer, was du sagst.“ (Matthias Claudius)
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.02.2010, 16:09
Beitrag #29

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.696
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Analogmessung auf einem Kanal im Hintergrund
' schrieb:... Ebenen parameterunabhängiger zu gestalten bedeuetet doch auch immer einen gewissen Mehraufwand respektive ( Big Grin ) eine komplexere Struktur.
Mehraufwand ja, komplexere Struktur auf keinen Fall.
Eine Kapselung führt immer zu einer einfacheren Struktur. Der Mehraufwand resultiert daher, weil man nicht direkt auf einen Parameter außerhalb der eigenen Ebene (Klasse, Modul, etc) zugreifen soll. Was gänge, wäre der Parameter als z.B Globale Variable typisiert. Man soll also in der anderen Ebene (Klasse, Modul etc.) ein Property schaffen, um dann auf dem Umweg über den Property-Aufruf an den Parameter zu kommen. (Mit Property hat die Klasse die Möglichkeit zu Zugriff zu verweigern, was nicht geht, wenn der Parameter in einer GV liegt). Ein "Property" in einer "FGV" ist der Enum-Eingang in Verbindung mit einem (leider) Variant Ein-/Ausgang.

Zitat:Hier z.B.: Normale Schleife gegen Timed-Loop mit Erzeuger Verbraucher Struktur. Wenn man also mit den Nachteilen der parameterabhängigereren Struktur leben kann, oder sogar gut Leben kann, oder sogar Vorteile darin sieht, ist das Prinzip der Kapselung zu hinterfragen respektive nicht pauschal als vorteilhaft anzusehen.
Hinterfragt werden kann das Prinzip der Kapselung nicht. Und es ist auch per se immer besser.

Das Problem ist halt immer die Verhältnismäßigkeit. Wenn, wollte ich der Kapselung gerecht werden, wenn ich also extremen Aufwand treiben muss, nur um ein Feature für 5Cent zu realisieren, wird keiner (und ich schon gar nicht) Einwände haben. Irgendwann kann ich nämlich absehen, dass die Nicht-Einhaltung der Kapselung in diesem einen Falle eigentlich gar nichts ausmacht. Was aber nichts daran ändert, dass es nach Lehrbuch falsch ist.

Und wenn ich hier einen (virtuellen) Vortrag halte, dann muss ich mich immer zuerst an die Lehrbuchmeinung halten. Zumindest dann, wenn einer ganz allgemeine Fragen hat. Danach kommen erst die durch die Praxis gegeben Einschränkungen.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.02.2010, 16:20
Beitrag #30

wernerIBN Offline
Datenflussumgeher
**


Beiträge: 124
Registriert seit: Sep 2009

8.6 und 2011
2000
DE

52425
Deutschland
Analogmessung auf einem Kanal im Hintergrund
' schrieb:Beispiel:
Je länger die auslesende Schleife wartet, desto mehr muss sie aus der Queue lesen.
Lv80_img[attachment=53119:QueueGraph_WFM.vi]
[attachment=53118:BD.png]

Wunderbar. vor allem das Auslesen in der for-Schleife - elegant. Ich muss aber trotzdem an der "deutschen" Benennung der Anschlüsse rumnörgeln: das VI Queue leeren hat den von dir genutzten Ausgang so benannt: "Verbliebene Elemente". Total blödsinning in meinen Ausgen, wieso in aller Welt heisst der nicht "Entfernten Elemente"...

' schrieb:Hier zählen Datenfluss und Error-Cluster-Sequenzierung. Von vorne herein also zu denken, ich nehm ein Event, ist falsch, viel zu viele Ebenen zu tief. Zuerst muss du denken: Wie bekomme ich meine Daten per Datenfluss von der Karte auf das Osci-Bild? ... Ein Teil dieses Datenflusses ist das Verwenden von Queues. Queues stellen einen imaginären Datenflus dar.
Ja, macht mir Mühe so zu denken - und ich folge deinem Ansatz; aber die Verwendung von Queues ist ja nicht gerade Datenfluss-orientiert. Versteh mich nicht falsch, Queues sind total prima, und ich werde Sie nutzen - aber man muss meiner Meinung nach bei LabVIEW schon viele Konzepte kennen, und alle kombinieren.

' schrieb:Nur:
Wenn dem jetzt so ist, ist das ja noch schlimmer: Was ist denn, wenn die Eventbearbeitung (aus welche Gründen auch immer, sag ich immer) zu spät kommt: dann läuft der Puffer über. Und dann ist aber das Verfahren, die Task explizit in einer eigenen, parallelen Loop zu bearbeiten und die Daten per Queue zu verschicken, prinzipiell sicherer. Den ganzen Zusatzaufwand mit der Event-Sequenz und dem Bereitstellen des DAQmx-Events kann ich mir also sparen.

Ich sehe das wie du, nur denk ich ja anders: In der Tat gehen bei fehlerhafter Auslegung der Eventbearbeitung, also wenn du nicht SOFORT bei Auftreten des Events (sehe ich als C-Programmierer wie einen Interrupt an) als Callback, oder Datenflussorientiert die Daten ausliest, Daten verloren. Dann machst du aber auch wirklich einen Fehler - man MUSS bei Auftreten eines Events der ja anzeigt die gewünschten Daten sind abzuholen, diese auch sofort holen. Deine LOOP ist da auch nicht besser, denn wenn die die zu langsam machst, übertrieben gesagt, statt 50ms 5 Sekunden gehen auch Daten verloren. Ist also der gleiche Fehler und auch nicht besser. Was ich aber im Kopf habe, ist die Performance bei schwächlichen Rechnern mit z.B. ATOM-CPU - da könnten 50ms LOOPs schon signifikante Anteile an Rechenleistung schlucken. Events hingegen ( vorausgesetzt gut in LV implementiert, was ich aber stark annehme) verbrauchen nur dann CPU-Zeit, wenn Sie auftreten. Aber wenn man die Parameter sinnvoll wählt, dann wirst du schon recht haben, sowohl deine LOOP, als auch meine EVENTS werden sich da nicht viel unterscheiden. Das kommt daher, weil ja der Hardwaretreiber DAQ-MX wunderbar puffert. Würde man das selber machen müssen, dann, ja dann: wären meine Events viel besser.Big Grin

Erfahrung ist die Summe der gemachten Fehler
KISS - Keep it simple and stupid
Walking on water and developing software from a specification are easy if both are frozen. – Edward V Berard
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Analogmessung und Lichtschranke Herri 4 3.994 09.12.2019 14:48
Letzter Beitrag: MarcoN
  DAQ Kanal erzeugen jodh14 11 8.729 21.03.2018 15:37
Letzter Beitrag: jodh14
Question DAQ - Task und Kanal Synchronisierung pandamir 20 23.507 04.09.2013 18:40
Letzter Beitrag: Spoony
  DAQmx - Kanal 2 Abtastrate abhängig von Kanal 1 DerJohannes 6 7.092 29.08.2013 17:50
Letzter Beitrag: DerJohannes
  Kanal in Task auswählen Sundypha 10 11.184 15.01.2013 11:07
Letzter Beitrag: Sundypha
  Samples pro Kanal und Zeiterfassung Mimo_LV002 6 8.050 15.12.2012 20:02
Letzter Beitrag: GerdW

Gehe zu: