ISOTP

From emotive
Jump to navigation Jump to search

Das wich­tigs­te aktu­el­le Trans­port­pro­to­koll für CAN ist ISOTP (ISO 15765-3). Hier wer­den vier ver­schie­de­ne Bot­schaft­s­ty­pen defi­niert:

  • Single-Fra­me
  • Fir­st-Fra­me
  • Con­se­cu­ti­ve-Fra­me
  • Flow-Con­trol

Der Single-Fra­me wird dann ver­wen­det, wenn die Bot­schaft klei­ner gleich 7 Bytes lang ist, sie­he Abbil­dung.


Protocolls-ISOTP-SF.png
ISOTP - Single-Fra­me


Grund: Eine CAN-Bot­schaft kann ins­ge­samt 8 Byte fas­sen und das ers­te Byte dient als Pro­to­koll­steue­r­in­for­ma­tion PCI. Bei einem Single-Fra­me wer­den die ers­ten vier Bits des PCI-Bytes auf 0 gesetzt. Die zwei­ten vier Bit die­ses Bytes ent­hal­ten die Daten­län­ge der fol­gen­den Daten. Der Nutz­da­ten­block kann nun zwi­schen einem und sie­ben Byte groß sein.


Protocolls-ISOTP-FF.png
ISOTP - Fir­st-Fra­me


Soll­te eine Dia­gno­se­bot­schaft aus mehr als 7 Daten­by­tes beste­hen, wird eine Seg­men­tie­rung benö­tigt. Dazu wird als ers­te Bot­schaft ein soge­nann­ter Fir­st-Fra­me ver­sen­det, sie­he Abbil­dung. Hier gibt es eben­falls ein PCI. Es besteht jedoch aus zwei Bytes. In den ers­ten 4 Bit des ers­ten Bytes steht der Wert 1. Dar­aus erkennt der Emp­fän­ger einen Fir­st-Fra­me. Die rest­li­chen vier Bits und das gesam­te nächs­te Byte zusam­men, also ins­ge­samt 12-Bit, ent­spre­chen der Anzahl der Daten der gesam­ten Dia­gno­se­bot­schaft. Ins­ge­samt also maxi­mal 4095 Byte. Die rest­li­chen sechs ver­blei­ben­den Bytes die­ser ers­ten Bot­schaft wer­den mit Daten gefüllt.


Protocolls-ISOTP-CF.png
ISOTP - Con­se­cu­ti­ve-Fra­me


Danach fol­gen so vie­le Con­se­cu­ti­ve-Fra­mes bis die gesam­te Bot­schaft ver­sen­det wur­de. Im Con­se­cu­ti­ve-Fra­me wird nur noch das ers­te Byte als PCI-Byte ein­ge­setzt. Mit den obe­ren vier Bits auf den Wert 2 und den fol­gen­den vier Bit mit einer so genann­ten Sequenz­num­mer. Die­se zählt ein­fach bei 1 begin­nend die ein­zel­nen Con­se­cu­ti­ve-Fra­mes. Und weil wir nur vier Bit zur Ver­fü­gung haben, wird Modu­lo 16 gerech­net. Der ers­te Con­se­cu­ti­ve-Fra­me hat die Sequenz­num­mer eins und so wei­ter bis fünf­zehn. Dann geht es wie­der bei null los.

Die­se drei Bot­schaft­s­ty­pen wer­den vom Sen­der gesen­det. Der vier­te Bot­schaft­s­typ, der so genann­te Flow-Con­trol-Fra­me, wird im Gegen­satz zu den Vori­gen vom Emp­fän­ger ver­sen­det. Der Flow-Con­trol-Fra­me besteht aus drei Bytes, die zusam­men ein PCI bil­den. Das ers­te Byte beginnt in den obe­ren 4 Bits mit dem Wert 3, der anzeigt, dass es sich um einen Flow-Con­trol han­delt. Dann folgt der Flow-Sta­tus. Die­ser Flow-Sta­tus kann ent­we­der 0 sein. Das zeigt dem Sen­der, der den Daten­block ver­sen­den will, dass er tat­säch­lich sen­den kann. Der Wert kann aber auch eins sein. Damit zeigt der Emp­fän­ger an, dass er noch Zeit braucht und dass der Sen­der war­ten möge. Mit dem Wert zwei kann der Emp­fän­ger anzei­gen, dass es bei ihm zu einem Spei­cher­über­lauf gekom­men ist, dass der Daten­block igno­riert wur­de und das Sen­den gege­be­nen­falls wie­der­holt wer­den muss.


