Data Acquisition Unit (Datenerfassungseinheit)

(nur für Geräte mit 32-bit CPU, siehe Feature-Matrix / "DAQ")

Leider wurde dieses Dokument noch nicht komplett ins Deutsche übersetzt.

Wenn möglich, verwenden Sie bitte die englischsprachige Version: daq_01.htm,
oder notfalls diese automatische Übersetzung - auch wenn das Ergebnis recht 'drollig' ausfallen dürfte.

Inhalt

  1. Einleitung, Funktionsprinzip
  2. DAQ-Konfiguration
    1. Konfiguration von DAQ-Kanälen als Quelle für Y(t)-Diagramme
  3. Verbinden von DAQ-Kanälen mit Analogeingängen
  4. DAQ-Abtastraten und Speichertiefe
  5. DAQ-Trigger
  6. Auslesen von DAQ-Speichern per Script
    1. Auslesen der neuesten Abtastwerte für einen bestimmten Kanal
    2. Auslesen von Abtastwerten für einen bestimmten Zeitpunkt
    3. Auslesen von Abtastwerten mit einer bestimmten Blocklänge
  7. Beispiele zur Verwendung der DAQ-Einheit


Einleitung, Funktionsprinzip

Die DAQ-Einheit dient zur schnellen Abtastung von Signalen, die z.B. per CAN-Bus als "Signal" übertragen werden, oder Spannungen an den Analogeingängen (onboard).
Mit der DAQ-Einheit ließen sich bei älteren Geräten (MKT-View I, II) Signale mit Abtastraten bis zu 1000 Samples/Sekunde erfassen. Bei neueren Geräten (MKT-View IV) sind bis zu 20000 Samples/Sekunde möglich (pro Kanal, von den analogen Eingängen).

Die von der DAQ-Einheit kontinuierlich aufgenommenen Abtastwerte werden in einem FIFO zwischengespeichert. Dieser FIFO dient z.B. als Datenquelle, wenn der zeitliche Verlauf mit hoher Auflösung in einem Y(t)-Diagramm geplottet werden soll. Darüberhinaus können bei einigen Geräten die Daten aus dem FIFO per Script weiterverarbeitet werden, z.B. zur Spektrumanalyse (Schwingungs- oder Vibrationsanalyse) per Fourier-Transformation.


Blockschaltbild und Signalfluss in der DAQ

Für 'normale' Anzeigen (numerisch, oder als Diagramm mit Abtastraten unter 10 Hz) wird die DAQ-Einheit nicht benötigt.
In den meisten Fällen wird die DAQ im Zusammenhang mit Y(t)-Diagrammen verwendet.


DAQ-Konfiguration

In vielen Fällen werden DAQ-Kanäle im Programmiertool mit Anzeige-Variablen verbunden. Dadurch kann das System die entsprechenden Meßwerte direkt beim Empfang entsprechender CAN-Signale mit der gewünschten Abtastrate in den DAQ-Speicher übernehmen.
Setzen Sie dazu die Option 'Connect to DAQ channel' / 'Verbinde mit DAQ-Kanal' im rechten Teil des Definitionsfensters auf der Registerkarte 'Variablen':


Das Programmiertool sucht beim Setzen dieser Option den nächsten freien DAQ-Kanal (von 0 bis 7 laufender Index), und trägt diese Nummer in das entsprechende Feld ein.
Damit ist die Verbindung von Variablen (bzw. dessen CAN-Signal) und DAQ hergestellt.

Um eine Variable von der DAQ zu trennen, setzen Sie die oben beschrieben Option (Haken) wieder zurück. Das Programmiertool entfernt die DAQ-Kanal-Nummer aus der Variablen-Definitions-Tabelle, wodurch der DAQ-Kanal wieder frei wird.

