Sběrnice CAN a automobil Škoda Fabia

Uvedené informace jsou získány z volně dostupných zdrojů na internetu a vlastním měřením na tomto automobilu. Autor neručí za stoprocentní pravdivost údajů ani škody způsobené chybným postupem.  Cílem seriálu v žádném případě není uvádět návody na změnu najetých kilometrů prostřednictvím diagnostiky ani "louskat" celý komunikační protokol apod., seriál si bere za cíl setřít tabu okolo této sběrnice a hlavně její implementace v automobilech a dále popsat schopnosti a praktické využití diagnostického SW PP2CAN. 

Obsah:

1. Jak na to Seznámení se sběrnicí CAN ve voze Škoda Fabia, připojení na větev CAN Komfort, nalezení informace s rychlostí a otáčkami motoru.
2. Co dále vyšťouráme Identifikace dalších dat na CAN Komfort.
3. Příprava dat pro další analýzu Příprava logů a logy ke stažení pro další analýzu.
4. Množství paliva v nádrži, teplota motoru Identifikace informace s množstvím paliva a teplotou motoru na CAN Komfort.
5. Motorový CAN Popis připojení a měření na CAN Motor ve voze Škoda Fabia.
6. Použití PP2CAN API Použití PP2CAN API, popis vytvoření vlastní aplikace zobrazující přístrojovou desku s funkčními ukazateli rychlosti, otáček, teploty atd. 
7. Pár poznámek bez ladu a skladu Kontrolky ovládané z CANu. CAN vodiče na konektorech.
8. Blinkry Jak jsem hledal informace o blinkrech.

Díl první: Jak na to

    Tento automobil obsahuje 3 sběrnice CAN. Jedná se o okruh motorový, komfort a diagnostický CAN vyvedený na diagnostickou zásuvku. Motorová větev běží na rychlosti 500k. Větev komfort a diagnostický CAN mají rychlost 100k. Motorová větev se někdy označuje jako CAN A (CAN Antrieb, CAN Pohon). Propojuje ovládací jednotky motoru J537, J361, J220 nebo J248, ovládací jednotku ABS a ASR J104, ovládací jednotku v přístrojové desce J285, ovládací jednotku airbagu J234, ovládací jednotku posilovače řízení J500 a ovládací jednotku palubní sítě J519. Větev CAN Komfort (CAN K) propojuje centrální ovládací jednotku J393, ovládací jednotky dveří J386-389, ovládací jednotku klimatizace J301 a ovládací jednotku palubní sítě J519.  V dalším textu se zaměříme prozatím na větev komfort. Pro komunikaci je použita CAN specifikace 2.A, tzn. 11bitový identifikátor. Nad touto specifikací je použit High-level protokol podle specifikace OSEK (Offene Systeme und deren Schnittstellen für die Elektronik im Kraftfahrzeug). Bohužel vlastní popis implementace tohoto protokolu není zdá se volně k dispozici. V našem případě se pokusíme určit zprávu která nese informace o otáčkách motoru.

    Vlastní měření bude prováděno na automobilu Škoda Fabia Sedan, vybavení Comfort + dálkové ovládání centrálu, vyrobeno v 8/2001. Protože měření bylo prozatím prováděno pouze na tomto jediném automobilu, nemohu zaručit, že uváděné informace jsou platné i pro jiné roky výroby. Zároveň na jinak vybavených modelech mohou po sběrnici putovat i další informace, nebo naopak některá data mohou úplně chybět. V případě že zjistíte rozdíly mezi jednotlivými modely nebo identifikujete další data, budu rád když mne informujete na adrese pp2can@seznam.cz.

    Pro připojení budeme potřebovat PP2CAN ve variantě low-speed, diagnostický SW a počítač, nejlépe notebook. Pro napájení PP2CANu lze využít diagnostické zásuvky nebo nejlépe zásuvky pro zapalovač.  Nyní je třeba se připojit k CANu. To lze samozřejmě na více místech. Osobně doporučuji u automobilu s centrálním zamykáním například na svazku vodičů v gumové průchodce ke dveřím řidiče. Nepotřebujeme tak provádět demontáž žádných plastů čí krytů, toto místo je jednoduše opakovaně přístupné. Ve svazku nalezneme vodiče oranžovo-hnědý pro CAN L a oranžovo-zelený pro CAN H. Je vhodné použít například miniaturní konektor a vložit jej jako odbočku. V normálním provozu pak mít tento konektor schovaný uvnitř gumové průchodky.

