Forum: Mikrocontroller und Digitale Elektronik OBD-Daten via CAN


von Joachim .. (joachim_01)


Lesenswert?

Moin,
ich habe gestern in ersten Gehversuchen probiert, ein paar OBD-Daten aus 
einem Peugeot 207 über CAN auszulesen. Am Simulator habe ich Drehzahl, 
Geschwindigkeit, Motortemperatur und Rahmennummer fehlerfrei lesen 
können. Allerdings sendete der Simulator manche Frames wohl doppelt, es 
gab aber zumindest auf meiner Empfängerseite keinen Eintrag im RX/TX 
Fehlerregister. Als ich die gleichen Allerwelts-Daten im Auto abfragen 
wollte, bekam ich über das Display des Bordrechners die Meldung: "System 
ESP/ASR defekt".

- Muß sich ein Teilnehmer am Bus in irgendeiner Form anmelden, damit die 
Hersteller-Software überhaupt mit ihm spricht?
- Ist meine Software fehlerhaft/nicht vollständig?

von Georg G. (df2au)


Lesenswert?

Moin,

Joachim ... schrieb:

> Als ich die gleichen Allerwelts-Daten im Auto abfragen
> wollte, bekam ich über das Display des Bordrechners die Meldung: "System
> ESP/ASR defekt".
Das sollte dir zu denken geben.

> - Muß sich ein Teilnehmer am Bus in irgendeiner Form anmelden, damit die
> Hersteller-Software überhaupt mit ihm spricht?
Nein, du bist nur der Lauscher an der Wand. Alles andere ist gefährlich.

> - Ist meine Software fehlerhaft/nicht vollständig?
Fehlerhaft. Offensichtlich sendest du auf dem Bus. Das kann tolle 
Effekte als Folge haben.

von Soul E. (Gast)


Lesenswert?

Georg G. schrieb:

>> - Ist meine Software fehlerhaft/nicht vollständig?
> Fehlerhaft. Offensichtlich sendest du auf dem Bus. Das kann tolle
> Effekte als Folge haben.

Wie soll man OBD-Daten anfordern ohne zu senden??

Er sendet vielleicht auf den falschen Identifiern, das trifft's wohl 
eher. Oder zu oft und die zusätzliche Buslast bringt das Timing 
durcheinander. Manche Steuergeräte werden ziemlich böse wenn sie nicht 
ziemlich genau zum gleichen Zeitpunkt senden dürfen.

von Joachim .. (joachim_01)


Lesenswert?

>Offensichtlich sendest du auf dem Bus.
Naja, was heißt senden? Senden tust du immer, du mußt ja eine Anfrage 
wegschicken.
 Hier mal das Wesentliche:

1
void sendDataToECU(uint32_t ul_can_datal, uint32_t ul_can_datah){
2
  can_reset_all_mailbox(CAN0);
3
  can_reset_all_mailbox(CAN1);
4
  
5
  /* Init CAN1 Mailbox 0 to Reception Mailbox. */
6
  reset_mailbox_conf(&can1_mailbox);
7
  can1_mailbox.ul_mb_idx = TEST1_CAN_COMM_MB_IDX;  //mailbox 0
8
  can1_mailbox.uc_obj_type = CAN_MB_RX_MODE;
9
  can1_mailbox.ul_id_msk = CAN_MAM_MIDvA_Msk | CAN_MAM_MIDvB_Msk; //CAN 2.0A + B
10
  can1_mailbox.ul_id = CAN_MID_MIDvA(0x7E8);  //get 7E8 from engine control module
11
  can_mailbox_init(CAN1, &can1_mailbox);
12
  
13
  /* Init CAN0 Mailbox 0 to Transmit Mailbox. */
14
  reset_mailbox_conf(&can0_mailbox);
15
  can0_mailbox.ul_mb_idx = TEST1_CAN_COMM_MB_IDX;  //mailbox 0
16
  can0_mailbox.uc_obj_type = CAN_MB_TX_MODE;
17
  can0_mailbox.uc_tx_prio = TEST1_CAN0_TX_PRIO;
18
  can0_mailbox.uc_id_ver = 0; // 0 stands for standard frame
19
  //can0_mailbox.ul_id_msk = 0;
20
  can0_mailbox.ul_id_msk = CAN_MAM_MIDvA_Msk | CAN_MAM_MIDvB_Msk; //CAN 2.0A + B
21
  can_mailbox_init(CAN0, &can0_mailbox);
22
23
  /* Write transmit information into mailbox. */
24
  can0_mailbox.ul_id = CAN_MID_MIDvA(0x7DF);  // engine control module  
25
  
26
  can0_mailbox.uc_length = MAX_CAN_FRAME_DATA_LEN; // 8bytes
27
  can0_mailbox.ul_datal = ul_can_datal;
28
  can0_mailbox.ul_datah = ul_can_datah;
29
  can_mailbox_write(CAN0, &can0_mailbox);
30
  
31
  /* Enable CAN1 mailbox 0 interrupt. */
32
  can_enable_interrupt(CAN1, CAN_IER_MB0);
33
34
  /* Send out the information in the mailbox. */
35
  can_global_send_transfer_cmd(CAN0, CAN_TCR_MB0);
36
  g_uc_waitForCanInterrupt = 1;
37
  
38
  //Let's wait for the response
39
  while (!g_ul_recv_status);
40
  g_ul_recv_status = 0;
41
  g_uc_waitForCanInterrupt = 0;
42
}

Und die Transportdaten:
1
  // Byte 7..4: 0
2
  // Byte 3: 0
