Reverse engineering der 5AM BINs

Die Uebersicht

Moderator: gk

Meinolf
Bialbero
Bialbero
Beiträge: 27
Registriert: Donnerstag 20. Februar 2020, 14:04

Reverse engineering der 5AM BINs

Beitrag von Meinolf »

Hi,

ich beschäftige mich seit einigen Jahren mit den BINs, die in den Marelli ECUs der Typen 15M/RC verwendet werden. Diese werden bei Guzzis, ich fahre u.a. V11 und Jackal, und Ducatis verwendet.

Vor etwas über 2 Jahren kamen noch eine Guzzi Norge 12002V und eine Aprilia Mana GT850, die mit 5AM ECUs betrieben werden, dazu.

Anfänglich begannen die Untersuchungen mit ECU Simulatoren, im Laufe der Zeit wurde eine Beschäftigung mit Assembler zur Analyse und dem Reverse Engineering der BINs nötig.

Meine Motorräder sind permanent mit Datenloggern ausgerüstet und im Fahrbetrieb werden Lambda, Drehzahl und TPS gemessen. Zu Beginn wird an den jeweiligen Fahrzeugen noch MAP, Bordspannung und Motortemperatur parallel geloggt. Die Messdaten werden nach Analyse in optimierte BINs überführt.

Die Ergebnisse wurden und werden auf einigen nationalen und internationalen Foren geteilt.

http://www.guzzi-forum.de/Forum/index.php?topic=40728.0 (Nur mit Anmeldung)

https://www.apriliaforum.com/forums/sho ... nformation

https://www.apriliaforum.com/forums/sho ... nformation

https://www.ducati.ms/threads/accelerat ... 807/page-4

https://wildguzzi.com/forum/index.php?t ... msg1481091

Vor einigen Monaten bat mich PaulDaytona, die gewonnenen Erkenntnisse für die Erstellung einer XDF für eine Morini Granpasso zu verwenden. Zu Marke Morini habe ich keinen Bezug und kenne keines der Modelle persönlich, aber die Grundlagen sind in allen 5AM gleich, so leistete ich dem Wunsch Folge. Vor kurzem kam dann noch der Kontakt zu 2 Morini-Fahrern dazu, für die ich dann XDFs für eine Granpasso Scramber und eine Corsaro erstellte.

Der benötigte Zeitaufwand ist erheblich, bis jetzt etwa ein Mannjahr. Die Analyse einer mir unbekannten BIN und der Erstellung einer XDF benötigt, abhängig vom Umfang und One Lambda/Two Lambda, 2-3 Tage. Bei einer tieferen Beschäftigung werden es Wochen.

Damit die gewonnenen Erkenntnisse nicht nur bei mir auf dem Rechner und im Kopf schlummern, habe ich mich hier angemeldet und werde die XDFs und ReadMe verlinken.

Falls jemand die Fähigkeiten und Zeit für eine weitergehende Beschäftigung hat, stelle ich auf Anfrage auch die dissassemblierten und kommentierten i64 (ich benutze IDA Pro 6.6) zur Verfügung.

Dies ist eins meiner Hobbies, es besteht keinerlei kommerzielles Interesse.

Gruss
Meinolf
Meinolf
Bialbero
Bialbero
Beiträge: 27
Registriert: Donnerstag 20. Februar 2020, 14:04

Beitrag von Meinolf »

Hi,

noch einige Erläuterungen zu mir und der verwendeten Systematik in den von mir erstellten BINs.

Ich verfüge über keine Vorkenntnisse bzgl. Programmierung oder Elektronik. Din inzwischen vorhandenen mageren Kenntnisse sind im Selbststudium und mit Unterstützung von Beard (Autor der GuzziDiag SW) angeeignet.

Die 5AM ist für die Verwendung bis hin zu 4-Zylinder Motoren mit manuellem und Automatikgetrieben geeignet. Hardware-Seitig ist bis auf die fehlenden Leistungs-Bausteine für 2 weitere Zündspulen alles vorhanden.

