Pāriet pie satura

CAN dekodavimas tikrinant BMW kuro siurblį

Perskaičius antrąjį forumo įrašą apie BMW F31 N47 žemo slėgio kuro siurblio valdiklį ir CAN ID 3 35, tapo nebeįmanoma atsispirti pagundai giliau panagrinėti su šiuo ID susietą duomenų lauką (payload).

Štai antrojo forumo įrašo santrauka:

  • ID 3 35 dingsta, kai kuro siurblio valdiklis atjungiamas nuo CAN tinklo.
  • ID 3 35 siunčiamas CAN magistrale ir tada, kai kuro siurblys įjungtas, ir tada, kai jis stovi. Tačiau siurbliui veikiant duomenų laukas nuolat atnaujinamas kas 1 sekundę.
  • ID 3 35 pirmą kartą išsiunčiamas 50 ms prieš paleidimo srovės šuolį į kuro siurblį (trigerio taškas).

Kadangi įrodėme, jog šis ID susijęs su kuro siurblio veikimu, parašiau šį tekstą, kad pasidalyčiau savo bandymais iššifruoti su CAN ID 3 35 susietą duomenų lauką.

Diagnostikos skaitytuvu atlikome aktyvųjį testą su prijungtu akumuliatoriaus palaikymo šaltiniu ir išjungtu varikliu. Skaitytuvas siūlė tris kuro siurblio paleidimo variantus: 60 l/h, 120 l/h ir visu pajėgumu (be užpildos valdymo). 

Šioje ekrano nuotraukoje matote žemo slėgio kuro siurblį, veikiantį 120 l/h našumu.

Kuro siurblys per kuro siurblio valdiklį valdomas teigiamu užpildos koeficientu. Tai matote juodame matematiniame kanale, kurį įtraukiau į aukščiau pateiktą įrašą. Jei norite daugiau sužinoti apie užpildos matematinius kanalus, žiūrėkite čia. Iš formulės pašalinau minuso ženklą, nes šio tipo kuro siurbliui reikia teigiamos užpildos.

Dabar pažiūrėkime, kaip dekoduoti kuro siurblio valdiklio duomenų lauką (CAN ID 3 35). Kuro siurblio įjungimo metu naudojau dekodavimą „tarp laiko žymeklių“. Rasite daugiau informacijos ir patarimų apie dekodavimą čia.

2 paveikslėlyje matote CAN srauto, esančio veikiant kuro siurbliui, dekodavimo nustatymus.

3 paveikslėlyje į dekodavimo lentelę pridėjau filtrą, kad būtų rodomas tik ID 3 35 (tarp laiko žymeklių), taip leidžiant visiškai susitelkti į šiuos aktualius duomenų paketus.

Atkreipkite dėmesį, kad CAN ID 3 35 siunčiamas magistrale ir kuro siurbliui veikiant, ir jam stovint, o duomenų laukas (payload) siurbliui veikiant nuolat atnaujinamas kas 1 sekundę. Naudojau sukimosi žymeklius ir padalas (jų reikšmes, paprastai išreiškiamas laipsniais, pakeičiau į sekundes) ir išdėsčiau jas grafike taip, kad žymėtų kiekvienos kuro siurblio valdiklio siuntos pradžios laiką (po trigerio). Tai padeda susieti CAN pranešimų iš kuro siurblio valdiklio siuntimo dažnį su siurblio veikimu.

Tad kaip duomenų lauką paversti žmogui suprantamais duomenimis?

Neturint gamintojo duomenų bazės failo (.dbc failo), atsakymas yra „daug sunkaus darbo ir šiek tiek sėkmės!”.

Pirmiausia turime suprasti, kaip mūsų dekodavimo lentelės duomenų laukas atspindi žmogui suprantamus duomenis, šiuo atveju – dešimtaines reikšmes.

Greitas būdas – dekodavimo lentelėje perjungti šešioliktainę sistemą į dešimtainę. Tačiau atminkite, kad mūsų CAN ID 3 35 dešimtainėje sistemoje tampa 3 53 (todėl filtruoti reikia 3 53 dešimtainį, o ne 3 35 šešioliktainį).

Spėju, kitas klausimas toks: kaip ID 3 35 (šešioliktainis) virsta 3 53 (dešimtainiu) ir kam viso to reikia?

Pagrindinė priežastis, kodėl naudojame šešioliktainę sistemą , yra ta, kad ja galime pavaizduoti didelius skaičius mažesniu skaitmenų kiekiu, o mums, žmonėms, tai lengviau interpretuoti. Nors PicoScope dekodavimo lentelė gali rodyti duomenis šešioliktaine, dvejetaine, dešimtaine sistemomis ir ASCII formatu, vos du šešioliktainiai skaitmenys supaprastina vaizdą analizei.

Pavyzdžiui, dešimtainis skaičius 12 500 dvejetainėje sistemoje yra 0000 1101 0100, arba 30D4 šešioliktainėje sistemoje.

Čia turime pagalbinę lentelę, padedančią šešioliktaines reikšmes paversti dešimtainėmis, kai du skaitmenys gali atvaizduoti 256 skirtingas reikšmes (įskaitant nulį). Atkreipkite dėmesį: paryškinau mūsų CAN ID 3 35 (šešioliktainio) pavertimą į CAN ID 3 53 (dešimtainį).

Prieš tęsdamas:  dažnai matome skaitmenis ar reikšmes, užrašytas kaip 0x52 arba 0x98. Priešdėlis 0x nurodo, kad rodomos reikšmės yra šešioliktainės, nes be raidžių (A–F) tai gali būti ne iš karto akivaizdu (0x52 = 82 dešimtainis, o 0x98 = 152 dešimtainis).

Grįšiu prie dekodavimo lentelės šešioliktainėje sistemoje (3 pav.), o ne dešimtainėje, kad paaiškinčiau, kaip šie du skaitmenys nurodo duomenų bitus, pusbaidžius (nibble) ir baitus ir kaip jais galima atvaizduoti 256 skirtingas reikšmes. Tikiuosi, tai padės suprasti, kaip CAN duomenys sudaromi, priskiriami ir interpretuojami.

Įprastą CAN pranešimą sudaro 8 baitai duomenų. Kaip pavyzdį paėmę 3 paveikslėlį matome, kad 1-ojo paketo duomenų ilgio kodas DLC = 8 baitai duomenų, perduotų šiame pakete.

Pastaba: CAN paketu vadinamas visas CAN kadras, kurį sudaro:

ID, RTR, FDF, DLC, Data, CRC, ACK, CRC Valid, Bit Stuffing Valid, Valid ir IDE.

Duomenų lauke yra po du šešioliktainius skaitmenis, sugrupuotus taip, kad atvaizduotų kiekvieną duomenų baitą (iš viso 8 baitai).

1-ojo paketo duomenų baitai = 00 C8 00 00 00 7E 00 00

Kiekvieną baitą sudaro 8 bitai (1 bitas yra mažiausias kompiuterinės atminties vienetas) – dvejetainis 1 arba 0 (CAN diferencinė įtampa atitinkamai 0 V arba 2 V), ir tai yra CAN tinklo valdiklių kalba.

Verta paminėti, kad 8 bitai skirstomi į dvi dalis po 4 bitus, o kiekviena tokia dalis vadinama pusbaidžiu („Nibble“, pusė baito).

Tad kaip šešioliktainė sistema dvejetainėmis reikšmėmis atvaizduoja dešimtainius vienetus ir kam to reikia?

Vėlgi, viskas dėl to, kad žmogui būtų lengviau suprasti hipnotizuojančią dvejetainę sistemą (kompiuterio kalbą paverčiant žmogaus kalba).

Toliau pateiktame paveikslėlyje duomenų laukas suskaidytas į visus 8 baitus, sunumeruotus nuo 0 iki 7 baito.

Taip pat pateikiame dešimtaines / dvejetaines reikšmes, į pusbaidžius sugrupuotus bitus ir bitų numeraciją bei padėtis.

Pažvelkime į aukščiau pateiktą duomenų lauką, ypač į 1 baitą 0xC8 (200 dešimtainis).

        C                    8
8   4   2   1      8  4  2  1  (bito dešimtainė vertė)
1   1   0   0      1  0  0  0  Dvejetainis (1 arba 0) iš 8 bitų (1 baitas), sugrupuotų į 2 pusbaidžius (po 4 bitus).

Norėdami apskaičiuoti 0xC ir 0x8 dešimtaines reikšmes, turime sudėti kiekvieno dvejetainio bito atstovaujamus dešimtainius vienetus. Taigi C lygu 8 + 4 + 0 + 0 = 12, o 8 = 8 + 0 + 0 + 0 + 0 = 8, tačiau 12 ir 8 nėra 200!

Tad iš kur kompiuteris žino, ar šešioliktainė reikšmė C8 = 200, ar C = 12 ir 8 = 8?

Viskas priklauso nuo gamintojo kodavimo ir nuo to, kaip atitinkami valdikliai buvo užprogramuoti interpretuoti CAN tinkle perduodamus duomenis. Galbūt pastebėjote „bito padėties“ numeraciją po kiekvienu baitu paveikslėlyje aukščiau. Bitų padėties numeravimo seka skiriasi priklausomai nuo gamintojo, ir būtent čia .dbc failai tampa neįkainojami. Vis dėlto šiame pratime laikysime, kad numeracija tokia, kaip parodyta.  

Tarkime, darome prielaidą, kad 1 baitas, žymimas 0xC8 (200 dešimtainis), atitinka tikslinį 200 litrų kuro per valandą tiekimą, kurį perduoda kuro siurblio valdiklis. Valdiklis bus užprogramuotas šią reikšmę siųsti 8 bitų (vieno baito) duomenų pavidalu.

Pastaba: vėliau įrodysime, kad 1 baitas kuro tiekimo neatitinka.

Tie tinklo ECU, kuriems aktualus „tikslinis kuro tiekimas“, bus užprogramuoti žiūrėti į ID 3 35 1 baitą. Pradedant nuo bito numerio / padėties 48, kurio ilgis 8 bitai (nuo 48 iki 55 bito). Atminkite, kad 8 bitai (du šešioliktainiai skaitmenys) gali atvaizduoti 256 skirtingas reikšmes (įskaitant nulį), ir tai vadinama 8 bitų skiriamąja geba.

Dabar pagalvokite apie mūsų kuro siurblio tiekimo našumą. Tarkime, jis yra nuo 0 iki 200 l/h (maksimumas), o tai galime atvaizduoti 8 bitais. 200 l/h / 256 = 0,781 l/h kuro tiekimo žingsnis. Tai gali būti perteklinis tikslumas, ir nors turime 256 žingsnius (esant 8 bitų skiriamajai gebai), galbūt panaudosime tik 200.

Jei vietoje 8 bitų būtų naudojami 4, tinklo ECU, kuriems aktualus „tikslinis kuro tiekimas“, bus užprogramuoti žiūrėti į ID 3 35 1 baitą. Tačiau šįkart pradedant nuo 48 bito, kurio ilgis 4 bitai (nuo 48 iki 51 bito). Atminkite, kad 4 bitai (1 šešioliktainis skaitmuo) gali atvaizduoti 16 skirtingų reikšmių (įskaitant nulį), ir tai vadinama 4 bitų skiriamąja geba.

200 l/h / 16 = 12,5 l/h kuro tiekimo žingsnis, o to nepakanka tiksliam kuro tiekimo valdymui.

Skiriamoji geba priklauso nuo perduodamų duomenų: kuo daugiau bitų naudojama duomenims atvaizduoti, tuo tikslesnis ir smulkesnis bus matavimas:

Pavyzdžiui:

Priekiniams žibintams (įjungta ar išjungta) visiškai pakanka 1 bito (1 bito skiriamoji geba): 1 = įjungta, 0 = išjungta

O kaip dėl variklio sūkių (rpm)?

4 bitų skiriamoji geba = 24 = 16. Skiriamoji geba iš 4 bitų gali užkoduoti analoginį signalą į vieną iš 16 skirtingų lygių (0–15). 0–6000 rpm / 16 = 375 rpm. Kitaip tariant, sūkius galima išskirti 375 rpm intervalais.

8 bitų skiriamoji geba = 28 = 256. Skiriamoji geba iš 8 bitų gali užkoduoti analoginį signalą į vieną iš 256 skirtingų lygių (0–255). 0–6000 rpm / 256 = 23,44 rpm. Kitaip tariant, sūkius galima išskirti 23,44 rpm intervalais. 

