Forum: Mikrocontroller und Digitale Elektronik RS485: Detektion ob Slave senden darf


von Pepe (Gast)


Lesenswert?

Hallo.
In einer Anwendung kommunizieren ein Master und mehrere Slaves über 
RS485. Normalerweise wird jedem Slave vom Master mitgeteilt, dass mit 
ihm jetzt kommuniziert wird. Dafür gibt es ein "Select" vom Master für 
jeden Slave.
Der Master initiiert die Kommunikation.
Leider keine "Request"-Möglichkeit vom Slave zurück zum Master.

Jetzt stehe ich vor dem Problem, dass mehrere Slaves gleichzeitig einen 
Job ausführen und sich dann nach dem Job zurückmelden sollen. (nach 
300-1200ms)
Leider kann ich nicht genau sagen, wann die Slaves ihre Quittierung 
rausschicken (könnten), aber es ist sehr wahrscheinlich nach anhähernd 
der gleichen Zeit.

Somit hab ich das Problem, dass mehrere Treiber gleichzeitig auf TX 
gehen könnten, was auf die Dauer sicherlich nicht toll ist. Unabhängig 
mal, dass man sicherlich nichts vernünftiges mehr Empfangen kann.

Hatte mir schon ein "Polling" vom Master überlegt: Master schaltet die 
entsprechenden "Select"-Leitung der Slave, welche quittieren sollen und 
der Slave antwortet dann nur in seinem "Zeitfenster", solange das Select 
aktiv ist.

Gibt es da noch andere Ansätze? Aber leider ohne die Schaltung zu ändern 
;-)

Vielen Dank,
Pepe.

von m.n. (Gast)


Lesenswert?

Pepe schrieb:
> Gibt es da noch andere Ansätze? Aber leider ohne die Schaltung zu ändern
> ;-)

Nur der "Master" darf ungefragt senden. Beim "Slave" kann der Status 
abgefragt werden: kurze Frage - kurze Antwort. Wenn er Daten hat, werden 
diese bei ihm abgeholt.

Ich hoffe, Du hast keine separate "Select"-Leitung, sondern adressierst 
ordentlich?

von Pepe (Gast)


Lesenswert?

Nö. Hab separate Select-Leitungen, weil in meiner Anwendung nicht die 
Adresse der Slaves, sondern der mechanische Ort benötigt wird.

Adressierung über den Bus bringt mich da nicht wirklich weiter.

von H.Joachim S. (crazyhorse)


Lesenswert?

Multimaster und RS485 (und das ist es ja, wenn mehr als einer ungefragt 
auf dem Bus rumquatschen darf) ist nicht so trivial wie es scheint. 
Letzten Endes brauchst du entweder eine Kollisionsvermeidungsstrategie 
(wie z.B.CAN) oder zumindest Kollisionserkennung (wie z.B. Ethernet).
Für dein Vorhaben wäre CAN besser geeignet gewesen :-)
Wenn du nun schon mal gebaut hast, bleib beim Singlemaster und denk dir 
was aus, wie du ausreichend schnell Senderechte verteilst. Was deine 
Select-Leitung soll, weiss ich nicht.

von Pepe (Gast)


Lesenswert?

H.Joachim S. schrieb:
> Was deine
> Select-Leitung soll, weiss ich nicht.

Meine Slaves sind alle gleich. Ich kann jeden dieser Slaves mechanisch 
an eine von max. 200 mechanischen Positionen anstecken und muss jetzt 
durch das Anstecken die mechanische Position erkennen können. Und dafür 
brauch ich ne eindeutige Zuordnung (=Select-Leitung) zum Steckplatz. 
Dass sich die dann noch als "TX-Enable Leitung" angeboten hat, war nur 
eine Nebensache.

von Toralf W. (willi)


Lesenswert?

Abend,

dann hast Du also 200 cs Leitungen verdrahtet? Quatsch oder?

von Amateur (Gast)


Lesenswert?

