Welches Bussystem?

#3234980
Lesenswert?

Hallo,

hab bis zu 30 Platinen ca. 200mm lang mit je einem Controller drauf.
Die sollten alle Slaves sein, und über ein Busssystem mit dem Master 
kommunizieren.

Welches Bussystem würdet Ihr bevorzugen?
Braucht der Bus eine Verstärkung auf jeder Platine?

Es sind schon mehrere Meter, die das ganze Konstrukt dann hat.

Gruß
Tweaker
Gast #3235323
Lesenswert?

RS485 ist an sich zwar sehr gut geeignet, aber bei der Datenrate ist das 
auf Controller-Seite nicht mehr trivial.

Bei niedrigeren Datenraten lässt sich per UART und RS485-Transceiver 
ganz simpel und sehr zuverlässig ein MODBUS RTU aufbauen.

Was darf es denn kosten?
Welcher Controller steht zur Verfügung?
Darf/soll für die Bus-Anbindung ein zusätzlicher Controller verwendet 
werden?
#3235685
Lesenswert?

Als Master soll ein Raspberry oder ähnliches dienen.
Der dann die Slaves mit Daten versorgt.
Der Bus ist von der Topologie auf jeden Fall Linear, also kein Stern...
Die Platinen sollen vorne ein Stecker und hinten eine Buchse haben, 
womit das Busssignal sowie Versorgung an die nächste Platine 
weitergegeben wird.

Die Kosten sollen, wie immer, möglichst niedrig ausfallen.
Hab auf der Platine/slave an einen Atmega88 oder so gedacht.
Der Muss auch sonst relativ wenig machen außer die Daten zu 
kommunizieren und diese umsetzten. -> Also nur ein 
Controller/Slaveplatine.
Kann aber Ressourcennotwenigkeit für die Datenrate schlecht einschätzen.
Sollte ja eigentlich von der HW-Uart im Controller abgedeckt sein.

Es ist vermutlich eher ein Problem auf der Masterseite. und diese 
Datenrate ist auch nur bei Vollauslast notwendig. Aber wäre halt super 
wenn ich das schaffe. Hier bin ich halt von 30mal/s alle Slaves mit 
Daten versorgen, ausgegangen. 5mal/s würde im Grenzfall auch 
reichen(240kbit/s).

@Markus: Denkst du an einen anderen Bus?
Gast #3235709
Lesenswert?

Naturgemäß sehen an einem (linearen) bus alle Teilnehmer die gleiche 
Datenrate. Also haben alle "ein Problem". Sobald Du in Geschwindigkeiten 
kommst, bei denen der UART noch mitmacht, kannst Du RS485 verwenden. Den 
kannst Du "einfach so" mit einem möglichst einfachen Protokoll oder mit 
etwas mehr Overhead mit einem Standard-Protokoll wie MODBUS RTU 
verwenden. Was davon sinnvoll ist, musst Du selbst beurteilen.

Bei Datenraten, die die Leistungsfähigkeit eines UARTs übersteigen, 
würde ich immer auf ein Ethernet-basiertes Protokoll gehen. Bei einer 
linearen Verbindung lässt sich das aber leider nicht umsetzen.
#3235729
Lesenswert?

Stimmt hast recht, lesen und Auswerten müssen das alle.
Also werde ich bei RS485 bleiben und schauen, wie hoch ich mit der 
Datenrate gehen kann.

Wie würdet Ihr das auf der Platine machen? Einfach ein MAX485 zum 
umsetzten auf Uart nehmen und den Bus ohne Verstärkung an die Nächste 
Platine weitergeben? Oder soll ich da Verstärken? Werden ja bis zu 8 
meter im Grenzfall...
Gast #3235750
Lesenswert?

Moin,

nur mal so als Denkanstoß: Die Datenrate würde sich halbieren, wenn der 
Master zwei Schnittstellen hätte und z.B. in der Mitte einspeisen würde.
Oder, vielleicht mit den Steckern einfacher zu realisieren, immer eine 
Platine überspringen würde.

