Funktion eines CAN to Ethernet Gateway ?

Gast #467878
Lesenswert?

Grüß Gott

Ich will ein Gateway bauen um von CAN auf Ethernet zu kommen und auch 
umgekehrt. Meine offene Frage ist eigentlich nur wie die beste Strategie 
ist, möglichst zeitsparend die Konvertierung zu machen.

Es sollte ja verschiedene Möglichkeiten geben:
1. Gateway-Funktion in einem festen Zyklus ausführen (z.B. x 
millisekunden)
D.h. Während des "Wartens" alle eingehenden CAN Nachrichten im Puffer 
sammeln.  Bei Warte-Ende prioritätsweise die Nachrichten behandelt auf 
je 1 Ethernet Frame konvertierenund absenden. Danach die zweitwichtigste 
CAN Nachricht usw.

2. Bei jeder eingegangenenn CAN Nachricht gleich den Konvertierunszyklus 
aufrufen. IDs werden dabei nicht beachtet. Es wird immer die gesendet 
die sich gerade am CAN durchgesetzt hat.
Ich denke dass diese Methode langsamer ist.

Gibt es weitere Strategien? Auf dem Markt sind sehr viele dieser 
Umsetzter aber man weis ja nicht wie diese im inneren funktionieren.
Vielleicht liege ich auch mit meinen 2 Vorschlägen komplett daneben...
Gast #470270
Lesenswert?

Ich mach es so:

eingehende CAN Nachrichten werden in einem Puffer gespeichert
sobald der Puffer nicht leer ist und der Ethernet NIC bereit ist zum 
senden werden die Nachrichten im Puffer in ein UDP Datagram verpackt und 
abgeschickt

Funktioniert bisher tadellos. (CAN Bus 125kBps, Ether 10MBps full 
duplex, AVR 4MHz, Puffer mit bis zu 16 Nachrichten)
Gast #489058
Lesenswert?

Hi Philipp

Hast du deine CAN <-> RS232 Version selbst entwickelt? Wie hast du das 
gemacht? V.a. Rs232->CAN interessiert mich. Nimmst du dann ein Terminal 
programm? Welche Parameter übergibst du?

xiao Hans


#489116
Lesenswert?

Ich habe einen Mega8 genommen und ein MCP2515. Ich benutze das ganze für 
meinen CAN Bus im Auto. Die Paramter sind deshalb fest. Der Bus läuft 
mit 125kbit/s und der UART mit 115k2. Das Protokoll ist binär um nicht 
nochmehr Bandbreite zu verlieren. Ich sende 2 Bytes als Startcode, dann 
kommen 2 Byte für ID, 1 Byte für RTR und Length und dann die Datenbytes 
am Ende kommen noch 2 Bytes die das ganze abschließen. Senden 
funktioniert genauso. Am PC läuft ein kleines Programm zu dem man sich 
per TCP/IP verbinden kann und so die CAN Nachrichten erhält und auch 
welche senden kann. Leider ist die PC Software noch nicht sonderlich 
gut.

Gruß Philipp
Gast #490140
Lesenswert?

Hallo, der LPC2368 sollte für dich ein interessanter Chip sind. Der 
Preis mit knapp 8 Euro ist ganz ok. Der LPC2368 bietet CAN2.0, Ethernet, 
USB uvm., falls der interne Ram nicht ausreicht koennte man auf den 
LQFP144 ausweichen und ein externes Sram anschliessen.

Ich wuerde die CAN Messages per Interrupt in ein Array (FIFO) legen und 
wenn Zeit ist einfach die Daten auf das Ethernet geben.
Gast #490582
Lesenswert?

Hier mal ein Bild von meinem CAN Gateway. Hardware ist im wesentlichen 
von Ulrich's Webserver übernommen hab bloß zusätzlich noch den MCP2515 
drangehöngt. Als Software hab ich den Netzwerkstack der Procyon AVRLib 
bis hinauf zu UDP und einen selbstgebastelten Treiber für den CAN Chip 
eingespielt.
Hab' schon überlegt die riesige Netzwerkkarte durch einen ENC28J60 zu 
ersetzen. Dann wirds aber eventuell etwas zu eng auf dem SPI Interface. 
LPCxy ist für mich keine Option (zu viele zu kleine Pins). Eventuell 
wäre so ein PIC mit CAN von Microchip interessant.. jetzt hab ich mich 
aber schon auf die AVRs eingestellt und bin zu faul nen neuen Compiler 
zu installieren.
Angehängte Dateien:
Gast #490996
Lesenswert?

Wenn Du die Prioritäten richtig verteilst müsste das sortieren schon 
möglich sein. (Message A muß vor Message B auf den Bus: also bekommt A 
eine höhere Priorität) Aber im Grunde hast Du schon recht. Am 
einfachsten und sichersten ist es wohl die Nachrichten in der gleichen 
Reihenfolge auszugeben in der sie empfangen wurden. Also beim MCP2515 
zum Beispiel nur einen der drei TX Register verwenden.
Gast #491209
Lesenswert?

Ich wöllte es so machen, dass ich einen festen Zyklus habe um die CAN 
Nachrichten abzuholen.
Ich sage mal beispielhaft Zyklus = 3ms. Jetzt überlege ich wie groß ich 
das Datasegment festlege. Das hängt doch davon ab wieviele CAN 
Nachrichten in den 3ms maximal eintreffen können oder?
wenn ich von 500kbps ausgehe und im Worst Käse Fall nur Extended Frames 
bekomme, dann errechnet sich die Dauer eines eingehenden Frames:
Extended Frame Länge = 128 Bit (mit 8 DataBytes)
Dauer= 128Bit/500kBit/s = 256µs

In 3ms können sich dann 11,72 also 12 Frames maximal ansammeln. D.h. ich 
lege meinen Nutzbereich (z.B. im Ethernet Frame) auch auf maximal 
12*128Bit = 192Byte.

Sieht jemand einen Fehler in der Denksweise?
Gast #491370
Lesenswert?

Könnte schon funktionieren. Allerdings musst du dann sicherstellen dass 
der NIC nach den 3ms auch wirklich bereit ist zum Senden. Wenn wir beim 
Beispiel CAN over UDP bleiben könnte es ja passieren dass gerade zu dem 
Zeitpunkt ein ARP Request eintrudelt.
Außerdem würden bei dieser Methode alle Nachrichten im Mittel um 1,5ms 
verzögert. Musst Du überlegen ob das was ausmacht bei Deiner Anwendung.
Gast #492119
Lesenswert?

Öhm, der Gateway sollte ja eigentlich die Nachrichten erstmal einfach 
nur weiterleiten. Egal ob RTR oder nicht. Wenn es ein bidirectionaler 
Gateway ist sehe ich kein Problem mit RTR Frames. Eventuell müsste man 
nochmal überprüfen wie das mit dem Auto-Answer-Modus geregelt ist. Aber 
so wie ich das verstanden hab tut der Controller dann einen neuen Frame 
mit der Antwort erzeugen und der wird dann vom Gateway wieder 
weitergeleitet.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren