Forum: Mikrocontroller und Digitale Elektronik CANopen: Initialisierung der Kommunikation


von [Gast] (Gast)


Lesenswert?

Hallo Forum,

ich bin momentan dabei einen Motor-Controller, der (laut Manual...) das 
CANopen "Drives and Motion Control Profile (DSP402)" implementiert, mit 
einem Mikrocontroller anzusteuern. Nach länglicher Literaturstudie 
glaube ich das CANopen System verstanden zu haben. Der Controller hat 
die Node ID 1.

Ich habe ihn zunächst mit einem gekauften USB-CAN Interface verbunden 
(1MBaud/Sec [=Default vom Controller], beide Seiten 120Ω terminiert), 
und sehe sofort die regelmäßige Übermittlung des SYNC Frames (Leere 
Nachricht auf CAN-ID 0x80), des Hearbeat Frames mit dem State code 
5="Operational" (Nachricht mit Inhalt 5 auf CAN-ID 0x701), und einer 
Reihe vermutlich herstellerspezifischer undokumentierter Frames 
(möglicherweise für eine Art Auto-Discovery für andere Geräte dieses 
Herstellers).
Um nun irgendetwas am Controller konfigurieren zu können, muss ich ja 
über SDOs eine Kommunikation aufbauen. Zunächst wollte ich einfach den 
Device Type, 0x1000 im Object Dictionary, auslesen. Und leider scheitert 
es direkt daran:
Ich sende eine Nachricht "0x80 0x10 0x00 0x00 0x00 0x00 0x00 0x00" auf 
CAN-ID 0x601 (= Server-SDO vom Node 1) für "Initiate SDO Upload". Der 
Controller gibt dabei ein ACK ab, d.h. setzt dominanten Pegel im ACK-Bit 
des Telegramms, d.h. sein CAN-Modul muss die Nachricht korrekt erhalten 
haben. Leider war das schon alles - es gibt keinerlei Reaktion darauf, 
keine "Initiate SDO Upload Response" und kein Error Frame.
Ich hatte nun vermutet dass man den Controller evtl. zuerst in den 
Preoperational State setzen muss, damit er ansprechbar wird, und habe 
dazu eine Module Control NMT Service Nachricht gesendet, d.h. "0x80 
0x01" auf CAN-ID 0, aber ohne Erfolg - der Controller sendet weiterhin 
über den Hearbeat, dass er im Status 5="Operational" ist.

Da ich ja den u.a. SYNC vom Controller sehe und dieser auch meine 
Nachrichten ACK't denke ich dass die CAN-Kommunikation an sich 
funktioniert, und es nur am Inhalt selber hapert...

Die "HOWTO"-Instruktionen im Manual fangen direkt an mit "konfigurieren 
sie Objekt ID sowieso auf dies und jenes" - aber das bekomme ich ja 
schon nicht hin...

Vermutlich habe ich irgendetwas in der CANopen-Spezifikation übersehen, 
dass man vorher irgendetwas anderes senden muss bevor man über SDOs 
kommunizieren kann - nur was? Weiß jemand was da noch fehlt?

von Peter Z. (hangloose)


Lesenswert?

Hallo, bist du sicher das du beim Object Dictionary erst das MSB senden 
musst? Probier es mal anders rum... 0x00 und dann 0x10

von Alex (Gast)


Lesenswert?

Dein Tool sollte SDO-Kommunikation beherschen(SDO zu Fuß emulieren ist 
nicht so trivial)

Für den Start kannst wahrscheinlich die Endstufe auch über PDOs 
einschalten, was deutlich einfacher geht nur mit rohe CAN-Frames

von Schorchi (Gast)


Lesenswert?

Hi,

SDO Kommunikation funktioniert nur in Preoperational. Also mit NMT auf 
Preoperational setzen.

Lesen des Modultyps Objekt 0x1000 mit 0x40 nicht mit 0x80. 0x80 wäre ein 
SDO Abbruch.

Lies noch mal die CANOpen spec durch.

Gruß,
Schorschi.

von Martin (Gast)


Lesenswert?

Schorchi schrieb:
> SDO Kommunikation funktioniert nur in Preoperational.

Nö.

> Lies noch mal die CANOpen spec durch.

Wäre eine Idee:
NMT state Operational --> Object dictionary access via SDO is possible.

Ansonsten 0x40 für den Request und den Object Index LSB first, also 
"0x40 0x00 0x10..."

von Syliosha (Gast)


Lesenswert?

Man sollte den State auf Pre-Operational setzen. Da im Operational 
Zustand, SDO nur möglich sind. Sie können genauso gut ignoriert werden.

von Schorchi (Gast)


Lesenswert?

Hi,

ja es kommt auf die SDO-Kommunikation drauf an.
Der Standardheader kann auch im Operational gelesen werden.
Aber eine Konfiguration sollte nur in Preoperational durchführbar sein.
Außer es ist eine gewollte Funktionsweise.

"0x40 0x00 0x10..." passt.

Gruß,
Schorschi.

von [Gast] (Gast)


Lesenswert?

Peter Z. schrieb:
> Hallo, bist du sicher das du beim Object Dictionary erst das MSB senden
> musst? Probier es mal anders rum... 0x00 und dann 0x10
Sicher nicht, aber ich meine irgendwo im Standard stand das so.

