HowTo: Einfache Kennfeldanalyse mit VCDS-Lite und Gnuplot

Wer wissen möchte, was sein Motor unter den verschiedenen Betriebsbedingungen genau tut, wird sicher schon mit VCDS (oder einem anderen ähnlichen Tool wie CarPort oder WBH-Diag) die Messwertblöcke angeschaut haben.

In einfachen Fällen reicht es, während der Probefahrt zuzuschauen was gerade passiert.

Etwas aussagekräftiger wird es schon, wenn man sich die Änderung der Werte über der Zeit als Grafik anschaut. Das geht recht einfach mit Excel und Co, wenn man die Werte mitgeloggt hat. VCDS bietet sogar ein eigenes kleines „Oszilloskop“, das im Grunde das gleiche leistet.

Beide Wege führen aber immer nur zu einer Momentaufnahme des gerade gefahrenen Betriebszustandes des Motors. Will man hingegen die Systematik dahinter um z.B. das Regelverhalten bestimmter Größen zu verstehen oder auch den Einfluss irgendwelcher Umbauten, dann ist man darauf angewiesen möglichst alle relevanten Betriebszustände des Motors gleichzeitig zu visualisieren.

In diesem HowTo werde ich mich der AGR-Regelung widmen und an diesem Beispiel erklären, worauf es ankommt. Mit dem gleichen Vorgehen kann ich mir natürlich genauso alle anderen Regelgrößen des Motors anschauen, wie Luftmassen, Ladedruck, Einspritzmengen, Einspritzzeitpunkte, usw…

Die Regelung des AGR-Ventils ist abhängig von der Motorlast und der Drehzahl. Deswegen erhalte ich nur einen sehr eingeschränkten Blick, wenn ich lediglich im Stand vor der Haustür mal eben den Motor hochdrehe und mir dabei den entsprechenden Messwertblock anschaue.

Idealerweise ermittelt man den AGR-Wert für jede Drehzahl und jede Motorlast. Das geht leider präzise nur auf einem entsprechenden Prüfstand und dauert sehr lange. Mit Hausmitteln können wir aber versuchen, die Werte zumindest für möglichst viele Drehzahlen und Motorlasten aufzuzeichnen und Lücken dazwischen dann am Computer rechnerisch aufzufüllen. Das kommt in den allermeisten Fällen der Realität schon sehr nahe.

Schritt 1: Datenaufzeichnung

726f7e709802813d2a544d26bbd02eb0.jpg

Die Datenaufzeichung erfolgt direkt aus VCDS-Lite heraus.

Zuerst sind die Messwertblöcke auszuwählen, an denen wir interessiert sind. Das sollten stets so wenig wie möglich gleichzeitig sein. Warum, erkläre ich gleich. Über den Button ‚Log‘ in der rechten unteren Ecke des Fensters wird die Aufzeichnung der Werte in eine csv-Datei gestartet.

Sobald die Aufzeichnung läuft, kann die Fahrt schon losgehen.

Dabei ist unbedingt zu beachten, daß jeder Messwertblock ca. 0,4 Sekunden für die Übertragung benötigt. D.h. je mehr Daten ich gleichzeitig beobachte umso langsamer geht es voran. Besonders stört dabei, daß die Blöcke zu unterschiedlichen Zeiten übertragen werden. D.h. die Werte aus dem einen Block passen dann zeitlich nicht mehr 100%ig zu den Werten aus dem nächsten, bzw. übernächsten Block.

Der zweite Effekt, den man während der Fahrt berücksichtigen muss ist, daß die Regelsysteme des Motors ebenfalls nicht unendlich schnell arbeiten. Am anschaulichsten ist das sicher beim Turbolader, der eben einen Moment braucht um auf Drehzahl zu kommen.

Aus diesen zwei Gründen müssen wir bei der Testfahrt darauf achten, die Betriebszustände des Motors sehr langsam zu durchfahren. Nur dann hat die Motorsteuerung genug Zeit, vollständig ‚einzuschwingen‘ und auch die jeweiligen Werte korrekt an den Rechner zu übertragen.