Připojení na CAN bus ve voze Škoda Fabia

    V programu PP2CAN v Options nastavíme verzi HW Low-speed. Doporučuji zapnout volbu Passive mode. V tomto režimu není možno odeslat z programu žádnou zprávu. Zamezíme tak náhodnému odeslání zprávy, která by mohla mít nepředpokládané následky. Dále je nutno vypnout v Options automatické resetování logů. V defaultním nastavení obsahuje log jen posledních 200 zpráv což jsou jen asi 4 sekundy komunikace. Komunikační rychlost pro komfort okruh nastavíme na 100kBaudu. 

    Zařízení připojíme k počítači (notebooku), připojíme napájení, CAN a spustíme SW PP2CAN. V okamžiku, kdy zapneme zapalování, začnou se v logu přijatých zpráv hromadit zprávy. Jejich množství je asi 50-60 zpráv za sekundu (u jinak vybaveného modelu automobilu se může toto množství lišit).  Protokol jak již bylo řečeno neznáme a potřebujeme identifikovat zprávu s otáčkami motoru. Před vlastním započetím práce ještě provedeme manuální reset logů (tlačítko Reset logs) abychom snížily délku logu a provedeme žádanou akci, v našem případě tedy například několikrát přidáme plyn. Po ukončení aktivujeme tlačítko Disable R log, čímž zakážeme další logování zpráv a pořízený log uložíme do souboru tlačítkem Save log. Tento log je uložen v textové formě. Tvar logu je uveden v následujícím výpisu který obsahuje část komunikace.

2004 20:53:43 St 897 5 0 15 0 132 0
2005 20:53:43 St 1569 3 176 212 120
2006 20:53:43 St 851 6 128 28 13 186 0 0
2007 20:53:43 St 1026 6 3 1 0 0 0 0
2008 20:53:43 St 337 4 0 80 32 112
2009 20:53:43 St 625 2 135 128
2010 20:53:43 St 849 7 68 0 0 0 0 137 150
2011 20:53:43 St 881 2 193 128
2012 20:53:43 St 1617 6 128 50 65 0 23 65
2013 20:53:43 St 1625 8 81 12 0 15 0 0 0 0
2014 20:53:43 St 1027 6 0 1 0 0 0 0
2015 20:53:43 St 949 5 0 0 0 132 0
2016 20:53:43 St 1569 3 176 212 120
2017 20:53:43 St 897 5 0 15 0 132 0
2018 20:53:43 St 1425 3 0 0 11
2019 20:53:43 St 1361 1 2
2020 20:53:43 St 851 6 128 20 13 186 0 0
2021 20:53:43 St 1024 6 1 1 0 0 0 0
2022 20:53:43 St 337 4 0 80 112 32
2023 20:53:43 St 625 2 135 128
2024 20:53:43 St 849 7 68 0 0 0 0 137 150
2025 20:53:43 St 1537 1 0
2026 20:53:43 St 1589 3 0 255 0
2027 20:53:43 St 1489 2 0 0
2028 20:53:43 St 1025 6 2 1 0 0 0 0

    Druhou variantou jak provést logování velkého množství dat je spustit funkci File logging. Po její aktivaci dojde k zablokování zpracování přijatých. Data nejsou nijak zpracovávána, čímž dojde ke snížení zátěže počítače vlivem zpracování dat, zejména pak vizualizací dat. Data jsou zapisována přímo do logu s názvem streem.log v adresáři diagnostického SW PP2CANu. Tento log má stejný tvar jako uvedený předchozí. Ve starších verzích PP2CANu však není uveden čas, je zde uvedeno pouze pořadí příjmu.

    Celý log následně importujeme do Excelu jako text oddělený mezerami. V prvním sloupci je uvedeno pořadí přijetí zprávy, následuje čas přijetí, formát (St-Ext), identifikátor(y), počet datových bytů a vlastní data zprávy. Hodnoty jsou uvedeny v dekadickém tvaru. Po importu dat do Excelu provedeme jejich seřazení podle hodnoty identifikátoru. Z logu je patrné že došlo k velkým změnám v datech u zprávy s identifikátorem 851d. Následně se pokusíme ověřit zda data odpovídají otáčkám motoru.

    V programu PP2CAN spustíme funkci Data receiver, nastavíme příjem standardního identifikátoru s hodnotou 851, zvolíme typ data UINT16 a nastavíme počátek dat na datovém bytu 1 (počítáno od nuly). Otevřeme zobrazení GRAPH a povolíme zpracování v Receiveru zaškrtnutím volby ENABLE. Pokud budeme měnit hodnotu stlačení plynového pedálu, měla by se nám měnit hodnota zobrazená v grafu a měla by odpovídat stlačení pedálu / otáčkám. Hodnoty při volnoběhu jsou kolem 3000, je patrné že hodnota je pravděpodobně násobena 4 z důvodu zvětšení rozsahu při zachování celočíselného datového typu nebo jsou data dána rozlišením nebo konstrukcí snímače.

    Podobně můžeme vystopovat v datech s identifikátorem 849d údaj s aktuální rychlostí vozidla. Rychlost je uložena v DB1 a DB2, hodnota je typu UINT16. Podělením konstantou ~185 dostaneme rychlost v km/h. V případě že máme zařazenou zpátečku, dojde ke změně DB0 z hodnoty 68d na 70d.

    Pro toho, kdo má zájem o vlastní studium dat dávám k dispozici ke stáhnutí několik logů:

        - start a stojící automobil

        - 2 minuty kroužení na parkovišti

        - trasa Brno Vídeňská -> Pisárky přes Bohunice (asi 4.5km)

   

