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
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.
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.ä.?
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.
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?
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ß.
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.
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!
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.
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?
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.
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
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.
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 ...
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?
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.
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!
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.
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.
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.
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.
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
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
>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 ?
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