Forum: Mikrocontroller und Digitale Elektronik RS485 Kommunikationsfehler bei mehreren Slaves


von Günter (Gast)


Lesenswert?

Liebe Bus Experten,

meinem RS485 Netzwerk (National Instruments 9871 als Master, Power Meter 
bzw. ICPDAS 7017 analoge Messbox als Slave) läuft gut mit einem Slave. 
Bei 2 oder mehr (egal von welcher Sorte) bekomme ich Timeouts auch schon 
bei 9600. Eine Signalanalyse hat gezeigt das zwar die Befehle richtig 
gesendet werden aber die Slaves nicht zuverlässig antworten (wie gesagt, 
bei nur einem geht es).

Bei einem anderen Versuch mit einem RS485/USB-Konverter als "Slave" (und 
einem kleinen LabVIEW-Programm um das Verhalten der Slaves zu simulieren 
- der "Slave" empfängt die Kommandos und sendet je nach Adresse einen 
Antwortstring) geht es mit 10 "Slaves" und 115200 fehlerfrei.

Den 2. Versuch habe ich gemacht um den Master (Hardware, VISA, Programm) 
und die Verkabelung (Cat5 mit 100 Ohm Abschluss weil das der 
Wellenwiderstand des Cat5 ist) zu testen.

Ich habe noch kein RS485 Netzwerk für hohen Durchsatz gebaut, aber ich 
wäre überrascht wenn das nicht gehen würde.

Ich bin für jeden Tip dankbar,
Grüße, Günter

von kläb (Gast)


Lesenswert?

Wie ist dein Bus aufgebaut?
Wo sitzen bzw sitzt der Anschlusswiderstand?

Bei vernünftigen Treibern, Verkabelung, Abschluß geht das in der 
Industrie auch deutlich weiter und mit einer höheren Datenrate. Siehe 
die ganzen Gebersysteme.

von kläb (Gast)


Lesenswert?

kläb schrieb:
> Anschlusswiderstand

Abschlusswiderstand

von kläb (Gast)


Lesenswert?

Günter schrieb:
> meinem RS485 Netzwerk (National Instruments 9871 als Master, Power Meter
> bzw. ICPDAS 7017 analoge Messbox als Slave) läuft gut mit einem Slave.

Achso, oder gibt es vllt. irgendwelche Kollisionen o.ä.?

von Günter (Gast)


Lesenswert?

kläb schrieb:
> geht das in der
> Industrie auch deutlich weiter und mit einer höheren Datenrate

Ja, das denke ich auch, aber ich steh irgendwie auf der Leitung. Ich 
habe am Beginn und Ende den 100R aber keine pull up/down weil ich keinen 
Zugang zur Versorgungsspannung der Bustreiber habe. Kann das eine Rolle 
spielen?

Und, das habe ich noch vergessen zu erwähnen, es ist nur eine 2-Draht 
Verkabelung A+/A- und GND also Halb-duplex, weil die Slaves so aufgebaut 
sind.

Der Master sendet in einer Schleife den Request, wartet bis die 
geforderten Bytes anstehen und ließt den String aus. Dieser wird danach 
verarbeitet und der Request an die nächste Adresse gesendet. Es sollte, 
wie gesagt, so schnell als möglich Abgefragt werden, daher bin ich mit 
Pausen eher sparsam. Die schleife läuft gleich schnell, egal ob ich 
einen oder mehrere Slaves anspreche also sollten die Slaves ja 
eigentlich mehr Zeit zum Antworten habe wenn ich mehrere Geräte 
verwende.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Günter schrieb:
> National Instruments 9871

Wie steuerst Du das Ding an? Erledigt es die Sende-/Empfangs-Umschaltung 
für den RS485-Treiber selber oder machst Du das etwa mit Deiner Software 
von Hand?

von Jens M. (Gast)


Lesenswert?

Günter schrieb:
> Den 2. Versuch habe ich gemacht um den Master (Hardware, VISA, Programm)
> und die Verkabelung (Cat5 mit 100 Ohm Abschluss weil das der
> Wellenwiderstand des Cat5 ist) zu testen.

