Servicedatenobjekte (SDO)
Die im Objektverzeichnis aufgeführten Parameter werden über Servicedatenobjekte gelesen und beschrieben. Diese SDOs sind Multiplexed Domains, also Datenstrukturen beliebiger Größe, die mit einem Multiplexor (Adresse) versehen sind. Der Multiplexor besteht aus 16-Bit-Index und 8-Bit-Subindex, die die entsprechenden Einträge im Objektverzeichnis adressieren.
Die CANopen Buskoppler sind Server für das SDO, d.h. sie stellen auf Anforderung des Clients (z. B. des IPCs oder der SPS) Daten zur Verfügung (Upload) oder sie empfangen Daten vom Client (Download). Dabei findet ein Handshake zwischen Client und Server statt.
Wenn der zu übertragende Parameter bis zu 4 Bytes umfasst, genügt ein einziger Handshake (ein Telegrammpaar): Beim Download sendet der Client die Daten zusammen mit Index, Subindex und der Server bestätigt den Erhalt. Beim Upload fordert der Client die Daten an, indem er Index und Subindex des gewünschten Parameters überträgt, und der Server sendet den Parameter (incl. Index und Subindex) in seinem Antworttelegramm.
Für Upload und Download wird das gleiche Identifier-Paar verwendet. In den stets 8 Byte großen Telegrammen sind im ersten Datenbyte die unterschiedlichen Dienste codiert. Bis auf die Objekte 1008h, 1009h und 100Ah (Gerätename, Hardware- bzw. Softwareversion) sind alle Parameter der Buskoppler nur bis zu 4 Byte groß, daher beschränkt sich diese Beschreibung auf die Übertragung dieser Daten im beschleunigten Transfer (Expedited Transfer).
Protokoll
Im Folgenden wird der Aufbau der SDO-Telegramme beschrieben.
Client -> Server, Upload Request
11-bit Identifier | 8 Byte Nutzdaten | |||||||
0x600 (=1536dez) + Node-ID | 0x40 | Index0 | Index1 | SubIdx | 0x00 | 0x00 | 0x00 | 0x00 |
Parameter | Erläuterung |
---|---|
Index0 | Index Low-Byte (Unsigned16, LSB) |
Index1 | Index High-Byte (Unsigned16, MSB) |
SubIdx | Subindex (Unsigned8) |
Client -> Server, Upload Response
11-bit Identifier | 8 Byte Nutzdaten | |||||||
0x580 (=1408dez) + Node-ID | 0x4x | Index0 | Index1 | SubIdx | Data0 | Data1 | Data2 | Data3 |
Parameter | Erläuterung |
---|---|
Index0 | Index Low-Byte (Unsigned16, LSB) |
Index1 | Index High-Byte (Unsigned16, MSB) |
SubIdx | Subindex (Unsigned8) |
Data0 | Daten Low-Low-Byte (LLSB) |
Data3 | Daten High-High-Byte (MMSB) |
Parameter des Datentyps Unsigned8 werden im Byte D0 übertragen, Parameter des Typs Unsigned16 in D0 und D1.
Die Anzahl der gültigen Datenbytes ist im ersten CAN-Datenbyte (0x4x) wie folgt codiert:
Anzahl Parameter-Bytes | 1 | 2 | 3 | 4 |
---|---|---|---|---|
Erstes CAN-Datenbyte | 0x4F | 0x4B | 0x47 | 0x43 |
Client -> Server, Download Request
11-bit Identifier | 8 Byte Nutzdaten | |||||||
0x600 (=1536dez) + Node-ID | 0x22 | Index0 | Index1 | SubIdx | Data0 | Data1 | Data2 | Data3 |
Parameter | Erläuterung |
---|---|
Index0 | Index Low-Byte (Unsigned16, LSB) |
Index1 | Index High-Byte (Unsigned16, MSB) |
SubIdx | Subindex (Unsigned8) |
Data0 | Daten Low-Low-Byte (LLSB) |
Data3 | Daten High-High-Byte (MMSB) |
Optional ist es möglich, im ersten CAN-Datenbyte die Anzahl der gültigen Parameter-Datenbytes anzugeben
Anzahl Parameter-Bytes | 1 | 2 | 3 | 4 |
---|---|---|---|---|
Erstes CAN-Datenbyte | 0x2F | 0x2B | 0x27 | 0x23 |
In der Regel ist das jedoch nicht erforderlich, da jeweils nur die niederwertigen Datenbytes bis zur Länge des zu beschreibenden Objektverzeichniseintrags ausgewertet werden. Ein Download von Daten bis zu 4 Byte Länge kann daher bei BECKHOFF Busknoten immer mit 22 h im ersten CAN-Datenbyte erfolgen.
Client -> Server, Download Response
11-bit Identifier | 8 Byte Nutzdaten | |||||||
0x580 (=1408dez) + Node-ID | 0x60 | Index0 | Index1 | SubIdx | 0x00 | 0x00 | 0x00 | 0x00 |
Parameter | Erläuterung |
---|---|
Index0 | Index Low-Byte (Unsigned16, LSB) |
Index1 | Index High-Byte (Unsigned16, MSB) |
SubIdx | Subindex (Unsigned8) |
Abbruch Parameterkommunikation
Im Falle einer fehlerhaften Parameterkommunikation wird diese abgebrochen. Client bzw. Server senden dazu ein SDO-Telegramm folgender Struktur:
11-bit Identifier | 8 Byte Nutzdaten | |||||||
0x580 (Client) oder | 0x80 | Index0 | Index1 | SubIdx | Error0 | Error1 | Error2 | Error3 |
Parameter | Erläuterung |
---|---|
Index0 | Index Low-Byte (Unsigned16, LSB) |
Index1 | Index High-Byte (Unsigned16, MSB) |
SubIdx | Subindex (Unsigned8) |
Error0 | SDO Fehler-Code Low-Low-Byte (LLSB) |
Error3 | SDO Fehler-Code High-High-Byte (MMSB) |
Liste der SDO-Fehler-Codes (Abbruch-Grund des SDO-Transfers):
SDO-Fehler-Code | Erläuterung |
---|---|
0x05 03 00 00 | Toggle Bit nicht geändert |
0x05 04 00 01 | SDO Command Specifier ungültig oder unbekannt |
0x06 01 00 00 | Zugriff auf dieses Objekt wird nicht unterstützt |
0x06 01 00 02 | Versuch, auf einen Read_Only Parameter zu schreiben |
0x06 02 00 00 | Objekt nicht im Objektverzeichnis vorhanden |
0x06 04 00 41 | Objekt kann nicht ins PDO gemappt werden |
0x06 04 00 42 | Anzahl und/oder Länge der gemappten Objekte würde PDO Länge überschreiten |
0x06 04 00 43 | Allgemeine Parameter Inkompatibilität |
0x06 04 00 47 | Allgemeiner interner Fehler im Gerät |
0x06 06 00 00 | Zugriff wegen Hardware-Fehler abgebrochen |
0x06 07 00 10 | Datentyp oder Parameterlänge stimmen nicht überein oder sind unbekannt |
0x06 07 00 12 | Datentyp stimmt nicht überein, Parameterlänge zu groß |
0x06 07 00 13 | Datentyp stimmt nicht überein, Parameterlänge zu klein |
0x06 09 00 11 | Subindex nicht vorhanden |
0x06 09 00 30 | allgemeiner Wertebereich-Fehler |
0x06 09 00 31 | Wertebereich-Fehler: Parameter wert zu groß |
0x06 09 00 32 | Wertebereich-Fehler: Parameter wert zu klein |
0x06 0A 00 23 | Resource nicht verfügbar |
0x08 00 00 00 | Allgemeiner Fehler |
0x08 00 00 21 | Zugriff wegen lokaler Applikation nicht möglich |
0x08 00 00 22 | Zugriff wegen aktuellem Gerätestatus nicht möglich |
Für die Register-Kommunikation (Index 0x4500, 0x4501) wurden weitere, herstellerspezifische Fehler-Codes eingeführt:
SDO-Fehler-Code | Erläuterung |
---|---|
0x06 02 00 11 | ungültige Tabelle: Tabelle oder Kanal nicht vorhanden |
0x06 02 00 10 | ungültiges Register: Tabelle nicht vorhanden |
0x06 01 00 22 | Schreibschutz noch gesetzt |
0x06 07 00 43 | fehlerhafte Anzahl Funktionsargumente |
0x06 01 00 21 | Funktion noch aktiv, später erneut versuchen |
0x05 04 00 40 | Allgemeiner Routing Fehler |
0x06 06 00 21 | Fehler Zugriff BC Tabelle |
0x06 09 00 10 | Allgemeiner Fehler bei Kommunikation mit Klemme |
0x05 04 00 47 | Time-out bei Kommunikation mit Klemme |