Díl druhý: Co dále vyšťouráme

        V případě že budeme chtít nalézt zprávy s dalšími daty doporučuji následující postup. Spustíme PP2CAN, zakážeme vypisování přijatých zpráv do Receive logu. Následně spustíme funkci File logging. Provedeme několikrát akci, jejíž zprávu chceme identifikovat (otevření dveří, stisk ovládacího prvku apod.). Ukončíme File logging. Log si importujeme do Excelu a hledáme zprávu, ve které došlo ke změnám stavu. Počet změn stavu by měl odpovídat počtu vykonání akce.  V okamžiku kdy zprávu identifikujeme otevřeme v PP2CANu Data receiver, zadáme nalezený identifikátor a provedeme povolení sledování dat s tímto identifikátorem (zatržítko ENABLE). Potom opakujeme hledanou akci a v datové části zprávy sledujeme změnu stavu jednotlivých bytů. Pokud změny následují naši akci poznamenáme si jednotlivé stavy. Doporučuji měření opakovat 2x, jednou s nastartovaným motorem, podruhé s vypnutým zapalováním.

   Na komfort okruhu Fábie můžeme identifikovat například tyto zprávy:

Zapnutí světlometů:

        ID 1589,  length 3,  DB1 = 255, DB2 = 0

        ZAPNUTO:        DB0 (datový bajt 0 zprávy) = 0

        VYPNUTO:        DB0 > 0, v mém případě hodnota kolísala mezi 39-40

 

Elektrické stahování oken:

        ID 385, length 2, DB1 = 0

        Verze vozu s elektrickým ovládáním pouze na předních oknech.

        Nalezena pouze zpráva pro okénko spolujezdce při ovládání       od řidiče.

        STOP:                     DB0 = 0

        DOLŮ                      DB0 = 64

        NAHORU                DB0 = 16

 

Stěrače:

        ID 1489, length 2, DB1 = 0

        Sekvence DB0:

            0->4->5                        páčka dolů (1 setření)

            0->1->5->1->5->.....    cyklovač

            0->5->0                        1 rychlost

            0->9->0                        2 rychlost

            0->2->6->4                   k sobě (ostřik+setření)

 

Centrální zamykání, ovládání zevnitř od řidiče:

        ID 897, length 5, DB0 = 0, DB2 = 0, DB3 = 132

            klidový stav: DB1 = 15, DB4 = 0

            zamknutí: 2x zpráva s DB1 = 64, DB4 = 128

            odemknutí: 1x zpráva s DB1 = 32, DB4 = 64

 

Signalizace otevření dveří:

        ID 881, length 2, DB1 = 128

            DB0 = 0         automobil v klidovém stavu, dveře uzavřeny

            DB0 = 192    po nastartování, vzpnutí motoru do otevření a zavření dveří, dveře uzavřeny

            Signalizace otevření je provedena nastavením bitů 0-3 v DB0.

                bit 0    - dveře řidiče

                bit 1    - dveře spolujezdce

                bit 2    - zadní dveře levé 

                bit 3    - zadní dveře pravé

Není bez zajímavosti že na mém automobilu není funkční a nikdy nebyla kontrolka otevření dveří na přístrojové desce. Nicméně na CANu informace o stavu dveří chodí.  

 Tato tabulka uvádí přehled identifikátorů, délku dat a četnost, s jakou se data na sběrnici vysílají:

Identifikátor

Identifikátor

(bin)

Délka - počet datových bajtů Počet výskytů za sekundu Popis
 337 001 0101 0001  4  10  
 385 001 1000 0001  2 zpráva chodí pouze pokud je stahování aktivní elektrické stahování oken
 625 010 0111 0001  2  10  
 849 011 0101 0001  7  10 rychlost
 851 011 0101 0011  6  10 otáčky motoru
 881 011 0111 0001  2  5 otevření-zavření dveří
 897 011 1000 0001  5  10 centrální zamykání, ovládání zevnitř od řidiče
 949 011 1011 0101  5  10  
 1024 100 0000 0000  6  5  
 1025 100 0000 0001  6  5  
 1026 100 0000 0010  6  5  
 1027 100 0000 0011  6  5  
 1361 101 0101 0001  1  5  
 1393 101 0111 0001  2  2  
 1425 101 1001 0001  3  5  
 1489 101 1101 0001  2  5 stěrače
 1537 110 0000 0001  1  5  
 1569 110 0010 0001  3  10  
 1589 110 0011 0101  3  5 světlomety
 1617 110 0101 0001  6  2  
 1619 110 0101 0011  3  2  
 1625 110 0101 1001  8  2  

 

Kombinace
1 0101
2 0001
3 1000
4 0111
5 0011
6 1011
7 0010
8 0011
9 1001
10 1101

