Verze programu PP2CAN 3.087 přináší jednu zásadní novinku. Tou je možnost automatického výpočtu a modifikace dat generovaných nástrojem Data generátor. Dosud bylo nutno zprávy, ve kterých se některé data nastavují manuálně a některé výpočtem generovat celé skriptem. Tato novinka dovoluje načíst soubor EYE nebo DBC do nástroje Data generátor a pro data které vyžadují výpočet napsat a nastavit příslušný skript.
Je také možné použít opačnou možnost, a to na základě přijatých dat do nástroje Data view vypočítat skriptem hodnoty. Ty je pak také možné zobrazit ale i použít opět jiným skriptem pro generování dat.
Praktické použití si ukážeme na generování CAN zprávy, která používá zabezpečení dle AUTOSAR E2E Profile 5. Co je AUTOSAR E2E?
AUTOSAR E2E je ochranný komunikační protokol v rámci standardu AUTOSAR, který zajišťuje bezpečnou výměnu dat mezi elektronickými řídicími jednotkami (ECU) v automobilech. Koncept E2E komunikační ochrany předpokládá, že výměna dat související s bezpečností má být za běhu chráněna proti účinkům poruch v komunikačním spojení.
Profile 5 používá zabezpečení dat, kdy CAN zpráva (ale i například jiná komunikační sběrnice) obsahuje dodatečná data pro zabezpečení komunikace. V tomto případě
- CRC (Cyclic Redundancy Check)
- Sekvenční čítač - Každý požadavek na přenos zvýší čítač, což se kontroluje na straně přijímače
- Živý (Alive) čítač - Je požadována pouze změna, nemusí se měnit postupně o jedna.
Toto zabezpečí že nemůže být například "vpašována" zpráva která ovlivní chování vozidla nebo data nějak modifikována - nesprávně vygenerována, sekvenční čítač také zabezpečí kontrolu pořadí dat.
V případě AUTOSAR E2E Profile 5 se jedná o 16 bitový CRC a 8 bitový čítač. V případě klasického CANu s maximálně 8 datovými bajty toto bylo využíváno jen pro velmi důležité zprávy, s postupným rozšiřováním CAN FD, kdy je k dispozici až 64 datových bajtů již tato data, které zabírají 3 bajty, tolik nelimitují množství přenášených dat a tak se využívá ve vozidlech u mnohem většího množství zpráv.
Pro toto použití byla zavedena nová třída skriptu. Jedná se o skript typu DATA_GENERATOR_SCRIPT. Samostatná třída skriptů tohoto typu zabezpečuje, že není skript volán s každou CAN zprávou, ale jen s konkrétní zprávou, která jej má nastaven v konfiguraci v souboru EYE. Není tak ani nutno kontrolovat ve skriptu ID zprávy a interpretr skriptu je méně zatěžován.
Následuje komentovaný výpis skriptu:
script: //Nový typ skriptu pro Data generátor nebo Data view type = DATA_GENERATOR_SCRIPT; end variables: //Návratová hodnoto pro výpočet CRC unsigned64 ret; //Čítač pro AUTOSAR E2E Profile 5 unsigned counter; end objects: //Objekt vektoru pro uložení dat a výpočet CRC obj_vector_int data; //Objekt CAN zprávy obj_can_msg msg; end init: end shutdown: end body: //Mažeme obsah vektoru, může obsahovat data z minulého volání, ty v tomto případě nepotřebujeme. data.clear(); //Načteme CAN zprávu do objektu, jedná se o CAN zprávu generovanou nástrojem Data generátor msg.load(); //DB2 obsahuje hodnotu čítače z předchozí odeslané zprávy counter = msg.data(2); //Čítač inkrementujeme counter = counter + 1; //Uložíme jej do globální sdílené proměnné typu unsigned, kterou mohou sdílet jak skripty mezi sebou, //tak je možné ji použít jako zdroj dat pro Data Generátor global_unsigned_set (1,u2c(counter)); //Toto přiřazení objektu CAN zprávy zkopíruje datové bajty zprávy do objektu vektoru data = msg; //Debugovací výpis obsahu vektoru hexadecimálně data.print_hex(); //První dva bajty jsou CRC, z těch ale nový CRC nepočítám, odstraním jej z vektoru data.remove(0,2); //Opět kontrolní debugovací výpis data.print_hex(); //Modifikuji DB2, po odstranění prvních 2 bajtů s CRC tedy do prvního prvku nastavíme novou hodnotu čítače. //To je tedy první bajt ze kterého se CRC počítá. data.modify(0,counter); //CRC se počítá i z identifikátoru CAN zprávy, je použit 11 bitový identifikátor, //horních 5 bitů 16 bitového slova se nastavuje na 1 //Identifikátor je 0x0283 //0x0283 + 0xF800 = 0xFA83 //Vložím tedy tyto 2 bajty data.push_back(0xFA); data.push_back(0x83); //Další debugovací výpis data.print_hex(); //Objekt vektoru přímo obsahuje metodu pro výpočet CRC zadané délky, polynomu atd... //unsigned64 crc(char bits, unsigned64 poly, unsigned64 init, bool refin, bool refout, unsigned64 xorout)) //Výpočet CRC, 16 bitové CRC, polynom 0x1021, init 0xFFFF, xor 0x0000. ret = data.crc(0x10, from_hex("1021"), from_hex("FFFF"),false,false,0); //Výpis vypočtené hodnoty. logu64_hex(ret); log_endl(); //Uložení vypočtené hodnoty do globální sdílené proměnné typu unsigned. global_unsigned_set (0,u642u(ret)); end
Skript je tedy hotov.. Nyní je třeba nakonfigurovat data pro nástroj Data view. V našem příkladu vycházíme z reálného DBC pro vozidlo nespecifikovaného výrobce. Ten je naimportován. Nyní je u zprávy kde je nutný výpočet CRC nutno upravit nastavení viz obrázek, který následuje. U dat Crc2Val (A), tedy našeho CRC kódu je třeba nastavit jako zdroj CAN script index 1, CRC je uložen v globální proměnné s indexem 0 (C). Dodatečnou úpravou je změna typu z UNSIGNED na HEX (B). To je praktičtější pro zobrazení CRC.
Poznámka, skripty mohou sdílet globální proměnné unsigned, int, bit/bool, double a string. Každý typ má vlastní paměť pro 128 hodnot s indexy 0 až 127. Výběr z jaké paměti je prvek Data generátorem načten se děje podle nastaveného datového typu proměnné v souboru EYE.
Podobně budeme postupovat u položky AlvCnt2Val (Alive counter).
Jakmile je spuštěn skript a povoleno generování dat nástrojem Data generátor, začnou se generovat data tak jak je vidět na obrázku. První dvě položky v data generátoru se automaticky mění, uživatel může modifikovat hodnoty dalších veličin dle potřeby a skript zabezpečí správný výpočet CRC a update čítače dle aktuálních dat.
Na závěr si můžeme překontrolovat zda skript počítá správnou hodnotu CRC. Z okna skriptu si opíšeme data z debugovacího výpisu obsahu vektoru. Například:
A pro kontrolní výpočet využijeme například online kalkulačku CRC na adrese: https://www.sunshine2k.de/coding/javascript/crc/crc_js.html .
Výsledek z online kalkulačky i výsledek vypočítaný skriptem si odpovídá, skript i online kalkulačka vypočítali hodnotu 0xF07B.