Forum: Mikrocontroller und Digitale Elektronik Verständnis zu RS-485


von Daniel S. (dseichter)


Lesenswert?

Guten Abend,

ich habe den Tag nun damit verbracht, mir die Unterschiede zwischen I2C, 
RS-485, sowie CAN zu Gemüte zu führen (One-Wire ebenfalls), konnte mir 
aber eine Frage nicht beantworten, nachdem ich mich nun auf RS-485 
festgelegt habe.

Mein Ziel/Ablauf:
- alle Slaves (Sensoren gleichen Typs, Anzahl zwischen 1 und 10) senden 
nur, wenn diese sich zwischen zwei Schwellenwerten befinden
- Die Sensoren werden in einem Netzwerk über ein 2 adriges Kabel 
(half-duplex) über eine Adapterplatine auf den Raspberry gebracht (wird 
noch gebaut).
- Das Datenpaket hat den Aufbau (falls wichtig für Antwort):
SeriaIDWert1Wert2Wert3 (gesamte Nutzdaten mit 19 Bytes Länge)
10St 4St 4St 1St

Nun meine Verständnisfrage(n):
Können alle Slaves einfach so auf dem RS-485 senden (bspw. SN65HVD72D) 
und der Master (in dem Fall Raspberry) zeichnet alles auf, was auf dem 
Bus "los" ist oder muss der Master (Raspberry) die einzelnen Slaves 
reihum abrufen und denen erlauben, dass sie senden dürfen (die ich dann 
vorher bekannt machen muss)?

Aktuell habe ich half-duplex angedacht mit zwei verdrillten Adern oder 
ist für diesen Anwendungsfall Full-Duplex notwendig?


Habt vielen Dank für eine Antwort,

Daniel

von Peter II (Gast)


Lesenswert?

Daniel Seichter schrieb:
> Aktuell habe ich half-duplex angedacht mit zwei verdrillten Adern oder
> ist für diesen Anwendungsfall Full-Duplex notwendig?

Full-Duplex  geht nur mit 2 Teilnehmern!

Bei RS485 darf immer nur ein Gerät senden, alle anderen können die Daten 
lasen. Wie du das sicherstellt ist dir überlassen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Daniel Seichter schrieb:
> Können alle Slaves einfach so auf dem RS-485 senden (bspw. SN65HVD72D)

Sollten sie nicht, denn dann kommt es zu Kollisionen, wenn nämlich zwei 
gleichzeitig senden. Außerdem wären es dann keine "Slaves".

> oder muss der Master (Raspberry) die einzelnen Slaves
> reihum abrufen und denen erlauben, dass sie senden dürfen (die ich dann
> vorher bekannt machen muss)?

So wird ein Single-Master/Multiple-Slave-Bus üblicherweise betrieben.

Wenn sich an Deinen Sensoren nichts ändert, könnten sie auf eine Anfrage 
des Masters auch mit einem kürzeren "nix los"-Paket antworten, statt ein 
vollständiges Paket zu senden. Das verkürzt den Abfragezyklus auf dem 
Bus.

Dafür genügt eine Halbduplex-Verbindung, also ein RS485-Kanal. Beachte, 
daß die Sender-/Empfänger-Umschaltung des RS485-Treibers ein kritischer 
Punkt ist. Wenn Du keine UART-Hardware verwendest, die das von sich aus 
erledigen kann, musst Du das in Software selbst ansteuern. Das bedeutet, 
daß Du nach dem Senden von Daten abwarten musst, bis die Daten auch 
wirklich das Schieberegister der UART verlassen haben, bevor Du 
umschaltest.

Beim Rpi bietet sich der Gebrauch eines USB-RS485-Wandlers auf Basis 
eines FT232 an, der beherrscht die Sender/Empfänger-Umschaltung in 
Hardware.

von Daniel S. (dseichter)


Lesenswert?

Hallo,

danke für die Antworten und dem Hinweis auf den FT232.

Habe mir für den RS485 Treiber den TI SN65HVD72D ermittelt, da er u.a. 
mit der Versorgungsspannung von 3,3V des Raspberry zu betreiben ist, 
sowie der dahinterliegende ATmega328P-AU ebenfalls damit betrieben 
werden kann.

Zusammenfassend:
Somit muss ich nun die ID der Slaves im Master eintragen (diese würde 
der serialID entsprechen), der fragt reihum die Slaves ab und sobald 
einer etwas zu melden hat, sendet dieser die Daten in den Bus und der 
Master greift diese ab.
Ich werde mir hier ggf. etwas überlegen, um neue Sensoren (bzw. Mit 
geänderter serialID) mit etwas in der Art von "bin neu hier lieber 
Master, hast Du mich?" automatisch hinzufügen zu können.

