Hello,
Donc j'ai testé cette technique et ça a l'air de bien marcher.
Malheureusement, ma vanne (ou le faisceau) est morte et j'ai des valeurs invalides sur RCO et recopie. Je peux donc pas checker sur le graphique.
J'essayerai de le faire avec un autre ECU.
J'ai mis un plaque devant la vanne, j'avais des défaut de débit d'air et de recirculation de gaz insuffisante. J'ai patché la valeur avec 0x17 0x70 (6000 tours) et plus de défaut de débit d'air. La voiture semble mieux se comporter également.
Ce bout de code trouve l’adresse de AirCtl_nMin_C sur l'ensemble de ma collection de dump (edc16c34 1.6 hdi 90cv et 110cv).
Code:
private void findEGRLimit() {
// Try to find address of AirCtl_nMin_C (Engine speed threshold for EGR shut-off, in rpm)
// Search for address of AirCtl_nMaxHi_C/AirCtl_nMaxLo_C (We assume that the difference
// between this 2 values is 200RPM or 250RPM)
// Immediately follow AirCtl_nMin_C
// Standard values for AirCtl_nMin_C are 650 or 700 RPM
boolean eos = false;
int start = 2600;
int diff = 200;
while(!eos) {
int hMaxHi = (start+diff) >> 8;
int lMaxHi = (start+diff) & 0xFF;
int hMaxLo = start >> 8;
int lMaxLo = start & 0xFF;
egrLimitAdd = search(0x1C0000,toByte(new int[]{hMaxHi,lMaxHi,hMaxLo,lMaxLo}));
if(egrLimitAdd!=-1) {
egrLimitAdd += 4;
egrLimit = ((((int) memory[egrLimitAdd]) & 0xff) << 8) + (((int) memory[egrLimitAdd + 1]) & 0xff);
eos = egrLimit == 700 || egrLimit == 650;
if( !eos ) {
// Try a second match
egrLimitAdd = search(egrLimitAdd,toByte(new int[]{hMaxHi,lMaxHi,hMaxLo,lMaxLo}));
if(egrLimitAdd!=-1) {
egrLimitAdd += 4;
egrLimit = ((((int) memory[egrLimitAdd]) & 0xff) << 8) + (((int) memory[egrLimitAdd + 1]) & 0xff);
eos = egrLimit == 700 || egrLimit == 650;
}
}
}
if(!eos) {
start += 50;
if(start>=3600) {
diff += 50;
if(diff>250) {
// Fail !
eos = true;
} else {
start = 3000;
}
}
}
}
}
}