Meine Absprungbasis sind die in den Guzzi CARC Modellen verwendeten BINs. Es gibt 2 Mainstream BINs, die sich durch die Anzahl der verwendeten Lambda-Sonden unterscheiden. Der BIN-Typ 2230 wird bei allen CARC mit einer Lambda-Sonde, der Typ 3222 bei denen mit 2 Lambda-Sonden verwendet.

Daraus ergibt sich, dass in den Kommentaren der Parameter in den XDF regelmäßig auf linken/rechten Zylinder Bezug genommen wird. Bei längs eingebauten V-Motoren entspricht das vorderen/hinterem Zylinder.

Ebenfalls sind in den Kommentaren öfter Hinweise auf RAM-Variable enthalten. Dies hilft mir bei der laufenden Ergänzung der Kommentare, ohne immer im Code nachzuschauen.

Die Syntax der führenden 5 Stellen (xx x xx = Adresse in hex) in den Parameter-Namen wird verwendet, um die Übersicht zu erleichtern. Byte/Word/Doubleword oder Flag erklären sich von selbst, bei Tabellen ist immer ein Table im Namen. Ebenfalls versuche ich durchgehend, im Namen rpm/TPS_Deg/TPS_deg_speed/roadspeed/... zu verwenden, um die Bedeutung auf den ersten Blick erkenntlich zu machen.

Wenn in den Parameter Konvertierungen erfolgen, beruhen diese immer auf den Berechnungen im Code. Es sind keine Konvertierungen enthalten, die aus "kosmetischen" Gründen erfolgten.

Es wird keine Sortierung nach Funktion (Fuel/Ignition/wasauchimmer) oder Read only/User changeable vorgenommen.

In wenigen Fällen führe ich den Namen eines Parameters aus historischen Gründen und zur besseren Wiedererkennung weiter. So z.B. Fuel Phase.

Keine Ahnung, wer wann basierend auf welchen Überlegungen den Namen erstmals in den XDFs der Marelli ECUs eingeführt hat. In der Fachliteratur wird er meines Wissens nicht verwendet. Diese Tabellen oder Skalare sind Gradwerte bezogen auf den OT, an dem die Ansteuerung von Spulen (Zündung und Einspritzung) beendet wird. Mit Fuel oder Phase hat das nichts zu tun.

Bei den Tabellen, ob 1D oder 2D, werden in den Achsen üblicherweise Indizes verwendet. So z.B. rpm/TPS bei den Fuel Main- oder Ignition Main-Tabellen.

Es gibt aber auch vereinzelt Tabellen, in den Integerwerte verwendet werden, die nicht indiziert sind. Ein Beispiel ist die Warm Up-Legende mit den Umdrehungswerten nach Motorstart, üblicherweise 2-2000 Umdrehungen. Diese Werte sind nicht indiziert, sondern werden freihändig eingetragen. (Die Begrenzung auf eine max. Anzahl erfolgt wiederum in einer anderen Tabelle)

In den von mir erstellten Morini XDFs ist nur eine kleine Untermenge der tatsächlich benutzten Skalare und Tabellen enthalten. Diese sind mit Blick auf Verwendbarkeit beim Optimieren der BINs ausgewählt.

Mein Rat, wer nicht weiss was er tut sollte keine Werte-Änderungen alleine auf Basis der Parameter-Kommentare vornehmen, oft werden die Parameter mehrfach verwendet und die resultierenden Auswirkungen sind dann ggfs. vollkommen unerwartet. Es ist kein Zufall, dass die SW-Ingenieure beim OEM bei der Anpassung an ein Modell/Marke häufig Werte im Code so stellen, dass diese in Unterprogrammen keine Änderungen bewirken, z.B. ein Faktor 1, anstelle die Unterprogramme komplett abzuklemmen.

Gruss
Meinolf
Meinolf
Bialbero
Bialbero
Beiträge: 27
Registriert: Donnerstag 20. Februar 2020, 14:04

Beitrag von Meinolf »

Hi,

mangels Kenntnisse der verschiedenen Morini-Modelle folgt die Namensgebung der in den BINs vorhandenen SW- und HW-Kennungen sowie der Anzahl der Lambda-Sonden.

Ich habe versucht, die jeweils mir bekannte aktuellste BIN als Grundlage zu verwenden.

Hier die Links:

Corsaro, aktualisiert auf V1.28
https://drive.google.com/open?id=1YToHr ... iaYdlXCzK6

Granpasso Scrambler
https://drive.google.com/open?id=1lu2D8 ... vcWJmKckWl

Gruss
Meinolf
Zuletzt geändert von Meinolf am Donnerstag 12. März 2020, 10:12, insgesamt 1-mal geändert.
Meinolf
Bialbero
Bialbero
Beiträge: 27
Registriert: Donnerstag 20. Februar 2020, 14:04

Beitrag von Meinolf »

Hi,

einer der interessierten Morini Fahrer (Corsara) hatte im Email-Verkehr noch Fragen. Ich nehme das als Anlass, am Beispiel der Fuel-Kalkulation den Ablauf zu erläutern.

Bild

Nach dem Aufruf der Sub wird zuerst eine Flag überprüft, ob die Idle Fuel Funktion umgangen werden soll. Falls diese gesetzt ist, geht's direkt zur Main Fuel.

Falls nicht, wird der Stand des TPS überprüft. Drei Werte, 1, 2 und 4, stehen für Geschlossen, WOT und Irgendwo dazwischen.

Die Übergänge von Geschlossen zu Irgendwo dazwischen und von Irgendwo dazwischen sind gelernte Werte, die ändern sich im laufenden Betrieb, ausgehend von Startwerten.

Falls das TPS den Wert <> 0, also ganz oder teilweise geöffnet hat, wird erst auf Basis der MainFuel der Einspritzwert für den vorderen Zylinder herausgesucht.

Am Ende der Routine loc_337FE findet sich die Variable curr_cyl_num_D89C. Die wird im laufenden Betrieb abhängig von der Stellung der EPS-Scheibe und den am Sensor vorbei gelaufenen Zahnflanken ständig aktualisiert und dient als Verzweigungsbedingung für den vorderen und hinteren Zylinder.

Wenn diese den Wert 1 hat, wird der zu dem jeweilig aktuellen Stand rpm/TPS der Wert der FuelDeltaTable für den hinteren Zylinder ausgewählt.

Wenn das TPS geschlossen ist, wird in dem linken Block erst die aktuelle Drehzahl ermittelt. Diese dient bei der nachfolgenden IdleFuelTable_4D080 als Index der y-Achse. Das word_D82C wiederum stammt aus einem anderen Unterprogramm und ist die Anzahl der Schritte des Steppermotors. Es wird als Index der x-Achse verwendet. Mit den beiden aktuellen Index-Werten wird der Einspritzwert ermittelt.

Danach dann wieder die Verzweigung zum hinteren Zylinder, wenn der gerade an der Reihe ist.

Gruss Meinolf
Meinolf
Bialbero
Bialbero
Beiträge: 27
Registriert: Donnerstag 20. Februar 2020, 14:04

Beitrag von Meinolf »

Hi,

nach Ermittlung der Einspritzwerte werden diese addiert bzw, wenn ein Delta-Wert negativ ist, subtrahiert.

Bild

Als nächste Sprungbedingung kommt die Lambda Flag 1. Falls gesetzt wird der STFT (Short Term Fuel Trim) Wert auf einen Faktor umgerechnet (Wert/1000=Faktor), mit dem wiederum der aktuelle Einspritzwert multipliziert wird.

Der STFT-Wert (-25% bis +25% sind zuässig) ist eine der beiden Regelgrößen, die im closed loop-Betrieb die Erreichung eines Lambda-Wertes von 1 beeinflussen.

Danach geht's weiter mit den Korrektur-Rechnungen für Luftdruck und Temperatur. FuelAirTempPressureTrimTable_4D9A0 ist eine 2D-Tabelle, indiziert durch Luftdruck und Temperatur. Ich hab's bei Morini nicht überprüft, bei Guzzi kommt der Luftdruck als Teil eines CANBus-Packets vom Dashboard.

In allen mir bekannten BINs ist die Tabelle fehlerhaft, d.h. die eingetragenen Korrekturwerte passen nicht zur allgemeinen Gasgleichung. Ich habe eine Excel-Rechnung zur Ermittlung der korrekten Werte erstellt, die kann ich bei Bedarf verlinken.

Gruss
Meinolf
Meinolf
Bialbero
Bialbero
Beiträge: 27
Registriert: Donnerstag 20. Februar 2020, 14:04

Beitrag von Meinolf »

Hi,

nach der ersten Korrektur wird die Motortemperatur als Regelgröße benutzt.

Nach links gehend der Wert für den vorderen, nach rechts gehend der Wert für den hinteren Zylinder.

Bild

Die sich ergebenden Faktoren werden mit dem aktuellen Einspritzwert multipliziert. An loc_338E0 kommt eine weitere Korrektur-Rechnung, die ich mir bei der Morini BIN nicht angeschaut habe.

Bei Guzzi ist es eine WirbescheissendieZulassungsStelle-Funktion, die im Messbereich der Geräuschermittlung bei der ABE-Prüfung zu einer kurzen Anreicherung und damit Geräuschverringerung führt. DieselGate im kleinen.

Gruss
Meinolf
Zuletzt geändert von Meinolf am Montag 24. Februar 2020, 19:30, insgesamt 1-mal geändert.
Meinolf
Bialbero
Bialbero
Beiträge: 27
Registriert: Donnerstag 20. Februar 2020, 14:04

Beitrag von Meinolf »

Hi,

nachdem das alles abgearbeitet ist, kommt die Warm-up Funktion. Abhängig von gesetztem Wert, der wiederum hängt vom aktuellen Engine Run Mode (0-11 gibt es) ab, wird sie umgangen oder abgearbeitet.

Beim Abarbeiten werden die in FuelWarmUpTable_4E402 verwendeten Werte wieder als Faktoren auf den Einspritzwert angewendet. Die Achsen der Tabellen sind Umdrehungen nach Start und Motortemperatur.

Wenn die Tabelle mit den Motortemperatur-Trimwerten einigermaßen passt, sind aus der FuelWarmUpTable nur die Korrektur-Werte der ersten paar Umdrehungen (bis ~50-60) wichtig.

In diesem Stadium ist die Strömungsgeschwindigkeit sehr gering, das eingespritzte Benzin bildet erstmal eine Pfütze an der Wandung. Erst mit steigender Strömungsgeschwindigkeit gelangt mehr in den Verbrennungsraum, die steigenden Motortemperatur sorgt dann auch für die schnellere Verdunstung.

Bild

Gruss
Meinolf
Meinolf
Bialbero
Bialbero
Beiträge: 27
Registriert: Donnerstag 20. Februar 2020, 14:04

Beitrag von Meinolf »

Hi,

jetzt folgen Bereiche, die ich in der Morini BIN nicht durchkommentiert habe. Wir sind aus der Warm Up-Berechnung raus, es erfolgen Verzweigungen abhängig von der Lambda Flag und dem Engine Run Mode.

Hier käme, wenn die Lambda Flag nicht gesetzt ist, die Berechnung und Anwendung des CO Trim zum Einsatz.

Bild

Danach schlagen die Engine Run Modes zu.

