Forum: Mikrocontroller und Digitale Elektronik RS485 - viele Teilnehmer - hohe Geschwindigkeit


von Hanna (Gast)


Lesenswert?

Hallo zusammen,

es geht um eine Kundenentwicklung, die mich etwas Nerven kostet, bzw. 
ich noch keinen so richtigen Ansatz finde.

Zentrale Anwendung:

Es gibt, in einer Gesamtlänge von ca 2000m insgesamt 30 kleine 
Steuerungen (Herzstück ist ein STM32 Cortex M3). Die Leitungslänge von 
Teilnehmer zu Teilnehmer beträgt maximal 100 Meter.
Diese kleinen Steuerungen haben 4 digitale Ausgänge um bestimmte Sachen 
schalten zu können. Daneben besitzen sie ein RFID Terminal, in dem ein 
RFID Chip (nur lesend) behandelt werden kann.

Am Ende des Busses sitzt eine WAGO PFC200 Industriesteuerung.

Was soll das Ganze:

Ziel ist es, dass die WAGO als zentraler Server genutzt wird, in dem 
jeder RFID Chipnummer bestimmte Berechtigungen zugeordnet werden können.

Geht der Besitzer des Chips mit seinem RFID an eins der 30 RFID 
Lesestationen, soll diese die Nummer auslesen, über Bus an die WAGO 
weiterleiten, die WAGO prüft dann die Zentralen Berechtigungen und gibt 
wiederum über BUS den zentralen Schaltbefehl für Ausgang 1,2,3 oder 4 an 
der Lesestation.


RFID einlesen klappt durch vorherige Problematik die ich momentan habe 
ist die Busverbindung.

2 Ideen hatte ich bisher:

1 RS485 Netz mit 30 Teilnehmern. Gut und schön, aber bei 2000m 
Leitungslänge sollte das selbst bei 9600kBit/s eher NICHT laufen.

ODER....

