Forum: Mikrocontroller und Digitale Elektronik RS-485 Netzwerk mit mehreren Teilnehmern


von Ingo S. (schicki)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

ich möchte meine Heimautomation vernetzen. Bisher greife ich mit dem PC 
die Daten von nur einem Teilneher ab. Das geht auch sehr gut. Nun habe 
ich mein Protokoll erweitert. Mit einem Teilnehmer geht das auch. Sobald 
ich aber ein Netzwerk mit zwei Teilnehmern habe, hängt sich immer der 
Teilnehmer auf, der nicht angesorochen wird. Woran kann das liegen?

Ich habe inzwischen die Vermutung dass der Bus irgendo nicht sauber 
schaltet. Vielleicht kennt sich jemand mit dem RS-485 und mehreren 
Teilnehern besser aus. Die Terminierung 120 Ohm ist am Anfang und am 
Ende des Busses. Die Pullups für VCC und GND sind an jedem Teilnehmer 
dran 680 Ohm. Eingesetzt wird der MAX3485 da ich nur mit 3,3 Volt und 
dem PIC18F97J60 arbeite. Ein Auszugder Hadware von der Schnittselle 
liegt bei. Die Umschaltung von Sende- und Empfangsbetrieb läuft 
automatisch.

PC -> Slave Adr. 1 -> Slave Adr. 2

Grüße und Danke
Ingo

Kurz zum Aufbau:
            SP_COM.Write(Chr(&H53)) // 'S' Controller wird aufgeweckt
            System.Threading.Thread.Sleep(100)

            SP_COM.Write(Chr(STX)) '0 Startzeichen
            SP_COM.Write(Chr(cbo_Ziel.Text)) '1 Ziel
            SP_COM.Write(Chr(cbo_Quelle.Text)) '2 Quelle
            SP_COM.Write(Chr(cbo_Art.Text)) '3 ART
            SP_COM.Write(Chr(cbo_Par_1.Text)) '4 PAR1
            SP_COM.Write(Chr(cbo_Par_2.Text)) '5 PAR2
            SP_COM.Write(Chr(cbo_Par_3.Text)) '6 PAR3
            SP_COM.Write(Chr(cbo_Par_4.Text)) '7 R/W
            SP_COM.Write(Chr(ETX)) '8
            SP_COM.Write("\0")

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Ingo S. schrieb:
> ich mein Protokoll erweitert. Mit einem Teilnehmer geht das auch. Sobald
> ich aber ein Netzwerk mit zwei Teilnehmern habe, hängt sich immer der
> Teilnehmer auf, der nicht angesorochen wird. Woran kann das liegen?

 Als erstes fehlt bei dir die Länge des Pakets und das ist unbedingt
 notwendig, ansonsten kann es passieren (wie bei dir) dass sich der
 Empfänger aufhängt !!

 Hier ist etwas, das bei mir in einem Netz mit 11 Teilnehmern
 ohne irgendwelche Probleme funktioniert:

 a) RxdPointer = 0, empfangenes Zeichen prüfen, wenn (Zeichen <> STX),
    wieder mit a) anfangen.
 b) nächstes Zeichen empfangen, wenn (Zeichen <> eigene Adresse),
    wieder mit a) anfangen.
 c) nächstes Zeichen empfangen, wenn (Zeichen <> Adresse des Masters),
    wieder mit a) anfangen.
 d) nächstes Zeichen empfangen, wenn (Zeichen > MaxMsgLen),
    wieder mit a) anfangen, ansonsten RxdPointer = empfangenes Zeichen.
 f) nächstes Zeichen empfangen, decr RxDPointer.
 g) Wenn (RxdPointer == 0) und (empfangenes Zeichen <> ETX),
    weiter mit a).

( Empfang in der Interrupt-Routine, Master kann alle Slaven ansprechen,
 Slaven können nur antworten).

von (prx) A. K. (prx)


Lesenswert?

Marc V. schrieb:
>  Als erstes fehlt bei dir die Länge des Pakets und das ist unbedingt
>  notwendig, ansonsten kann es passieren (wie bei dir) dass sich der
>  Empfänger aufhängt !!

Nicht wenn das Protokoll eindeutige Trennzeichen definiert. Was hier der 
Fall zu sein scheint. Mit STX weiss jeder Slave, dass es neu losgeht, ob 
er ein ETX gesehen hat oder nicht.

Unabhängig davon wäre aber eine CRC ratsam.

von торфкопф (Gast)


Lesenswert?

Der GND des Busses muss durchgezogen werden. Ohne 120 Ohm. Die muessen 
weg. Die Richtung muss per Protokoll umgeschalten werden, nicht 
automatisch.
Miss doch mal mit einem Oszilloskop nach, welche Signale wo vorhanden 
sind.

von Bernd K. (prof7bit)


Lesenswert?

торфкопф schrieb:
> Der GND des Busses muss durchgezogen werden. Ohne 120 Ohm.

Oh, Gott, RS485-Ground-Diskussion die 432616te in  3 - 2 - 1 ...

von Gerd E. (robberknight)


Lesenswert?

Ingo S. schrieb:
> hängt sich immer der
> Teilnehmer auf, der nicht angesorochen wird.