In unserem AGR-Beispiel werden wir zum Beispiel versuchen, die Drehzahl ganz langsam von 900 bis auf 4500 Touren hochzudrehen. Das darf gerne 30 Sekunden oder noch länger dauern. Wer hier ungeduldig ist und die Kiste im 2. Gang mit Vollgas in wenigen Sekunden hochjagt wird nur Datenmüll produzieren.

Jegliche schnelle Änderung stört die Daten. Deswegen ist auch eine Testfahrt im fließenden Verkehr mit ständigem Wechsel zwischen Gasgeben und Gaswegnehmen unbrauchbar. Am besten sucht man sich einen verlassenen Wirtschaftsweg oder macht das ganz nachts.

Schritt 2: Datenbereinigung

Am Ende haben wir dann die Logdatei auf dem Rechner, die ungefähr so aussieht:

Wednesday,17,January,2018,01:51:36
038 906 019 LR,1.9l R4 EDC 0001SG 1565,

,Group A:,'020,Group B:,'003,Group C:, Not Running
,RPM,Torque,Inj. Quantity,Inj. Quantity,Engine speed,MAF (specified),MAF (actual),EGR duty cycle,
,TIME,TIME,820-900,230-420,230-420,10-95%,TIME,
Marker,STAMP, /min, Nm, mg/str, mg/str,STAMP, /min, mg/str, mg/str, %,STAMP,
,0.32,903,56.0,70.0,0.0,0.00,903,300.0,303.8,58.2,
,1.00,882,60.0,70.0,0.0,0.66,903,300.0,294.0,57.4,
,1.67,882,62.0,70.0,0.0,1.32,903,310.0,298.9,51.8,
,2.32,903,56.0,70.0,0.0,1.98,903,305.0,323.4,51.0,
,2.96,903,58.0,70.0,0.0,2.64,903,300.0,308.7,56.6,
,3.62,903,58.0,70.0,0.0,3.30,903,310.0,303.8,57.0,

Diese müssen wir nun ein wenig für die spätere Analyse aufbereiten. Das ist ganz einfach: Der Header wird mit ‚#‘ auskommentiert, damit später Gnuplot nicht durcheinander kommt.

Und dann müssen wir die guten von den schlechten Daten trennen. Für unser AGR-Beispiel sind wir ja nur an den Teilen interessiert, in den wir die Drehzahl langsam hochdrehen. Das spätere Abbremsen interessiert nicht und stört nur. Genauso evtl. Fahrtabschnitte zwischen zwei Testläufen. Dazu gehen wir einmal von Hand durch die ganze Datei hindurch un löschen alles, was wir nicht brauchen können, so daß am Ende nur noch die ca. 10 Testläufe übrigbleiben.

Wichtig hier: Zwischen den Testläufen sollte immer eine Leerzeile stehen, aber auch nur da. Das macht die Datenanzeige später etwas hübscher.

Danach sollte die csv-Datei dann ungefähr so aussehen:

# Wednesday,17,January,2018,01:51:36
#038 906 019 LR,1.9l R4 EDC 0001SG 1565,

#,Group A:,'020,Group B:,'003,Group C:, Not Running
#,RPM,Torque,Inj. Quantity,Inj. Quantity,Engine speed,MAF (specified),MAF (actual),EGR duty cycle,
#,TIME,TIME,820-900,230-420,230-420,10-95%,TIME,
#Marker,STAMP, /min, Nm, mg/str, mg/str,STAMP, /min, mg/str, mg/str, %,STAMP,
,639.75,2415,292.0,70.0,0.0,640.07,2457,850.0,1004.5,4.8,
,640.39,2478,314.0,70.0,0.0,640.72,2541,850.0,931.0,4.8,
,641.03,2562,262.0,70.0,0.0,641.37,2604,850.0,901.6,4.8,
,641.69,2625,262.0,70.0,0.0,642.01,2667,850.0,921.2,4.8,
,642.34,2688,260.0,70.0,0.0,642.65,2709,850.0,935.9,4.8,
,642.99,2751,254.0,70.0,0.0,643.33,2793,850.0,935.9,4.8,
,643.66,2814,250.0,70.0,0.0,643.99,2835,850.0,935.9,4.8,
,644.31,2856,246.0,70.0,0.0,644.65,2898,850.0,935.9,4.8,
,644.96,2919,280.0,70.0,0.0,645.31,2961,850.0,999.6,4.8,
,645.63,2982,276.0,70.0,0.0,645.95,3024,850.0,950.6,4.8,
,646.30,3045,270.0,70.0,0.0,646.63,3087,850.0,921.2,4.8,
,646.97,3108,250.0,70.0,0.0,647.29,3129,850.0,896.7,4.8,
,647.62,3150,242.0,70.0,0.0,647.96,3171,850.0,891.8,4.8,
,648.29,3192,238.0,70.0,0.0,648.66,3213,850.0,886.9,4.8,
,648.98,3234,176.0,70.0,0.0,649.33,3234,820.0,847.7,4.8,
,649.64,3255,184.0,70.0,0.0,649.96,3255,845.0,769.3,4.8,
,650.30,3276,190.0,70.0,0.0,650.63,3297,850.0,774.2,4.8,
,650.97,3297,194.0,70.0,0.0,651.30,3318,850.0,764.4,4.8,
,651.63,3339,194.0,70.0,0.0,651.97,3339,850.0,764.4,4.8,
,652.29,3360,190.0,70.0,0.0,652.62,3360,800.0,676.2,4.8,
,652.97,3360,172.0,70.0,0.0,653.30,3381,825.0,715.4,4.8,
,653.62,3381,186.0,70.0,0.0,653.95,3318,630.0,583.1,4.8,

,665.54,2100,62.0,70.0,0.0,665.87,2100,305.0,308.7,64.9,
,666.20,2100,70.0,70.0,0.0,666.53,2079,310.0,303.8,60.2,
,666.85,2079,66.0,70.0,0.0,667.18,2079,320.0,303.8,57.0,
,667.51,2079,68.0,70.0,0.0,667.85,2079,320.0,318.5,59.0,
,668.18,2079,70.0,70.0,0.0,668.51,2079,380.0,357.7,51.4,
,668.86,2079,84.0,70.0,0.0,669.17,2079,380.0,416.5,62.6,
,669.51,2079,82.0,70.0,0.0,669.85,2079,380.0,382.2,65.3,
,670.18,2079,84.0,70.0,0.0,670.51,2079,395.0,362.6,61.4,
,670.83,2079,86.0,70.0,0.0,671.17,2058,390.0,367.5,57.4,
,671.48,2079,84.0,70.0,0.0,671.83,2079,385.0,377.3,55.8,
,672.17,2079,82.0,70.0,0.0,672.49,2079,385.0,387.1,56.2,
,672.83,2079,86.0,70.0,0.0,673.15,2079,385.0,387.1,59.4,
,673.49,2058,88.0,70.0,0.0,673.83,2079,400.0,401.8,61.0,
,674.16,2079,82.0,70.0,0.0,674.49,2079,390.0,396.9,62.6,
,674.80,2079,86.0,70.0,0.0,675.15,2079,390.0,387.1,64.5,
,675.46,2079,84.0,70.0,0.0,675.81,2079,385.0,382.2,65.3,