Das funzt, also mach den umgekehrten Versuch und ersetze den Master.

Erstmal mit einem slave, dann langsam steigern.

Wenn das läuft werden sich die beiden nicht vertragen. Das kann dann 
jede Menge Ursachen haben (Umschaltverhalten, bei Cat5 kein paar 
erwischt etc pp) aber wenn es mit 9600 nicht läuft tippe ich auf falsche 
Verdrahtung.

Die Abschlussswiderstände sind bei dem speed nicht wichtig.

Zwei hundert Ohm Serienwiderstände in die Datenleitung (um die slew rate 
zu begrenzen) kann auch helfen, aber das ist dann schon Master/Slave 
Voodoo wenn man nicht mehr weiter weiß.

von m.n. (Gast)


Lesenswert?

Günter schrieb:
> Es sollte,
> wie gesagt, so schnell als möglich Abgefragt werden, daher bin ich mit
> Pausen eher sparsam.

Dann nimm eine höhere Baudrate, aber spare nicht mit der Pause beim 
Umschalten von Senden auf Empfangen. Der Sender muß abwarten, bis sein 
Stoppbit vollständig ausgegeben ist.

von Günter (Gast)


Lesenswert?

Jens Martin schrieb:
> Das funzt, also mach den umgekehrten Versuch und ersetze den Master.

Gute Idee, habe ich auch gemacht :) und den RS485/USB Konverter als 
Master statt dem cRIO genommen, hat aber genauso reagiert.

Die Verdrahtung ist sicher OK, aber das mit dem Serienwiderstand werde 
ich probieren, danke!

von Günter (Gast)


Lesenswert?

m.n. schrieb:
> Der Sender muß abwarten, bis sein
> Stoppbit vollständig ausgegeben ist.

Da hätte ich mich auf den VISA Layer von National Instruments verlassen, 
dass der darauf achtet. Ich verstehe nicht warum (mit gleichen Timing) 
zwei aufeinander folgende Befehle ans gleiche Gerät super funktionieren 
und an 2 unterschiedliche 5%-10% Fehler verursachen.

Ich werde nochmals Pausen erzwingen, danke für die Tipps.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Günter schrieb:
> Da hätte ich mich auf den VISA Layer von National Instruments verlassen,
> dass der darauf achtet.

Wie ist denn Dein Gerät konfiguriert? Der 9871 bietet ja wohl 
verschiedene Möglichkeiten, den RS485-Bus anzusteuern; welche davon 
nutzt Du?

von Besserwisser (Gast)


Lesenswert?

Du musst die A/B-Leitungen mit Widerständen auf Vcc/2 an einer
Stelle terminieren.
Denn die Offsetströme der Bustreiber heben Dir Deinen Pegel derart an, 
dass sie von den Treibern nicht mehr erkannt werden, wenn sie gegen Vcc 
gehen oder gegen 0V. Sieh Dir mal die A/B-Leitungen mit dem Oszi (gegen 
Gnd) an, dann siehst Du, was Sache ist.

von Dietrich L. (dietrichl)


Lesenswert?

Günter schrieb:
> Ich
> habe am Beginn und Ende den 100R aber keine pull up/down weil ich keinen
> Zugang zur Versorgungsspannung der Bustreiber habe.

Die Pull-Up/Pull-Down Widerstände sind aber wichtig, denn sonst ist in 
der Pause zwischen 2 Telegrammen der Zustand auf der Leitung 
undefiniert. Die Empfänger können "umkippen" (also den Ruhezustand 
verlassen) und die erste Flanke (Startbit) des ersten gesendeten Zeichen 
geht verloren. Der UART synchronisiert dann falsch.

Gruß Dietrich

von Arsenico (Gast)


Lesenswert?

Jeder Slave benötigt eine eigene Adresse !

