Ostatnio spotykam w sieci wiele komentarzy dotyczących sprawy przyspieszającej Toyoty Prius. Internetowi eksperci mądrzą się o samochodach, że to mogło być, albo że tamto, a może tam gdzieś są Windowsy... Ale tego, jak działa współczesny samochód nie można się dowiedzieć zaglądając do środka i obserwując że wihajster łączy się z holajzą.
Ja akurat to wiem - przez dobre parę lat robiłem w branży automotive (a może wkrótce do tego wrócę, ale na razie cicho sza!). Więc mimo że to nie jest ani o NRD, ani o Niemczech, dla szerzenia edukacji notka o tym.
Kiedyś każde urządzenie elektryczne w samochodzie miało doprowadzony kabelek, który szedł do jakiegoś wyłącznika. Dalej było prosto - styki zwarte - urządzenie działa, rozwarte - nie działa. Wszystko pięknie, ale mamy tu parę wad:
- Nie ma żadnej informacji zwrotnej, czy urządzenie naprawdę działa.
- Wyłączniki przełączają duże prądy a kabelki muszą być grube (wiem, można dać przekaźnik, ale to nie taka duża różnica).
- Dużo grubych kabelków kosztuje i waży swoje.
Od dłuższego już czasu robi się więc samochód inaczej. Do każdego urządzenia doprowadzone jest kabelkiem zasilanie, a drugim kabelkiem (tak dokładnie to parą różnicową kabelków) sygnał sterujący. Zarówno zasilanie jak i sterowanie jest wspólne dla wielu urządzeń (czyli jest to magistrala - ang. bus) więc kabelków robi się o wiele mniej. Do urządzeń wymieniających większe ilości danych zamiast kabelków miedzianych podłączany jest światłowód.
Ten bus do sterowania to specjalny wariant złącza szeregowego na którym chodzi protokół niskiego poziomu zwany CAN, natomiast światłowód to klasyczny ring chodzący z protokołem MOST. Czyli samochód jest całkowicie usieciowiony. A jaka jest tego konsekwencja? Taka, że każde urządzenie, nawet nieznaczące, musi mieć swój procesor. A tych busów to tak naprawdę jest kilka, jest też moduł routera między busami zwany Gateway.
Po tych magistralach przesyłane jest wszystko - od rozkazów typu "włącz światła", przez digitalizowany stream sygnału dźwiękowego z radia do wzmacniacza w bagażniku, do streamu danych video z odtwarzacza DVD do monitorów w zagłówkach albo streamu video z noktowizora do wyświetlacza HUD.
I teraz zaczyna się prawdziwa zabawa - mamy do czynienia z heterogenicznym systemem rozproszonym z oprogramowaniem od różnych producentów. Teoria mówi oczywiście że mamy standardy i wszyscy mają się ich trzymać, ale praktykę każdy praktykujący inżynier dowolnej branży zna.
Na zdjęciu małe stanowisko testowe do testowania HeadUnit Audi A6.
Podstawowym systemem operacyjnym używanym w branży automotive jest VxWorks. Jest to specjalnie do tych zastosowań dopasowany derywat Unixa. W czym się na to pisze to już wybór każdego z producentów. Na przykład do Audi A6 robiliśmy w C++, a do BMW i VW Tuarega w Javie.
Każde urządzenie ma kilka standardowych możliwości komunikacji z nim. Można:
- przeczytać z niego pewne dane (Messwertblock)
- ustawić pewne parametry (Anpassunskanal)
- Można wystartować self-test i odpytać jego stan.
- Można sprawdzić i skasować zarejestrowane błędy i problemy (DTC - Diagnostic Trouble Code)
- Można wysyłać do niego rozkazy
Protokół komunikacji z takim urządzeniem jest zestandaryzowany i na przykład warsztat używa do diagnozy różnych samochodów standardowego testera. Problem jest tylko taki, że dla konkretnego urządzenia konkretnego producenta trzeba wiedzieć, co wartość albo rozkaz o danym numerze oznacza.
Na zdjęciu (znalezionym przypadkiem w sieci, nie ja wyniosłem): Pełne stanowisko testowe elektroniki do Audi A6.
Oczywiście zagwarantowanie poprawnego działania tak heterogenicznego systemu to jest jeden wielki horror. W dodatku zauważmy że samochód to jest akurat miejsce gdzie zakłócenia radioelektryczne są po prostu potworne. A ten samochód do tego tu i ówdzie przejeżdża obok silnych nadajników radiowych...
Trudno się więc dziwić, że w takim systemie pojawiają się błędy. I o ile błędy w oprogramowaniu, w protokołach itp. można wytestować i usunąć (na co idzie bardzo dużo wysiłku i czasu, zazwyczaj cała produkcja nowego modelu jest od dawna gotowa a o terminie SOP decyduje, czy oprogramowanie już działa jak trzeba), to pozostaje jeszcze cała gama błędów losowych spowodowanych wpływami zewnętrznym. Słyszałem na przykład o samoczynnej zmianie biegu na niższy przy przejeżdżaniu obok nadajnika. Problem był kilkukrotnie zgłaszany w serwisie, ale zawsze ignorowany jako niepowtarzalny.
Według statystyk ADAC za rok 2008 (EDIT: tu był link, ale się zdezaktualizował) aż 40% przypadków zatrzymania się samochodu w drodze lub niemożności uruchomienia samochodu przypada na problemy z instalacją elektryczną (czytaj: oprogramowaniem). Według ADAC coraz częściej przyczyną problemów jest wyładowany akumulator, według mojej wiedzy prawdziwą przyczyną wyładowania akumulatora są zazwyczaj problemy oprogramowania - jakieś urządzenie może się nie wyłączyć poprawnie po zgaszeniu silnika. Audi przy A6 miało co do tego bardzo dokładnie sformułowane i testowane requirementy, właśnie dlatego że jest to poważny problem. Zauważmy, że jednak w sumie zatrzymań w drodze jest w ogóle coraz mniej. Oznacza to, że mechanikę wszyscy mają już opanowaną bardzo dobrze, prawdziwym wyzwaniem jest właśnie oprogramowanie.
Myślę też, że sprawy przyspieszającego Priusa nie da się wyjaśnić, ani tego błędu zreprodukować. Tak to już we współczesnych samochodach jest.