die Steuerungen so aufbauen, dass es immer ZWEI ein RS485 Netzte gibt 
(UART1 und UART2 des µC nutzen und 2 RS485 Wandlerbausteine nebst 
galvanischer Trennung einplanen. Dann könnte der letzte im Bunde seine 
Informationen an den Vorletzten schicken, der packt seine Informationen 
hinzu und sendet beide Infors an den Vorvorletzten usw. usw.

Vorteil: Ab jedem Teilnehmer beginnen die 1200m theoretisch nutzbare 
Länge von neuem, mit meinen zu erwartenden 100m bin ich somit Safe.
Nachteil: Bis ich mich durch 30 Controller gearbeitet habe und die WAGO 
dann wieder über 30 Controller zum letzten Teilnehmer zurück melden muss 
vergehen schätzungsweise 10-15 Sekunden --> nicht akzeptabel.



So und nun bin ich mit meinem Latein am Ende.

Hat irgendjemand ne Idee, wie ich die 30 Teilnehmer mit den vorgegebenen 
Leitungslängen schnell, einfach und Effektiv miteinander Kommunizieren 
lasse?

von Phil (Gast)


Lesenswert?

Hallo Hanna,

warum soll die Weitergabe 10-15 Sekunden dauern? Das Signal muss doch 
nicht von jedem Controller interpretiert werden.

Im Empfangsfall wird das empfangene Signal (RX) direkt über den zweiten 
Transceiver weiter gegeben.

Im Sendenfall sendest du dein Telegram in beide Richtungen um 
Verdrahtungsfehler zu vermeiden.

Wenn von einem im Bus später angeordnetem Slave Daten versendet werden 
gibst du diese von Transceiver 2 auf Transceiver 1.

Vereinfacht kann man direkt RX und TX der beiden Transceiver kreuzen und 
im Sendefall diese Verbindung auftrennen und die RX und TX LEitung des 
Controllers an beide Transceiver anbinden.

Beste Grüße
Philipp

von Falk B. (falk)


Lesenswert?

Hanna schrieb:
> 1 RS485 Netz mit 30 Teilnehmern. Gut und schön, aber bei 2000m
> Leitungslänge sollte das selbst bei 9600kBit/s eher NICHT laufen.

Unsinn, das läuft schon, wenn man keinen Murks baut.

> die Steuerungen so aufbauen, dass es immer ZWEI ein RS485 Netzte gibt
> (UART1 und UART2 des µC nutzen und 2 RS485 Wandlerbausteine nebst
> galvanischer Trennung einplanen. Dann könnte der letzte im Bunde seine
> Informationen an den Vorletzten schicken, der packt seine Informationen
> hinzu und sendet beide Infors an den Vorvorletzten usw. usw.

Noch mehr Unsinn und Fehlerquellen.

> Vorteil: Ab jedem Teilnehmer beginnen die 1200m theoretisch nutzbare
> Länge von neuem, mit meinen zu erwartenden 100m bin ich somit Safe.

Da scheint ein neues Modewort zu sein "safe sein", wahlweise auch "save 
sein". OMG!

> Nachteil: Bis ich mich durch 30 Controller gearbeitet habe und die WAGO
> dann wieder über 30 Controller zum letzten Teilnehmer zurück melden muss
> vergehen schätzungsweise 10-15 Sekunden --> nicht akzeptabel.

Blödsinn^3. Dann wären deine Knoten in Relaistechnik aufgebaut.

> So und nun bin ich mit meinem Latein am Ende.

Bis ja nicht wirklich weit gekommen.

Barba non facti philosophum.

Ein 2km RS485 Bus mit 9600 Baud ist machbar, ohne Tricks. Selbst wenn 
man da Bedenken sieht, kann man ja in der Mitte einen Repeater einbauen. 
Aber man braucht man sicher NICHT alle 100m in jedem Knoten einen!

Außerdem kann man im Fall der Fälle auch auf 4800 oder gar 1200 Baud 
runter. Für die paar Bytes für die ID der RFIDs reicht das allemal. 
1200Baud sind auch 120 Bytes/s.

von fop (Gast)


Lesenswert?

Phil schrieb:
> Vereinfacht kann man direkt RX und TX der beiden Transceiver kreuzen und
> im Sendefall diese Verbindung auftrennen und die RX und TX LEitung des
> Controllers an beide Transceiver anbinden.

Hm, da braucht es sowas, das die Post früher mal Gabelschaltung nannte. 
Macht es doch ein wenig komplizierter.

15 Sekunden klingt echt viel. Das wären 250 ms zum Weiterleiten eines 
Päckchens. Du kannst ja durch die kurzen Abstände die Baudrate erhöhen.

Eventuell musst Du einen Hybrid zwischen Deinen beiden Konzepten 
verwirklichen. Sprich es gibt Kleinsteuerungen und Router. Von den 
Routern werden nur so viele eingesetzt, dass die Anforderungen an 
Teilnehmerzahl und Länge pro Bussegment gerade so erfüllt werden. 
Dadurch geht eine Botschaft über weniger Zwischenstationen.

von Olaf (Gast)


Lesenswert?

> 1 RS485 Netz mit 30 Teilnehmern. Gut und schön, aber bei 2000m
> Leitungslänge sollte das selbst bei 9600kBit/s eher NICHT laufen.

Ich halte die Leitungslaenge an sich fuer kein Problem. Allerdings hat 
man sich bei solchen langen Leitungen hoffentlich Gedanken ueber 
moegliche Potentialunterschiede gemacht. .-)

Olad

von Hanna (Gast)


Lesenswert?

Hallo,

weist du FALK, solche Antworten wir deine sind mal wieder prädestiniert 
dafür, dass eine Diskussion ins Unsachliche abschweift UND, dass sich 
keiner mehr traut hier im Forum was zu posten.

Ist ja ganz toll, dass du ne Word Datei mit lateinischen Sprichwörtern 
auf deinem PC hast und auch wirklich Klasse, dass alles für dich ein 
Klacks ist und nominelle Vorgaben für dich nicht gelten (RS485 max. 
1200m bei 9600) aber jedwede Nutzinformation aus deinem Post konnte ich 
auch bei mehrmaligem Durchlesen nicht entnehmen.

Zurück zum Thema:

Phil schrieb:
> Im Empfangsfall wird das empfangene Signal (RX) direkt über den zweiten
> Transceiver weiter gegeben.
>
> Im Sendenfall sendest du dein Telegram in beide Richtungen um
> Verdrahtungsfehler zu vermeiden.

Das hört sich sehr interessant an, en Detail verstehe ich es aber noch 
nicht so ganz. Bedeutet, ich habe 2 RS485 Treiber auf meiner Schaltung, 
die die Daten im Regelfall nur 1:1 durchschleifen (und das dann in 
Echtzeit). Wenn die jeweilige Schaltung dass aber senden soll, wie würde 
das physikalisch aussehen?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Hanna schrieb:
> und nominelle Vorgaben für dich nicht gelten (RS485 max. 1200m bei
> 9600)

Woher kommt diese "nominelle Vorgabe"?

Bei 9600 Baud sind deutlich mehr als 1200m möglich, zuverlässig und 
stabil, und auch bei mehr als 30 Teilnehmern.

Wenn man die RS485-Treiber sauber aufbaut (galvanische Trennung, 
Versorgung über DC-DC-Wandler), muss man sich auch über 
Potentialunterschiede und -Ausgleichsströme nicht allzuviele Gedanken 
machen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hanna schrieb:
> weist du FALK, solche Antworten wir deine sind mal wieder prädestiniert
> dafür, dass eine Diskussion ins Unsachliche abschweift UND, dass sich
> keiner mehr traut hier im Forum was zu posten.

Ich bin zwar nicht Falk, aber Du solltest seinen Beitrag ruhig nochmal 
mit abgekühltem Gemüt lesen. Was er da sagt, hat Hand und Fuß. Natürlich 
sollte man den Bus als Bus belassen, statt die Päckchen von einer 
Relais-Station zur nächsten zu senden. Wie Falk schon sagte: Das 
verkompliziert eher alles und macht das Ganze fehleranfällig. Mich 
wundert allein, dass Du hier die benötigte relativ hohe Latenzzeit 
akzeptierst aber eine niedrigere Baudrate für Dich inakzeptabel ist. Das 
passt nicht zusammen.

> und nominelle Vorgaben für dich nicht gelten (RS485 max.
> 1200m bei 9600)

Lies seinen Beitrag genauer.

Falk schrieb: notfalls ein Repeater

Damit sind 2000m natürlich realisierbar.

Davon abgesehen: In welcher "Norm" steht das mit den 1200 Metern? Meines 
Wissens nach sind das lediglich Erfahrungswerte. Probiers doch einfach 
mal aus.

: Bearbeitet durch Moderator
von Olaf (Gast)


Lesenswert?

> Bei 9600 Baud sind deutlich mehr als 1200m möglich, zuverlässig und
> stabil, und auch bei mehr als 30 Teilnehmern.

Man sollte sich auch darueber im klaren sein das es bei solchen 
Leitungslaengen auch stark von der Kabelqualitaet abhaengt.

Olaf

von Hanna (Gast)


Lesenswert?

Hallo nochmal,

das heißt zusammenfassend:

Ich kann das Netzwerk aufbauen wie hier unter 3.2 dargestellt?

http://www.alciro.org/alciro/RS-485_16/topologia-conexiones-RS-485_329_de.htm

Dann kann senden und Empfangen als FULLDUPLEX realisiert werden?

Der Master sendet zyklisch, z.B. alle 100ms an die Slaves, diese 
"picken" sich dann die entsprechenden Nutzinformationen für sich raus

Der jeweilige Slave sendet nur, wenn er vom Master aufgefordert wird?
Oder gäbe es eine Möglichkeit, dass jeder Slave zu jeder Zeit senden 
kann wenn er will und die anderen Teilnehmer "einfach" nur hören ob der 
Bus frei ist bis sie senden?
Was ist da gängige Praxis? Bzw. wie sieht sowas in der Praxis aus?

von Falk B. (falk)


Lesenswert?

Hanna schrieb:

> Ich kann das Netzwerk aufbauen wie hier unter 3.2 dargestellt?
>
> http://www.alciro.org/alciro/RS-485_16/topologia-conexiones-RS-485_329_de.htm

Ja. Aber wozu full duplex? Dein Bus ist sowieso langsam, da reicht 
halbduplex.

> Der Master sendet zyklisch, z.B. alle 100ms an die Slaves, diese
> "picken" sich dann die entsprechenden Nutzinformationen für sich raus

Kann man machen.

> Der jeweilige Slave sendet nur, wenn er vom Master aufgefordert wird?

Kann man machen.

> Oder gäbe es eine Möglichkeit, dass jeder Slave zu jeder Zeit senden
> kann wenn er will und die anderen Teilnehmer "einfach" nur hören ob der
> Bus frei ist bis sie senden?

Kann man machen, ist aber mehr Aufwand, vor allem für die 
Kollisionserkennung bzw. Vermeidung. CAN macht das schon selber, da muss 
man sich nicht drum kümmern.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hanna schrieb:
> Der Master sendet zyklisch, z.B. alle 100ms an die Slaves, diese
> "picken" sich dann die entsprechenden Nutzinformationen für sich raus

Genau, dazu gibst Du jedem Slave eine eindeutige Adresse.

Vereinfachtes Kommunikations-Beispiel (ohne CRC):

Der Slave Nt. 22 soll das Licht anmachen:
1
$22On<CR><LF>
Der Slave antwortet: "Das Licht ist nun an".
1
!22On<CR><LF>
Anderes Beispiel: Der Slave 31 soll den zuletzt eingelesenen RFID-Code 
ausspucken.
1
$31RFID<CR><LF>
Der Slave antwortet:
1
!31RFID<CR><LF>        // hat keinen gelesen
oder:
1
!31RFID1234567890<CR><LF>        // gibt RFID aus

und löscht danach den zuletzt eingelesenen RFID-Code imn internen 
Speicher.

>
> Der jeweilige Slave sendet nur, wenn er vom Master aufgefordert wird?

Korrekt. Am besten gibt der Slave für jede(!) Anfrage auch eine Antwort 
aus. Das vereinfacht eine evtl. verwendete Statemachine sowohl auf dem 
Master als auf den Slaves.

: Bearbeitet durch Moderator
von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

Das mit dem RS485 ist generell nicht allzu beliebt in der Industrie, vor 
allem bei vielen Teilnehmern. Hat ein Ausgagstreiber einen Schaden, 
steht das ganze Netz still. Die Suche nach dem defekten Gerät ist dann 
oft zeitaufwändig. Ethernet wäre eine gute Alternative. Es gibt auch 
RS485 auf Ethernet-Umsetzter. Wäre vieleich darüber nachzudenken...

Grüsse

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Gebhard R. schrieb:
> Ethernet wäre eine gute Alternative

Passt nicht so ganz einfach zu den geforderten 2000 Metern.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Hanna schrieb:
> Dann kann senden und Empfangen als FULLDUPLEX realisiert werden?

Nein. Aber das, was Du beschreibst, ist auch kein Vollduplex, sondern 
Halbduplex.

Vollduplex bedeutet gleichzeitiges Senden und Empfangen. Das geht nur 
auf Punkt-zu-Punkt-Verbindungen, nicht aber auf einem Bus, und schon gar 
nicht bei RS485, dessen Treiberbausteine eigens eine 
Sender-/Empfänger-Umschaltung haben.

> Der jeweilige Slave sendet nur, wenn er vom Master aufgefordert wird?

So wird es üblicherweise gehandhabt.

> Oder gäbe es eine Möglichkeit, dass jeder Slave zu jeder Zeit senden
> kann wenn er will und die anderen Teilnehmer "einfach" nur hören ob der
> Bus frei ist bis sie senden?

Umständlich, weil Bus-frei-Erkennung nötig, und weil Kollisionsdetektion 
nötig (denn es können ja auch mehrere Slaves gleichzeitig senden, weil 
alle gleichermaßen den Bus für "frei" gehalten haben).

von fchk (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
>> und nominelle Vorgaben für dich nicht gelten (RS485 max. 1200m bei
>> 9600)
>
> Woher kommt diese "nominelle Vorgabe"?

Z.B. von hier:

ANSI/TIA/EIA-422-B-1994

Annex A (informative), Seite 20ff

---->
The curve of cable length versus data signaling rate given in figure A.1 
may be used as a conservative guide. This curve is based upon empirical 
data using a 24 AWG, copper conductor, unshielded twisted-pair telephone 
cable with a shunt capacitance of 52.5 pF/meter (16 pF/foot) terminated 
in a 100 Ohm resistive load. The cable length restriction shown by the 
curve is based upon assumed load signal quality requirements of:
a. Signal rise and fall times equal to or less than, one-half unit 
interval at the applicable data switching rate.
b. A maximum voltage loss between generator and load of 66%

At the higher data signaling rates (90 kbit/s to 1 0 Mbit/s), the 
sloping portion of thefcurve shows the cable length limitation 
established by the assumed signal rise and fall time requirements. As 
the data signaling rate is reduced below 90 kbit/s, the cable length has 
been limited at 1200 meters (4000 feet) by the assumed maximum allowable 
66% signal loss.
<----

Da kommen die 1200m her, die sich überall finden. Mit besserem Kabel mit 
weniger Dämpfung kommt man weiter. Wie weit, das muss man ausmessen. 
Dabei spielen dafürlich auch die eingesetzten Transceiver eine Rolle.

fchk

von Falk B. (falk)


Lesenswert?

Rufus Τ. F. schrieb:
> Vollduplex bedeutet gleichzeitiges Senden und Empfangen. Das geht nur
> auf Punkt-zu-Punkt-Verbindungen, nicht aber auf einem Bus, und schon gar
> nicht bei RS485, dessen Treiberbausteine eigens eine
> Sender-/Empfänger-Umschaltung haben.

Stimmt nicht, es gibt vollduplex RS485 Tranceiver, MAX488 & Co.

von Martin (Gast)


Lesenswert?

Geht es denn um ein bestehendes System? Könnte man auch einen CAN-Bus 
nehmen? Der soll bei 10kbit/s auch 6,7km können.

https://www.me-systeme.de/de/technik-zuerst/elektronik/can-bus-grundlagen

von Hanna (Gast)


Lesenswert?

Hallo Zusammen,


vielen Dank für die mittlerweile doch sehr nützlichen Beiträge.


Eine Frage hätte ich aber noch:


Wenn ich 32 Teilnehmer von meiner Mastersteuerung aus zyklisch abfragen 
muss, dann muss ich ja zuerst eine Antwortanforderung senden, so wie 
Frank das eben sehr gut dargestellt hat, dann muss ich auf eine Antwort 
warten. Ist die Antwort vollständig da, dann kann ich mit den nächsten 
Slave fortfahren.

Wenn ich nur 100ms für eine Taktung (Senden, auf Antwort warten, Antwort 
empfangen) rechne, dann komme ich auf 3,2 Sekunden um alle Slaves durch 
zu tingeln. Das kommt mir doch sehr lange vor. Wo liegt mein Denkfehler

von Bauform B. (bauformb)


Lesenswert?

Da gibt's keinen Denkfehler. Man kann von der Baudrate her die 100ms 
sicher auf 10ms reduzieren, aber wie schnell ist die Wago? Und 0.32s 
sind immer noch lange, wenn der Benutzer eine Reaktion erwartet. In der 
Hinsicht kann dein Plan mit der "Reihenschaltung" schneller sein.

von Falk B. (falk)


Lesenswert?

Hanna schrieb:
> enn ich nur 100ms für eine Taktung (Senden, auf Antwort warten, Antwort
> empfangen) rechne, dann komme ich auf 3,2 Sekunden um alle Slaves durch
> zu tingeln. Das kommt mir doch sehr lange vor. Wo liegt mein Denkfehler

Schon mal überlegt, wieviele Zeichen man bei 9600 Baud in 100ms senden 
kann? Ob man die alle braucht, um eine einfache Nachricht für "Hallo, 
was gibt's Nr 11?" und "Nix, alles ruhig, mein Meister" zu übertragen?

von Christopher J. (christopher_j23)


Lesenswert?

Für RS485 würde ich mal einen Blick auf das Modbusprotokoll werfen. Das 
ist für Single-Master ausgelegt und übernimmt auch die Sicherung der 
Datenintegrität mittels CRC. Die Spec ist offen und absolut 
industrietauglich mit Millionen von Geräten, die täglich im Feld 
zuverlässig ihren Dienst verrichten.

CAN wäre natürlich auch eine Idee. Da geht dann auch Multimaster und 
Kollisionserkennung sowie CRC-Sicherung sind schon im Protokoll 
"eingebaut" (auf Hardware-Ebene).

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Falk B. schrieb:
> Stimmt nicht, es gibt vollduplex RS485 Tranceiver, MAX488 & Co.

Dsa nennt man dann RS422, und funktionieren tut es nur im 
Punkt-zu-Punkt-Betrieb mit nicht mehr als einem Sender pro Aderpaar.

Vollduplex auf einem Adernpaar ist aber auch im Punkt-zu-Punkt-Betrieb 
nicht drin.

von Der Zweite günstige Troll aus dem Duzendpack (Gast)


Lesenswert?

Man kann RS485 im 2 Leiterpaar System als RS422 laufen lassen, und hat 
so eine bidirektionale kommunikation. Ein Master Slave system mit 30 
Stationen ist machbar. Treiber wie der SN65HVD24D ist fuer 3MBit auf 
500m spezifiziert. Ich denke bei einem hochwertigen Kabel ist mehr 
Laenge bei weniger Geschwindigkeit drin. Eine Frage der 
Eingangsschwellen, und der Signalqualitaet.

von Toni Tester (Gast)


Lesenswert?

Christopher J. schrieb:
> CAN wäre natürlich auch eine Idee. Da geht dann auch Multimaster und
> Kollisionserkennung sowie CRC-Sicherung sind schon im Protokoll
> "eingebaut" (auf Hardware-Ebene).

Genau dieses.
Die WAGO PFC200 gibt es auch mit integriertem CAN-Interface => Ich würde 
definitiv auf CAN statt EIA-485 gehen, alleine schon wegen des 
angesprochenen Delays durch das permanente Polling aller Slaves. 
Stattdessen sendet jeder Slave eine Message, wenn ein RFID-Tag erkannt 
wurde, sowie eine "Alive"-Message alle paar Sekunden, um zu 
signalisieren, dass er noch online ist.
Spannender wird die Frage nach der Spannungsversorgung aller 
Busteilnehmer.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

fchk schrieb:
> As the data signaling rate is reduced below 90 kbit/s, the cable length
> has been limited at 1200 meters (4000 feet) by the assumed maximum
> allowable 66% signal loss.

Nun passt zwischen "below 90 kbit/s" und 9600 Baud noch 'ne ganze Menge.

von VIA (Gast)


Lesenswert?

Toni Tester schrieb:
> Spannender wird die Frage nach der Spannungsversorgung aller
> Busteilnehmer.

Dezentral und Schnittstelle galvanisch trennen?

von Peter D. (peda)


Lesenswert?

Falk B. schrieb:
> ist aber mehr Aufwand, vor allem für die
> Kollisionserkennung bzw. Vermeidung. CAN macht das schon selber, da muss
> man sich nicht drum kümmern.

Ich würde auch CAN empfehlen, einfacher gehts nicht. Der Master muß 
nichts pollen. Jeder Teilnehmer sendet einfach drauflos, sobald ein 
RFID-Chip erkannt wurde. CAN kümmert sich um alles in HW.

von Christopher J. (christopher_j23)


Lesenswert?

Bei Modbus RTU wäre der Overhead wirklich nicht zu vernachlässigen aber 
mal eine grobe Rechnung:
3,5 Byte Start + 1 Byte Adresse + 1 Byte Funktion + 1 Byte Daten + 2 
Byte CRC , macht also in Summe 8,5 Byte bzw. ~94 Baud bei 8E1. Bei 9600 
Baud würde dann das aulesen eines Statusbits (RFID vorhanden) ca. 10ms 
dauern, d.h. in ca. 300ms ist klar ob irgendwo ein RFID-Tag gescannt 
wurde. Das finde ich jetzt gar nicht soooo übel.

Das schöne am Modbus RTU ist halt die relativ geringe Anforderung an die 
Hardware, die große Verbreitung und die offene Spec. CAN hat halt 
definitiv Vorteile bei der Geschwindigkeit bzw. Reichweite, braucht aber 
halt eine CAN-PHY und die ist halt nicht so trivial zu haben wie ein 
UART. Beim F103 kannst du z.B. nicht CAN und USB gleichzeitig nutzen. 
Das könnte aber z.B. ein F042 oder F072. Was für einen STM32 hast du 
denn eigentlich? Bei Cortex M3 tippe ich mal auf F103.

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Was ist denn bei CAN mit den unterschiedlichen Potenzialen? Ihr wollt 
doch nicht etwa die Masse auf diese Länge einfach durchschleifen. Da muß 
doch zwischen MCU und Transceiver noch ein Isolator:
https://www.nve.com/Downloads/il41050ta.pdf

RS485 mit zwei Adern kann man schon vollduplexfähig machen. Aber das 
wäre ne aufwändige Spezialschaltung. Das lohnt nicht, denn als fertiger 
Chip sah ich das noch nirgends.

Oder doch Stromschleife 20mA.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Abdul K. schrieb:
> Was ist denn bei CAN mit den unterschiedlichen Potenzialen?

CAN hält schon einiges an Masseversatz aus.

https://gemac-fieldbus.com/de/common-mode/

+7/-2V

Naja, RS485 kann da mehr, aber für die normalen CAN-Sachen reicht es.


> Ihr wollt
> doch nicht etwa die Masse auf diese Länge einfach durchschleifen.

Warum nicht. Wenn man da keinen großen Strom drüber schickt, geht das 
schon.

> Da muß
> doch zwischen MCU und Transceiver noch ein Isolator:
> https://www.nve.com/Downloads/il41050ta.pdf

Kann man machen, muss man nicht, wenn alle Knoten lokal gespeist werden.

> Oder doch Stromschleife 20mA.

Als Bus für 30 Knoten? Eher nicht.

von (prx) A. K. (prx)


Lesenswert?

Der Thread heisst "... hohe Geschwindigkeit" und erwähnt "9600kBit/s". 
Nun sieht das zwar nach einem Schreibfehler aus, aber andererseits sind 
9600 bit/sec nicht direkt das, was man gemeinhin unter einer hohen 
Geschwindigkeit versteht. Vielleicht sollte man klären, was wirklich 
gefordert ist.

von Stefan F. (Gast)


Lesenswert?

In den 90er Jahren galten 14.400 Baud Modemen als "high Speed" und 
kosteten mehr als heutige Kabel/DSL Modemen mit 400.000.000 Baud.

Das waren noch Zeiten ...

von Christopher J. (christopher_j23)


Lesenswert?

9,6 Mbaud/s sind wohl bei 2000m Leitungslänge doch etwas unrealistisch 
und 9600 Baud/s sind ja immer noch "schnell", z.B. verglichen mit 1200 
Baud/s ;)

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Frank M. schrieb:
> Ich bin zwar nicht Falk, aber Du solltest seinen Beitrag ruhig nochmal
> mit abgekühltem Gemüt lesen. Was er da sagt, hat Hand und Fuß.

 Seine Beiträge hatten noch nie Hand und Fuß.

 Und seine Antworten wie
 Unsinn, das läuft schon, wenn man keinen Murks baut
 und
 Kann man machen

 zeugen nur davon, daß er keine Ahnung davon hat.

 Man kann vieles machen, aber einfach 2000m Kabel verlegen und hoffen,
 daß alles gut geht, weil man ja keinen Murks gebaut hat, ist einfach
 Unsinn.


> Davon abgesehen: In welcher "Norm" steht das mit den 1200 Metern? Meines
> Wissens nach sind das lediglich Erfahrungswerte. Probiers doch einfach
> mal aus.

 Natürlich steht das in keiner Norm, das sind ganz einfach Empfehlungen,
 basiert auf Erfahrungen und Berechnungen.
 Siehe auch:
 https://www.maximintegrated.com/en/app-notes/index.mvp/id/3884


 Aber mal abgesehen davon, ist CAN sowieso die weitaus bessere Wahl,
 vor allem weil man sich praktisch um nichts kümmern muß und CAN
 kann, im Gegensatz zu RS485, ohne Probleme verlegt bzw. nachträglich
 verlängert werden - es muß nur auf die stub länge geachtet werden
 - Bustopologie ist ohne Bedeutung.

: Bearbeitet durch User
von A. S. (Gast)


Lesenswert?

Zum Daisy Chain aka Punkt-zu-Punkt aka 2 Schnittstellen je Modul:

Der Durchsatz ist genauso hoch wie beim Bus

Ein Fehler kann sofort lokalisiert werden, Teilketten laufen weiter

Signaltechnisch das einfachste/robusteste

Ja, der Zeitverzug ist da, aber da liegt es bei 30 Rechner bei etwa 1s 
@30byte-telegramme. Und wie gesagt, der Gesamt-Durchsatz ist gleich.

von Bauform B. (bauformb)


Lesenswert?

A. S. schrieb:
> Zum Daisy Chain aka Punkt-zu-Punkt aka 2 Schnittstellen je Modul:
>
> Der Durchsatz ist genauso hoch wie beim Bus
>
> Ein Fehler kann sofort lokalisiert werden, Teilketten laufen weiter
>
> Signaltechnisch das einfachste/robusteste

Geradezu trivial wird es, wenn man vollduplex Verbindungen spendiert.

> Ja, der Zeitverzug ist da, aber da liegt es bei 30 Rechner bei etwa 1s
> @30byte-telegramme. Und wie gesagt, der Gesamt-Durchsatz ist gleich.

Dank der relativ kurzen Kabel geht es auch deutlich schneller. Noch dazu 
kann die Sende-/Empfangsumschaltung entfallen.

von A. S. (Gast)


Lesenswert?

Bauform B. schrieb:
> Geradezu trivial wird es, wenn man vollduplex Verbindungen spendiert.

Stimmt: Vollduplex ist ja sonst gar nicht drin. Damit wird es insgesamt 
deutlich schneller und robuster. Auch ist es wesentlich einfacher, mal 
ein langes Teilstück von ein paar tausend Metern zu realisieren, eine 
galvanische Trennung einzubauen oder das Medium beliebig zu wechseln, 
z.b. POF oder Funk.

von Der Zweite günstige Troll aus dem Duzendpack (Gast)


Lesenswert?

Daisy chain gehenuber Bus hat den Nachteil, dass bei Stationsausfall 
alle hinter dran nicht mehr gesehen werden. Ja, welcher es ist ist 
leicht herauszufinden.

von Hanna (Gast)


Lesenswert?

Hallo Zusammen,

nochnals vielen Dank für die Überlegungen/ Gedankenanstöße.

CAN Bus erscheint mir nun auch vielleicht die bessere Wahl, vor allem 
weil es bis mehrere km spezifiziert ist und weil jeder Slave sehr 
schnell ohne Anforderung senden darf. Großes Problem an der Sache: Ich 
habe mit dem STM32 noch NIE etwas mit CAN Bus zu tun gehabt, weiß also 
nicht im geringsten wie ich das anfange.
Hat da jemand ein Codebeispiel o.ä.?

von Jan (Gast)


Lesenswert?

Hanna schrieb:
> Großes Problem an der Sache: Ich habe mit dem STM32 noch NIE etwas mit
> CAN Bus zu tun gehabt, weiß also nicht im geringsten wie ich das
> anfange. Hat da jemand ein Codebeispiel o.ä.


Gibt es für sowas nicht Lehrgänge? Sowas muss doch dein Arbeitgeber 
zahlen.

So habe ich mich in Richtung CANopen weitergebildet

von Bauform B. (bauformb)


Lesenswert?

Der Zweite günstige Troll aus dem Duzendpack schrieb im Beitrag 
#5924194:
> Daisy chain gehenuber Bus hat den Nachteil, dass bei Stationsausfall
> alle hinter dran nicht mehr gesehen werden.

Dafür funktioniert der vordere Teil noch, während am Bus ein defekter 
Transceiver alle Stationen lahmlegt ;)
Man könnte die beiden Kabel stecken, und zwar mit Männchen und Weibchen. 
So kann man eine defekte Station mit 2½ Handgriffen isolieren und der 
Rest geht wieder.
Mit Relais könnte man das auch noch automatisieren, kostet aber ca. 8 
Umschalter. Wie immer ist das wirkliche Leben nicht einfach 
schwarz/weiß.