Díl třetí: Příprava dat pro další analýzu

    V této části si popíšeme jakým způsobem jsem připravil data pro další analýzu. V naměřených datech se budu snažit najít data která reprezentují údaje o teplotě motoru a obsahu paliva v nádrži. Připomínám že sám prozatím netuším, zda je tato informace na Komfort okruhu CANu ve Fabii k dispozici. Mé závěry vznikají analýzou naměřených dat, nemám možnost je porovnat s jakoukoliv dokumentací výrobce.

    Vlastní měření jsem provedl ve dvou kolech. První kolo je zaměřeno zejména na identifikaci informace s množstvím paliva v nádrži, druhé kolo pak na identifikaci teploty motoru. Měření v prvním kole probíhalo při zastávkách. První měření prvního kola proběhlo při nastartování automobilu. Zalogoval jsem část komunikace a logování  přerušil. Následně jsem ujel část vzdálenosti k benzinové stanici, opět zalogoval data a pokračoval v jízdě. Po natankování jsem provedl poslední logování dat.

    Druhý pokus probíhal tak, že jsem si naplánoval trasu s několika zastávkami. Data jsem logoval za jízdy mezi těmito zastávkami a na každé zastávce jsem si opsal data z palubního počítače a hodnotu ukazatele teploty motoru a uložil log.

    V následující tabulce jsou popsány podmínky prvního kola měření a pro zájemce jsou tu logy ke stažení.

 

 Popis

Data ke stažení

1.1

dojezd dle palubního počítače 10 km

indikovaná průměrná spotřeba 1 na 100km: 5.8

indikovaná průměrná spotřeba 2 na 100km: 5.8

teplota motoru: více než 1/4 rozsahu ukazatele

log

1.2

dojezd dle palubního počítače 5 km

indikovaná průměrná spotřeba 1 na 100km: 5.7

indikovaná průměrná spotřeba 2 na 100km: 5.8

teplota motoru: 1/2 rozsahu ukazatele (pracovní teplota)

log

1.3

po natankování 17.4 litru

dojezd 365km

teplota motoru: méně než 1/2 rozsahu ukazatele

log

    Následují podmínky a logy druhého kola měření:

 

 Popis

Data ke stažení

Start

Studený motor

 

2.1

Čas jízdy: 4 min

Průměrná spotřeba 1: 9,6

Ujeto km: 1

Dojezd: 350

Venkovní teplota: 12

Teplota motoru: 1/4 rozsahu

Průměrná rychlost: 20

log

2.2

Čas jízdy: 11 min

Průměrná spotřeba 1: 8,7

Ujeto km: 5

Dojezd: 340

Venkovní teplota: 12

Teplota motoru: 1/2 (pracovní teplota)

Průměrná rychlost:  33

log

2.3

Čas jízdy: 15 min

Průměrná spotřeba 1: 7,9

Ujeto km: 7

Dojezd: 330

Venkovní teplota: 12,5

Průměrná rychlost: 30

log

4

Čas jízdy: 21 min

Průměrná spotřeba 1: 7,2

Ujeto km: 11

Dojezd: 335

Venkovní teplota: 14,5

Průměrná rychlost: 32

log

2.5

Čas jízdy: 27

Průměrná spotřeba 1: 6,6

Ujeto km: 16

Dojezd: 340

Venkovní teplota: 15

Průměrná rychlost: 35

log

    Analýzy a dat a výsledky budou obsahem následujícího dílu.

Díl čtvrtý: Množství paliva v nádrži, teplota motoru

    Předem se chci omluvit za to, že tento 4 díl je velice krátký. Bohužel  v poslední době jsem měl jen velmi málo volného času, který bych této problematice mohl věnovat.

    V prvním fázi jsem se pokusil nalézt informaci s množstvím paliva v nádrži. K tomu jsem použil logů z prvního měření. Log 1.1 a 1.2 byl naměřen s téměř prázdnou nádrží, dojezd 10 a 5 km. Před pořízením logu 1.3 jsem natankoval 17.4 litru benzinu. Logy jsem otevřel v Excelu a okna uspořádal tak jak je uvedeno na následujícím obrázku (Po kliknutí se obrázek otevře 1:1 v novém okně). Data jsem seřadil dle identifikátoru funkcí Data->Filtr->Automatický filtr.

 

Zpracování logu dat z CAN sbernice naměřeném na automobilu Škoda Fábia

 

    Následně jsem prošel všechny vyskytující se identifikátory. V případě, že by se hledaná data v nějaké zprávě vyskytovala, musela by po natankování nastat výrazná změna některých dat. Data jsem procházel několikrát, nicméně hledaná data s množstvím paliva v nádrži, případně dojezd jsem nenalezl.

    Dalšími daty která jsem hledal, byla teplota motoru. K tomu jsem využil zejména druhé série logů. První log druhé série byl pořízen ihned po nastartování  automobilu, který byl odstaveném přes noc. Teplota motoru by tedy měla odpovídat venkovní teplotě. Nicméně než jsem stihnul vše nachystat, teplota se v okamžiku spuštění měření vyšplhala na 1/4 rozsahu ukazatele. Předpokládám že to odpovídá 40 ºC. V okamžiku kdy jsem pořídil log 2.1 odpovídala teplota motoru již pracovní teplotě (cca 80 ºC ?). K porovnání jsem využil logu  2.1, 2.2 a 2.5. Hledaná data jsem nalezl ve zprávě s ID 851. V následující tabulce je uvedena vždy první zpráva z uvedených logů.