Protocolls-ISOTP-FC.png
ISOTP - Flow-Con­trol


Mit dem zwei­ten Byte, der Block­grö­ße, wird der Sen­der dar­über infor­miert, wie vie­le Con­se­cu­ti­ve-Fra­mes er hin­ter­ein­an­der sen­den darf, bevor der Emp­fän­ger wie­der Zeit zur Ver­ar­bei­tung braucht. Als letz­tes zeigt die Mini­mum-Sepa­ra­tion-Time den Min­destab­stand zwi­schen auf­ein­an­der­fol­gen­den Con­se­cu­ti­ve-Fra­mes, den der Sen­der ein­hal­ten muss. Der Gesamta­blauf wird an fol­gen­dem klei­nen Bei­spiel deut­lich, sie­he Bild:


Protocolls-ISOTP-Sample.png
{{{3}}}


Wir neh­men an, dass wir eine Dia­gno­se­bot­schaft mit 35 Byte haben und der Emp­fän­ger ledig­lich 24 Byte puf­fern kann. Der gan­ze Ablauf beginnt vom Sen­der aus mit einer Fir­st-Fra­me-Bot­schaft. Sie hat in den obers­ten 4 Bits eine eins gesetzt. Danach fol­gen zwölf Bits, die die gesam­te Daten­län­ge anzei­gen. Da wir hier 35 Bytes haben, dies ent­spricht 0x23 hexa­de­zi­mal, folgt hier der Wert 0x23. Danach kom­men die ers­ten 6 Daten­by­tes.

Der Emp­fän­ger rea­giert auf den Fir­st-Fra­me, indem er einen Flow-Con­trol-Fra­me zurück­sen­det, in dem die obers­ten 4 Bit als Anzei­ge für den Flow-Con­trol auf 3 gesetzt sind. Wir neh­men an, dass der Emp­fän­ger in der Lage ist, 24 Byte zu puf­fern. Er ist außer­dem bereit, Daten zu emp­fan­gen. Daher wird in den unters­ten 4 Bits des ers­ten Bytes Cle­ar­To­Send auf 0 gesetzt. Das fol­gen­de Byte ent­halt die Anzahl der Blöcke. Dies sind hier 3 Blöcke (=24/8). Im letz­ten Byte wird hier die Mini­mum-Sepa­ra­tion-Time auf zehn Mil­li­se­kun­den (=0x0A) ein­ge­stellt.

Auf den Flow-Con­trol-Fra­me rea­giert der Sen­der indem er beginnt, sei­ne Con­se­cu­ti­ve-Fra­mes mit den rest­li­chen Daten zu sen­den. Der Con­se­cu­ti­ve-Fra­me beginnt wie­der mit einem PCI-Byte, in dem die obe­ren 4 Bits auf 2 gesetzt sind. Dann folgt die Sequenz­num­mer eins, da es der ers­te Con­se­cu­ti­ve-Fra­me ist. Die rest­li­chen 7 Byte der CAN-Bot­schaft wer­den mit den nächs­ten 7 Nutz­da­ten­by­tes gefüllt. Da wir eine Block­grö­ße von ins­ge­samt drei haben, geht die­ser Ablauf unter Ein­hal­tung der Sepa­ra­tion-Time von zehn Mil­li­se­kun­den so wei­ter: Der nächs­te Con­se­cu­ti­ve-Fra­me folgt, die Sequenz­num­mer hat sich geän­dert und die 7 nächs­ten Daten­by­tes wer­den gesen­det. Dann folgt der drit­te Con­se­cu­ti­ve-Fra­me mit eben­falls wie­der 7 Daten­by­tes, die Sequenz­num­mer hat sich auf 3 erhöht.