Also als Beispiel: Bei einem 10pol. Stecker auf jeder Seite geht es bei 
1 und 2 rein und am anderen Stecker bei 3 und 4 raus - dieser Bus wird 
benutzt.
Der zweite geht auf 3 und 4 rein und auf 1 und 2 raus - dieser wird nur 
durchgeleitet.

Je nachdem natürlich auch mit 3 oder mehr Bussen realisierbar.

Bei der Länge würde ich auch auf einen Bus ohne Zwischenverstärker 
setzen.

Gruß
Jens
Gast #3235755
Lesenswert?

Noch einmal moin,

ich vermute ja mal fast, Du willst LEDs ansteuern. Über den Strom, der 
vorne rein geht, hast Du Dir vermutlich Gedanken gemacht. Und den 
Spannungsabfall, bis Du mal hinten bist.

Schaltregler je Platine, die mit z.B. 24V arbeiten, könnten da Sinn 
machen.

Für die Autoaddressierung ein DaisyChain-Signal vorsehen, oder? Denn die 
Reihenfolge sollte vermutlich passen... Und vielleicht noch ein 
gemeinsames Reset- und/oder Sync-Signal.

Gruß
Jens
Gast #3235770
Lesenswert?

Aeh, 3. moin,

wie wäre es mit einer schlichten TTL-Seriell-Verbindung, die aber nur 
von einer Platine zur nächsten geht? Spart die vielen Treiber und 
erlaubt das Festlegen der Reihenfolge ohne zusätzliche Leitung.

Bei Bedarf eine Rückleitung durch alle Platinen wieder hin zum Master. 
Ok, hier sind die 8m ein Wort für TTL.

Ach, wäre doch schön, etwas mehr über die Applikation zu wissen...

Jens
Gast #3235861
Lesenswert?

Jens schrieb:

> Die Idee beim dritten moin war, jeden Platine das Signal empfangen und
> erneut aktiv aussenden zu lassen. Es entstehen also nur kurze,
> wohldefinierte Datenstrecken von 20cm.

So habe ich das auch verstanden und halte die Idee für gut. Allerdings 
muß man sich im Klaren darüber sein, daß so eine Kette eine nicht zu 
unterschätzende Verzögerung erzeugt und das Protokoll so gestalten, daß 
möglichst wenige Frage-Antwort-Wechselspiele vorkommen, denn dabei geht 
die Verzögerung gleich doppelt ein und belegt den Bus, ohne daß 
irgendwelche Daten dabei transportiert würden. Sprich: Man sollte 
möglichst große Datenblöcke verwenden.

> Du tauscht den Hardware-Aufwand gegen die Software, die die Daten
> weiterleiten muss.

Nö, man kann auch einfach ein paar Logik-Gatter zur Weiterleitung und 
Auskopplung verwenden. Softwarehilfe braucht man dann bloß für die 
Autoadressierung. Da wird einfach die Weiterleitung zur nächsten Platine 
blockiert, bis man eine Adresse bekommen hat, danach wird sie 
freigeschaltet.

Da Logik-ICs spottbillig sind, würde ich vorschlagen, die Sache gleich 
doppelt vorzusehen und dann mit differentiellen Signalen zu arbeiten.
#3235905
Lesenswert?

c-hater schrieb:
> Allerdings
> muß man sich im Klaren darüber sein, daß so eine Kette eine nicht zu
> unterschätzende Verzögerung erzeugt und das Protokoll so gestalten, daß
> möglichst wenige Frage-Antwort-Wechselspiele vorkommen, denn dabei geht
> die Verzögerung gleich doppelt ein und belegt den Bus, ohne daß
> irgendwelche Daten dabei transportiert würden. Sprich: Man sollte
> möglichst große Datenblöcke verwenden.
>
angenommen ich nehme RS232 TTL pegel und schiebe das immer durch den 
Atmega88 durch. Von welcher verzögerung kann ich bei dem einen 
Controller ausgehen?