,727.60,1491,72.0,70.0,0.0,727.94,1512,285.0,298.9,84.5,
7,728.28,1512,70.0,70.0,0.0,728.62,1533,280.0,298.9,84.5,
,728.95,1533,68.0,70.0,0.0,729.26,1554,305.0,298.9,84.5,
,729.60,1554,88.0,70.0,0.0,729.92,1596,565.0,475.3,39.0,
,730.27,1617,144.0,70.0,0.0,730.60,1659,565.0,578.2,49.0,
,730.94,1701,154.0,70.0,0.0,731.27,1743,660.0,730.1,46.2,
,731.58,1785,176.0,70.0,0.0,731.93,1827,675.0,651.7,51.4,
,732.24,1890,178.0,70.0,0.0,732.57,1932,665.0,622.3,52.2,
,732.90,1974,178.0,70.0,0.0,733.22,2016,685.0,637.0,51.8,
,733.56,2058,182.0,70.0,0.0,733.88,2121,675.0,651.7,58.2,
,734.23,2163,180.0,70.0,0.0,734.56,2226,695.0,646.8,55.4,
,734.89,2268,178.0,70.0,0.0,735.23,2310,700.0,686.0,50.6,
,735.54,2352,176.0,70.0,0.0,735.89,2394,685.0,700.7,54.2,
,736.22,2457,168.0,70.0,0.0,736.55,2499,660.0,681.1,59.0,
,736.88,2541,168.0,70.0,0.0,737.20,2583,640.0,651.7,60.2,
,737.54,2625,164.0,70.0,0.0,737.86,2667,635.0,627.2,59.4,
,738.20,2709,160.0,70.0,0.0,738.54,2751,640.0,612.5,53.0,
,738.86,2793,156.0,70.0,0.0,739.21,2814,645.0,637.0,49.8,
,739.52,2856,154.0,70.0,0.0,739.87,2898,650.0,641.9,49.4,
,740.20,2919,152.0,70.0,0.0,740.52,2961,655.0,641.9,48.6,
,740.85,2982,148.0,70.0,0.0,741.16,3024,655.0,646.8,47.8,
,741.51,3045,146.0,70.0,0.0,741.84,3066,675.0,646.8,46.2,
,742.17,3108,148.0,70.0,0.0,742.50,3129,695.0,686.0,4.8,
,742.82,3150,146.0,70.0,0.0,743.16,3171,715.0,676.2,4.8,
,743.48,3213,150.0,70.0,0.0,743.82,3234,740.0,676.2,4.8,
,744.16,3255,152.0,70.0,0.0,744.48,3276,760.0,671.3,4.8,
,744.82,3297,150.0,70.0,0.0,745.14,3339,775.0,661.5,4.8,
,745.48,3360,152.0,70.0,0.0,745.80,3381,800.0,671.3,4.8,
,746.12,3402,160.0,70.0,0.0,746.45,3423,815.0,686.0,4.8,
,746.78,3465,160.0,70.0,0.0,747.12,3486,835.0,676.2,4.8,
,747.44,3507,170.0,70.0,0.0,747.77,3549,850.0,686.0,4.8,
,748.10,3570,160.0,70.0,0.0,748.42,3591,850.0,627.2,4.8,
,748.76,3612,134.0,70.0,0.0,749.08,3633,850.0,622.3,4.8,
,749.42,3654,142.0,70.0,0.0,749.76,3675,850.0,627.2,4.8,
,750.08,3675,162.0,70.0,0.0,750.42,3717,850.0,695.8,4.8,
,750.74,3738,176.0,70.0,0.0,751.09,3759,850.0,695.8,4.8,
,751.40,3801,184.0,70.0,0.0,751.74,3843,850.0,690.9,4.8,
,752.07,3864,186.0,70.0,0.0,752.39,3906,850.0,686.0,4.8,
,752.74,3927,186.0,70.0,0.0,753.08,3969,850.0,676.2,4.8,
,753.42,3990,192.0,70.0,0.0,753.74,4032,850.0,666.4,4.8,
,754.07,4053,194.0,70.0,0.0,754.41,4095,850.0,681.1,4.8,
,754.73,4137,194.0,70.0,0.0,755.08,4158,850.0,681.1,4.8,
,755.42,4200,190.0,70.0,0.0,755.75,4242,850.0,700.7,4.8,
,756.08,4263,196.0,70.0,0.0,756.40,4284,850.0,681.1,4.8,
,756.74,4305,184.0,70.0,0.0,757.08,4305,850.0,494.9,4.8,

Schritt 3: Grafische Darstellung

Spätestens jetzt wird es Zeit, sich Gnuplot herunterzuladen und zu installieren: www.gnuplot.info/

GnuPlot wird über die Kommandozeile gesteuert. Das ist zwar am Anfang etwas komplizierter als nur mit der Maus herumzuklicken, hat aber den riesigen Vorteil, daß man alles, was man tut als Skript abspeichern und damit dann spätere komplizierte Analysen mehr oder weniger vollautomatisch durchführen kann.

Ich werde hier nun auf ein paar einfache Beispiel eingehen, die die meisten Anwendungen für die Kennfelddarstellung abdecken.

# Hier haben wir bereits ein gnuplot-Skript vor uns. Das kann man so in einer einfachen Textdatei abspeichern.
# Genauso kann man jeden Befehl einzeln auf der Kommandozeile von Gnuplot eintippen und erhält dann direkt das Ergebnis.

