Program PP2CAN určený pro práci s CAN sběrnicí obsahuje vlastní skriptovací jazyk, který dovoluje snadno vytvářet vlastní nástroje pro generování dat na CAN sběrnici, ale i zpracovávat data z CAN sběrnice a realizovat různé jednoduché řídící algoritmy nebo simulace chování. Syntaxe tohoto jazyka je inspirována jak jazykem C tak i Pascalem. Tato vlastní syntaxe a implementace skriptovacího jazyka vznikla ještě dříve než většina současných skriptovacích jazyků a byla zvolena z důvodu snadného provázání s programem PP2CAN bez nutnosti úpravy nějakého v té době existujícího skriptovacího jazyka a portování vlastních úprav do nových verzi interpretrů těchto jazyků.
Instalace programu PP2CAN obsahuje v instalačním adresáři ve složce "Demo data" tři desítky ukázkových skriptů. Popis funkce skriptovacího jazyka a ovládacích prvků okna CAN skriptu je k nalezení v tomto manuálu.
CAN skripty v programu PP2CAN mají 2 základní varianty a to CAN_FUNCTION a TIMER_SCRIPT. První typ je spouštěn při příchodu CAN zprávy, spouštění druhého je pak dáno periodickým časovačem. Existuje i třetí varianta a to CAN_FUNCTION_AND_TIMER. Ta je pak spouštěna v obou případech.
V tomto prvním díle si vytvoříme velmi jednoduchý skript, který bude generovat na CAN bus periodicky zprávu. V této zprávě bude hodnota prvního datového bajtu řízena posuvníkem z okna skriptu. Hodnota posuvníku bude také ovládat nastavení horního bitu v datovém bajtu 7. Pokud by jsme potřebovali v programu PP2CAN ovládat hodnotu datového bajtu a data odesílat na CAN, za normálních okolností můžeme použít nástroj Data sender. V tomto případě ovšem potřebujeme navíc ovládat i stav bitu v DB7. To je nástrojem Data sender nerealizovatelné a proto je vhodné použít skript.
Každý skript začíná hlavičkou ve které se definuje o jaký druh skriptu jde, tedy v tomto případě se jedná o periodický skript spouštěný časovačem:
script: type = TIMER_SCRIPT; end
Za touto hlavičkou pak následuje sekce, která obsahuje definici proměnných:
variables: char data; end
Další sekcí je sekce definice objektů. V něm si definujeme objekt CAN zprávy:
objects: obj_can_msg can_msg; end
Další sekce již obsahuje vykonávaný kód. Tato konkrétní sekce je kód který se vykoná jednou po spuštění skriptu, slouží tak například k inicializaci proměnných, datových položek objektů, uživatelských ovládacích prvků atd:
init: //Zapis textu do konzole okna skriptu logs("Script: Tutorial 1"); //Odradkovani log_endl(); //Odesilame zpravu se standardnim identifikatorem s hodnotou 10. //11 bitova cast se nastavuje do id1 objektu CAN zpravy can_msg.id1 = 10; can_msg.id2 = 0; //Delka zpravz je 8 bajtu can_msg.size = 8; //11 bitovy identifikator -> false can_msg.stext = false; //Nejedna se o RTR can_msg.rtr = false; //CAN port can_msg.port=1; //Inicializacni hodnoty datovych bajtu can_msg.set_data(0,0x00); can_msg.set_data(1,0x00); can_msg.set_data(2,0x00); can_msg.set_data(3,0x00); can_msg.set_data(4,0x00); can_msg.set_data(5,0x00); can_msg.set_data(6,0x00); can_msg.set_data(7,0x00); //Prednastaveni timeru na pro spousteni skriptu na 100ms ui_set_timer_script_period (100); end
Nyní nám již zbývá vytvořit pouze tělo skriptu s požadovanou funkcí:
body: //Precteni ovladaciho prvku scrollbaru value = ui_get_val0(); //Zmeritkovani, scrollbar vraci hodnotu 0..10000 //CAN zprava odesila data v rozsahu 0..100 value = value/100; //nastaveni hodnoty do prislusneho bajtu CAN zpravy can_msg.set_data(0,u2c(value)); //Nastavovani bitu v DB7 dle hodnoty prectene ze scrollbaru //a ulozeni hodnoty do CAN zpravy if(value>50) { can_msg.set_data(7,0x80); } else { can_msg.set_data(7,0x00); } //Odeslani zpravy na CAN can_msg.send(); end
Celý soubor s tímto skriptem je možné stáhnout zde.
Další díly seriálu:
- Díl 1: Periodické generování dat na CAN sběrnici.
- Díl 2: Uživatelské prvky pro řízení skriptu
- Díl 3: Simulace joysticku dle SAE J1939
- Díl 4: Monitorování a zápis událostí do souboru CSV
- Díl 5: Měření periody a zápis do CSV pomocí přiřazení objektu
- Díl 6: Komunikace pomocí TCP
- Díl 7: Komunikace pomocí sériové linky
- Díl 8: PID regulátor
- Díl 9: Výpočet CRC a objekt obj_dataset
- Díl 10: Volání funkce z externí DLL
- Díl 11: Odeslání emailu s hlášením