>
> Nö, man kann auch einfach ein paar Logik-Gatter zur Weiterleitung und
> Auskopplung verwenden. Softwarehilfe braucht man dann bloß für die
> Autoadressierung. Da wird einfach die Weiterleitung zur nächsten Platine
> blockiert, bis man eine Adresse bekommen hat, danach wird sie
> freigeschaltet.
>
> Da Logik-ICs spottbillig sind, würde ich vorschlagen, die Sache gleich
> doppelt vorzusehen und dann mit differentiellen Signalen zu arbeiten.

Das habe ich auch so in etwa vorgestellt, dass ich dafür Logik-ICs 
einsetzten kann nicht. Danke!
Gast #3236033
Lesenswert?

> Natürlich wirds mit CAN aufwändiger und auch vermutlich teurer aber du
> hast gerade Vorteile in Sachen Störfestigkeit.

Wieso soll CAN störfester sein als eine RS485-Verbindung? Ich kenne 
Beispiele, die das Gegenteil belegen.
Die geforderte Datenrate und Topologie dürfte mit RS485 ohne große 
Probleme (vorausgesetzt, die richtigen µCs werden verwendet) und recht 
störfest zu realisieren sein.


> angenommen ich nehme RS232 TTL Pegel

Warum? RS485-Treiber kosten ähnlich viel wie RS485-Treiber, sind 
deutlich störanfälliger und erlauben nur Punkt- zu Punkt-Verbindungen.


> Von welcher verzögerung kann ich bei dem einen Controller ausgehen?

Je nachdem, was Du alles vorhast, liegt die Verzögerung etwa zwischen 
1,5 Bytelängen bis mehreren Sendungslängen.


> würde das mit ttl un evtl. Impedanzwandler je platine gehen? bei der
länge?

Ja, ist aber störanfälliger als RS485.
#3236096
Lesenswert?

CAN ist nach aussen hin störfester als RS485, weil Übertragungsfehler 
automatisch erkannt werden. Physikalisch ist RS485 besser (es gibt den 
schlappen rezessiven Pegel nicht).
CAN hat in deinem Fall auch den Nachteil, dass ne Menge Bits übertragen 
werden, die nichts zur eigentlichen Sache tun. Üblicherweise arbeitet 
CAN mit max. 1Mbit, was einer Nettodatenrate von etwa 500kbit 
entspricht, fällt also auch von daher schon aus.
RS485 ist die ideale Lösung für Single-Master wie in deinem Fall. 
Einfach, billig, zuverlässig, schnell. Alles andere wäre meiner Meinung 
nach die falsche Lösung.
Gast #3237047
Lesenswert?

Alex E. schrieb:
> Welche vorschläge gibt es zur Auto adressierung?

Du ziehst eine weitere Leitung auf dem Bus als daisy chain: Der erste 
Slave hängt schon beim Einschalten am Bus und bekommt vom Master eine 
Adresse zugewiesen. Danach schaltet er den receiver enable des nächsten 
Slaves ein, dann bekommt dieser eine Adresse vom Master zugewiesen, usw.
Gast #3244074
Lesenswert?

Low = Empfang / High = Senden

Bei einem Single-Master-System ist es einfach.
Du weißt ja ob du gerade sendest bzw. wann eine Antwort von einem Slave 
komplett ist.
Ansonsten musst du immer auf Empfang sein (müsste eh immer so sein) und 
nur senden wenn du nichts empfängst.


P.S.: Darf man noch ein Master-Slave System beschreiben oder ist das 
mittlerweile "politisch Inkorrekt"???
#3244096
Lesenswert?

H.Joachim Seifert schrieb:
> Alex E. schrieb:
>> Wie schaue ich ob nicht gerade jemand anders sendet?
>
> Genau das ist das grundlegende Problem bei RS485-Multimastersystemen.
> Prinzipiell: ja, es geht. Aber es ist mit einem erheblichen
> Softwareaufwand verbunden.
> Ich persönlich setze RS485 nur in single-master-Systemen ein.