set datafile separator comma # Die Felder in der csv-Datei sind durch Komma getrennt.
set grid # Dies schaltet das Hintergrund-Raster im Diagramm ein.

set title ‚AGR Ansteuerung [%] / ursprüngliche Messreihen‘
set xlabel ‚Drehzahl [1/min]‘
set xrange [500:5000] # Skala der X-Achse von 500 rpm bis 5000 rpm
set ylabel ‚Drehmoment [Nm]‘
set yrange [0:350] # Skala der Y-Achse von 0 bis 350 Nm
set zlabel ‚AGR [%]‘ rotate parallel
set zrange [*:*] # Skala der Z-Achse wird automatisch gesetzt, je nach Werten in der csv-Datei
set cbrange [0:90] # Farbskala reicht von 0 bis 90%

set view map # Hiermit schauen wir genau von oben auf das Diagramm, wie auf eine Karte.
# Dann verschwindet die Z-Achse
# Ohne dieses Kommando erhalte ich eine richtige 3D-Grafik die ich auch mir der Maus bewegen kann.

splot ‚filename.csv‘ using 3:4:11 with lines palette lw 2 # Dies löst das eigentlich Malen aus.

Der letzte Befehl ist der interessanteste.

Hier wird die csv-Datei geöffnet und daraus die Spalten 3, 4 und 11 ausgewählt für die X, Y und Z-Achse.

‚with lines‘ bedeutet, daß die Testfahrten als Linie gezeichnet werden und nicht nur als einzelne Datenpunkte. ‚lw 2‘ macht die Linie etwas dicker.

‚palette‘ färbt die Linien entprechend ihrer Höhe auf der Z-Achse ein.

Das Ergebnis sieht dann so aus:

Diese Ansicht ist sehr wichtig und hilfreich, um vor den nächsten noch viel schöneren Grafiken zu schauen, ob die einzelnen Testläufe plausibel sind, keine totalen Ausreißer dabei und wir auch sonst oben bei Schritt 2 keinen Datenmüll übersehen haben.

Als nächstes füllen wir die Lücken zwischen den einzelnen Testläufen und malen daraus eine schöne 3D-Grafik.

set datafile separator comma
set grid
set hidden3d

set title 'AGR Ansteuerung [%] ’
set xlabel ‚Drehzahl [1/min]‘
set ylabel ‚Drehmoment [Nm]‘
set zlabel ‚AGR [%]‘ rotate parallel
set xrange [500:5000]
set yrange [0:350]
set zrange [0:100]
set cbrange [0:90]
set xyplane at 0

set view 60, 170 # Blickwinkel auf die 3D Grafik

set dgrid3d 50,100 hann 100,50 # Hiermit werden die Lücken aufgefüllt. 100,50 gibt die „Reichweite“ des Füllens an.

Hier kann man sich gerne austoben und experimentieren, was gut aussieht.

splot ‚filename.csv‘ using 3:4:11 with lines palette

Dieses Ergebnis erwartet uns:

Eine andere Ansicht ist die sogenannte Heat-Map. Das ist eine 2D-Ansicht von oben, bei der die Z-Achse, also die Höhe nur als Farbe dargestellt wird.

set datafile separator comma
set grid

set title ‚AGR Ansteuerung [%] (‘.ARG1.’)’
set xlabel ‚Drehzahl [1/min]‘
set ylabel ‚Drehmoment [Nm]‘
set zlabel ‚AGR [%]‘ rotate parallel
set xrange [500:5000]
set yrange [0:350]
set zrange [0:100]
set cbrange [0:90]

set view map

set dgrid3d 50,100 hann 100,50

set pm3d at b # Dies generiert die Heatmap

splot ‚filename.csv‘ using 3:4:11 with lines palette

Und so siehts aus:

Bis jetzt haben wir die Grafik immer in einem Fenster auf dem Bildschirm ausgegeben. Wer das lieber gleich in eine jpeg Datei speichern will (praktisch bei Batchverarbeitung), fügt einfach vor dem ‚splot‘ diese beiden Zeilen ein:

set terminal jpeg size 1280,720 lw 2
set output ‚Bild.jpg‘

2 „Gefällt mir“