Das ein Slave von sich aus sendet widerspricht dem Master-Slave-Prinzip.

Kollisionen sind dabei vorhersehbar.

Führe doch einen zusätzlichen Befehl ein, der notfalls mit Schweigen 
beantwortet werden kann.
Massa weiß ja in welchem Zeitraum eine Antwort kommen sollte.
Oder der eine variable Antwortlänge beinhaltet.

von Pepe (Gast)


Lesenswert?

Um genau zu sein 208. Kein Quatsch. Aber über Schieberegister in 8 
Gruppen gelöst. ;-)

von H.Joachim S. (crazyhorse)


Lesenswert?

Und das ist dann ein daumendickes Kabel, mit 200 select-Adern und 2 
Busleitungen??
Oder 200 4polige, verschaltet als Kampfstern?

edit: Antwort überschnitten.

: Bearbeitet durch User
von Gerd E. (robberknight)


Lesenswert?

Pepe schrieb:
> Meine Slaves sind alle gleich. Ich kann jeden dieser Slaves mechanisch
> an eine von max. 200 mechanischen Positionen anstecken und muss jetzt
> durch das Anstecken die mechanische Position erkennen können. Und dafür
> brauch ich ne eindeutige Zuordnung (=Select-Leitung) zum Steckplatz.

Was mir da einfällt wäre, an jeder der 200 möglichen Positionen z.B. 8 
Widerstände = 8 Bit anzubringen. Jeder Widerstand geht entweder auf Vcc 
(=1) oder Gnd (=0). Jetzt hast Du am Slave ne Buchse über die der Slave 
die 8 Bits kontaktiert und auslesen kann und dadurch seine Adresse 
kennt. Da die Widerstände nur lokal an der Slaveposition sind, sparst Du 
Dir die Adern.

Es gibt noch mehr Möglichkeiten für sowas, z.B Spannungsteiler und den 
dann mit nem ADC auslesen.

Aber jetzt zu Deinem Multimaster-Problem: wie kritisch ist denn das 
Timing? Also muss eine Antwort innerhalb von t Millisekunden beim Master 
ankommen oder ist das egal ob die ne Sekunde früher oder später ankommt, 
solange sie nicht ganz verloren geht?

Wieviel ist auf dem Bus los? Ist der fast voll ausgelastet oder ist da 
noch Luft?

Was Du machen könntest wäre nämlich einfach mit den Kollisionen und 
Paketverlusten leben und Deine Strategie daran anpassen. So ähnlich wie 
bei TCP. Der Empfänger muss den ordnungsgemäßen Empfang quittieren, 
ansonsten versucht es der Absender erneut.

von Amateur (Gast)


Lesenswert?

In dem Moment, in dem Du Kollisionen zulässt, brauchst Du das volle 
Programm aus Prüfsumme und Acknowledge.

von H.Joachim S. (crazyhorse)


Lesenswert?

Also du hast statt einer Adressierungsmöglichkeit auf den slaves zu 
jedem eine Leitung.
Also machst du folgendes: beim Systemstart werden die Adressen verteilt:
-1.CS auf low, Kommando: hier kommt deine Adresse (1)
Entweder kommt jetzt eine Antwort und der Master weiss jetzt, dass auf 
CS1 jemand wohnt und dass der ab jetzt die Adresse 1 hat. Kommt nichts, 
ist der Platz leer oder defekt
usw bis du alle durchgeklappert hast. Dann hast du eine Tabelle, welche 
Plätze belegt sind und kannst ab da über eine einfache 8bit-Adresse 
jeden einzelnen gezielt ansprechen.

Und ab dann pollst du alle vorhandenen:
slave 1, hast du was? (2 Byte)
Antwort nein (1byte) oder den entsprechenden Datensatz

1Mbit geht i.a. problemlos (wie lang ist deine Leitung??), sprich die 
Anfrage dauert 20µs pro slave, die (negative) Antwort 10µs. Mit ein 
bisschen Latenzzeit bist du bei 50µs pro slave, d.h. in 10ms hast du 
alle einmal durch.