Sorry, hab auch nur einen Master. Von dem her passt das.
Danke...
#3244108
Lesenswert?

Eben. Und deswegen musst du nicht wissen, ob gerade jemand sendet. D.h. 
alle slaves sind auf Empfang. Es sei denn, sie werden vom master 
aufgefordert, ihren Datensalat loszulassen.
Da lauert übrigens noch ein kleines timing-Problem. Je nach UART gibt es 
verschiedene Statusbits. Z.B. eines, das anzeigt, dass das Byte ins 
Senderegister geschrieben wurde. Das darf man natürlich nicht benutzen, 
um auf Empfang umzuschalten. Sondern erst dann, wenn das Datenbyte incl. 
parity/stopbit(s) tatsächlich raus sind.
#3244122
Lesenswert?

Alex E. schrieb:
> Wie schaue ich ob nicht gerade jemand anders sendet?

Das ist genau das Problem am RS-485.
RS-485 ist daher zeitgesteuert:
Der Master muß zuerst an den Slave eine Nachricht senden, in welchem 
Zeitfenster dieser auf Senden umschalten darf, sobald er zum Senden 
adressiert wurde.
Die minimale Wartezeit gibt an, wann der Master zuverlässig auf Empfang 
umgeschaltet hat. Und die maximale Zeit gibt an, wie lange der Master 
auf Empfang bleibt, ehe er ein Timeout annimmt und z.B. die Nachricht 
wiederholt.
#3244292
Lesenswert?

Im 9Bit-Modus (9tes signalisiert Slave-Adresse) über UART auf RS485 bei 
250k und einem miesen protokoll mit 12 Nutzbytes und 15 "Byte" (sind ja 
eigentlich 9 Bit) Rahmen dauert mit zwei zusätzlichen Bytes wg. 
Frame-Error Vorbeugung etwa:
Start+9+Stop (keine Parity, das kann man Bitweise machen) => 11*4µS=44µS
jetzt noch 12Nutzbytes+Adresse+Cmd+Parity+2*Frame-Sync => 17*44µS=748µS

Mal den worst-case Überschlag angenommen der Master will 12 Nutzbyte 
senden und der Slave mit 12Nutzbyte antworten, dann kommt man bei 
2*0,75=1,5ms raus!

Wenn das ganze über 30 slaves geht, bist du nach spätestens 45ms einmal 
rum, wenn du die 12Byte ausnutzt.

DMX ist ja auch 250k-UART-basiert und da hängen auch mehr als 30 slaves 
dran und trotzdem geht es irgendwie.

Bei den RS485-Bausteinen gibt es tolle 5V-supply und gleichzeitig 
3,3V-kompatible ICs von Maxim die auch 1/8 unit load haben, sprich von 
denen kannst du auch 8*32 an den Bus hängen und die Kommunikation läuft 
noch sauber über "mehrere meter".
#3244304
Lesenswert?

René B. schrieb:
> Bei den RS485-Bausteinen gibt es tolle 5V-supply und gleichzeitig
> 3,3V-kompatible ICs von Maxim die auch 1/8 unit load haben, sprich von
> denen kannst du auch 8*32 an den Bus hängen und die Kommunikation läuft
> noch sauber über "mehrere meter".

Kannst du das nochmal genau erklären? Was meinst du mit 8*32? 8/32/256 
Busteilnehmer?
#3244411
Lesenswert?

Ein RS485 transciever mit unit-load==1 belastet die Leitungen so, dass 
genau 32 Teilnehmer zuverlässig daran angeschlossen werden können.
Wenn ein transciever in der Spec aber so beschrieben wird, dass er die 
Leitung mit 1/8 unit-load belastet, so kann man 8mal mehr Teilnehmer 
diesen Typs an den Bus hängen. Daher 8*32 Teilnehmer, wenn alle 
transciever vom typ (1/8-unit-load) haben.

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