von Stefan F. (Gast)


Lesenswert?

Suche Dir ggf. einen STM32 aus, der USB und CAN gleichzeitig 
unterstützt, z.B. den STM32F303. Der alte STM32F103 kann das nicht.

von A. S. (Gast)


Lesenswert?

Nochwas: DaisyChain erfordert keine parallele Adressierung. Also keine 
dippschalter, unique IDs oder Parametrierung. Bei CAN muss ich schon 
dafür sorgen, dass keine 2 Geräte das gleiche Telegramm zu senden 
versuchen.

von Stefan F. (Gast)


Lesenswert?

Die maximalen 100 Meter (pro Segment) sind für RS485/RS422 Treiber 
absolute Pillepalle. Da kannst du fast jedes beliebige Kabel verwenden 
und hast viel Luft nach oben für längere Kabel oder höhere 
Übertragungsraten. Und diese Treiber sind billig.

Deswegen plädiere ich ebenfalls für eine Daisy_Chain.

Die Programmierung ist vor allem bei RS422 simpel, da Kollisionen 
ausgeschlossen sind. Jeder kann jederzeit senden, was er will, und der 
nächste in der Kette reicht das dann weiter bis zum Host, sobald er 
kann.

von Hanna (Gast)


Lesenswert?

Hallo Stefanus,

