Teil 6 der TSN-Serie

Mit offenen Lösungen zum eigenen Endpunkt


Fortsetzung des Artikels von Teil 2

Senden in Traffic-Klassen nach Qbv (TAPRIO)

Listing 7. Konfiguration TAPRIO Qdisc
Listing 7. Konfiguration TAPRIO Qdisc
© ISW

Neben dem zeitgesteuerten Senden unterstützt Linux die TSN Funktionalität „Enhancements for Scheduled Traffic“ (IEEE802.1Qbv). Jede Traffic Klasse bekommt dabei einen ­Zeitschlitz für die Übertragung zur Verfügung gestellt. Unter Linux ist die Funktionalität in der TAPRIO-Qdisc (Time Aware Priority) umgesetzt. Diese wird ähnlich zur MQPRIO-Qdisc (siehe Abschnitt ETF) konfiguriert. Zusätzlich werden die Zeitschlitze als Gate-Control-List parametriert. Mangels frei verfügbarer Netzwerk-Schnittstellen mit Qbv-Unterstützung verwendet das Beispiel in Listing 7 kein Hardware-Offloading.

Der Parameter ‚base-time‘ spezifiziert den Startzeitpunkt des Schedules in Nanosekunden. Die Einträge ‚sched-entry‘ konfigurieren die Zeitschlitze. Dabei steht jeder Eintrag für einen Zeitschlitz. Das Schlüsselwort ‚S‘ sorgt für das Öffnen der danach spezifizierten Traffic-Klassen. Die Traffic-Klassen werden als hexadezimaler Parameter angegeben, bei dem jedes Bit eine Traffic-Klasse repräsentiert. Der Zeitschlitzeintrag ist durch die Angabe der Zeitschlitzlänge in Nanosekunden angegeben.

Im Beispiel sind somit drei Zeitschlitze parametriert. Während des ersten 300-µs-Zeitschlitzes wird die Traffic-Klasse 0 geöffnet, während des zweiten 300-µs-Zeitschlitzes werden die Traffic-Klassen 0 und 1 geöffnet und während des 400-µs-Zeitschlitzes ist die Traffic-Klasse 2 geöffnet. Die Parameter ‚flags‘ und ‚txtime-delay‘ aktivieren einen TxTime-assistierten Modus und die zugehörige Zeitspanne. Der Parameter ‚clockid‘ spezifiziert die für die Zeitstempel zu verwendende Uhr. 

Die Umsetzung der Anwendung

Listing 8. Setzen der Socketpriorität für TAPRIO (wie im Beispiel auf Priorität 3) in C
Listing 8. Setzen der Socketpriorität für TAPRIO (wie im Beispiel auf Priorität 3) in C
© ISW

Die Entwicklung einer Anwendung, die in Echtzeit auf dem beschriebenen System ausgeführt werden und dabei die beschriebenen TSN-Funktionalitäten verwenden soll, kann auf Basis der Quellcode-Beispiele im Realtime Linux Wiki erfolgen. Der beschriebene zyklische Echtzeit-Thread sollte zur Synchronisierung immer die CLOCK_TAI als Uhr verwenden. Vor Beginn des Echtzeit-Zyklus muss die Anwendung gegebenenfalls mittels clock_nanosleep() auf den Start des Schedules (bei TAPRIO) warten. Für die Anwendung mit einem Netzwerk-Schedule kann die Anwendung einen normalen Socket mit gewünschtem Typ öffnen und anschließend die Socket-Priorität entsprechend der Qdisc-Konfiguration anpassen (Listing 8).

Listing 9. C-Beispiel zeitgesteuertes Senden: Nutzung der Socketoption SO_TXTIME
Listing 9. C-Beispiel zeitgesteuertes Senden: Nutzung der Socketoption SO_TXTIME
© ISW

Um das zeitgesteuerte Senden zu nutzen, gilt es für den Socket die Option ‚SO_TXTIME‘ zu aktivieren. Dabei ist mit jedem Datenpaket ein vorher berechneter Sendezeitpunkt zu übergeben. Bei der Berechnung des Sendezeitpunktes aus dem aktuellen Zeitpunkt ist eine gewisse Zeitspanne für die Ausführung des Linux- Netzwerkstacks zu berücksichtigen. Auch hier sollte CLOCK_TAI als Uhr verwendet werden. ­Ebenfalls sind die Ausführungsprioritäten des Linux-Netzwerkstacks und der Echtzeit-Anwendung entsprechend anzupassen (Listing 9).

Eine Basis für viele Anwendungen

Mit den beschriebenen Werkzeugen lassen sich bereits heute einfache, verteilte Echtzeit-Anwendungen auf Basis von TSN realisieren. Wie genau diese aussehen, ist sehr applikationsspezifisch und muss im Einzelfall entschieden werden. Ein komplettes Beispiel, welches mehrere Endpunkte enthält und ein typisches Automatisierungsszenario abbildet, findet sich auf den Webseiten des Projekts ‚AccessTSN‘ [2].

Quellenhinweise:

[1] https://wiki.linuxfoundation.org/realtime/documentation/howto/applications/start

[2] https://www.accesstsn.com/

[3] https://tsn.readthedocs.io/

[4] https://wiki.linuxfoundation.org/realtime/documentation/howto/applications/start

[5] https://github.com/open62541/open62541/tree/master/examples/pubsub_realtime


  1. Mit offenen Lösungen zum eigenen Endpunkt
  2. Zeitgesteuerte Datenübertragung
  3. Senden in Traffic-Klassen nach Qbv (TAPRIO)

Das könnte Sie auch interessieren

Verwandte Artikel

Institut für Steuerungstechnik der Werkzeugmaschinen- und Fertigungsindustrie (ISW), WEKA FACHMEDIEN GmbH

TSN & OPC UA