Alex schrieb:
> Dein Tool sollte SDO-Kommunikation beherschen(SDO zu Fuß emulieren ist
> nicht so trivial)
Eventuell könnte ich an das CANopen Plugin des Tools rankommen. Der 
Mikrocontroller muss es dann aber eh auch können...  Den Programmteil 
zur SDO-Kommunikation habe ich schon fertig, nur dass er nicht 
funktioniert ;-)
> Für den Start kannst wahrscheinlich die Endstufe auch über PDOs
> einschalten, was deutlich einfacher geht nur mit rohe CAN-Frames
Leider nein, da die PDO's per Default-Config nicht auf die dazu 
notwendigen Objects gemappt sind; außerdem muss man eine ganze Reihe 
Parameter einstellen, die sich gar nicht alle auf PDO's mappen lassen.

Schorchi schrieb:
> SDO Kommunikation funktioniert nur in Preoperational. Also mit NMT auf
> Preoperational setzen.
Syliosha schrieb:
> Man sollte den State auf Pre-Operational setzen. Da im Operational
> Zustand, SDO nur möglich sind. Sie können genauso gut ignoriert werden.
Laut Standard (S. 66, Kapitel 5.3.2.2.3) sollte SDO auch im Operational 
funktionieren. Aber wie gesagt, das hatte ich ja schon probiert, und das 
Gerät ignoriert ja auch die NMT Anfragen zum State ändern...
> Lesen des Modultyps Objekt 0x1000 mit 0x40 nicht mit 0x80. 0x80 wäre ein
> SDO Abbruch.
Oohps, der CCS ist 3 ja Bits... Das ist schonmal ein guter Tip :-)
> Lies noch mal die CANOpen spec durch.
Wenn sie lesbare wäre. ...

Schorchi schrieb:
> Aber eine Konfiguration sollte nur in Preoperational durchführbar sein.
Macht Sinn. Allerdings schon komisch dass der Controller direkt im 
Operational loslegt...

Schorchi schrieb:
> "0x40 0x00 0x10..." passt.
Okay vielen Dank, das werde ich dann mal so probieren :-)

von Christian (Gast)


Lesenswert?

Du könntest dir auch mal die Implementierung in canfestival ansehen, als 
Anregung. Ist keine tolle Implementierung, aber es funktioniert:

http://dev.automforge.net/CanFestival-3/file

die Dateien src/sdo.c und include/sdo.h

von Heinz-Jürgen O. (Firma: emtas) (hjo)


Lesenswert?

Syliosha schrieb:
> Man sollte den State auf Pre-Operational setzen. Da im Operational
> Zustand, SDO nur möglich sind. Sie können genauso gut ignoriert werden.

Das wäre dann kein Standard konformes Gerät.
SDO muss im PREOP und OPERATIONAL gehen, nur nicht im STOPPED,
dem dritten 'Standard' Kommunikationszustand eines CANopen Knotens.

Ja, CANopen überträgt mehrbyte Daten wie den Index ( 2 Byte) im little 
endian format, low- dann high-byte.

Es ist mühselig im Standard die richtigen Kommandobytes für ein initate 
SDO Kommando zu suchen. Es gibt auch Demo Versionen von CANopen 
konfigurationstools die zumindest solche einfachen Kommndos durchführen 
lassen.

Heinz

von [Gast] (Gast)


Lesenswert?

So, ich konnte jetzt wieder mit dem Controller weiterarbeiten, und 
tatsächlich funktioniert es mit den richtigen Kommando-Bytes (0x40). 
Dass so ein kleiner Verzähler so viel Arbeit generiert... Und in der Tat 
funktioniert das auch im OPERATIONAL Mode. Vielen Dank für die Hilfe... 
:-)

von Heinz-Jürgen O. (Firma: emtas) (hjo)


Lesenswert?

Auf

http://www.emtas.de/download/canopen-deviceexplorer-demo

gibt es eine der erwähnten Demos.
Ob sie real verwendet werden kann, hängt von Deinem verfügbaren Hardware 
Interface ab.

 Heinz

von Steffen Rose (Gast)


Lesenswert?

Hi,
ist schon etwas ungewöhnlich, wie dein Antrieb sich verhält.

Du schriebst, er sendet Sync. Im allgemeinen machen dies die Master.
Du schriebst, er reagiert nicht auf NMT Kommandos. Auch dies gilt häufig 
für die NMT Master.

Ich fände es etwas merkwürdig, dass der Antrieb ein Master ist. Doch das 
würde das Verhalten erklären. Für deine weiteren Experimente würde ich 
aber schauen, wie ich den Antrieb in den Slave mode bekomme. Du willst 
ja das Netzwerk steuern. Geht bestimmt, da es eigentlich der Normalfall 
ist.

Anm: Als Master wäre es dann auch wieder Standardkonform, dass er im 
OPERATIONAL ist.

Desweiteren sind bei 402 Geräten eigentlich die PDOs so eingestellt, das 
was geht.

Mich würde aber mal interessieren, was für ein Antrieb dies ist?

bye
Steffen

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.