ja mittlerweile erscheint mir diese Variante auch als die Beste, da ich 
wirklich hohe Taktraten verwenden kann und (ich will mit CAT7 Kabeln und 
RJ45 Buchsen auf dem Layout arbeiten) eigentlich mit wenigen Fehlern zu 
rechnen ist.

Was mir noch nicht ganz klar ist ist, wie ich die Aktualisierungsrate 
berechne:

Wenn ich jetzt mal von sau langsamen 9,6kbps ausgehe und von 10 Byte 
Anfrage (Master -> Slave) und 25Byte Rückantwort (Slave-->Master), dann 
davon ausgehe, dass meine Daisy-Chain 32 Teilnehmer hat, also 25*32Byte 
zurück geschickt werden, da jeder Teilnehmer das gesamte Array überträgt 
und nur "seinen Teil" mit Nutzdaten befüllt, dann komme ich auf 6400bit 
die übertragen werden müssen.
Das wären 666ms von einem Teilnehmer zum nächsten.

Das würde bedeuten, die Aktualisierungsrate vom letzten zum Master wären 
~ 32*0,66s = 21 Sekunden.

Bei 115,2kbps sind es 5,5ms (mit etwas Rechnerei etc sind es schnell mal 
10ms), also 3,2 Sekunden. Auch nicht so rosig  :-(

von Strubi (Gast)


Lesenswert?

Moin,

für "Fabrikumgebung" habe ich auf modbus und Ethernet gesetzt. Ethernet 
darum, um skalierbar zu bleiben, die intelligenten Hubs die kaum noch 
was kosten, sorgen dafür, dass nicht alle Teilnehmer mit Paketen 
beschallt werden. Das kostet deutlich weniger an Aufwand was das 
Repeating angeht.

Für Umsetzung von modbus RTU/TCP gibt es einige offene Libraries. Wir 
haben dafür einen Embedded Linux-Server als Hutschienengerät gebaut, 
inzwischen gibt's aber ähnliches schon aus der RPi-Fraktion oder von 
Siemens.
Nachteil sind bei Linux die Boot-Zeiten, wenn das System nach einem 
Power-Out schnell hochstarten muss.

Und natürlich kann man auch CAN nehmen, aber das klingt für den Fall 
etwas nach Kanonen auf Spatzen. RS485 ist immer noch robust genug und 
gut zu debuggen. Solang man nicht auf die Idee kommt (Klassiker), die 
Signalmasse wegzulassen.

von Stefan F. (Gast)


Lesenswert?

Hanna schrieb:
> da jeder Teilnehmer das gesamte Array überträgt
> und nur "seinen Teil" mit Nutzdaten befüllt,

Das würde ich anders machen. Jeder Teilnehmer sende nur seine Daten 
zusammen mit einer eindeutigen ID Nummer.

Wenn du die Daten aller Teilnehmer zusammen packen willst, musst du sie 
sammeln und zeitlich koordinieren. Wie stellst du dir das praktisch vor?

Die Übertragungszeit hängt maßgeblich davon ab, wie schnell die 
Teilnehmer ein Paket weiter reichen.

von Bauform B. (bauformb)


Lesenswert?

Hanna schrieb:
> Wenn ich jetzt mal von sau langsamen 9,6kbps ausgehe und von 10 Byte
> Anfrage (Master -> Slave) und 25Byte Rückantwort (Slave-->Master)

Mit einer vollduplex Daisy Chain muss man eigentlich nicht pollen. 
Gerade diese Anwendung müsste doch rein ereignisgesteuert funktionieren? 
Sobald eine RFID gelesen wurde, kann der Slave sofort die Daten senden. 
Die anderen Stationen können das Paket weiterleiten ohne es zu 
dekodieren (wenn es aus der Richtung kommt, kann es ja nur für den 
Master bestimmt sein). Das ergibt ein Zeichen Verzögerung pro Station.

In der anderen Richtung muss ein Slave entscheiden, ob das Paket für ihn 
selbst bestimmt ist oder ob er es weiterleiten muss. Das kann aber 
spätestens nach dem 2. oder 3. Zeichen klar sein.

Wenn nur dann Pakete unterwegs sind, wenn tatsächlich etwas zu tun ist, 
wird die Antwortzeit in der Praxis sehr kurz. Immerhin muss jemand mit 
einem RFID-Teil hantieren.

Ich sehe wenig Gründe, warum der Master ein Art Abfrage senden muss: 
natürlich beim Neustart des Masters, zur Fehlersuche und ggf. um den 
Slaves gelegentlich die Uhrzeit zu schicken. Für's "Kinder zählen" 
könnten die Slaves alle Minute oder so ein ping schicken.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Hanna schrieb:
> Hallo Stefanus,
>
> ja mittlerweile erscheint mir diese Variante auch als die Beste, da ich
> wirklich hohe Taktraten verwenden kann und (ich will mit CAT7 Kabeln und
> RJ45 Buchsen auf dem Layout arbeiten) eigentlich mit wenigen Fehlern zu
> rechnen ist.

 Du verwechselst CAN-Bus mit CAN-Protocol.
 Man kann sehr wohl CAN Transceiver benutzen ohne das CAN Protokoll,
 d.h. genauso wie RS485.
 Beim CAN wird, im Gegensatz zu RS485 jedes gesendete bit auch gleich
 wieder empfangen und dadurch kann man Kollisionen sofort erkennen.
 Also, falls irgendein Node yy sendet aber yz empfängt, dann hat
 ein anderer Node oder Master dazwischengefunkt.
 Danach wird die empfangene Adresse bit für bit mit eigener (gesendeten)
 Adresse verglichen und es wird festgestellt ob die eigene Adresse höher
 oder niedriger ist.
 Falls die eigene Adresse niedriger ist, wird die komplette Nachricht
 inkl. Adresse wieder gesendet, falls die eigene Adresse höher ist, wird
 gewartet bis die andere Nachricht zu Ende ist.
 Deswegen sind die vorgeschlagenen ASCII-Nachrichten ungeeignet, sowohl
 für RS485 als auch besonders für CAN.
 Vorschlag:
1
 EA - ZA - R/A - DL - data - CRC - EOF
2
  |    |    |     |
3
  |    |    |    Data
4
  |    |    |   length
5
  |    |    |
6
  |    |   Request/
7
  |    |   Answer
8
  |    |
9
  |   Ziel
10
  |   Adresse
11
Eigene
12
Adresse
 Mit solch einem Format der Nachrichten kannst du dein Netz ohne
 Probleme um weitere Funktionen, Master, Endgeräte ganz anderer Art
 usw. erweitern.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Wenn man einen doppelten Ring baut (2 Adern für die Kommunikation links 
herum, und zwei für die umgekehrte Richtung) und jeder Teilnehmer immer 
in beide Richtungen gleichzeitig sendet, hat man sogar Redundanz gehen 
Ausfälle einzelner Knoten.

von Bauform B. (bauformb)


Lesenswert?

Marc V. schrieb:
> Deswegen sind die vorgeschlagenen ASCII-Nachrichten ungeeignet, sowohl
>  für RS485 als auch besonders für CAN.

ASCII hat aber den unschätzbaren Vorteil, menschenlesbar zu sein. Zur 
Fehlersuche einfach ein Terminal(programm) dran hängen und klar sehen...
Bei so wenig Adressen würde ich das sogar für die komplette 
CAN-Nachricht versuchen.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Bauform B. schrieb:
> ASCII hat aber den unschätzbaren Vorteil, menschenlesbar zu sein. Zur
> Fehlersuche einfach ein Terminal(programm) dran hängen und klar sehen...

 ASCII wird bei weitem überschätzt...
 Ein Programm in VS zu erstellen um die Nachrichten zu dekodieren,
 dauert kaum ein paar Stunden und der ganze Verkehr auf dem Bus ist
 dann weitaus verständlicher und menschenlesbar...

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Marc V. schrieb:
> ASCII wird bei weitem überschätzt...

Sehe ich anders. Bei der Vernetzung von Servern haben binäre Protokolle 
längst weitgehend ausgedient. Menschen-lesbare Protokolle erleichtern 
das Troubleshooting massiv.

Sofern es die Performance-Anforderungen zulassen, sollte man meiner 
Meinung nach immer auf Text statt Rohdaten setzen.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Stefanus F. schrieb:
> Marc V. schrieb:
>> ASCII wird bei weitem überschätzt...
>
> Sehe ich anders. Bei der Vernetzung von Servern haben binäre Protokolle
> längst weitgehend ausgedient. Menschen-lesbare Protokolle erleichtern
> das Troubleshooting massiv.

 ASCII erleichtert da genau nichts.
 Troubleshooting wird nicht durch einfaches lesen der Nachrichten mit
 irgendeinem Terminalprogramm gemacht.
 Ein mithörendes Programm welches alle Nachrichten übersichtlich
 (entweder nach Node oder Zeit oder Art der Nachricht) sortiert, mit
 kommentiertem Inhalt, ist für so etwas ganz einfach ein MUSS.

 Ausserdem ist es ein gewaltiges Unterschied, ob eine Node 3 Bytes
 oder 1 Byte einlesen muss, um die Zieladresse zu dekodieren.
 Ob man 4 Bytes oder 10 ASCII-Ziffern sendet...
 Und:
 Je kürzer die Nachricht selbst ist, umso effizienter ist das Ganze.
 Nicht umsonst hat CAN die länge der Daten  begrenzt...

: Bearbeitet durch User
von A. S. (Gast)


Lesenswert?

Wenn der HOST rechts ist:

Knoten <--> Knoten <--> Knoten <--> Host

Jeder Knoten sendet seine Daten nach rechts.
Was er von links bekommt, sendet er nach rechts weiter.

Wenn alle gleichzeitig senden, passiert, ... nichts. Wenn jeder sein 
Telegramm fertig hat, ist das nächste reingekommen und kann gesendet 
werden.

Wenn Du pollen möchtest, dann sendet der Host z.B. an Alle nach links: 
"Gebt mir Eure Daten".
Was von rechts kommt, wird nach links weitergeleitet. Also senden alle 
ihre Daten.

Die Absender-Adressierung ist einfach: Ein Feld wird bei jedem 
Weiterleiten erhöht, mit Initialer 1: Sehe ich eine 3, dann kommt es vom 
dritten Gerät aus der Richtung

Die Empfänger-Adressierung ebenso: Ein Feld ist 0 (dann gehts an jeden) 
oder >0, dann ist es bei 1 für mich, bei >1 wird dekrementiert und 
weitergeleitet.

von Christopher J. (christopher_j23)


Angehängte Dateien:

Lesenswert?

Hanna schrieb:
> Großes Problem an der Sache: Ich
> habe mit dem STM32 noch NIE etwas mit CAN Bus zu tun gehabt, weiß also
> nicht im geringsten wie ich das anfange.
> Hat da jemand ein Codebeispiel o.ä.?

Ich hab mal ein Beispiel für eine CAN-Configuration für einen F072 
angehängt. Das Beispiel stammt aus den "STM32F0 Snippets", basiert also 
lediglich auf Registerprogrammierung mittels CMSIS-Header (das komplette 
Paket bekommt man unter 
https://www.st.com/en/embedded-software/stm32snippetsf0.html). Von der 
Konfiguration her ist CAN schon ein bisschen komplizierter als SPI oder 
I2C aber immer noch viel einfacher als z.B. USB. Der Code ist schon sehr 
gut kommentiert aber wie immer hilft ein Blick in das Reference-Manual 
(in diesem Fall dem des F072).

von Toni Tester (Gast)


Lesenswert?

Christopher J. schrieb:
> Ich hab mal ein Beispiel für eine CAN-Configuration für einen F072
> angehängt.

Danke.
CAN ist nun wirklich keine große Kunst, und auch für STM32 findet man 
Codebeispiele ohne Ende. Klar kann man das noch beliebig 
verkomplizieren, indem man noch weitere Schichten wie CANopen etc. oben 
drauf packt - braucht es aber nicht; CAN reicht meiner Meinung nach für 
diese Applikation völlig aus.
Ja, das Erlernen einer neuen Busschnittstelle bedeutet Arbeit und kostet 
Zeit - wie auch das Einarbeiten in einen neuen Mikrocontroller oder in 
eine neue Programmiersprache. Das ist immer so im Leben; gratis gibts 
fast nix.
Letztendlich muss Dein Chef (bzw. der Kunde) aber sagen, was er konkret 
will bzw. braucht.
Nicht zu unterschätzender Vorteil von Standardlösungen wie CAN, RS485 
usw. im Gegensatz zu "wilden" Selbstbaulösungen mit Stromschleifen, 
RS422 usw.: Es gibt auch halbwegs professionelle Bus-Sniffer für relativ 
wenig Geld - ein im normalen Entwickleralltag unverzichtbares Utensil, 
und hat sich normalerweise schnell bezahlt gemacht (zumal bei anderen 
Lösungen im Allgemeinen nicht nur Zeit für die Fehlersuche drauf geht, 
sondern auch über Gebühr viel Aufwand für die eigentliche Definition und 
Implementierung des eigentlichen Busses, so wie er bei RS485 und 
speziell CAN schon vorhanden bzw. systemimmanent (Arbitrierung usw.) 
ist.). Wenn allerdings selbst sowas Deinem Chef zu teuer ist...

von nachtmix (Gast)


Lesenswert?

Hanna schrieb:
> Gut und schön, aber bei 2000m
> Leitungslänge sollte das selbst bei 9600kBit/s eher NICHT laufen.

Du siehst das zu schwarz.
Vor über 30 Jahren haben wir problemlos 307kBd (vielleicht sogar 1,8MBd) 
mit RS422 über einen beidseitig abgeschlossenen  Bus aus gewöhnlichem 
Telefonkabel übertragen.
Clock und Daten gingen dabei allerdings über separate Paare.
Die Länge des Bus in den Türmen der Stadtverwaltung dürfte bei etwa 600m 
gelegen haben.
https://de.wikipedia.org/wiki/CTOS

von Cu deMonteur (Gast)


Lesenswert?

Hanna schrieb:

> Es gibt, in einer Gesamtlänge von ca 2000m insgesamt 30 kleine

2km Kabel fachgerecht zu verlegen werden wohl alle Hardwarekosten 
deutlich übertreffen => nimm gleich SMF!

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.