Ve druhém díle si vytvoříme skript který:
- čte data ze dvou různých příchozích zpráv
- generuje na CAN sběrnici periodicky zprávu, ve které jsou data vypočtena na základě dat z příchozích zpráv
- výstupní data se počítají jako poměr mezi vstupními daty, poměr je dán uživatelským sliderem
- vstupní a výstupní data se zobrazují v grafu
Pro testování můžeme použít program PP2CAN v režimu V2CAN, kdy data odesílaná jsou přijata loopbackem zpět. Pro generování zpráv se vstupními daty je pak možné použít nástroje Data sender. Zde je ke stažení příslušný projekt pro PP2CAN, který otevře přednastavená okna Data senderů, které generují potřebná data.
Pro přesnou periodu použijte PP2CAN ve variantě PP2CAN_PT.
Popis jednotlivých části skriptu je uveden ve skriptu jako komentář.
script: //Skript se vola jak periodicky tak i po prichodu CAN zpravy type = CAN_FUNCTION_AND_TIMER ; end variables: unsigned input_val1; unsigned input_val2; unsigned output; double coef; end objects: //Pouzivame 2 objekty pro CAN zpravu, jeden pro prichozi //a druhy pro odchozi CAN zpravu obj_can_msg can_msg_in; obj_can_msg can_msg_out; //Objekt jednoduchych oken grafu obj_datagraph graph_in; obj_datagraph graph_out; end init: logs("Script: Tutorial 2 - prijem dat a generovani zpravy"); log_endl(); input_val1 = 0; input_val2 = 0; output = 0; //Prednastavujeme si zpravu, ktera se bude periodicky generovat //Pri generovani tak staci pouze updatovat data can_msg_out.id1 = 10; can_msg_out.id2 = 0; can_msg_out.size = 2; can_msg_out.stext = false; can_msg_out.rtr = false; can_msg_out.set_data(0,0xFF); can_msg_out.set_data(1,0xFF); can_msg_out.set_data(2,0xFF); can_msg_out.set_data(3,0xFF); can_msg_out.set_data(4,0xFF); can_msg_out.set_data(5,0xFF); can_msg_out.set_data(6,0xFF); can_msg_out.set_data(7,0xFF); //Prednastaveni timeru na spousteni skriptu na 100ms ui_set_timer_script_period (100); //Ovladaci slider prednastavujeme na hodnotu 5000, tedy na polovinu rozsahu. //Pozor,nutny prekladac skriptu verze min 1.81, starsi verze tuto funkci nepodporuje ui_set_val0(5000); //Otevirame 2 okna grafu a nastavujeme jim titulek. graph_in.open("DATA-IN"); graph_out.open("DATA-OUT"); end body: //Test zda je skript volan udalosti prichodu CAN zpravy if(is_can_function_call()==true) { // Nactu do objektu zpravu, ktera prisla z CANu can_msg_in.load(); // Kontroluji zda je to zprava s 11 bitovym identifikatorem if(can_msg_in.stext==false && can_msg_in.rtr==false) { //Prvni vstupni data jsou ve zprave s ID 100 dekadicky if(can_msg_in.id1==100) { logs("Prichozi data, Id 100"); log_endl(); //Data jsou typu uint16, little endian a jsou ulozeny od datoveho bajtu 0 input_val1 = can_msg_in.get_uint16(0); } //Druha vstupni data jsou ve zprave s ID 200 else if(can_msg_in.id1==200) { logs("Prichozi data, Id 200"); log_endl(); //Data jsou typu uint16, little endian a jsou ulozeny od datoveho bajtu 0 input_val2 = can_msg_in.get_uint16(0); } } } //Test zda jde o udalost casovace - budu generovat data if(is_timer_call()==true) { logs("Timer"); log_endl(); //Cteni hodnoty slideru. Ten urcuje pomer mezi vstupnmi daty do vystupu coef = ui_get_val0(); //Prepocet rozsahu z 0..10000 na 0..1.0 coef = coef/10000; //Vypocet vystupni veliciny coef = (input_val1*coef) + (input_val2*(1.0-coef)); //Nastaveni vystupni veliciny do dat generovane CAN zpravy, little endian, od bajtu 0 //coef je typu double a pro vlozeni do dat CAN zpravy jako in16 je nutno jej //pretypovat zaokrouhlenim pomoci truncd na cele cislo can_msg_out.set_int16(0,truncd(coef)); //Odeslani zpravy na CAN can_msg_out.send(); //Nastaveni vstupnich a vystupnich dat do grafu graph_in.set_value(0,input_val1); graph_in.set_value(1,input_val2); graph_out.set_value(2,truncd(coef)); //Prekresleni grafu graph_in.update(); graph_out.update(); } end
Pokud skript pustíme a použijeme ke generování dat připravený projekt, vidíme že výstupní data jsou kombinací vstupních dat. Data jsou modulovány do sebe. Sliderem je možné změnit poměr vzájemné kombinace.
Kompletní skript ke stažení 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