(nur für bestimmte Terminals mit geeignetem CAN-Transceiver)
Sorry, wir haben dieses Dokument mangels Zeit noch nicht komplett ins Deutsche übersetzt. Verwenden Sie ggf. die englischsprachige Version: sdocm_01.htm .
Dieses Dokument beschreibt, wie einzelne Werte per SDO-Client gelesen und geschrieben werden können, ohne eine UPT-Variable dauerhaft mit einem bestimmten CANopen-Objektindex und -Subindex zu verbinden.
Hinweis: Nicht alle Terminals bieten diese Funktion - nur Geräte mit CANopen seit 2004 (siehe Feature Matrix) !
Siehe auch:
Bei Geräten mit CANopen V4 (seit 2004)
können einzelne Werte per SDO gelesen oder geschrieben werden,
ohne den Einsatz einer speziell dafür konfigurierten
Variablen.
Die folgende Beschreibung bezieht sich nur auf den Display-Interpreter.
Bei Geräten mit der neueren Script-Sprache (die nicht interpretiert, sondern compiliert wird)
sind seit Juli 2013 ähnliche Funktionen verfügbar. Diesen muss allerdings der Prefix 'cop.'
(für 'CANopen') vorangestellt werden, um den Namensraum des Compilers nicht zu 'verseuchen' (namespace pollution).
sdo( [ #SDO-Client-Index , ] < index >.< subindex> [ , Datentyp ] [ , Defaultwert
] )
Die Angabe des SDO-Client-Indizes ist optional. Fehlt diese Angabe, wird der erste SDO-Client verwendet (mit dem Index 0). Die folgenden Kommandos sind daher gleichwertig:
sdo(#0,0x6411.04,I16) = 29490 : REM set 4th analog output to +9 V sdo( 0x6411.04 , I16) = 29490 : REM set the same output, using the same SDO client
Bei allen Zugriffen sollte der Datentyp angegeben werden. Andernfalls könnte der per SDO gelesene Wert falsch interpretiert werden. Zur Verfügung stehen:
Hinweis: Der erste Name ist die offizielle Bezeichnung nach CiA, der zweite Name ist eine alternativ wählbare Kurzform.
Für spezielle Anwendungen kann auch ein "Default-Wert" angegeben werden, der als Rückgabewert verwendet wird, falls ein Fehler bei der Bearbeitung auftritt.
In diesem Beispiel ändert sich der Wert der Variablen 'Temp' nicht, wenn der Zugriff per SDO-Lesefunktion fehlschlägt (andernfalls würde 'Temp' auf den 0x8001EEEE gesetzt, was intern als Zahlencode für einen "ungültigen Wert" verwendet wird).
Im Juli 2011 trat ein weiteres Problem mit CANopen auf, als ein Gerät
(ein CANopen slave, bzw SDO server) einen extrem langsamen SDO-Zugriff aufwies.
Das Auslesen eines Objektes mit dem Datentyp "String" dauerte mehrere Sekunden !
Um Probleme mit der ehemals 'hartcodierten' SDO-Timeout-Überwachung zu vermeiden,
wurde der folgende Interpreterbefehl in der Firmware des CANopen-Terminals
(d.h. auf der SDO-Client-Seite) implementiert.
Syntax:
sdo.timeout = new_timeout_in_milliseconds
sdo.timeout_ms = 5000 : REM set SDO timeout to 5 seconds
In einer robusten Terminal-Anwendung sollten Sie bei Verwendung von SDO-Transfers per Interpreterkommando auch prüfen, ob die Übertragung erfolgreich war, und den Anwender (Bediener) ggf. darauf hinweisen, wenn Probleme auftreten.
Ursachen für SDO-Kommunikationsprobleme können so trivial sein wie ein ausgefallenes CAN-Kabel, ein fehlender Abschlußwiderstand, eine falsch eingestellte Baudrate - es kann allerdings auch viel komplizierter sein. Der CANopen-Standard definiert sogenannte "abort codes", von denen die wichtigsten unten aufgeführt sind. Der im Terminal verwendete Interpreter bietet eine Funktion, mit dem der zuletzt aufgetretene "abort code" abgefragt werden kann. Sie können diese Funktion verwenden, um einen eigenen Event-Handler zu schreiben, um auf Fehler entsprechend reagieren zu können (ein Beispiel folgt später).
Syntax:
sdo.abort
sdo.abort.i (or sdo.abort.index)
sdo.abort.s (or sdo.abort.subindex)
The following codes may be returned by the function "sdo.abort". Zero means "no SDO abort" (no error recently).
Some of these codes are defined by CANopen, some are specific to the CANopen
implementation in the terminal.
Please note: (*) Due to problems in a certain network, abort code 0x05040000
will only be returned by the "sdo.abort" function if three SDO-communication
timeouts occurred in a row. This reduces the chance of false alarms if the
network suffers from an occasional loss of CAN messages. All other abort
codes will be returned "immediately", though.
SDO Abort Code | Meaning |
0x00000000 | no abort, no SDO error (yet) - TERMINAL SPECIFIC ! |
0x05030000 | SDO toggle bit error (protocol violation) |
0x05040000 | SDO communication timeout (*) |
0x05040001 | unknown SDO command specified (protocol incompatibility) |
0x05040002 | invalid SDO block size |
0x05040003 | invalid sequence number |
0x05040004 | CRC error (cyclic redundancy code, during block transfer) |
0x05040005 | out of memory |
0x06010000 | unsupported access |
0x06010001 | tried to read a WRITE-ONLY object |
0x06010002 | tried to write a READ-ONLY object |
0x06020000 | object does not exist (in the CANopen object dictionary) |
0x06040041 | object cannot be mapped (into a PDO) |
0x06040042 | PDO length exceeded (when trying to map an object) |
0x06040043 | general parameter incompatibililty |
0x06040047 | general internal incompatibility |
0x06060000 | access failed due to hardware error |
0x06070010 | data type and length code do not match |
0x06070012 | data type problem, length code is too high |
0x06070013 | data type problem, length code is too low |
0x06090011 | subindex does not exist |
0x06090030 | value range exceeded |
0x06090031 | value range exceeded, too high |
0x06090032 | value range exceeded, too low |
0x06090036 | maximum value is less than minimum value |
0x08000000 | general error |
0x08000020 | data could not be transferred or stored |
0x08000021 | data could not be transferred due to "local control" |
0x08000022 | data could not be transferred due to "device state" |
0x08000023 | object dictionary does not exist |
Siehe auch: Abfragen von SDO-Abort-Codes in der Script-Sprache .
Datei: ..?..\uptwin1\help\sdocm_49.htm
Autor: W.Büscher, MKT Systemtechnik
Letzte Änderung: 2014-05-07 (ISO8601, YYYY-MM-DD)