Beispielprogramm 6 (Verschränken von Messwerten)

Programmbeschreibung/ Funktion

Anmerkung zu diesem Kapitel: Der Einsatz von EL3751/ELM3xxx‑Klemmen gilt entsprechend auch für EPP35xx.

In manchen Anwendungsfällen wird eine zeitlich besonders feine Auflösung des Signals gewünscht, z.B. damit für eine FFT viele Messpunkte zur Verfügung stehen. Im Folgenden werden zwei Möglichkeiten hierfür dargestellt:

In diesem Beispiel wird der zweite Weg beschrieben: Einsatz von EtherCAT‑Klemmen 2 x EL3751 mit je 10 kSps max. Samplerate (hier somit 100 µs Wandlungszeit, vgl. Weiterführende Dokumentation zu I/O-Komponenten mit analogen Ein- und Ausgängen, Kapitel „Zeitliche Aspekte der analog/digital bzw. digital/analog Wandlung“). Beide Klemmen erhalten durch deren Parallelschaltung das gleiche Signal simultan zugeführt und sind per DistributedClocks derartig konfiguriert, dass sie nicht gleichzeitig, sondern um die halbe Wandlungszeit versetzt sampeln (hier: 50 µs). Werden nun die beiden Messdatenströme in der Steuerung abwechseln zusammengesetzt, d.h. „verschränkt“, ergibt sich ein netto Messdatenstrom von 20 kSps.

Beispielprogramm 6 (Verschränken von Messwerten) 1:
Vorgang der Verschränkung der Eingangsdaten

Hierfür wird folgender Aufbau verwendet:

Beispielprogramm 6 (Verschränken von Messwerten) 2:
Konfiguration und Aufbau zum Beispielprogramm 6: Verdopplung der Samplingrate mit 2 x EL3751

Das Beispiel ist mit entsprechenden Anpassungen für andere EL3xxx/ELM3xxx Klemmen bzw. Box‑Modulen ebenfalls anwendbar. Es liegen dann ggf. andere Oversamplingfaktoren, Shiftzeiten etc. vor. Auch die optional vorhandene Task mit 50 µs im Beispiel 6a kann u.U. nicht zum Einsatz kommen.

Damit die Eingangswerte nacheinander zu einem Gesamtwert zusammengesetzt werden können, ist für jeden Kanal/klemme eine entsprechende Verschiebungszeit „Shift time“ notwendig; in diesem Beispiel für die zweite Klemme 50 µs. Diese wird in den „Erweiterten Einstellungen“ zu DistributedClocks (Karteireiter „DC“) der zweiten Klemme vorgenommen:

Beispielprogramm 6 (Verschränken von Messwerten) 3:
Einstellung der DC-Verschiebungszeit für Klemme 2

Einige Hinweise und Einschränkungen

Beispielprogramm

Diese genannte Einstellung, wie auch die Basiszeit und die Taskzykluszeit ist bereits in dem Beispielprogramm konfiguriert:

Download TwinCAT 3 Projekt/ Beispielprogramm 6a: Programlink

Im Folgenden ist zunächst mit Oversampling = 1 für jeden Eingangswert die einfachste Variante der Verschränkung der Eingangswerte in „strukturierten Text“ gezeigt: eine Feldvariable mit zwei Elementen erhält je einen Wert von einer Klemme. Diese kann zur Weiterverarbeitung verwendet werden und wird hier im TwinCAT ScopeView dargestellt. Die Programmanweisungen sind bei der EL3751 einer 100 µs Task zugeordnet:

Variablendeklaration Beispielprogramm 6a

PROGRAM MAIN
VAR
   nSamples_1         AT%I*      :DINT; // EL3751 input with no added shift time
   nSamples_2         AT%I*      :DINT; // EL3751 input with -50 µs added shift time
   aCollectedResult              :ARRAY[0..1] OF DINT;
END_VAR

Ausführungsteil:

// Example program 6a:
// 100 µs task
// ============================================================
aCollectedResult[0] := nSamples_1;   // Put 1st Value of sequence into array
// Pattern: 1.1.1.1...
aCollectedResult[1] := nSamples_2;   // Put n-th Value of sequence into array (2nd here)
// Pattern: .2.2.2.2...
// ============================================================
// Result pattern: 12121212... (--> see scope view dots)

Bei einem Eingangssignal z.B. Sinus 5 kHz und 2,5 V Amplitude liefert das TwinCAT‑ScopeView folgende Ergebnisse:

Beispielprogramm 6 (Verschränken von Messwerten) 4:
Oversampling 20 KSps mit 2 x EL3751 mit Eingangssignalen (unten) und Ergebnissignal (oben)

Die obere Abbildung zeigt das Gesamtsignal und die beiden Eingangssignale (nSample_1, nSample_2), um 50 µs zueinander Zeitversetzt innerhalb von 18 s in gestauchter Form. Das Gesamteingangssignal (nCollectedResult) zeigt hier im groben die Verschränkung der beiden Eingangssignale.

Nachfolgend ist dargestellt (mit Markierungen grafisch nachbearbeitet), wie die Eingangssignale (nSample_1, nSample_2) an der Konstruktion des Gesamteingangssignals beteiligt sind:

Beispielprogramm 6 (Verschränken von Messwerten) 5:
Oversampling 20 KSps mit 2 x EL3751 zeigt abwechselnd den Eingangswert 1 und Eingangswert 2 für je einen Ergebniswert

Unter bestimmten Voraussetzungen können zudem in einer entsprechend schnellen Task beide Eingänge auf eine einzelne Variable zusammengefasst werden. Das Beispielprogramm enthält hierfür noch eine zusätzliche Task mit 50 µs Zykluszeit, die zum einen für die Darstellung der Eingangssignale im SopeView benötigt wird und zum anderen auch eine Variable (nCollected) enthält, die beide Eingänge abwechselnd zugewiesen bekommt:

// 50 µs task
// ============================================================
// Junction of the two inputs
nCollected := SEL(nToggle, MAIN.nSamples_1_, MAIN.nSamples_2_);
nToggle := NOT nToggle;

Die für das ScopeView erforderlichen Variablen der Eingänge werden in dieser Task aus der 100 µs Task ausgelesen, um die einzelnen Werte im 50 µs Abstand darstellen zu lassen.

Variante mit 2 x Oversampling 10 = Oversampling 20

Wird beispielsweise ein Oversampling‑Faktor von 10 für beide Eingangsklemmen verwendet, wird für den Gesamtmesswert eine Feldvariable das so kann die Verschränkung der Eingangswerte durch eine einfache Programmschleife erfolgen, die die Werte nacheinander in eine Feldvariable für die resultierende Ergebnisvariable einliest:

Variablendeklaration Beispielprogramm 6b

PROGRAM MAIN
VAR
   aSamples_1         AT%I*      :ARRAY[0..9] OF DINT; // EL3751 input with no added shift time
   aSamples_2         AT%I*      :ARRAY[0..9] OF DINT; // EL3751 input with -50 µs added shift time
   aCollectedResult              :ARRAY[0..19] OF DINT;
// ===================================================
   nPos                          :BYTE;
END_VAR

Ausführungsteil:

// Example program 6b:
// 1 ms task
// ============================================================
FOR nPos := 0 TO 9 DO
   // Put 1st Value of sequence into array:
   aCollectedResult[2*nPos] := aSamples_1[nPos];
   // Put n-th value of sequence into array (2nd here):
   aCollectedResult[2*nPos+1] := aSamples_2[nPos];
END_FOR

Download TwinCAT 3 Projekt/ Beispielprogramm 6b: Programlink

Das Beispielprogramm 6b liefert das gleiche Ergebnis, nur liegt hier das Gesamteingangssignal lediglich in Form einer Feldvariablen mit 20 Elementen vor.