Bild

Die folgende Kommentierung kommt aus einer Guzzi-BIN, deswegen passen die verwendeten Label nicht. Die Bedeutung der verschiedenen Modi ist aber die gleiche.

0: engine stopped
1: start requested / pre-crank
if word_DB5C = 4
2: during warmup / if throttle closed
or throttle closed and curr rpm > target_idle_rpm + RPM_Word_4D294 + RPM_Word_4D296
or mode_2_6_chg_flag_DB76 = 1
or mode_2_6_chg_flag_DB76 = 0 and TPS closed
or mode_2_6_chg_flag_DB76 = 0 and curr rpm < target_idle_speed + RPM_Word_4D298
3: during warmup / if TPS in between and no accel/decel and curr rpm >= target_idle + RPM_Word_4D29A (non-idle fuel mode)
4: during warmup / if accelerating
5: during warmup / throttle closed and curr rpm <= target_idle + RPM_Word_4D294 (idle fuel mode)
6: after warmup / throttle open (main tables)
or throttle closed and curr rpm < target idle + RPM_Word_4D298 (idle fuel mode)
or throttle closed and curr rpm > target_idle_rpm_DB04 + RPM_Word_4D294 + RPM_Word_4D296
or mode_2_6_chg_flag_DB76 = 1 (still unclear when set)
or if rev passed > rev_Table_4D226
7: after warmup / if throttle open and curr rpm < target_idle + RPM_Word_4D294 (idle fuel mode)
8: after warmup / throttle in between and accel (main fuel tables, non-idle fuel mode)
9: after warmup / throttle closed and curr rpm < target idle + RPM_Word_4D29A
if throttle WOT
or throttle in between and accel/decel and curr rpm > target_idle + RPM_Word_4D29A
10: if DB70 = 1 or 2
11: start for run mode selection?
if DB70 = 2
or byte_DB5C <> 4
or if rev passed < rev_Table_4D226

Gruss
Meinolf
Zuletzt geändert von Meinolf am Montag 24. Februar 2020, 19:31, insgesamt 1-mal geändert.
Meinolf
Bialbero
Bialbero
Beiträge: 27
Registriert: Donnerstag 20. Februar 2020, 14:04

Beitrag von Meinolf »

Hi,

damit ist die Berechnung des Einspritzwertes im ersten Teil abgeschlossen. Die Prozedur springt zurück zur aufrufenden Routine.

Dort werden dann die Geschwindigkeitsänderungen des TPS verarztet, also statisch oder über einen Grenzwert (andere Tabelle, einige Skalare) hinaus schnell öffnend oder schließend und als Anreicherung oder Abmagerung bei Beschleunigen oder Verzögern verwendet.

Bild

Im Anschluss geht's dann mit dem final_fuel_left_cyl/final_fuel_right_cyl weiter in die Prozedur, in der die Werte in Öffnungszeiten der Einspritzdüsen konvertiert werden.

Gruss
Meinolf
MonstroMorini
Morinisti
Morinisti
Beiträge: 719
Registriert: Donnerstag 25. November 2010, 09:24
Wohnort: Wormer (NL)
Kontaktdaten:

Beitrag von MonstroMorini »

Danke !!
Greetz,
Rob - In MoMo we trust, sempre pio' force
Meinolf
Bialbero
Bialbero
Beiträge: 27
Registriert: Donnerstag 20. Februar 2020, 14:04

Beitrag von Meinolf »

Hi,

gern geschehen. Bei Interesse an mehr Details bitte melden.

Gruss
Meinolf
1200cc.v2
Corsarino
Corsarino
Beiträge: 15
Registriert: Donnerstag 14. Juni 2018, 22:20

Beitrag von 1200cc.v2 »

Wahnsinn! :shock:

Du hast dir da echt was angetan, ich hoffe ich muss nie auf dieses Wissen zurückgreifen! :wink:

Vielen Dank fürs Teilen! :D
quattro
Morinisti
Morinisti
Beiträge: 1254
Registriert: Sonntag 20. Juni 2010, 16:57
Wohnort: Odenwald

Beitrag von quattro »

Ja, danke für Deine Erkenntnisse,
ist für mich etwa zu abstrakt, was sich da so hinter den bins versteckt.
Für mich waren schon Ebis Einblicke verwirrend.:oops:
Man muss ja nicht alles wissen, entscheidend ist, was beim Kabel hinten raus kommt,
aber schon krass, wie Du Dich da reinkniest.
Hast Du schon mal Rückmeldungen erhalten, von Morinifahrern, die Deine
Dateien ausprobiert haben?
Was sagen Denn unsere Editoren hier dazu?
Grüße, Reinhard
Camel 500 `82
Coguaro 501 `88
Scrambler 1200 `09
NSU Quickly `59
Toyota HJ60 `87
Meinolf
Bialbero
Bialbero
Beiträge: 27
Registriert: Donnerstag 20. Februar 2020, 14:04

Beitrag von Meinolf »

Hallo Reinhard,

"ist für mich etwa zu abstrakt, was sich da so hinter den bins versteckt"
Man sagt, Schönheit liegt im Auge des Betrachters, so auch die Beschäftigung mit diesem Thema. Mit meinem/meinen Beiträgen versuche ich, die durchaus komplexe Materie in besser verständliche Konzepte zu übersetzen.

"Hast Du schon mal Rückmeldungen erhalten, von Morinifahrern, die Deine
Dateien ausprobiert haben?
"
Nein. Mit 2 Morini-Fahrern bin ich im Gespräch und teile meine inzwischen 6-Jährigen Erfahrungen zum Optimieren von BINs.
Nun ist die Anzahl derer, die sich unabhängig von der Motorrad-Marke im Detail damit beschäftigen, ist sehr überschaubar.
Positives Feedback gibt es allerdings zu den BINs, die ich für die verschiedenen Guzzi-Modelle erstellt habe.

Gruss
Meinolf
Meinolf
Bialbero
Bialbero
Beiträge: 27
Registriert: Donnerstag 20. Februar 2020, 14:04

Beitrag von Meinolf »

Hi,

hier und da gibt es auch mal comic relieve.

Wie schon in den BINs anderer Hersteller ist auch bei Morini eine Zeichenkette vorhanden die deutlich macht, für wenn Marelli den Code der 5AM zuerst geschrieben hat.

'S', 'O', 'N', 'O', ' ', 'U', 'N', 'A', ' ', 'D', 'U', 'C', 'A', 'T', 'I',

Frei übersetzt "Ich bin eine Ducati".

Ich habe mich oft gefragt, ob die anderen OEMs von dieser Zeichenkette wissen.

Ebenfalls ein Standard in den BINs der 5AM ist ein, frei beschreibbares, Textfeld im unteren Adressbereich,

ROM:000048BA Comment_Field_48BA:
db 'I','T','_','T','I','M','E','R','_','f','r','e','e'
db '_','r','u','n','n','i','n','g', 0,'A','r','r','a'
db 'y',' ','d','i',' ','7','9',' ','b','y','t','e','s'
db ' ','+',' ','1',' ','a',' ','d','i','s','p','o','s'
db 'i','z','i','o','n','e',' ','p','e','r',' ','c','o'
db 'm','m','e','n','t','i','.','.','.','.','.','.','.'
db 'H','E','_','N','O','T','E','-','H','E','_','N','O'
db 'T','E','-','H','E','_','N','O','T','E'

Als Beleg für die Standfestigkeit der Motoren mögen auch Motortemperatur-Grenzwerte gelten, die den zulässigen Betriebsbereich auf -40°C bis +1500°C beschränken.

Bild

Gruss
Meinolf
Antworten

Zurück zu „Mapping“