12 bitų skiriamoji geba = 212 = 4096. Skiriamoji geba iš 12 bitų gali užkoduoti analoginį signalą į vieną iš 4096 skirtingų lygių (0–4095). 0–6000 rpm / 4096 = 1,465 rpm. Kitaip tariant, sūkius galima išskirti 1,465 rpm intervalais.

16 bitų skiriamoji geba = 216 = 65 536. Skiriamoji geba iš 16 bitų gali užkoduoti analoginį signalą į vieną iš 65 536 skirtingų lygių (0–65 535). 0–6000 rpm / 65 536 = 0,092 rpm. Kitaip tariant, sūkius galima išskirti 0,092 rpm intervalais.

Kaip matote iš pateiktos informacijos, priklausomai nuo atitinkamam jutikliui ar vykdikliui reikalingo tikslumo, parenkama tinkama bitų skiriamoji geba.

Tad kaip visa tai susiję su kuro siurblio valdiklio pranešimo pavertimu žmogui suprantamais duomenimis?

Šio įrašo pradžioje minėjau, kad neturint .dbc failo gali prireikti šiek tiek sėkmės. 

Valdydamas kuro siurblį diagnostikos skaitytuvu greitai pastebėjau dėsningumą tarp duomenų lauko dešimtainių reikšmių ir aktyviojo testo metu rodomo kuro tiekimo našumo!

Štai santrauka:

ID 3 35 siurbliui veikiant siunčiamas kas 1 sekundę.

0 baitas nekinta – visą siurblio veikimo laiką lieka 0x00.

1 baitas, siurbliui veikiant ar stovint, cikliškai keičia šešioliktaines reikšmes C8, D9, E9, 9, 19 ir taip toliau (dešimtainėje sistemoje po 16).

Panašu, kad tai cikliškas laikrodis, didėjantis žingsniais ir galbūt žymintis veikimo trukmę.

2 baitas siurbliui neveikiant yra 0x00, o jam veikiant keičiasi į 0x39, 0x38.

Pažvelgę į 1 paveikslėlį matome, kad matematiniu kanalu parodėme teigiamą kuro siurblio užpildos valdymą (apie 48 %). Šis baitas galėtų reikšti tikslinį teigiamą užpildos koeficientą, nes jo dešimtainė reikšmė yra 57! Galimas gautos dešimtainės reikšmės (57) pataisymas būtų 100 – 57 = 43 % tikslinės teigiamos užpildos.

Atkreipkite dėmesį, kad varant kuro siurblį 60 l/h našumu ši dešimtainė reikšmė pasikeičia į 24, o matematiniu kanalu išmatuotas teigiamas užpildos koeficientas rodo 22 %.

3 baitas siurbliui neveikiant yra 0x00, o jam veikiant keičiasi, dažniausiai į 1B, 1D ir 1C.

Kol kas neturiu teorijos, kokius duomenis šis baitas galėtų atspindėti.

4 baitas iš 0x00 (siurblys išjungtas) pasikeičia į 0x10 (siurblys įjungtas) ir lieka 0x10 net ir tada, kai siurblys sustoja ties 8366 paketu.

Įtariu, kad tai kuro slėgis!

5 baitas siurbliui neveikiant yra 7E, o jam veikiant keičiasi, dažniausiai į 7D.

7D atitinka dešimtainę reikšmę 125, kuri, mano įtarimu, yra tikslinis kuro tiekimas (l/h).

6 baitas iš 0x00 (siurblys išjungtas) pasikeičia į 0x78 (siurblys įjungtas).

0x78 atitinka dešimtainę reikšmę 120, kuri, mano įtarimu, yra faktinis kuro tiekimas ir sutampa su diagnostikos skaitytuvo rodmeniu 120 l/h aktyviojo testo metu.

Atkreipkite dėmesį, kad varant kuro siurblį 60 l/h našumu ši dešimtainė reikšmė pasikeičia į 60.

7 baitas iš 0x00 (siurblys išjungtas) pasikeičia į 0x36 (siurblys įjungtas).

Kalbant apie 2 baitą, tai galėtų būti faktinis kuro siurblio užpildos koeficientas.

Straipsnis išverstas iš Pico Technology bibliotekos su gamintojo leidimu. Originalas: picoauto.com. PicoScope įrangą rasite mūsų kataloge.

Nuolatinių magnetų sinchroninio variklio-generatoriaus (MG) veikimas