Bzgl FT232 werde ich morgen das DB ansehen, da ich die BUS-Platine erst 
noch aufbauen/anfertigen muss und mir noch das ein oder andere Bauteil 
fehlt :(

Danke nochmals und einen schönen Abend,
Daniel

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Daniel Seichter schrieb:
> Ich werde mir hier ggf. etwas überlegen, um neue Sensoren (bzw. Mit
> geänderter serialID) mit etwas in der Art von "bin neu hier lieber
> Master, hast Du mich?" automatisch hinzufügen zu können.

Ist das bei der begrenzten Anzahl von Slaves am RS485 (offiziell 32) 
nicht ein bisschen zu aufwendig? Ein 8-Bit-Wert ist zur Adressierung 
ausreichend, und den kann man mit 'nem DIP-Schalter oder zwei 
4-Bit-Drehschaltern am Slave einstellen.

> Bzgl FT232 werde ich morgen das DB ansehen

Das lohnt, denn darin ist eine Beispielschaltung für die Ansteuerung 
eines RS485-Treibers enthalten.

von Stefan (Gast)


Lesenswert?

Wenn Du nicht mehr als 8 Bits zur Adressierung verwendest, dann ist es 
sicher praktikabel, dass der Master einfach alle möglichen Adressen 
nacheinander abfragt und schaut, ob er eine Antwort erhält.

Ansonsten brauchst Du eine Kollisions-Erkennung mit Lösungs-Algorithmus. 
Wie gesagt finde ich da den Ansatz bei CAN schön einfach.

von Hoppla ! (Gast)


Lesenswert?

Das dynamische Hinzufuegen von neuen Stationen ist nicht trivial. Der 
Codieransatz mit Dipschaltern sollte zumindest ueberlegt werden.
Falls die Position des Slaves wichtig ist, ist das der beste Ansatz.
Meist sollte man ja wissen welcher Slave wo steht. Sei es fuer 
Wartungsarbeiten, oder man muss irgend eine Funktionalitaet einem 
Standort zuweisen.
Kollisionserkennung ist nicht ganz so einfach.

von H.Joachim S. (crazyhorse)


Lesenswert?

Für das, was du eigentlich vorhast, ist CAN besser geeignet.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Stefan schrieb:
> Wenn Du nicht mehr als 8 Bits zur Adressierung verwendest

Wozu sollte man das tun? "Offiziell" sind nur 32 Teilnehmer möglich, 
auch inoffiziell wird es schwierig, mehr als 100 zu betreiben. Also 
reichen 8 Bit.

Eine Möglichkeit zur Adresszuweisung ohne Kollisionserkennung, die 
allerdings Zugang zu den einzelnen Slaves erfordert, könnte wie folgt 
aussehen:

Jeder Sensor bekommt einen "Anmeldetaster".

Wird der gedrückt, reagiert der Slave auf eine spezielle im Protokoll 
festgelegte Adresse.

Der Master sendet in seinem Abfragezyklus alle ihm bekannten Adressen 
und diese Spezialadresse. Reagiert ein Slave auf diese Adresse, teilt 
der Master ihm seine neue, dauerhaft zu verwendende Adresse zu, die der 
Slave daraufhin in seinem EEPROM (oder wo auch immer) unterbringt und 
fortan verwendet. Der Master erweitert seine Liste von bekannten 
Adressen - fertig.

Somit ist für die Inbetriebnahme an jedem Slave einmal der Anmeldetaster 
zu betätigen. Das kann gegebenenfalls auch vor Installation der Slaves 
an ihren jeweiligen Betriebsorten geschehen.

von H.Joachim S. (crazyhorse)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Wozu sollte man das tun? "Offiziell" sind nur 32 Teilnehmer möglich,
> auch inoffiziell wird es schwierig, mehr als 100 zu betreiben. Also
> reichen 8 Bit.

Nö. Es gibt auch 1/8load-Transceiver. Funktioniert zuverlässig. Schon 
mit >200 Teilnehmern aufgebaut.
Aber 8Bit-Adresse reicht trotzdem.

von Reinhard Kern (Gast)


Lesenswert?

Daniel Seichter schrieb:
> Ich werde mir hier ggf. etwas überlegen, um neue Sensoren (bzw. Mit
> geänderter serialID) mit etwas in der Art von "bin neu hier lieber
> Master, hast Du mich?" automatisch hinzufügen zu können.

Ich habe das folgendermassen geregelt: der Master hat eine Tabelle für 
z.B. 32 oder 64 Slaves, ob diese online oder offline sind. Der Master 
fragt die online Slaves reihum ab, antwortet einer nicht mehr, wird er 
offline (die anderen liefern Daten). Nach dem Durchgang fragt der Master 
noch einen der offline Slaves ab (auch reihum), antwortet der, wird er 
online.

Das Abfragen neuer Slaves dauert länger, weil meistens die maximale 
Antwortszeit abgewartet werden muss, daher frage ich nur immer einen ab. 
Die Folge ist, dass es bis zu n Zyklen dauert, bis ein neuer Slave 
online ist. Man kann auch mehr abfragen, dementsprechend wird die Zeit 
bis zum Einloggen kürzer und dafür die Zykluszeit länger. Ganz nach 
Bedarf.

Funktionierende Slaves sollten IMMER antworten, notfalls eben mit 
"Nichts los hier", sonst wird Zeit verschwendet.

Gruss Reinhard

von Daniel S. (dseichter)


Lesenswert?

Hallo,

in CAN habe ich mich auch schon eingelesen, allerdings ergab die Suche 
nach Treibern, die über Txd/RxD das Signal auf den CAN-Bus bringen 
können, kein wirkliches Ergebnis. Oder sind hier immer bereits 
CAN-fähige µC erforderlich?

Nichts desto trotz finde ich den Lösungsansatz über "Anmeldetaster" eine 
gute Idee. Somit könnte man auch, wenn man einen Sensor auf einen 
anderen Master setzt, diesen wieder zurücksetzen (muss ja nur verhindert 
werden, dass der Taster versehentlich gedrückt werden kann).

Nach DIP-Schalter-Beispiele hatte ich gestern ebenfalls bereits gesucht, 
war aber, wahrscheinlich aufgrund falscher Suchbegriffe oder falschen 
Vorstellungen von mir, nicht von Erfolg gekrönt.
Wie muss ich mir das Vorstellen? Setze ich durch die unterschiedlichen 
Stellungen eine Adresse und der µC kann diese Adresse dort auslesen oder 
verbindet man die DIP-Schalter mit bspw. 8 Ports und je nach Zustand 
(0/1), wird daraus die Adresse festgelegt?
Könnte man, wenn über einen Port(eine Leitung möglich, die DIP-Schalter 
nicht auch direkt am Master anbringen und somit, je nach angeschlossener 
Buchse, die Adresse stets gleich halten (Buchse 1 = Adresse 1, Buchse 2 
= Adresse 2,...)?

Danke für eure Hilfe,

Daniel

von Reinhard Kern (Gast)


Lesenswert?

Daniel Seichter schrieb:
> Wie muss ich mir das Vorstellen? Setze ich durch die unterschiedlichen
> Stellungen eine Adresse und der µC kann diese Adresse dort auslesen

Am transparentesten (soll ja einfach bedienbar sein) ist es natürlich, 
wenn du z.B. bei 64 Slaves ein 6poliges Mäuseklavier verwendest und 
jeder Schalter einem Adressbit entspricht. Die Schalterstellung muss der 
Prozessor beim Starten einlesen und als seine Adresse benutzen. Noch 
anwenderfreundlicher wären 2 Dezimalschalter.

Hat der Slave eine Bedien-Schnittstelle, kann man die Adresse auch 
eintippen. So oder so ist der Nachteil, dass man Zugang zum Slave haben 
muss (Administration by Walking) und beim Schalter ev. sogar das Gerät 
öffnen muss - aber das kann auch ein Vorteil sein, damit nur 
qualifizierte Leute was ändern. Die erwähnte automatische Vergabe von 
Adressen ist natürlich hinderlich bei einer Fehlersuche. So hat eben 
alles seine Vor- und Nachteile.

Gruss Reinhard

von Daniel S. (dseichter)


Lesenswert?

Guten Abend zusammen,

habe mich nun für folgende Lösung entschieden:
- RS-485 Schnittstelle
- Taster für die Initialisierung der Slave Adresse (Abfrage bei Master 
und Speicherung in Slave)
- Initialroutine sendet die vorher selbst definierte Seriennummer, die 
wiederum im Master bzw. RPi (also Raspberry) gespeichert wird. (1:1 
Zuordnung Bus-ID mit Seriennummer)
- auf dem RPi läuft über den Webserver eine Statusseite, die mir die 
Slaves, deren Seriennummer, sowie weitere Informationen (manuell in Web 
eingetragen) auflistet und ich deren Status somit prüfen kann
- Mit Hilfe des Taster, realisiere ich auch die Abmeldung eines Sensors 
am BUS (quasi Reset)

Die Zusammenführung der Daten werde ich dann in einem neuen Projekt 
durchführen.

Nun gilt es, den Schaltplan voll fertig zu stellen und mich ans 
Platinendesign zu machen :)

Wünsche einen schönen Abend und Danke für Eure Anregungen. Die haben mir 
weitergeholfen!!

Daniel

von Walter (Gast)


Lesenswert?

wenn Du immer nur einen neuen Slave anschließt kannst Du dir den Taster 
auch sparen:
jungfräuliche Slaves haben eine bestimmte Adresse die der Master 
regelmäßig abfragt, dann bekommen sie vom Master die "richtige" Adresse 
und du kannst den nächsten Slave anschließen usw.

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.