Da die Block­grö­ße auf drei fest­ge­legt wur­de, kann nun kein wei­te­rer Con­se­cu­ti­ve-Fra­me fol­gen. Der Sen­der war­tet dar­auf, dass der Emp­fän­ger ihm jetzt über einen zwei­ten Flow-Con­trol-Fra­me mit­teilt, dass das Sen­den wei­ter­ge­hen kann. Hier ste­hen nun in unse­rem Bei­spiel die­sel­ben Wer­te wie im ers­ten Flow-Con­trol-Fra­me. Theo­re­tisch könn­te der Emp­fän­ger an die­ser Stel­le zum War­ten auf­for­dern oder er könn­te mit einer ande­ren Block­grö­ße oder einer ande­ren Sepa­ra­tion-Time arbei­ten.

Nach­dem der eigent­li­che Sen­der nun die­sen zwei­ten Flow-Con­trol-Fra­me emp­fan­gen hat, setzt er das Sen­den des Daten­blocks fort. Es folgt ein wei­te­rer Con­se­cu­ti­ve-Fra­me mit der Sequenz­num­mer 4 und ein letz­ter mit der Sequenz­num­mer 5. Ins­ge­samt sind damit die 35 Daten­by­tes erfolg­reich ver­sen­det wor­den.

Der Ablauf die­ser seg­men­tier­ten Daten­über­tra­gung ist doch eini­ger­ma­ßen kom­plex, des­we­gen sieht das Pro­to­koll eine Rei­he von Feh­ler­er­ken­nungs- und Über­wa­chungs­me­cha­nis­men vor, die nach­fol­gend stich­wort­ar­tig auf­ge­lis­tet wer­den:

Timeout Bedin­gun­gen

  • Für den Sen­der: Abstand zwi­schen der FF-Bot­schaft und der FC-Ant­wort: max. 1s
  • Für den Emp­fän­ger: Abstand zwi­schen zwei CF-Bot­schaf­ten: max. 1s
  • Falls der Emp­fän­ger Zeit zur Ver­ar­bei­tung benö­tigt, kann er mit einer Flow Con­trol Bot­schaft mit Flow Sta­tus FS = Wait eine Pau­se erzwin­gen, bis er nach max. 1s mit einer wei­te­ren Flow Con­trol Bot­schaft zum Wei­ter­sen­den oder erneut zum War­ten auf­for­dert
  • Für Dia­gno­se­tes­ter wird BS=0 und STMin=0 gefor­dert, d.h. Emp­fang auf der Tes­ter­sei­te effek­tiv ohne Fluss­steue­rung

Feh­ler­er­ken­nung

  • Sen­der und Emp­fän­ger über­wa­chen die seg­men­tier­te Über­tra­gung durch die ent­spre­chen­den Timeouts, der Emp­fän­ger zusätz­lich über die Sequenz­num­mer
  • Im Feh­ler­fall wird eine emp­fan­ge­ne Bot­schaft igno­riert und die dar­über lie­gen­de Schicht infor­miert.
  • In der Trans­port­schicht erfolgt kei­ne Feh­ler­be­hand­lung, d.h. weder Sen­de­wie­der­ho­lung noch Feh­ler­bot­schaft

Zu den Über­wa­chungs­me­cha­nis­men gehö­ren eine Rei­he von Zeit­be­din­gun­gen, also Time-Out-Mecha­nis­men. Zwi­schen Fir­st- und Flow-Con­trol-Fra­me darf maxi­mal ein zeit­li­cher Abstand von einer Sekun­de lie­gen. Wenn also der Emp­fän­ger nicht schnell genug mit einer Flow-Con­trol-Fra­me-Bot­schaft rea­giert, weiß der Sen­der, dass etwas nicht in Ord­nung ist. Umge­kehrt über­wacht der Emp­fän­ger den zeit­li­chen Abstand der Con­se­cu­ti­ve-Fra­mes. Auch da darf maxi­mal eine Sekun­de als Abstand dazwi­schen lie­gen. Dazu kommt bei der seg­men­tier­ten Über­tra­gung, dass die Seg­ment­num­mern über­wacht wer­den. Falls es zu einem Feh­ler in den Seg­ment­num­mern oder einem Timeout kommt, wird die emp­fan­ge­ne Bot­schaft ein­fach igno­riert. Ob der Sen­der die fehl­ge­schla­ge­ne Über­tra­gung wie­der­holt, ist nicht in der Trans­port­schicht fest­ge­legt, son­dern muss auf der Appli­ka­ti­ons­ebe­ne geklärt sein.


Siehe auch

Transportprotokolle

FlexRay TP

Andere Transportprotokolle