von Pepe (Gast)


Lesenswert?

@H.Joachim Seifert
So etwa ist das Ganze auch jetzt schon implementiert. Nur hatten wir uns 
vor >10 Jahren auf 115Kb eingestellt.

Ich sehe schon, dass ich wohl nicht ums Pollen rum komme. Ehrlich gesagt 
hatte ich auch nichts anderes erwartet.

Jetzt was persönliches: Kommst Du aus der SMD Fertigungsecke?

von m.n. (Gast)


Lesenswert?

Pepe schrieb:
> So etwa ist das Ganze auch jetzt schon implementiert.

Das hattest Du aber nicht geschrieben!
Pepe schrieb:
> Adressierung über den Bus bringt mich da nicht wirklich weiter.

... und nichts von bis zu 200 Teilnehmern und 115 kBd.
Wichtig ist es, das Pollen kurz zu halten und nach Prioritäten ablaufen 
zu lassen.

von Jürgen D. (poster)


Lesenswert?

Ich hatte mal System gesehen da wurden die Slaves vom Master fortlaufend 
durchnummeriert. Auf eine Statusabfrage des Masters hat dann zuerst 
Slave1 mit einem Statusbyte geantwortet, dieses hat auch Slave2 
empfangen und dann sofort sein Statusbyte gesendet u.s.w. bis alle 
Slaves ihren Status gesendet hatten.
Das ganze ging recht flott weil der Master ja nur eine Anfrage an alle 
gesendet hat und jeder Slave nur mit einem Byte geantwortet hat.
Im Fehlerfall wenn ein Slave ausgefallen ist mussten die restlichen 
natürlich wieder neu durchnummeriert werden.
Über ihre eigentliche Adresse waren die Slaves natürlich auch direkt 
erreichbar.

von Georg (Gast)


Lesenswert?

Pepe schrieb:
> Und dafür
> brauch ich ne eindeutige Zuordnung (=Select-Leitung) zum Steckplatz.

Wieso - die Leitungen sind doch überflüssig. Du kannst jeder Station 
durch Jumper oder Verdrahtung am Steckplatz eine positionsabhängige 
Nummer geben und der eingesteckte Slave meldet die auf Anfrage, so weiss 
der Master, welcher Slave in welchem Steckplatz steckt.

Georg

von Pepe (Gast)


Lesenswert?

Georg schrieb:
> eine positionsabhängige Nummer geben

Da aber meine Kunden den Slave irgendwo hinstecken wollen, ohne irgend 
Jumper zu ändern, geht's wohl trotzdem nur mit einer Steckplatzerkennung 
die nichts mit den Slaves zu tun hat. Aber das ist auch gar nicht mein 
Thema. Da kann ich eh nichts ändern.

von S. K. (hauspapa)


Lesenswert?

Je nach Häufigkeit, Wahrscheinlichkeit und technischer Möglichkeit 
(mehrere CS gleichzietig aktivieren oder Lockerung des bestehenden 
Regimes) geht evtl. ein Gruppenbroadcast schneller:

Slaves 1-10 habt Ihr was?
keine Antwort
Slaves 11-20 habt Ihr was?
alle schwatzen los, kein sinnvolles Signal aber Info das was abzuholen 
ist hat man ja trotzdem gewonnen.
Slave 11 hast Du?
...

viel Erfolg
hauspapa

von Pepe (Gast)


Lesenswert?

Macht das die Ausgangstreiber eines LT1785 auf die Dauer mit?

von S. K. (hauspapa)


Lesenswert?

Datenblatt Seite 7:
The driver output is protected from shorts between ±60V in both active 
and high impedance modes.

Würde ich als "ist einen Versuch Wert" interpretieren

Ausserdem ist CAN Bus Applications Explizit aufgeführt. Auch da halte 
Datenkollision nicht für ausgeschlossen.

keine Garantie
hauspapa

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.