St ID Ext ID Length DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7
St 851 - 6 128 136 20 90 0 0 0 0
St 851 - 6 128 176 13 160 0 0 0 0
St 851 - 6 128 28 13 180 0 0 0 0

 

    Jedná se o stejnou zprávu která nese i data s otáčkami motoru. Data s teplotou jsou uvedena v DB3. Protože nezná hodnotu pracovní teploty, budu teď jen hádat, ale zdá se že hodnota 90 by mohla odpovídat 45 ºC a 180 pak 90 ºC (pracovní teplota motoru). V tomto případě by se jednalo o rozlišení 0.5 stupně.  Kontrolou s daty z prvního kola měření lze usoudit že se opravdu jedná o hledanou informaci s teplotou motoru.

Díl pátý: Motorový CAN

    V tomto díle si popíšeme, jak realizovat měření na motorovém CANu automobilu Škoda Fabia. K vlastnímu měření budeme potřebovat PP2CAN ve variantě high-speed. Můžeme samozřejmě použít i jinou CAN interface kartu, pak ovšem nebudete moci používat diagnostický SW dodávaný s PP2CANem a budete muset použít jiný SW, nebo si jej napsat :-(.

    Prvním úkolem je realizovat vlastní připojení na CAN. Jednou z variant je připojit se na rozvodnici pod palubní deskou. Demontáž plastů se na první pohled zdá složitá, nicméně tomu tak není. Nejprve je nutno sejmout boční kryt pojistek na straně řidiče. Následně pak tahem sejměte kryt mezi sloupkem volantu a tachometrem. Dále je nutno odšroubovat 6 šroubků držících spodní plast. Ten pak vytáhněte tahem k sobě. Nakonec pak vycvakněte konektor VAG testeru a konektory na spínači osvětlení. Nad pedály se nachází krabička do které je připojena spousta konektorů. Potřebujeme nalézt vodiče CANu, tzn. oranžovo-černý pro CAN-H a oranžovo-hnědý pro CAN-L. Vodiče jsou v páru, já tu tento pár nalezl dvakrát. Při vypnutém zapalování a vytažených klíčích si na tento pár "příbastlíme" odbočku s nějakým konektorem, kterou budeme používat k měření. Já osobně mám tento kabel vyveden do odkládací skřínky vlevo u řidiče.

    Při vlastním měření si dalším kabelem propojím PP2CAN s tímto konektorem a mohu měřit. Tento CAN-motor používá komunikační rychlost 500kbaudů. Nastavíme proto tuto rychlost v diagnostickém SW ještě před vlastním připojením, připojíme se a můžeme začít měřit. Protože komunikační rychlost a množství dat je vysoké, nemá cenu provádět on-line analýzu. Provedeme zalogování dat pomocí funkce File-logging a data pak budeme prohledávat off-line v programu Excel tak, jako u CANu Komfort.

    Nejprve uvedu přehled identifikátorů zpráv, které se na sběrnici vyskytují.

Identifikátor

Identifikátor

(bin)

Délka - počet datových bajtů Počet výskytů za sekundu
16 000 0001 0000 6 1 x v měření (nastartování,akce,vypnutí)
17 000 0001 0001 6 1 x v měření (nastartování,akce,vypnutí)
80 000 0101 0000 4 50
640 010 1000 0000 8 100
648 010 1000 1000 8 80
800 011 0010 0000 8 40
896 011 1000 0000 8 6
904 011 1000 1000 3 40
906 011 1000 1010 4 50
976 011 1101 0000 2 50
1056 100 0010 0000 8 5
1136 100 0111 0000 5 20
1152 100 1000 0000 8 5
1160 100 1000 1000 8 60
1312 101 0010 0000 8 5
1392 101 0111 0000 4 10
1416 101 1000 1000 8 40
1488 101 1101 0000 6 10
1496 101 1101 1000 8 10
1502 101 1101 1110 5 5

        Identifikátory jsou samozřejmě zcela jiné než identifikátory dat na CAN komfort. V uvedeném grafu jsou ve druhém sloupci identifikátory v binární podobě. Na první pohled je patrné, že několik zpráv má zcela shodných dolních 8 bitů. Pro názornost jsou barevně vyznačeny. Rozdělíme-li těchto 8 bit na dvě 4 bitové části, můžeme sestavit tabulku kombinací, které se vyskytují. V tabulce je také zpracováno zda se tato 4-bitová kombinace vyskytuje v dolní (A) a horní (B) části.

Kombinace A (bit 0-3) B (4-7)
1 0000 Y N
2 0001 Y Y
3 0101 N Y
4 1000 Y Y
5 0010 N Y
6 1010 Y N
7 1101 N Y
8 0111 N Y
9 1101 N Y
10 1110 Y N

Možnou teorií je, že tyto 4 bity jsou adresou odesílatele a příjemce. Vybereme-li kombinaci 1000, je možno nakreslit tento diagram distribuce informací jdoucích do zařízení a ze zařízení s adresou 1000:

Směr šíření je však zatím těžké určit. Nelze tedy říci, zda směr šíření je od hypotetického zařízení, nebo do něj. Dále je při použití této teorie o adrese příjemce a odesílatele těžké interpretovat některé zprávy, které mají obě tyto části shodné (Id: 17,648, 904, 1160, 1416). Nicméně v části textu o CANu Komfort jsem tyto kombinace vyznačil a vypsal taktéž.

Díl šestý: Použití PP2CAN API

    Tento díl trochu vybočí z problematiky "rozlouskávání" dat na CAN sběrnici a předvede, jak si vytvořit vlastní testovací aplikaci s využitím PP2CANu Low-speed a API které je možno společně s PP2CANem zakoupit. Použití varianty low-speed nám napovídá, že budeme připojeni na CAN Komfort. Tam jsme již identifikovali několik informací. Tyto informace (otáčky, rychlost, teplota motoru) využijeme k vytvoření jednoduché přístrojové desky Škoda Fabia.

    Jako základ budeme potřebovat texturu palubní desky. Jednu texturu budeme mít bez rozsvícených symbolu, druhá pak bude obsahovat svítící symboly. Možná se někomu bude zdát, že mají špatné barvy, ale protože tyto symboly stejně nebudeme používat, tak je to vlastně jedno. Prozatím uvádím jen náhled. Vlastní textury jsou obsahem balíku společně se zdrojovými kódy.

    Programovat budeme pod Microsoft Visual Studiem, já používám verzi 6. Používat budeme verzi C PP2CAN API, tzn.neobjektovou. Vytvoříme nejprve nový projekt typu MFC AppWizard (exe). Vzhled aplikace nastavíme Dialog based a dáme Finish. Nebudu popisovat vytvoření aplikace řádek po řádku, k tomu jsou určené jiné materiály, popíšeme si tu dvě klíčová místa která se týkají PP2CANu, to znamená inicializaci a výběr + zpracování zpráv.  

    Do obsluhy OnInitDialog() vložíme následující kód:

    // načtení textur pro zobrazení

    hpicture_on = (HBITMAP)::LoadImage(NULL, "fabia_on.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    hpicture_off = (HBITMAP)::LoadImage(NULL, "fabia_off.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
 

    // Zvýšíme prioritu procesu.
    SetPriorityClass(GetCurrentProcess(),HIGH_PRIORITY_CLASS);
 

    // Pokusíme se otevřít PP2CAN port.

    // Prvním parametrem je adresa paralelního portu, druhym je komunikační rychlost.

    // Funkce error_function a msg_receiver nebudeme používat, proto jsou tyto

    // parametry NULL. Parametr HW_version bude 2-low speed, one_shot_mode a passive_mode

    // budou false.
    PP2CAN_Open(0x378, SPEED_100k, NULL, NULL, 2, false, false);

    // Je li PP2CAN_init_ok==true proběhlo otevření správně
    if(PP2CAN_init_ok)
    {
        MessageBox("PP2CAN OK");
    

        // Budeme li chtít testovat, zapneme Loopback mód, co odešleme na sběrnici,

        // dostaneme zpět.   

        // P2CAN_SET_LOOPBACK_MODE();
 

        // Nastavení filtrů a masek zpráv, chceme přijímat jen některé zprávy.

        // Pole filtru a masek mají délku 4. K určení jejich hodnot můžeme

        // použít Msg. filter z diagnostického SW a následně hodnoty jednotlivých

        // bajtů určit z uloženého souboru *.MSF.

        PP2CAN_SET_FILTER_FILTER(0, &filter_0[0]);    //ID 849
        PP2CAN_SET_FILTER_FILTER(1, &filter_1[0]);    //ID 851
        PP2CAN_SET_FILTER_FILTER(2, &filter_2[0]);    //ID 849
        PP2CAN_SET_FILTER_FILTER(3, &filter_3[0]);    //ID 851
        PP2CAN_SET_FILTER_FILTER(4, &filter_4[0]);    //ID 881
        PP2CAN_SET_FILTER_FILTER(5, &filter_5[0]);    //ID 1589

        PP2CAN_SET_FILTER_MASK(0, &mask_0[0]);
        PP2CAN_SET_FILTER_MASK(1, &mask_1[0]);
    }

    // Chyba při otevření
    else

    {
        MessageBox("PP2CAN ERROR");

    }

   

    Pokud tuto obsluhu nemáte nagenerovanou, můžete ji vytvořit pomocí MFC ClassWizardu tak, že kliknete na dialog pravým tlačítkem myši vyberete ClassWizard.

    Nastavení filtrů a masek bude takovéto:

 

    unsigned char filter_0[4] = {106,32,0,0};
    unsigned char filter_1[4] = {106,96,0,0};
    unsigned char filter_2[4] = {106,32,0,0};
    unsigned char filter_3[4] = {106,96,0,0};
    unsigned char filter_4[4] = {110,32,0,0};
    unsigned char filter_5[4] = {198,160,0,0};

    unsigned char mask_0[4] = {255,224,0,0};
    unsigned char mask_1[4] = {255,224,0,0};

 

        Dalším klíčovým místem bude funkce OnTimer vygenerovaná pomocí ClassWizardu. Tato funkce se volá při obdržení zprávy WM_TIMER. Budeme používat dva časovače, první pro příjem zpráv a druhý prokreslení. Časovače vytvoříme v obsluze OnCreate voláním:

    SetTimer(1,40,NULL);    // Výběr zpráv každých 40 ms
    SetTimer(2,60,NULL);    // Kreslení po 60 ms

     Časy můžeme upravovat jako kompromis k výkonu počítače a plynulosti pohybu kreslených ručiček. Do funkce OnTimer vložíme následující tělo:

MCP2510Msg *data =NULL;
unsigned __int16 Id1;
unsigned __int32 Id2;
bool rtr;
bool st_ext;
unsigned char length;
unsigned __int16 *pi16;
 

// Timer 1 - výběr zpráv
if(nIDEvent==1)
{

    // Výběr zpráv provádíme tak dlouho, dokud obsahuje přijímací

    // buffer nějaké zprávy   
    while(PP2CAN_GET_LENGTH()>0)
    {

        // Výběr zprávy, vrací-li true, byla zpráva vybrána
        if(PP2CAN_GET(&data))
        {

¨           // Dekódování identifikátoru, má li zpráva rozšířený identifikátor

            // je vráceno true, jinak false. Fabia používá standardní identifikátor.
            st_ext = PP2CAN_MSG_get_ID1(&data->bytes[0],Id1,Id2);
            if(st_ext==false)
            {

                // Dekódování délky zprávy a rtr
                PP2CAN_MSG_get_DLC2(&data->bytes[0],rtr,length);

                // Je-li zpráva typu RTR, přeruším zpracování smažu zprávu

                // a pokračuji výběrem další zprávy. Nicméně komunikační protokol

                // ve Fabii nepoužívá RTR zprávy takže tento kód není třeba.

                if(rtr)

                {

                    PP2CAN_DELETE(data);

                    continue;

                }

                // Zpracování dle identifikátoru
                switch(Id1)
                {

                    // Otáčkoměr a teplota motorů
                    case 851:

                        // otáčky jsou v DB1 a DB2
                        pi16 = (unsigned __int16*)&data->item.data[1];
                        rev_counter = *pi16;
                        rev_counter/=4;

                        // teplota motoru je v DB3
                        engine_temperature = data->item.data[3]/2;
                        break;

                    // Rychloměr
                    case 849:
                        pi16 = (unsigned __int16*)&data->item.data[1];
                        speed = *pi16;
                        speed/=185;
                        break;

                    // Signalizace otevření dveří
                    case 881:
                        if((data->item.data[0]&0x0F)>0)
                            door = true;
                        else
                            door = false;
                        break;

                    // Zapnutí světel
                    case 1589:
                        if(data->item.data[0]>0)
                            lights = true;
                        else
                            lights = false;
                        break;
                    default:
                    break;
                }
            }

            // Smažu zprávu
            PP2CAN_DELETE(data);
        }
    }
}

// Timer 2 - kreslení
else if(nIDEvent==2)
{
    CDC *dc = GetDC();
    reload_bitmap(dc);   
    paint_bitmap(dc);
    ReleaseDC(dc);
}
CDialog::OnTimer(nIDEvent);

    Ostatní funkce, které se starají o vykreslování nejsou z hlediska PP2CANu důležité, jak vypadají si můžete  prohlédnout v kompletním zdrojovém kódu. Ten je ke stažení zde. V této první verzi je funkční ukazatel rychlosti, otáček motoru a teploty motoru. Dále pak signalizace otevření dveří a rozsvícení světel. Jak to funguje v praxi pak můžete vidět na videu, které je ke stažení zde. Video je ve formatu XVID, omlouvam se za trochu roztřepaný obraz, silnice byla sama díra :-))  Pro překlad musíte doplnit soubory pp2can_lib.h, pp2can_vc.lib a pp2can_vc.dll. Ty jsou na CD PP2CAN v adresáři API/MSVC-C v případě, že jste si společně s PP2CANem objednali i API pro vývoj vlastních aplikací. 

 

