Signalqualität bei Signalausgabe mit digitalen Analogausgängen – Klirrfaktor
Das modulare Beckhoff IO-System IP20/IP67 verfügt über analoge Ausgänge in verschiedenen Bauformen, z.B. die Serien EL41xx, EL47xx, EJ4xxx oder EP4xxx (die „x“ stehen für jeweilige konkrete Produktnummern).
Allen Geräten gemeinsam ist, dass sie
- mit elektronischem DAC (Digital-Analog-Konverter) arbeiten: ein von der Steuerung (TwinCAT) über den Feldbus gesendeter Digitalwert z.B. 4567dez = 11D7hex wird von ihm je Kanal in eine analoge Ausgabe (je nach Gerät Spannung oder Strom) umgewandelt und ggf. noch leistungsverstärkt,
- zyklisch arbeiten: die Steuerung sendet in einem festen Echtzeit-Rhythmus („Steuerungszyklus“) zeit-diskret ihre Ausgabewerte, z.B. alle 1 ms. Das analoge Ausgabegerät empfängt diesen Wert über den Feldbus und gibt ihn je nach eingestellter Betriebsart aus, dabei stehen je nach Gerät bis zu drei Modi zur Verfügung:
- sofortige Ausgabe nach Empfang: SyncManager-synchron,
- ausgelöst durch die lokale Uhr: DistributedClocks-gesteuert,
- freilaufend: die Geräte-Firmware wiederholt fortlaufend ihre MAIN-Schleife und gibt den empfangenen Wert entsprechend den eigenen Erfordernissen aus.
Insgesamt führt dies dazu, dass kein harmonischer Signalverlauf erzeugt werden kann, sondern stattdessen am Ausgang ein in Zeit und Amplitude gestuftes Signal anliegt (insbesondere ohne interne oder externe Signalglättung):