Bei ausreichend großem Bildschirm können Sie alle momentan verwendeten DAQ-Kanäle auf einen Blick in der letzten (oder vorletzten) Spalte der Variablen-Definitions-Tabelle sehen (neben dem optional angezeigten aktuellen Messwert:


Variablen-Definitions-Tabelle mit DAQ-Kanalnummern am rechten Rand

Der oben gezeigte Screenshot stammt aus der Applikation 'DAQ_test.cvt'.
In diesem Beispiel wurde die DAQ als Quelle für ein schnelllaufendes Y(t)-Diagramm verwendet, in dem die Meßwerte 'FourSines1' bis 'FourSines4' mit hoher zeitlicher Auflösung angezeigt wurden.

Konfiguration von DAQ-Kanälen als Quelle für Y(t)-Diagramme

Um ein bereits existierendes Y(t)-Diagramm auf die Verwendung der DAQ-Einheit umzustellen, kann der Button mit der Aufschrift 'Verbinde XYZ mit DAQ' (darin ist XYZ der Name der im aktuell markierten Diagramm-Kanal, z.B. 'Drehzahl') auf der Registerkarte 'Kanäle, Modus, Zeitbasis im Dialog 'Eigenschaften eines Liniendiagramms' verwendet werden.
Die Bedienung ist denkbar einfach:
Markieren Sie zunächst den gewünschten Diagramm-Kanal in der Tabelle (unter 'Kanäle').
Nur wenn die Quelle des markierten Kanals noch nicht auf die DAQ-Einheit verweist (z.B. 'Drehzahl' statt 'daq[0]'),
hat der oben genannte Button eine Funktion, und bietet Ihnen z.B. die Funktion Verbinde 'Drehzahl' mit DAQ an.

   Hinweise zur DAQ im Zusammenhang mit Y(t)-Diagramen:
        Die DAQ-Kanal-Nummer braucht nicht mit der Diagramm-Kanal-Nummer übereinzustimmen !

        Seit 2018-09 beginnt die Firmware mit dem 'Einsammeln' von Daten für Diagramme
        bereits bevor das erste Diagramm sichtbar wird - auch ohne die DAQ-Einheit.


Verbinden von DAQ-Kanälen mit Analogeingängen (u.Ä.)

Zusätzlich zu den normalen 'Anzeige'-Variablen können DAQ-Kanäle auch elektrische 'onboard'-Eingänge mit der DAQ-Einheit gekoppelt werden, und stehen damit auch als Signalquelle mit hoher Abtastrate für Y(t)-Diagramme und ähnliche Anzeigeelemente zur Verfügung. Im Gegensatz zum Polling (im Script per system.analog_in[]) sind damit beim MKT-View IV Abtastraten bis zu 20 kHz erreichbar.


DAQ-Kanäle und -Optionen im Hauptmenü des Programmiertools

Um DAQ-Kanäle mit analogen und ähnlichen 'elektrischen' Eingängen zu koppeln, wählen Sie
    'Optionen'..'Datenerfassungseinheit' im Hauptmenü des Programmiertools.
Wählen Sie einen der acht DAQ-Kanäle (Indizes 0..7), und geben eins der folgenden Schlüsselwörter im Editierfeld ein (anstelle des Namens einer Anzeige-Variablen):
analog_in[0]
Erster analoger 'onboard'-Eingang (in den meisten 'MKT-Views' verfügbar, siehe Feature-Matrix).
Skalierung wie bei der entsprechenden Script-Funktion system.analog_in[0] (floating point, 0 bis 1.0 bzw. -1.0 bis +1.0).
analog_in[1]
Zweiter analoger 'onboard'-Eingang.
Skalierung wie bei der entsprechenden Script-Funktion system.analog_in[1] (floating point, 0 bis 1.0 bzw. -1.0 bis +1.0).
analog_in[2]
3. analoger 'onboard'-Eingang (z.Z. nur beim MKT-View IV, 3-polige Buchse "X4")
analog_in[3]
4. analoger 'onboard'-Eingang (z.Z. nur beim MKT-View IV, 3-polige Buchse "X4")

mic_in
Mikrofoneingang. Beim MKT-View IV kann der Mikrofoneingang (3.5-mm-Klinkenbuchse "X8") als Analogeingang für die DAQ verwendet werden. Aus historischen Gründen ist der Wertebereich -32767 .. +32767.

digital_in[0]
erster digitaler Eingang ('onboard', 0=logic low, 1=logic high)
digital_in[1]
zweiter digitaler Eingang ('onboard', 0=logic low, 1=logic high)

frequency_in[0]
am ersten Digitaleingang gemessene Frequenz (nur bei bestimmten Geräten, muss wie hier beschrieben konfiguriert werden)
frequency_in[1]
am zweiten Digitaleingang gemessene Frequenz

pulse_counter[0]
am ersten Digitaleingang gezählte Impulse (nur bei bestimmten Geräten, muss wie hier beschrieben konfiguriert werden)
pulse_counter[1]
am zweiten Digitaleingang gezählte Impulse.

Die oben aufgezählten Schlüsselwörter (Tokens) können auch in Kanal-Definitionen für Diagramme (Y(t) or X/Y) verwendet werden.
Wird ein DAQ-Kanal bereits zum Erfassen des zeitlichen Verlaufs einer Anzeige-Variablen verwendet, dann wird (wie im oben gezeigten Screenshot) der Variablenname in der Liste angezeigt. Der Variablenname kann einfach im Editierfeld mit der gewünschten Funktion (z.B. "analog_in[0]") überschrieben werden.


Zuordnung einer Signalquelle für einen DAQ-Kanal im Programmiertool

Hinweis: Als 'Quelle' für die DAQ-Einheit können keine beliebigen numerischen Ausdrücke verwendet werden, sondern nur Signale, die mit hoher Abtastrate eingelesen werden können (alles andere kann z.B. in der Hauptschleife 'gepollt' werden).


DAQ-Abtastraten und Speichertiefe

Alle mit der DAQ-Einheit verbundenen Kanäle werden mit der gleichen Abtastrate in den Speicher eingelesen. Da die DAQ meistens (aber nicht notwändigerweise) zum 'Einsammeln' von Daten für Diagramme verwendet wird, wird die Abtastrate vom System automatisch passend zur Zeitbasis des aktuell angezeigten Diagramms eingestellt.

In einigen Anwendungen wurde die DAQ-Einheit allerdings für andere Zwecke (ohne Diagramm) verwendet, z.B. für die Signalanalyse per Script. Um in solchen Fällen die Abtastrate für die DAQ zu definieren, wählen Sie im Hauptmenü des Programmiertools
    'Optionen'..'Datenerfassungseinheit'..'Abtastrate',
und geben den gewünschten Werte (gemessen in Hertz bzw. 'Samples pro Sekunde') in der Dialogbox ein.

Hinweis
Bei alten Geräten wie z.B. MKT-View II lag die maximale Abtastrate unter 2000 Hz.
Bei Geräten mit schnellerer CPU sind deutlich höhere Abtastraten möglich, z.B. 20000 Hz beim MKT-View IV.
Für die Entwicklung von 'portablen', d.h. auch auf alten Geräten lauffähigen Applikationen sollte die Abtastrate nur so hoch wie unbedingt nötig gewählt werden.
Für Experten: Wählen Sie eine Abtastrate knapp oberhalb der doppelten Signalfrequenz, siehe Nyquist-Shannon-Abtasttheorem.

DAQ-Speichertiefe verschiedener Geräte

Hinweis: Die Speichertiefen (maximale Anzahl von Abtastwerten pro Kanal sind geräteabhängig, und können von den im Folgenden aufgeführten Richtwerten abweichen.


DAQ-Trigger

Hinweis: Die in diesem Kapitel beschriebene Funktion befand sich im November 2018 noch in der Entwicklungsphase, und ist z.Z. nur als 'Beta' im Programmiertool und in der Geräte-Firmware vorhanden !

Im Normalfall arbeitet die DAQ-Einheit kontinuierlich, ohne Unterbrechungen.
In typischen Meßaufgaben mit 'moderaten' Abtastraten können die Daten in Echtzeit per Script weiterverarbeitet werden, oder per Diagramm laufend ('life') angezeigt werden. Gegenenenfalls kann das Script mit den a.a.O. vorgestellten Befehlen das Diagramm auch stoppen (bzw. "einfrieren"), wenn ein bestimmtes Ereignis eingetreten ist (z.B. Grenzwertüberschreitung, "merkwürdiges Geräusch", usw).
Bei sehr hohen Abtastraten stellt sich allerdings das Problem, daß weder der Bediener noch das im Bediengerät ablaufende Script "schnell genug" auf das Ereignis reagieren können. In diesen Fällen kann die DAQ-Einheit selbst in den Meßdaten (Abtastwerten) nach entsprechenden Ereignissen suchen, und die Datenaufnahme mit einstellbarer Nachlaufzeit anhalten.
Das Prinzip entspricht weitgehend einem digitalen Oszilloskop mit Triggerfunktion:
Alles Weitere (nach einem Trigger-Ereignis) ist dann Sache des Scripts oder des Bedieners (z.B. Begutachtung der getriggerten Aufzeichnung im einem Y(t)-Diagramm). Auch das Fortsetzen der Datenerfassung per DAQ erfolgt i.A. per Script.


Auslesen von DAQ-Speichern per Script

Die DAQ-Einheit kann nicht nur (direkt) zum schnellen Abtasten von Signalen für die Anzeige (Diagramm), sondern auch für digitale Signalverarbeitung per Script eingesetzt werden. Mit dem Befehl

  daq.read_channel( <DAQ-Kanalnummer>, <Ziel-Array> );  // zwei Parameter: die neuesten Abtastwerte lesen
oder
  daq.read_channel( <Kanal>, <Ziel-Array>, <Unix-Zeit> );  // 3 Parameter: Für einen bestimmten Zeitpunkt
oder
  daq.read_channel( <Kanal>, <Ziel-Array>, <Unix-Zeit>, <Länge> );  // 4 Parameter: Mit fester Blocklänge
kann das Script zeitlichen Verlauf eines Meßsignals aus einem DAQ-Speicher auslesen, und in einem im Script deklarierten Array ablegen. Ein Beispiel finden Sie ebenfalls im 'DAQ-Test' (Applikation programs/DAQ_Test.cvt). Darin wird u.A. per FFT das Spektrum des Mikrofon-Signals berechnet, logarithmiert, und wie hier beschrieben als Diagramm zur Anzeige gebracht.

Auslesen der neuesten Abtastwerte für einen DAQ-Kanal

Wird beim Aufruf von daq.read_channel nur die Kanalnummer und der Name des Ziel-Arrays angegeben, dann liefert die Funktion immer die neuesten verfügbaren Abtastwerte (siehe Beispiel in der Einleitung dieses Kapitels). Die Anzahl von Abtastwerten ist nur durch die Kapazität des Ziel-Arrays, und den momentanen 'Füllstand' des DAQ-internen Speichers begrenzt. Die Anzahl ausgelesener Abtastwerte kann bei dieser Variante (mit zwei Parametern) zwischen 1 und <Ziel-Array>.size liegen.

Wie auch bei den weiter unten beschriebenen Varianten von daq.read_channel werden die folgenden Informationen in den Array-Header übernommen:
<Ziel-Array>.len
Wird auf die Anzahl der von daq.read_channel in das Array eingelesenen Abtastwerte gesetzt.

<Ziel-Array>..t_sample
In dieser Komponente des Array-Headers wird das Abtastintervall in Sekunden (= Kehrwert der Abtastrate in Hertz) gespeichert.

<Ziel-Array>.unix_time
Enthält nach dem Aufruf von daq.read_channel den Zeitstempel des ersten im Ziel-Array abgelegten Abtastwert im Unix-Format.

Ist dieser Automatismus unerwünscht, kann das Script nach dem Aufruf von daq.read_channel die oben genannten Timing-Parameter im Array überschreiben.

Die Funktion zum Zeichnen von Y(t)-Diagrammen verwendet diese Informationen für die horizontale Skalierung. Details zum Plotten von Arrays finden sie hier.

Für eine 'nahtlose', kontinuierliche digitale Signalverarbeitung per Script und DAQ kann der Funktion daq.read_channel() noch ein drittes Argument ("gewünschter Zeitstempel") übergeben werden - siehe nächstes Kapitel.

Auslesen von Abtastwerten für einen bestimmten Zeitpunkt

Für spezielle Zwecke kann beim Auslesen auch der Zeitstempel für den ersten auszulesenden Abtastwert (sample) spezifiziert werden:
  daq.read_channel( <DAQ-Kanalnummer>, <Ziel-Array>, <Unix-Zeit> );
Mit drei Parametern (in der Argumentenliste) beginnt daq.read_channel mit dem Abtastwert, dessen Zeitstempel mit dem Parameter <Unix-Zeit> übereinstimmt (*).

Diese im Dezember 2018 implementierte Erweiterung kann z.B. verwendet werden, um im Script eine 'nahtlose' Signalverarbeitung zu realisieren. Rufen Sie dazu daq.read_channel zyklisch aus der Hauptschleife des Scripts auf, wobei Sie als Zeitstempel (drittes Argument von daq.read_channel) die Zeitmarke des letzten Samples im vorhergehenden Block übergeben, erhöht um das Abtastintervall eines einzelnen Samples:
  daq.read_channel( 0/*channel*/, AudioStream/*dest-array*/, AudioStream.unix_time + AudioStream.t_sample ); // read the next block of samples

Ein Beispiel für den Einsatz dieser Variante von daq.read_channel() finden Sie in der ausführlich kommentierten Beispiel-Applikation script_demos/diagrams.cvt in der Funktion CheckTriggerAndUpdateDiagram().
(*) Hinweis zum Verhalten von daq.read_channel bei einer 'zu alten Zeitmarke' im Parameter 'Unix-Zeit':
Stehen für die angegebene Zeitmarke wegen der begrenzten DAQ-Speichertiefe keine Daten mehr im DAQ-Speicher zur Verfügung, dann liefert daq.read_channel beim Aufruf mit drei oder vier Parametern stattdessem den Block mit den ältesten noch im FIFO verfügbaren Abtastwerten, und trägt deren 'Alter' in <Ziel-Array>.unix_time ein.
Siehe auch: Beispiel und Hinweise zur kontinuierlichen Signalverarbeitung (und dem Übergang zur 'lückenhaften' Verarbeitung bei zu langsamen Script) im nächsten Kapitel.

Auslesen von Abtastwerten mit einer bestimmten Blocklänge

Für bestimmte Algorithmen (z.B. FFT) können Abtastwerte nur in Blöcken mit einer bestimmten Größe verarbeitet werden (z.B. 2^N). Um diese Anforderung ohne großen Aufwand im Script zu erfüllen, kann daq.read_channel mit einem vierten Parameter (optional) dazu gezwungen werden, nur genau eine bestimmte Anzahl von Abtastwerten auszulesen (statt einer nur durch die Kapazität des Ziel-Arrays begrenzten maximalen Anzahl). Beispiel:
   float  fltFFTin[1024];    // FFT-Eingang (1024 Abtastwerte)
   float  fltFFTout[1024+2]; // FFT-Ausgang mit 513 komplexen "Frequenz-Eimern" 
   double dblTimeForNextFFT; // geplanter Zeitpunkt für die nächste Transformation
     ...
   daq.read_channel( 7, fltFFTin, dblTimeForNextFFT, 1024 );  // die FFT benötigt genau 2^N Werte - nicht weniger !
   if fltFFTin.len > 0 then  // nur wenn daq.read_channel neue Daten für die FFT geliefert hat:
      dblTimeForNextFFT := fltFFTin.unix_time + fltFFTin.len * fltFFTin.t_sample; // 'geplanter' Zeitpunkt für die nächste FFT
      Math.rfft( fltFFTin, fltFFTout ); // Vorwärts-FFT mit reellem Ein- und komplexem Ausgang
   endif;
     ...
Da in diesem Fall (daq.read_channel mit vier Parametern) entweder 'gar nichts' oder genau die gewünschte Anzahl (hier: 1024 Abtastwerte) eingelesen werden, bewegt sich der 'geplante Zeitpunkt für die nächste FFT' im Idealfall bei jedem erfolgreichen Aufruf um 1024 * fltFFTin.t_sample (Sekunden) weiter.
Bei einer Abtastrate von z.B. 11025 Hz (für Signale vom Mikrofoneingang im MKT-View) müsste das Script dann 11025 Hz / 1024 = etwa 11 Spektren (FFTs) pro Sekunde berechnen, was bei älteren Geräten (ohne Hardware-Fliesskommaeinheit) nicht funktioniert.
In dem Fall ("zu langsame Verarbeitung") liefert der nächste Aufruf von daq.read_channel() dann nicht mehr den Block mit der 'gewünschten' Zeitmarke, sondern (wegen der begrenzten DAQ-Speichertiefe) einen Block mit einer neueren Zeitmarke.

Mit anderen Worten: Bei zu langsamer CPU entstehen 'Lücken' zwischen zwei Blöcken, erkennbar am "Sprung" der Zeitmarke (im obigen Beispiel: fltFFtin.unix_time > dblTimeForNextFFT).
Dieses Verhalten ist beabsichtigt. Es stellt sicher, daß bei zu langsamer CPU ohne großen Aufwand im Script-Quelltext die Signalverarbeitung vom 'nahtlosen' Betrieb in den Betrieb mit 'möglichst kurzen Lücken' zwischen zwei Blöcken übergeht.


Beispiele zur Verwendung der DAQ-Einheit

In der Applikation DAQ_test.cvt (zu finden im Verzeichnis "programs" im Programmiertool) finden Sie einige trickreiche Beispiele zur Verwendung der DAQ-Einheit. Sie besteht aus mehreren Anzeigeseiten:

Auf der ersten Anzeigeseite ("Analog") werden per DAQ 'gesammelte' Abtastwerte von Analogeingängen und dem Mikrofoneingang in einem einfachen Y(t)-Diagramm dargestellt, ähnlich wie bei einem Speicheroszilloskop für NF-Signale. Für dieses einfache Beispiel wird kein Script benötigt - die in Kapitel 3 beschriebene Definition von DAQ-Kanälen reicht dazu aus.


Wellenform an den Analogeingängen, per DAQ digitalisiert, Anzeige als Y(t)-Diagramm.
Beispiel aus Applikation 'DAQ_Test.cvt', läuft mit 20 kHz Abtastrate auf einem MKT-View IV.



Auf der zweiten Anzeigeseite ("CAN") werden per DAQ vom CAN-Bus 'eingesammelte' Meßwerte angezeigt. Aus Sicht der DAQ wären deutlich mehr als 1000 Samples/Sekunde möglich, der CAN-Bus erlaubt allerdings bei vertretbarer Buslast keine schnellere Übertragung.


Wellenform von per CAN empfangenen Signalen, per DAQ 'eingesammelt', Anzeige als Y(t)-Diagramm.
Beispiel aus Applikation 'DAQ_Test.cvt', Testlauf auf einem MKT-View IV.



Auf der dritten Anzeigeseite ("Spectrum Analyser") werden per DAQ 'eingesammelte' Analogwerte per Script (mit FFT) vom Zeit- in den Frequenzbereich transformiert, und das Resultat (Spektrum) wie hier beschrieben gezeichnet.


Beispiel eines Diagramms mit Hintergrundbild (hier: Spektrogramm aus 'DAQ_Test.cvt').
Verwendet die Datenerfassungseinheit zum Digitalisieren des Mikrofonsignals im MKT-View,
und die Fourier-Transformation im Script, um daraus Spektren zu berechnen.
Das Spektrogramm (unter der Kurve mit dem aktuellen Spektrum) wird per Script
in einem Canvas-Objekt gezeichnet.



Letzte Änderung: 2021-05-05 durch WB / MKT Systemtechnik .