Interpreterkommandos für SDO-Transfer

(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) !

Inhalt

Siehe auch:



Elementarer SDO-Zugriff mit einer Interpreterfunktion des Terminals

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).

Syntax:
sdo( [ #SDO-Client-Index , ] < index >.< subindex> [ , Datentyp ] [ , Defaultwert ]  )
Beispiele:
@X = sdo(0x6000.1, U8)
sdo(0x6200.1, U8) = X+1

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:

BOOLEAN, BOOL
Nur "True" oder "False" (in CANopen nicht genau definiert, vermutlich eine Ein-Bit-Variable)
INTEGER8, I8
8 Bit Integer mit Vorzeichen
INTEGER16, INT16, I16
16 Bit Integer mit Vorzeichen
INTEGER32, INT32, I32, LONG
32 Bit Integer mit Vorzeichen
UNSIGNED8, U8, BYTE
8 Bit Integer ohne Vorzeichen
UNSIGNED16, U16, WORD
16 Bit ohne Vorzeichen
UNSIGNED32, U32, DWORD
32 Bit ohne Vorzeichen
FLOAT32, F32, FLT
32 Bit Fliesskomma nach CANopen

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.

Beispiel:
@Temp = sdo(0x6000.1, Temp)

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).

zurück zur Übersicht


Ändern der SDO-Timeout-Zeit

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
Setzt die maximale "Wartezeit" für SDO-Zugriffe auf der Client-Seite.
Trifft die Antwort (SDO read- oder write-response) nicht innerhalb der spezifizierten Zeit (in Millisekunden) auf der Client-Seite ein, dann bricht die SDO-Zugriffs-Funktion die Übertragung ab, löst einen 'SDO-abort' aus (siehe Unten) und kehrt zum Aufrufer zurück.
Wenn das Anzeigeprogramm das sdo.timeout-Kommando nicht aufruft, verwendet die Firmware einen 'Default-Wert' für die SDO-Timeout-Zeit. Dieser liegt bei ungefähr 1000 Millisekunden.
Hinweis:
Die SDO-Timeout-Zeit kann erst gesetzt werden, nachdem das CANopen-Protokoll gestartet wurde. Andernfalls würde (bei der Initialisierung von CANopen) wieder der im CANopen-Protokollstack definierte Default-Wert verwendet.
Aus dem Grund funktioniert das Setzen von 'sdo.timeout_ms' nicht, wenn der Befehl in einem page-enter Event auf Anzeigeseite "Null" aufgerufen wird.
Grund: Seite Null wird in der Firmware bereits (einmal) angezeigt, bevor der CANopen-Stack initialisiert ist.

Aus dem Grund funktioniert das folgende Beispiel...

    sdo.timeout_ms = 5000 : REM set SDO timeout to 5 seconds

... nicht, wenn es als Reaktion auf das Page-Enter-Event auf Seite Null ausgeführt wird !
Manche 'Sonderfunktionen' (z.B. der in einem bestimmten Gerät eingebaute CANopen-Node-Scanner) überschreiben den Timeout-Wert im CANopen-SDO-Client. Nach dem Aufruf von Sonderfunktionen, die ebenfalls den SDO-Klienten verwenden, muss der Timeout-Wert vor dem Zugriff auf 'besonders langsame Objekte' daher gegebenenfalls neu eingestellt werden.

zurück zur Übersicht


Fehlerbehandlung in den SDO-Funktionen

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
returns the SDO abort code from the last erroneous SDO transfer. If nothing went wrong, the result is zero. This function may be used in a global event definition to trap any SDO errors. Please note: Once sdo.abort is non-zero, it will not return to zero automatically. The error code must be "cleared" (sdo.abort=0) after handling it.
sdo.abort.i (or sdo.abort.index)
returns the CANopen object index which was accessed when the last SDO abort occurred. You may show this value on the display to simplify "debugging" for the end-user.
sdo.abort.s (or sdo.abort.subindex)
returns the subindex of the CANopen object which was accessed when the last SDO abort occurred.

SDO abort codes

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 .

zurück zur Übersicht


Datei: ..?..\uptwin1\help\sdocm_49.htm
Autor: W.Büscher, MKT Systemtechnik
Letzte Änderung: 2014-05-07 (ISO8601, YYYY-MM-DD)

zurück zur Übersicht