3
  // Byte 2: 0x0C = rpm, 0x05 = coolant temp, ...
4
  // Byte 1: 01 ISO TP PCI Byte
5
  // Byte 0: 02 OBD SID
6
  //
7
  // let's send some data:
8
  // ID: 7DF DLC: 08 Bytes: 02 01 00 FF FF FF FF FF
9
10
  // rpm
11
  ul_datal = 0x000C0102;  //
12
  ul_datah = 0x00000000;
13
  sendDataToECU(ul_datal, ul_datah);  
14
  // Now let's read some data from the ecu
15
  // decode rpm:
16
  messageLo = can1_mailbox.ul_datal;
17
  ...
18
  ...
19
20
  //coolant temp
21
  ul_datal = 0x00050102;  // ect
22
  ul_datah = 0x00000000;
23
  sendDataToECU(ul_datal, ul_datah);
24
  //decode response
25
  messageLo = can1_mailbox.ul_datal;
26
  ...
27
  ...
28
  //vehicle speed
29
  ul_datal = 0x000D0102;  // 0x0D = vehicle speed
30
  ul_datah = 0x00000000;
31
  sendDataToECU(ul_datal, ul_datah);
32
  //decode response
33
  messageLo = can1_mailbox.ul_datal;
34
  ...
35
  ...
36
37
  //vehicle information number:
38
  //1st frame
39
  ul_datal = 0x00020902;  //
40
  ul_datah = 0x00000000;
41
  sendDataToECU(ul_datal, ul_datah);
42
  //decode response
43
  messageHi = can1_mailbox.ul_datah;
44
  ...
45
  ...
46
  //2nd frame
47
  //Flow Control Frame. The message format is:
48
  //ID B1 B2 B3 B4 B5 B6 B7 B8
49
  //??? 30 00 00 na na na na na
50
  ul_datal = 0x00000030;  //
51
  ul_datah = 0x00000000;
52
  sendDataToECU(ul_datal, ul_datah);
53
  messageLo = can1_mailbox.ul_datal;
54
  ...
55
  ...
56
57
  
58
  
59
  //3rd frame
60
  //Flow Control Frame. The message format is:
61
  //ID B1 B2 B3 B4 B5 B6 B7 B8
62
  //??? 30 00 00 na na na na na
63
  ul_datal = 0x00000030;  //
64
  ul_datah = 0x00000000;  
65
  sendDataToECU(ul_datal, ul_datah);  
66
  messageLo = can1_mailbox.ul_datal;
67
  ...
68
  ...      
69
  }


Hm... jetzt, wo ich die Zeilen poste komt mir gerade ein Verdacht... 
irgendwo las ich mal, daß ein Teilnehmer in der Lage sein muß 
selbstständig die 11-bit Standard ID von der 29-bit Extended ID zu 
unterscheiden... grummel...

von Joachim .. (joachim_01)


Lesenswert?

>Oder zu oft und die zusätzliche Buslast bringt das Timing
>durcheinander. Manche Steuergeräte werden ziemlich böse wenn sie nicht
>ziemlich genau zum gleichen Zeitpunkt senden dürfen.

Ich glaube, das ist es...
Ich hatte anfangs nämlich zyklisch alle 100ms  in einer Schleife 
angefragt... und das aus Bequemlichkeit im Code gelassen...

von Bad U. (bad_urban)


Lesenswert?

Joachim ... schrieb:
> Als ich die gleichen Allerwelts-Daten im Auto abfragen
> wollte, bekam ich über das Display des Bordrechners die Meldung: "System
> ESP/ASR defekt".

Das ist wohl normal. Ist bei meinem Audi mit VCDS auch so. Es erscheint 
die Fehlermeldung im FIS wenn das Steuergerät gescant wird.
Warum das so ist weiß ich auch nicht. Aber ich hab mir sagen lassen, 
dass dies sogar im Handbuch beschrieben ist.

von Erwin R. (erwin_r54)


Lesenswert?

Joachim ... schrieb:
> Am Simulator habe ich Drehzahl,
> Geschwindigkeit, Motortemperatur und Rahmennummer fehlerfrei lesen
> können. Allerdings sendete der Simulator manche Frames wohl doppelt, es
> gab aber zumindest auf meiner Empfängerseite keinen Eintrag im RX/TX
> Fehlerregister.

Darf ich fragen, um welchen Simultor es sich handelt?
Ich frage das, weil ich selber OBD2-Simulatoren entwickelt habe und es 
ziemlichen Müll auf dem Markt gibt.

Bitte unbedingt vorsichtig sein, wenn man eine Befehl auf den CAN-Bus 
des Fahrzeugs schickt. Dies bitte niemals während der Fahrt tun, ich 
habe mehrfach erlebt, dass Steuergeräte abgestürzt sind und eine 
Weiterfahrt nur möglich war, nachdem der Diagnoseadapter entfernt und 
Zündung aus- und wieder eingeschaltet wurde.

Erwin

von rcc (Gast)


Lesenswert?

Bad Urban schrieb:
> Das ist wohl normal. Ist bei meinem Audi mit VCDS auch so. Es erscheint
> die Fehlermeldung im FIS wenn das Steuergerät gescant wird.

mit nem OBD Scanner kommt man nicht ins ESP, OBD ist rein für 
abgasrelevante Bauteile. Tester und Fahrzeugdiagnose ist nochmal eine 
andere Baustelle.

von Soul E. (Gast)


Lesenswert?

...aber ansonsten stimmts. Wenn ein Diagnosejob aktiv ist, wird die 
ESP-Lampe eingeschaltet.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.