wie äußert sich das genau?

Antwortet er danach nicht mehr auf RS485-Kommunikation?
Führt er seine Main-Loop nicht mehr aus?
Spricht ein Hardware-Watchdog an?
Geht er in einen Hardfault-IRQ (keine Ahnung ob PICs sowas haben)?
Kommt Rauch aus dem Controller?
...

Vielleicht mal mit dem Debugger, printf-Debugging, LED-Blinken, ... 
rausfinden, was das Ding tatsächlich treibt wenn es sich "aufhängt".

von Ingo S. (schicki)


Lesenswert?

hab inzwischen mit dem Ozi gemessen. Muss was mit dem Protokoll zu tun 
haben. Die Teilneher laufen weiter. Doe Uhrzeit von der RTC auf den 
Teilnehmern läuft weiter. Werde wohl ne Checksumme usw. einbauen müssen. 
Der erste Teilnehmer schaltet definitiv nicht zurück.

Danke für die Ideen.

Ingo

von Bernd K. (prof7bit)


Lesenswert?

Ich würde zusätzlich auch einen Timeout beim Empfang einbauen, wenn das 
Ende-Zeichen aus irgendeinem Grund nicht x Millisekunden nach dem Beginn 
des Paketes empfangen wurde hört er auf darauf zu warten und wartet 
stattdessen wieder auf das Startzeichen.

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


Lesenswert?

A. K. schrieb:
> Nicht wenn das Protokoll eindeutige Trennzeichen definiert. Was hier der
> Fall zu sein scheint. Mit STX weiss jeder Slave, dass es neu losgeht, ob
> er ein ETX gesehen hat oder nicht.

 Ja, viele haben so gedacht und sind immer noch beim Fehlersuchen...
 In einem solchen Fall können binäre Daten nicht gesendet werden, da
 der STX im Paket vorkommen kann.


> Unabhängig davon wäre aber eine CRC ratsam.

 CRC ist ratsam, kommt aber erst zum Schluss, LÄNGE ist viel, viel
 wichtiger, vor allem beim CAN oder RS485, wo mehrere Teilnehmer am
 Bus sind !!!

Bernd K. schrieb:
> Ich würde zusätzlich auch einen Timeout beim Empfang einbauen, wenn das
> Ende-Zeichen aus irgendeinem Grund nicht x Millisekunden nach dem Beginn
> des Paketes empfangen wurde hört er auf darauf zu warten und wartet
> stattdessen wieder auf das Startzeichen.

 Ja, das kann auch als zusätzliche Handbremse eingebaut werden.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Marc V. schrieb:
>  Ja, viele haben so gedacht und sind immer noch beim Fehlersuchen...
>  In einem solchen Fall können binäre Daten nicht gesendet werden, da
>  der STX im Paket vorkommen kann.

Korrekt. Binärdaten sind in reinen Steuerungsprotokollen aber oft 
verzichtbar. Und mit Escape-Methoden wie in asynchronem PPP oder dem 
älteren SLIP gehen auch die. Auch ohne explizit übertragene Länge.

Bei Steuerungsprotokollen haben in ASCII codierte Daten zudem den 
Vorteil, ohne speziellem Dekoder lesbar zu sein. Recht praktisch beim 
Debugging.

Ich habe freilich nicht tiefer analysiert, ob das Protokoll hier frei 
von STX/ETX im Body der Message ist.

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

A. K. schrieb:
> Korrekt. Binärdaten sind in reinen Steuerungsprotokollen aber oft
> verzichtbar. Und mit Escape-Methoden wie in asynchronem PPP oder dem
> älteren SLIP gehen auch die. Auch ohne explizit übertragene Länge.

 Auch korrekt, aber ich stehe auf dem Standpunkt:
 So schnell und einfach wie möglich, so sicher wie möglich.

> Bei Steuerungsprotokollen haben in ASCII codierte Daten zudem den
> Vorteil, ohne speziellem Dekoder lesbar zu sein. Recht praktisch beim
> Debugging.

 Ich habe dafür einen CAN/RS485-Sniffer und ein kleines (aber wirklich
 kleines) Programm fur PC, da sieht man gleich, ob alles richtig ist -
 Adressen, Befehle, Timing...

von Ingo S. (schicki)


Lesenswert?

So, Nun läuft die Anwendung. Mit einer optimierten Abfrage des USART und 
einer Checksumme hat alles funktioniert. Das Problem ist also gelöst!

Danke nochmals
Ingo

von wendelsberg (Gast)


Lesenswert?

Ingo S. schrieb:
> So, Nun läuft die Anwendung. Mit einer optimierten Abfrage des USART und
> einer Checksumme hat alles funktioniert. Das Problem ist also gelöst!

in 5:03h. Respekt!
Ich melde hiermit Zweifel an.

wendelsberg

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


Lesenswert?

Ingo S. schrieb:
> So, Nun läuft die Anwendung. Mit einer optimierten Abfrage des USART und
> einer Checksumme hat alles funktioniert. Das Problem ist also gelöst!

 Ja, es lag bestimmt am falschen Checksum.
 Langsam verliere ich die Lust zu helfen...

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.