von Günter (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Wie steuerst Du das Ding an?

Ich benutze den VISA Layer von NI, der übernimmt das Umschalten, auf der 
SW Seite habe ich nur noch Write/Read Blöcke. Ich war der Annahme dass 
NI weiß wie sie am besten mit ihren Treibern reden.

von Günter (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Wie ist denn Dein Gerät konfiguriert?

Ich verwende VISA und erhalte sowohl unter Windows als auch unter RT die 
gleichen Ergebnisse. Ich hatte früher schon mal ein RS232 Modul mit FPGA 
direkt angesprochen und für ein anderes low-speed Projekt VISA 
erfolgreich verwendet. Ich habe mich hier für VISA entschieden weil ich 
dachte dass die verwendet SW Treiber für die Bausteine optimiert sind. 
Und für ein Gerät geht es ja auch gut ...

von Achim M. (minifloat)


Lesenswert?

Bei Master + 1 Gerät gehts.
Bei Master + 2 Geräte gehts nicht so gut.
Bei Master + Masterahnliche Geräte als Geräteemulation gehts.

=> Brummschleife der Geräte zueinander, nur der Master hat galvanische 
Trennung oder genug Common-Mode-Bereich?

=> Viel elektromagnetische Verseuchung in der Umgebung?  Masse des RS485 
mitführen? Schirmung des Signalkabels?

von Günter (Gast)


Lesenswert?

Dietrich L. schrieb:
> Die Pull-Up/Pull-Down Widerstände sind aber wichtig

Das 9871 Modul verwendet einen MAX3076 Treiber welcher, ich zitiere das 
Datenblatt:

These devices feature fail-safe circuitry,
which guarantees a logic-high receiver output when the
receiver inputs are open or shorted, or when they are
connected to a terminated transmission line with all drivers
disabled.

meiner Meinung nach dafür sorgt. Außerdem habe ich von außen keinen 
Zugang zur Versorgungsspannung des Treibers.

von Günter (Gast)


Lesenswert?

Arsenico schrieb:
> Jeder Slave benötigt eine eigene Adresse !

Ja, das ist mir schon klar ...

von Günter (Gast)


Lesenswert?

Joachim K. schrieb:
> Bei Master + 1 Gerät gehts.
> Bei Master + 2 Geräte gehts nicht so gut.
> Bei Master + Masterahnliche Geräte als Geräteemulation gehts.
>
> => Brummschleife der Geräte zueinander, nur der Master hat galvanische
> Trennung oder genug Common-Mode-Bereich?
>
> => Viel elektromagnetische Verseuchung in der Umgebung?  Masse des RS485
> mitführen? Schirmung des Signalkabels?

Das werde ich mir nochmals genau mit dem Oszi anschauen. Beim ersten 
Check ist mir nichts ungewöhnliches aufgefallen aber ich prüfe das 
nochmals ich komm erst am Donnerstag wieder ins Labor. Vielen Dank für 
den Tipp!

von Günter (Gast)


Lesenswert?

Zwischendurch mal an alle:

Vielen Dank für die vielen Hinweise, ich komme erst am Donnerstag dazu 
alles auszuprobieren, aber jetzt weiß ich schon worauf ich achten soll.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Günter schrieb:
>> Wie ist denn Dein Gerät konfiguriert?
>
> Ich verwende VISA

Das ist die Software. Mich interessierte eher die Konfiguration des 
Gerätes selbst, da scheint man zwischen Steuerung per DTR und "Auto" und 
Zwei- und Vierdrahtbetrieb wählen zu können. DTR bedeuet, daß die 
Software sich darum kümmern muss, "Auto" sollte bedeuten, daß die 
Hardware des Gerätes sich selbst um die Sender-/Empfänger-Umschaltung 
kümmert, wie es jede etwas bessere UART auch unterstützt.

von Günter (Gast)


Lesenswert?

Bei den Slaves habe ich keine Steuerleitungen, nur A+/A- daher muss ich 
im 2-Drahtbetrieb mit "Auto" Konfiguration arbeiten. In diesem Mode ist 
lt. NI immer auf "Empfang" geschaltet außer wenn gesendet wird. Auf das 
Umschalten selbst habe ich keinen Einfluss.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Günter schrieb:
> daher muss ich im 2-Drahtbetrieb mit "Auto" Konfiguration arbeiten.


Das sollte auch die bestmögliche Variante sein. Hättest Du das nämlich 
selbst per DTR "in die Hand genommen", gäbe es nach dem Senden eine 
potentielle Totzeit, in der die Slaves antworten können, der Treiber 
aber noch im Sendebetrieb steht und also nichts empfangen werden kann. 
Würde zu früh umgeschaltet werden, könnte das Senden selbst verstümmelt 
werden.

Deswegen sind UARTs mit Hardware-RS485-Unterstützung --der 
"Auto"-Betrieb-- eindeutig zu bevorzugen.

Immerhin: Das ist hier also nicht die Fehlerquelle.

von Günter (Gast)


Lesenswert?

Ich konnte heute einige Tests machen und das Verwenden von pull up/down 
Widerständen hat die Fehler beseitigt, wie es scheint (Tests laufen zur 
Zeit noch). Ich musste eine externe 7V Quelle verwenden da die 
Treiberversorgung nicht herausgeführt ist. Ich verstehe es zwar noch 
immer nicht so 100% da ich dachte der MAX3076 braucht das nicht, aber 
Hauptsache es klappt erstmal.

Ich möchte mich bei allen für die zahlreichen Hinweise herzliche 
bedanken!
Grüße, Günter

von Dietrich L. (dietrichl)


Lesenswert?

Günter schrieb:
> Ich verstehe es zwar noch
> immer nicht so 100% da ich dachte der MAX3076 braucht das nicht, aber
> Hauptsache es klappt erstmal.

Die zusätzlichen pull up/down Widerstände erhöhen zumindest die 
Störfestigkeit des Ruhezustands.
Vielleicht ist da ja irgendwelcher "Dreck" auf der Leitung oder 
kritische Masseschleifen, die stärker sind als die "fail-safe circuitry" 
des MAX?
Oder das Abschalten des Senders hinterlässt noch einen unsauberen 
Zustand auf der Leitung, der durch die Widerstände schneller verlassen 
wird?

Gruß Dietrich

von Uwe (Gast)


Lesenswert?

>Arsenico schrieb:
>> Jeder Slave benötigt eine eigene Adresse !

>Ja, das ist mir schon klar ...

Und welche Adresse hat Slave 1 ? Slave 2 usw ...

Wenn du Slave 1 einzeln ranhängst und ihn mit seiner Adresse ansprichsts 
antwortet er ?
Wenn du Slave 2 einzeln ranhängst und ihn mit seiner Adresse ansprichsts
antwortet er ?
Wenn du Slave 1 einzeln ranhängst und ihn mit einer anderen Adresse 
ansprichsts  antwortet er ?
Wenn du Slave 2 einzeln ranhängst und ihn mit einer anderen Adresse 
ansprichsts  antwortet er ?

von Günter (Gast)


Lesenswert?

Uwe schrieb:
> Und welche Adresse hat Slave 1 ? Slave 2 usw ...
Jeder hat eine andere Adresse (2,3,4,5,...)
>
> Wenn du Slave 1 einzeln ranhängst und ihn mit seiner Adresse ansprichsts
> antwortet er ?
Ja
> Wenn du Slave 2 einzeln ranhängst und ihn mit seiner Adresse ansprichsts
> antwortet er ?
Ja
> Wenn du Slave 1 einzeln ranhängst und ihn mit einer anderen Adresse
> ansprichsts  antwortet er ?
Wenn ich die Adresse auf dem Slave und im Programm ändere: Ja
> Wenn du Slave 2 einzeln ranhängst und ihn mit einer anderen Adresse
> ansprichsts  antwortet er ?
Wenn ich die Adresse auf dem Slave und im Programm ändere: Ja

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.