Díl sedmý: Pár poznámek bez ladu a skladu

    Ovládání kontrolek panelu přístrojů z CAN busu:

Kontrolka

Zdroj signálu
kontrolka alternátoru

centrální řídicí jednotka vozu

kontrolka hladiny brzdové kapaliny

řídicí jednotka ABS

kontrolka směrových světel přívěsu

centrální řídicí jednotka vozu

kontrolka zapnutí bezpečnostních pásů

řídicí jednotka airbagu

kontrolka teploty chladicí kapaliny

řídicí jednotka motoru

kontrolka žhavení

řídicí jednotka motoru

kontrolka ABS

řídicí jednotka ABS

kontrolka levých směrových světel

centrální řídicí jednotka vozu

kontrolka airbagu

řídicí jednotka airbagu

kontrolka emisí

řídicí jednotka motoru

kontrolka ASR  / kontrolka ESP

řídicí jednotka ABS/ASR/ESP

kontrolka servořízení

centrální řídicí jednotka vozu

kontrolka pravých směrových světel

centrální řídicí jednotka vozu

kontrolka elektrického pedálu akcelerace

řídicí jednotka motoru

kontrolka otevření dveří

centrální řídicí jednotka vozu

kontrolka otevření víka zavazadlového prostoru

centrální řídicí jednotka vozu

 

    Ovládání ukazatelů panelu přístrojů z CAN busu:

 

