Po dwóch pierwszych częściach przygód z CANoe czas w końcu na napisanie kodu. Zaimplementujemy prostą funkcjonalność dla węzła Body Computer. Komputer będzie nadawał jedną ramkę, w której dwa sygnały będą miały stałą, określoną wartość, zaś trzeci sygnał (Counter) będzie się inkrementował za każdym wysłaniem ramki.
W rzeczywistości countery (liczniki) są często stosowane w ramkach nadawanych cyklicznie. Pozwala to wykryć przez odbiorcę zgubienie ramek lub nadejście ich w niepoprawnej kolejności.
Aby przejść do edytora CAPL należy kliknąć dwukrotnie bloczek w Simulation Setup. Oto kod, który możesz wkleić do węzła. Polecam Ci go jednak przepisać ręcznie – abyś lepiej uświadomił sobie co tu robimy.
Jeśli nigdy nie programowałeś w CAPLu i nie czytałeś mojego wpisu o podstawach programowania w CAPL, zrób sobie przerwę na lekturę zanim przejdziesz dalej.
/*@!Encoding:1250*/
includes
{
}
variables
{
int MessageCounter = 0;
timer CyclicFrameTransmission; /* timer do cyklicznego nadawania ramki */
message BCM_Status BCM_status_variable; /* zmienna typu message - ramka od BCM */
}
on start {
setTimer(CyclicFrameTransmission, 1); /* zaczynamy kręcić timerem */
BCM_status_variable.HeadLightStatus = 0x11; /* określamy wartości sygnałów */
BCM_status_variable.TurnSignal = 0x7;
}
on timer CyclicFrameTransmission {
MessageCounter = (MessageCounter+1) & 0xFF; /*świadomie kontrolujemy przepełnienie jednego bajtu - bierzemy samą końcówkę */
BCM_status_variable.Counter = MessageCounter;
output(BCM_status_variable); /* wysłanie ramki na magistralę */
setTimer(CyclicFrameTransmission, 1); /* timer wywołuje sam siebie za 1s */
}
Pokażę Ci teraz jedną rzecz. W trakcie pisania kodu zauważysz, że dzięki podpięciu bazy danych DBC możesz podejrzeć elementy składowe (np. sygnały) zawarte w obiekcie ramki typu BCM_status i możesz bezpośrednio do niej wpisywać wartość.
Ogarnęliśmy temat dla pierwszego węzła. Zanim pójdziemy dalej odpalmy symulację, żeby sprawdzić, czy ramki rzeczywiście się nadają.
W pierwszej części pisałem, że niewielu z opcji CANoe będziesz naprawdę potrzebował. No więc kolejną rzeczą, która Ci się na pewno przyda jest trace (Analysis -> Trace). Jest to okienko pokazujące listę ramek pojawiających się na magistrali.
Jeśli to Twoje pierwsze spotkanie z Tracem, polecam teraz zrobić pauzę i poświęcić chwilę na podejrzenie sobie co robią te wszystkie przyciski na górze. Nie będę tego opisywał, bo wierzę że lepszy efekt osiągniesz badając to samodzielnie.
Co widzimy w trace’ie?
Kolejne ramki wysyłane zostają co 1 sekundę. Wartość na pierwszym bajcie jest inkrementowana z każdym kolejnym wystąpieniem ramki, zaś bajty 2 i 3 się nie zmieniają.
CANoe wyszarza te części ramki, które nie zmieniają swojej wartości od dłuższego czasu. Jest to genialna funkcjonalność, ponieważ pozwala skupić się jedynie na tych bajtach, które wnoszą zmianę.
Dalsze kroki dla Ciebie
Zanim przejdziemy dalej, mam dla Ciebie zadanie.
Stworzyliśmy skrypt jedynie dla pojedynczego węzła. Twoim zadaniem jest zaprogramowanie pozostałych dwóch węzłów według własnego uznania i upewnienie się, że poprawnie nadają swoje ramki na magistralę.
zobacz także:
Dodaj komentarz