Im Internet bin ich auf das Protokoll CANOPEN gestoßen. Dieses wird sehr
häufig in der Automatisierungstechnik usw. eingesetzt. Ist es sehr
schwierig das CANOPEN Protokoll auf dem Mikrocontroller zu
implementieren? Ich möchte
nur mal zwei Message Objekte verwenden, die jeweils 1 Datenbyte
beinhalten.
Um da näher einzusteigen benötige ich zuerst eine deutsche Beschreibung.
Die CAN ID soll dann so aussehen:
Bit 10 bis Bit 7 = Baugruppenadresse
Bit 6 bis Bit 0 = interne Adresse (Objekt)
Ziel soll es sein, dass jedes Board die gleiche Software enthält. Mit
Schaltern soll die Baugruppenadresse jeweils eingestellt werden.
Beispiel:
Baugruppenadresse 0 und Message Objekt 1 = Temperaturwert
Diese Information soll dann an das andere Board mit der
Baugruppenadresse 1 in das Message Objekt 1 empfangen werden (Ausgabe
LED).
Als Mikrocontroller verwende ich den Neuen mit der Bezeichnung
XC888/886.
Mit DAVE kann zum Beispiel eine Maske gesetzt werden (Register AMR).
Ist es möglich zuerst nur die obersten 4 Bits vom Identifier zu Filtern
und anschließend die unteren 7 Bits, die ausschlaggebend für die Message
Objekte sind.
Hmm, irgendwie ist Deine Frage widersprüchlich. Auf der einen Seite
willst Du CANopen verwenden, auf der anderen Seite legst Du schon Deine
Message-IDs fest. Was willst Du jetzt wirklich?
Wenn es CANopen sein soll, dann schau Dir mal den freien CANopen-Stack
CANfestival an. http://www.canfestival.org/
Dein Ziel ist mir aber nicht klar. Was sollen die Geräte machen? Sind
das I/O-Knoten?
mfg, Stefan.
Also ich will jetzt nicht zu 100% das CANopen Protokoll auf dem
Mikrocontroller nachbilden.So wie das ganze aussieht hat das wohl nix
mit CANopen zutun oder?
Im Dateianhang befindet sich eine Skizze, so wie ich mir das Ganze
vorstelle.
Wie gesagt, die Boards sollen schon gleich sein mit der gleichen
Software darauf. Nur die Unterscheidung soll duch Schalter realisiert
werden. Dadurch kann ich sagen entweder Busteilnehmer 0 oder 1 usw.
Ich möchte zuerst nur mal ein Byte versenden und empfangen pro Message
Objekt. Ja das sollen I/O-Knoten sein.
Hab noch was vergessen. Das Ansprechen der Busteilnehmer soll durch die
oberen 4 Bits(CAN-ID) erfolgen. Die unteren 7 Bits sollen die internen
Adressen abbilden. Das heisst z.B. interne Adresse 1 soll das Message
Objekt 1 sein.
CANopen regelt aber explizit die COB-ID's, die auf dem Bus während der
Arbitrierung gesendet werden. Es wird unterschieden in SDO's und PDO's,
Sync und Heartbeak, sowie Emergency und NMT-Messages mit explizit
festgelegten COB-ID's. (Diese sind natürlcih abhängig von der
eingestellten Knotennummer)
Das ist CANopen, wie es in der AT verwendet wird. Über diese SDO/PDO..
werden u.a. Frequenzumrichter, abgesetzte IOs... angesprochen..
Brauchst mehr Infos??
Hi Matthias,
hast Du da genauere Infos drüber?
Bin gerade am Eintüfteln in CANopen, aber
so richtig steige ich noch nicht durch.
Speziell diese Hardwarebeschreibungsfiles ... wars EDS oder ESD?
Da hab ich noch keine richtige Infos drüber gefunden, hast Du da
was passendes?
Guten Morgen, ich habe gestern zwei beitrgäge reingestellt.
So stelle ich mir das ganze vor. Kann mir jemand dazu helfen, wie man
dies mit dem Xc888/886 lösen könnte?
Also zunächst mal zu Patrick:
Vergiß das mit dem CANopen, das ist nicht das was Du brauchst. Du kannst
natürlich auf die ganze Programmiererei verzichten und fertige
CANopen-IO-Knoten kaufen. Wegen Hobby-Projekt wird das aber nicht sehr
günstig. Hersteller solcher IO-Knoten sind z.B. Frentzel&Berg oder
Möller. Das gibt es aber mindestens von weiteren 20 Herstellern.
Schau Dir mal Datenblätter oder Application Notes zum XC888 an, die sich
mit der CAN-Schnittstelle auseinandersetzen. Wenn Du Pakete empfangen
und versenden kannst, ist das die Halbe Miete.
@Mathias: Das Format der EDS- und DCF-Dateien ist in der Spezifikation
DS306 geregelt. Diese kannst Du über die CiA (CAN in Automation)
beziehen. Was hast Du überhaupt vor?
mfg, Stefan.
Vor einiger Zeit habe ich mal was miz dem SJA1000 gemacht.
Dieser besitzt für die Filterung der Nachrichten das ACR und AMR
Register. Der XC888 hat dagegen nur das AMR Register.
Wie könnte ich die Filterung (siehe oben) der ID's realisieren?
So dass ich zuerst die Baugruppenadresse und anschließend die Interne
Adresse (Message Objekt Nr) filtern kann?
Ich verstehe das doch richtig, daß CANopen im Gegensatz zu CAN selbst im
Application Layer residiert, also kann man ja OpenCAN auch über Seriell,
TCP/IP - ETH oder was einem auch in den Sinn kommen mag realisieren. CAN
selbst erfordert natürlich echte Hardware, aber CANopen sollte lösbar
sein, ober hab ich jetzt was völlig falsch verstanden?
Ja, CANopen residiert auch im Application-Layer, zumindest, was die
Device-Profile (DS4xx) angeht. Ethernet-Powerlink ist beispielsweise
CANopen sehr ähnlich. Wenn Du mit lösbar meinst, daß das in Software zu
implementieren ist, dann hast Du recht. CANopen ist allerdings alles
andere als trivial und für den Hobby-Einsatz völlig überzogen. Als
Alternative gibt es noch Micro-CANopen, die allerdings nicht 100% den
Standard unterstützen. Für die meisten Anwendungen reicht es aber
dennoch.
@Patrick: Wenn der CAN-Controller des XC888 kein AMR-Register hat, dann
macht man das eben von Hand. Die eine if-Abfrage sollte doch nicht allzu
schwer sein. Oder?
mfg, Stefan.
Ja der Mikrocontroller hat ein AMR Register. Diese Mikrocontroller hat
nur kein ACR register wie beim SJA1000.
Ich verstehe das mit der ID Filterung immer noch nicht ganz.
Kann mir jemand ein Beispiel geben, damit ich diese Sache besser
verstehen kann?
Zu den electronic data sheets kann ich dir (noch?) nix sagen.
Aber zum Protokoll des CANopen. Weil ich gerade eine Fkt schreibe, die
das CANopen Protokoll (OSI-Schicht7) auf einer CAN-Schnittstelle
realisiert (OSI-Schicht1?). Also die Sache mit den PDO's und SDO's und
der Berechnung der COB-IDs....
Falls du das brauchst..
Hi Matthias, brauchen könnte ich die eventuell schon. Ich brauche einen
Mechanismus, indem ich die CAN-ID dementsprechend filtern kann.
Z.B.
CAN-ID vom Busteilnehmer 1: Message Objekt 1 indem die
Schalterstellungen gespeichert und versendet wird: ID: 0001 0001
Der Busteilnehmer 2 empfängt diese Nachricht und sieht das ein Message
Objekt mit der Nr. versendet wurde. ID: 0002 0001
Das Problem ist die Umsetzung. Ich komm da noch nicht zurrecht.
Hab mal noch ne Frage:
Als Master verwende ich einen CAN Dongle (MASTER), den ich am PC
angeschlossen habe.
Hier kann ich alle CAN Botschaften verfolgen. Muss ich an dem MASTER
irgendwas machen?
Also zum Einlesen in CANopen kann ich folgendes Buch empfehlen :
Holger Zeltwanger CANopen ISBN 3-8007-2448-0
Um aber bei obiger Anwendung zu bleiben, lass die Finger von CANopen.
Ist viel zu komplex für diese simple Aufgabe. Schau dir erstmal die CAN
Grundlagen gut an. Das Beispiel ist dann mit ein paar C-Zeilen schnell
zu realisieren.
Und bei den CAN IDs bitte umdenken. Die sind nicht Teilnehmer orientiert
sonder werden besser Datenorientiert definiert. Also Teilnehmer 1 sendet
die Schalterstellungen mit der ID 0x011. Teilnehmer 2 möchte die
Schalterstellungen empfangen, also empfängt er ID 0x011.
Die Filterung würde ich zunächst ganz abschalten und einfach alles
empfangen und in der Empfangsroutine einfach die ID auswerten, wars die
richtige dann weiterverarbeiten ansonsten ignorieren. Wenn das mal
läuft, dann Filterung dazu und Empfang auf Interrupt umbauen.
Viel Glück
Ich muss aber dies so realisieren. Das heisst die CAN-ID besteht aus der
Nummer des Busteilnehmers und der Nummer vom Message Objekt (siehe
oben).
Busteilnehmer Nr. Message Objekt
CAN-ID: 0001 0001
Im Message Objekt 1 ist z.B. die Schalterstellung drin.
Diese Info soll über CAN gesendet werden.
Busteilnehmer Nr. Message Objekt
CAN-ID: 0002 0002
Der zweite Busteilnehmer soll dann die Info in das Message Objekt 2
laden und anzeigen.
Dies soll schon Teilnehmerorientiert sein.
@Patrick:
Kannst du dich noch bis abends gedulden? Hab grad wenig Zeit.
Abends schreib ich das mal hier auf, wie die Berechnung der COB-IDs nach
CanOpen erfolgt.... SOwie wie der Datenaustausch realisiert sit
Vielen Dank Matthias! Also du denkst schon, das ich mein Konzept, das
ich zuvor hier Vorgestellt habe mit dem XC888 Mikrocontroller
realisieren könnte?
Nun, zu dem Prozessor kann ich nix sagen, den kenne ich nicht.
Aber irgendwie klingt dein Vorhaben (Vergabe von CAN-IDs) nicht nach
CANopen.
Du wirst dich also entscheiden müssen, ob es notwendig/sinnvoll ist,
dieses Protokoll bei dir zu verwenden. Ich kann dir diesbezüglich nur
sagen, wie das aufgebaut ist das Protokoll.
Also definitiv möchte ich das Konzept, so wie ich es hier vorgestellt
habe realisieren. Kannst du mir dabei Helfen, wie ich dies realisieren
könnte?
Meine E-Mail Adresse lautet: patrick_elektronik@web.de
Also Patrick nun mal Tachles: Was möchtest Du von uns? Du kannst gerne
Hilfe in Form von Ratschlägen bekommen. Was ich oben NICHT sehe, ist ein
Konzept, auch wenn Du es als solches bezeichnest. Ich weiß bisher nur,
daß Du Dir um ungelegte Eier einen Kopf machst (Mapping, CANopen) und
mit den interessanten Fakten nicht rüber kommst (Was macht der
IO-Knoten?).
Was Du von uns nicht bekommen wirst, jedenfalls nicht kostenlos, ist der
Quellcode für Dein Projekt. Bisher habe ich von Dir keine
Eigeninitiative erkennen können, Dein Problem zu lösen. Das Forum kann
Dir bei konkreten Fragen helfen, Deine Fragen sind sowas von unkonkret,
dass sie einer Diskussion eigentlich nicht würdig sind.
mfg, Stefan.
P.S. Wenn Du etwas investieren willst, dann stelle Dein Konzept in Markt
vor. Dort gibt es bereitwillige Freiberufler, die Dir das realisieren
können.
Im Internet bin ich auf das Protokoll CANOPEN gestoßen. Wenn ich es
genau betracht dann ist CANOPEN für mich eher ungeeignet. Ich nutzt
sozusagen nur die Physik von CAN. Das Protokoll möchte ich nun selber
festlegen.
Also das CANOPEN Protokoll ziehe ich jetzt definitiv nicht mehr in
Betracht.
Mit dem XC888 kann ich ja CAN Nachrichten senden und empfangen. Das tut
auch soweit.
Zitat :
Der zweite Busteilnehmer soll dann die Info in das Message Objekt 2
laden und anzeigen.
Dies soll schon Teilnehmerorientiert sein.
Wenn ich das richtig verstehe sendet Teilnehmer 1 die Schalterstellung
im CAN Kommando mit der ID 000 0001 0001.
Falls Teilnehmer zwei diese Info empfangen möchte wird ihm nichts
anderes übrig bleiben, als diese ID auszuwerten. Wer soll denn aus der
000 0001 0001 (also 0x011) eine 000 0002 0002 (also 0x022) machen ? Der
Master ?
Oder soll Teilnehmer 2 die Info anzeigen und mit einer anderen ID
weitersenden ?
Der CAN Dongle der am PC angeschlossen ist empfängt alle CAN
Nachrichten.
Jetzut weiss ich nicht ob man jetzt mit meinem Vorhaben einen Master
braucht oder nicht. Fakt ist ich möchte das Ganze so haben wie ich oben
bereits beschrieben habe. Mir fehlt das die Idee, wie ich dies machen
könnte!!!
Der Busteilnehmer soll die CAN NAchricht emfangen und dementsprechend
die Info mit der LED anzeigen.
Gesten habe ich mir nochmals gedanken darüber gemacht.
Ich werde es zuerst mal so machen.
Ich sende vom Busteilnehmer 0 ein CAN NAchricht. Der Busteilnehmer 1
empfangt diese CAN NAchricht. Dies geschieht so, dass als erstes die
oberen 4 Bits überprüft werden. Wenn die oberen 4 Bits 0001 ergeben
dann, weiss der Busteilnehmer 1 das er gemeint ist. Danach werden die
unteren 7 Bits überprüft, ob eine Message Objekt (z.B. 000
0001)vorhanden ist. Wenn ja dann speichere die Info in das entsprechende
Message Objekt. So könnte ich dies doch als erstes mal machen oder ?
Ziel soll es sein, dass z.B. ein weiterer Busteilnehmer mit der Nr.2,
diese Nachricht gar nicht empfangen soll.
Gehen sollte das so. Effizient ist was anderes.
Falls irgendwann mal ein weiterer Teilnehmer verwendung für die Infos
vom Teilnehmer 0 hat, so musst du die gleichen Infos unter einer 2. ID
nochmals versenden und damit die Software mehrerer Knoten ändern.
Bis jetzt hast du nicht ein Argument für die Teilnehmerorientierung
gebracht.
Ich bleib dabei, schau dir die CAN Grundlagen an und ändere dein
Grundkonzept.
Dann kannst du auch die Vorteile von CAN nutzen.
Was soll das?
>>Bis jetzt hast du nicht ein Argument für die Teilnehmerorientierung>>gebracht.
Ich weiss ja auch nicht, wo ich richtige Informationen darüber bekommen
kann.
Ihr macht da ein Geheimnis draus, das ist unglaublich.
Mein Posting vom 18.06.2007 15:46 hast Du z.B. völlig ignoriert. Ich
weiß immer noch nicht wirklich, was Du vor hast. Ich weiß nur, daß Du
Nachrichten eine Bedeutung zugeordnet hast. Was ja schön ist. Nur was
ist dann Dein tatsächliches Problem? Du hast geschrieben, daß Du mit dem
XC888 CAN-Nachrichten senden und empfangen kannst. Dann hast Du doch
alles was Du brauchst. Nochmal: Was ist Dein tatsächliches Problem?
mfg, Stefan.
Hallo Stefan May, mein Problem ist eigentlich die Umsetzung.
Ich möchte dies ja auch teilnehmerorientiert realisieren.
Es soll ja auch so sein, dass ich später die Software auf jeden
Teilnehmer laden kann. Anschließend die Nummer des Teilnehmers mit
Schalter festlegen kann.Dies hat dann den Vorteil, dass man nicht für
jeden teilnehmer eine eigene Software erzeugen muss.
Dann bekommst Du aber das Problem, daß Du einen Master benötigst, der
Dir die Teilnehmerorientieren Pakete verteilt. Den Nachteil hat Dir
Patrick schon mitgeteilt, weshalb ja auch sein Vorschlag kam, das ganze
Nachrichtenorientiert zu betrachten.
Wenn Dein Problem die Umsetzung ist, dann verstehe ich nicht, warum. Du
sagst, CAN-Nachrichten empfangen und versenden ist kein Problem. Dann
kannst Du die Empfangenen Nachrichten doch per Software leicht
auswerten. Woran hapert es denn jetzt. Weißt Du nicht, wie Du anfangen
sollst? Oder hast Du Probleme, das in Software umzusetzen? Oder ist die
Hardware das Problem?
mfg, Stefan.
Ok ich verwende ja einen CAN Dongle am PC. Das verteilen der NAchrichten
mit Hilfe des Masters (CAN Dongle) möchte ich nicht verwenden. Dann wird
es zu komplex.
Ja ich weiss nun nicht, wie ich anfangen soll und wie ich dies in die
Software umzusetzen muss.
Und wieder meine Frage nicht beantwortet. :-( Ich gebe es bald auf.
Ich habe vier einfache Fragen gestellt und die Antwort ist "Ja ich
weiss!". Toll.
Die CAN-ID kannst Du z.B. so auswerten (C-Pseudocode):
int teilnehmer = ( id >> 7 ) & 0xF
int interne_adresse = ( id & 0x7F )
if ( teilnehmer == meine_schalter_stellung ) {
// tue was sinnvolles
}
else {
// ignoriere mich einfach
}
Hilft Dir das? Ist das Dein Problem?
mfg, Stefan.
Wahrscheinlich denke ich viel zu kompliziert. Ich werde zuerst
überprüfen, wie die CAN-ID aussieht. Wenn die Teilnehmernummer mit der
Schalterstellung übereinstimmt, kann ich dann als nächstes überprüfen on
ein Message Objekt anliegt. Wenn ja speichere das Datenbyte in das
entsprechende Message Objekt.
ALso eine Busprotokoll habe ich noch nie so entworfen. Wie würde man da
vorgehen? Also mein Vorhaben, so wie ich es mir vorstelle, ist ungefähr
klar.
Ich sehe hier noch ein Problem. Dieser XC888 beherbergt ja einen FUL
CAN.
Das heisst wenn ich mit DAVE eine Message Objekt für den Emfang
definiere, dann wird immer die CAN Nachricht in diesem Message Objekt
mitaufgenommen.
Ich möchte aber schon vorher selektieren (feststellen), ob die CAN
Nachricht in das Message Objekt gespeichert werden soll oder nicht.
Sorry, hab mich da ein paar mal vertippt.
Also so ein Busprotokoll habe ich noch nie so entworfen. Wie würde man
da
vorgehen? Also mein Vorhaben, so wie ich es mir vorstelle, ist ungefähr
klar.
Ich sehe hier noch ein Problem. Dieser XC888 beherbergt ja einen FULL
CAN. Das heisst wenn ich mit DAVE eine Message Objekt für den Empfang
definiere, dann wird immer die CAN Nachricht in diesem Message Objekt
mitaufgenommen.
Ich möchte aber schon vorher selektieren (CAN-ID), ob die CAN
Nachricht in das Message Objekt gespeichert werden soll oder nicht.
@ smay4finger:
Was ich vor habe? Naja, ist nicht ganz einfach das zu erklären,
also ich habe ein µC-System in meinem Weinkeller aufgebaut,
das zur Zeit über RS485 läuft. Das System soll nun um diverse
Komponenten erweitert werden und auch nachher noch erweiterbar
sein (diverse Sensoren und Aktoren halt, die noch dazu sollen)
Im Prinzip könnt ich mir ja n eigenes Protokoll zusammenschustern,
aber mir gefällt einfach die Vorstellung die Module an einen
Industriestandard kompatibel zu machen. Vielleicht wenn
ich mal n bissl mehr Zeit habe könnt ich sie zur Serienreife
weiterentwickeln und auch ggf vermarkten, aber das ist nur zweitrangig.
Ach so, nur zur Verdeutlichung, mit Weinkeller mein ich nicht
das Flaschenregal wo das Fahrrad davor steht, sondern die
Produktionsstätte von 200000L Wein / Jahr mit diversen Maschinen,
Pumpen, Filtern, Pressen etc.
Da würde ich aber gerade auf einen ordentlichen und wohldurchdachten
Ansatz setzen, bei Hard und Software. Weil wenns einmal läuft (wie auch
immer) änderst du nie und nimmer die ganze Kommunikation.
Lieber vorher zwei Wochen länger drüber nachgedacht, und dann richtig...
> Produktionsstätte von 200000L Wein / Jahr
Ja klar, und dann solche Komponenten selber entwickeln. Mal ein Beispiel
für eine Industriekomponente:
http://www.frenzel-berg.de/de/pr_canit/canit20.htm
Kostenpunkt so etwa 300 bis 400 Euro. Sowas gibt es von diversen
Herstellern als CANopen-DS401-Gerät. Einbauen und freuen, daß es
funktioniert. Gerade im industriellen Umfeld sollte man sich das
überlegen.
mfg, Stefan.
wenn ich aber gern bastle und das ohne
überheblich wirken zu wollen nicht gerade erfolglos?
Mal ganz davon abgesehen, dass ich eben wenn ichs
selbst zusammenbrutzle auch weiß was die Kiste macht und
mir "special features" einbauen kann, die außer mir eben
keiner hat?
Nein, selbst ist der Mann ;)