Ukazatel Zdroj signálu

ukazatel teploty chladicí kapaliny

řídicí jednotka motoru

otáčkoměr

řídicí jednotka motoru

vícefunkční ukazatel

řídicí jednotka + T32a/11, 12, 27, 31 +  řídicí jednotka panelu přístrojů

ukazatel polohy volicí páky

řídicí jednotka automatické převodovky

 

    Konektor diagnostiky - CAN vodiče:

 

6 - CAN H motor, spínatelný (CAN pro diagnostiku)

14 - CAN L motor, spínatelný (CAN pro diagnostiku)

 

    Konektor panelu přístrojů - CAN vodiče:

 

7 - CAN L motor

8 - CAN H motor

9 - CAN H komfort

10 - CAN L komfort

 

    Centrální řídící jednotka vozu, konektor XS2 - CAN vodiče:    

 

9 - CAN L komfort

12 - CAN H komfort

 

    Centrální řídící jednotka vozu, konektor XS6 - CAN vodiče: 

 

2 - CAN L, spínaný

3 - CAN L motor

5 - CAN H motor

6 - CAN H, spínaný

 

    8 pinový konektor na řídící jednotce dveří řídiče  - CAN vodiče:

 

4 - CAN H komfort

6 - CAN L komfort

 

Díl osmý: Blinkry

    Nejprve jedna poznámka na začátek. V jednom z předchozích dílů jsem se zabýval hledáním informace o teplotě motoru. Později jsem napsal prográmek Škoda Fabia Monitor a při jeho používání jsem zjistil, že při identifikaci informace o teplotě jsem se zmýlil. Takže do dalšího dílu se pokusím napsat, jak to tedy ve skutečnosti je.

    Zároveň mi  u Škoda Fabia Monitoru vadilo, že nefungují blinkry. Několikrát jsem je hledal v datech na sběrnici CAN Komfort , ale bohužel musím konstatovat že tato informace tam prostě není. Nicméně pokusil jsem se je nalézt na motorovém CANu. Do budoucna jsem stejně plánoval upravit Fabia Monitor tak, aby uměl monitorovat data i na tomto CANu.

    Pořídil jsem tedy log dat, ve kterém jsem 3x střídavě přepnul  pravý a levý blinkr a následně zapnul 3x varovná světla. Po troše hledání jsem nalezl dvě velice nadějné zprávy. První zpráva má identifikátor 800. V této zprávě je zajímavý datový bajt 5 (DB5). V klidu má tento bajt hodnotu 0. Při zapnutí jednoho směru blinkru má hodnotu 16 (binárně 00010000), u druhého směru 32 (binárně 00100000). V okamžiku zapnutí varovných světel pak 48 (binárně 00110000, což je logický součet předešlých hodnot). Hodnoty 48 nabývá tento bajt také na krátký okamžik při přepnutí z jednoho směru na druhý. Z toho mimo je mimo jiné zřejmé,  že při přepnutí směru je signalizováno sepnutí obou blinkrů, nicméně tento stav je tak krátký, že jej v praxi na světlech není možno postřehnout.

    Druhá zpráva má identifikátor 1136 a bajt který nás zajímá je DB0. V klidu má DB0 hodnotu 0. V okamžiku kdy zapneme některý směr blinkrů, začne tento bajt periodicky měnit hodnotu. Pro jeden směr (Id 800, DB5=16) střídá periodicky hodnoty 0 a 1. Pro druhý směr (Id 800, DB5=32) pak střídá hodnoty 0 a 2. Perioda je někde pod 1Hz a odpovídá frekvenci blikání blinkrů. Při zapnutých varovných světlech pak střídá stav 8 a 11 (binárně 00001000 a 00001011).

    Pokud má někdo zájem prostudovat log dat sám, může jej stáhnout zde. Je již importovaný do Excelu. Okamžiky změn hodnot popisovaných dat jsem barevně zvýraznil. Doporučuji při prohlížení nastavit filtr dat tak, aby Excel zobrazoval jen řádky s identifikátory zpráv 800 a 1136. 

 


    Závěrem bych se chtěl zeptat případných čtenářů, zda mají nějaké vlastní zkušenosti s měřením a analýzou dat na této sběrnici v automobilech, nebo případně nemají informace nebo materiály, které by mi mohly poskytnout pro další práci nebo k uveřejnění. Ocenil bych i logy dat v jakékoliv čitelné formě pořízené na CANu v jiných automobilech (Fabia, Octavia, SuperB, Golf atd.) či modelech (roky výroby, modely s různou výbavou). Pokud nemáte k dispozici PP2CAN, ale jste ochotní mi umožnit měření na Vašem automobilu, pište také. Kontaktní adresa je  pp2can@seznam.cz.

 

David

 

Zpět na hlavní stránku