Das eigentlich vorgegebene analoge Signal (blau) kann elektrisch nur durch dezidierte Stützstellen (rote Punkte) abgebildet werden. Dadurch wird das reale Ausgabesignal sowohl in der Zeit-Dimension als auch in der Amplituden-Dimension gestuft, es wird diskretisiert.
Dazu folgendes Beispiel mit der EL4732 (Analogausgang ±10 V, max. 100 kSps, Oversampling-fähig):
- für die Ausgabe eines Sinusförmiges Signals wird folgender TwinCAT 3 PLC-Code verwendet, in dem für jeden Aufrufzyklus Sinuswerte für das konfigurierte Oversampling-Feld berechnet werden:
Deklaration:
FUNCTION_BLOCK FB_sine_generator
VAR CONSTANT
// TwinCAT / Terminal configuration:
CnMaxIdx : UDINT :=10; // Fixed amount for Oversampling
tCycleTime : LTIME :=LTIME#1MS; // Configured task cycle time
nOversampling : UDINT :=10; // Used oversampling of the terminal
END_VAR
VAR_INPUT
// Output configuration:
rFreq_Hz : LREAL :=1; // Destination frequency
rAmplitude : LREAL :=1; // Destination amplitude
END_VAR
VAR_OUTPUT
bError : BOOL;
arOut : ARRAY[1..CnMaxIdx] OF LREAL;
aiOut_EL4732 AT%Q* : ARRAY[1..CnMaxIdx] OF INT; // 10 V max
END_VAR
VAR
nIdx : UDINT;
rPosition : LREAL := 0; // Init, if for startup important
rPeriod_Sec,
rStep,
rPositionPi,
rValue : LREAL;
END_VAR
Ausführung:
// This code generates values of a sinus for an EL4732 analog output terminal
IF nOversampling > CnMaxIdx OR (nOversampling = 0) OR
(tCycleTime = LTIME#0S) THEN
bError := TRUE;
ELSE
bError := FALSE;
rPeriod_Sec := 1 / rFreq_Hz;
// Calculate a step width (percentual of 1):
// Divide the cycletime by the destination periode and ovs factor:
rStep := (1E-9 * LTIME_TO_LREAL(tCycleTime))
/ (rPeriod_Sec * UDINT_TO_LREAL(nOversampling));
// (Note:
// factor of 1E-9 for value in seconds due to LTIME data type's unit is ns)
// fill the array bound to oversampling output for one task cycle
FOR nIdx := 1 TO nOversampling DO
// Calculate next X-Position of the sine:
rPosition := FRAC(rStep + rPosition);
// (usage of FRAC for saturation of rPosition to < 1)
// Calculate percent from 1 to an angle of radians:
rPositionPi := (rPosition * 2 * PI);
// Calculate next Y-Value:
rValue := rAmplitude * SIN(rPositionPi);
arOut[nIdx] := rValue; // allocate to array
// Convert output to PDO of EL4732:
aiOut_EL4732[nIdx] := LREAL_TO_INT((rValue / 10) * 16#7FFF);
END_FOR
END_IF
![]() | Verwendung der Beispielprogramme Dieses Dokument enthält exemplarische Anwendungen unserer Produkte für bestimmte Einsatzbereiche. Die hier dargestellten Anwendungshinweise beruhen auf den typischen Eigenschaften unserer Produkte und haben ausschließlich Beispielcharakter. Die mit diesem Dokument vermittelten Hinweise beziehen sich ausdrücklich nicht auf spezifische Anwendungsfälle, daher liegt es in der Verantwortung des Anwenders zu prüfen und zu entscheiden, ob das Produkt für den Einsatz in einem bestimmten Anwendungsbereich geeignet ist. Wir übernehmen keine Gewährleistung, dass der in diesem Dokument enthaltene Quellcode vollständig und richtig ist. Wir behalten uns jederzeit eine Änderung der Inhalte dieses Dokuments vor und übernehmen keine Haftung für Irrtümer und fehlenden Angaben. |
Erläuterung des Beispiels
- bei Zykluszeit = 1 ms, Oversampling = 10, Amplitude = 1 V und f = 758 Hz zeigt das ScopeView folgendes Bild der PLC-Variable arOut:
Deutlich sind die einzelnen berechneten Stützstellen zu sehen (Einstellung der Kanaleigenschaft: Eigenschaftsgruppe „Marks“, Eigenschaft „Mark State“ = On, „Mark Size“ = 4). - Die voreingestellte Kanaleigenschaft „Graph Type“ unter der Eigenschaftsgruppe „Line“ im Scope ist auf die Darstellung „Line“ voreingestellt. Daher entspricht die o.a. ScopeView-Ausgabe nicht dem tatsächlichen elektrischen Ausgangssignal der Klemme. Dem kommt eine Änderung in die „Stair“ Darstellung näher:
Dieser „Graph Type“ kann wie folgt dargestellt, ausgewählt werden: - Dazu nun das elektrische Signal, dass in Realität das digital arbeitende (und damit in Zeit- und Amplitudendimension diskretisierende) Analoggerät verläßt, aufgezeichnet mit einem Oszilloskop, EL4732/Ch1 an einer Last von 1 kΩ:
.
- Die Auflösung im Zeitbereich (x-Achse) ist abhängig von der konfigurierten Task-Zykluszeit (CycleTime) und dem eingestellten Oversamplingfaktor (Oversampling):
Resolution [s] = CycleTime / Oversampling
Mit den o.g. Werten ergibt sich aus 1 ms / 10 = 0.1 ms. Aus dem Kehrwert der Auflösung ergibt sich die Anzahl der aufeinanderfolgenden Analogwerte pro Sekunde: In diesem Beispiel (1 ms Zykluszeit, 10-fach Oversampling) können somit 10.000 aufeinanderfolgende Analogwerte mit der Auflösung 100 µs ausgegeben werden (umgangssprachlich „Ausgabe mit 10 kHz“).
Soweit zur Theorie. Nun kann in manchen Aufgabestellungen die Frage nach der analogen Signaltreue in Relation zum theoretischen Signal aufkommen. Dafür gibt es verschiedene Bewertungskriterien wie etwa den Klirrfaktor.
Für Sinusförmige Signale gibt der Klirrfaktor den Oberschwingungsgehalt des realen Signals zum Gesamtsignal an, d.h. wie hoch die Anteile im Signal sind, die nicht dem idealen Sinus entsprechen, ihn also verzerren. Der Klirrfaktor bewegt sich zwischen 0 und 1, i.allg. zeigt ein niedriger Klirrfaktor nahe 0 ein Realsignal an, dass sehr nahe am Ideal-Sinus ist und wenig (ungewollte) Oberschwingungen enthält.

Messung und Bewertung wie folgt:
- Ausgabe des Sinussignals an bekannter Last,
- Messung mit dem Oszillokop und FFT-Auswertung,
- Bestimmung der Effektivwerte der ganzzahligen Oberwellen/Harmonischen und daraus
- die Berechnung des Klirrfaktors.
Im folgenden Beispiel soll diese Klirrfaktor-Berechnung an der Sinusausgabe einer EL4732 (±10 V, 10 kSps je Kanal) mit f = 1 kHz, RLoad = 1 kΩ durchgeführt werden.
Es wird ein einfaches Oszilloskop mit FFT-Funktion verwendet: Im Zeitbereich (blau) ist mit 10-fach Oversampling das 1‑kHz-Sinusförmige Signal zu sehen:

Grün ist die FFT-Auswertung. Die daraus abgelesenen Effektivwerte [dBV] (Hinweis: Grundlinie „M“ beachten) und per Vrms = 10-(dBV/20) umgerechnet lauten wie folgt:
Frequenz [kHz] | Effektivwert [dBV] | Effektivwert [Vrms] |
---|---|---|
1 | -4 | 0,630 |
2 | -51 | 0,0028 |
3 | -46 | 0,005 |
4 | -60 | 0,001 |
5 | -53 | 0,002 |
Gemäß der Formel:
ergeben sich 0,92% Klirrfaktor.