Forum: Mikrocontroller und Digitale Elektronik RS485 (Modubus RTU) Bus zur Ethernet (Modbus TCP)


von Martin S. (lebowski)


Lesenswert?

Hallo,

ich habe einen RS485 Bus, an dem einige Zähler angeschlossen sind. Ich 
würde gerne über das LAN einige Werte auslesen. Es gibt ja z.B. diese 
Module hier: https://www.waveshare.com/rs485-to-eth-b.htm Da benötige 
ich aber für jedes Gerät eins dieser Module.
Ist es möglich, mit einem Gerät den ganzen Bus über das LAN 
anzusprechen?

von Rahul D. (rahul)


Lesenswert?

Martin S. schrieb:
> Ist es möglich, mit einem Gerät den ganzen Bus über das LAN
> anzusprechen?

ModBUS ist ein Bus.
Das Problem wird die Adressierung der einzelnen Zähler sein:
Wenn die alle dieselbe Modbus-Adresse haben, brauchst du für jeden einen 
eigenen Umsetzer, der dann eine eigene IP-Adresse bekommt.

von Martin S. (lebowski)


Lesenswert?

Rahul D. schrieb:
> Wenn die alle dieselbe Modbus-Adresse haben, brauchst du für jeden einen
> eigenen Umsetzer, der dann eine eigene IP-Adresse bekommt.

Die Adresse ist doch eindeutig im Bus?

Oder verstehe ich etwas falsch?

von Rahul D. (rahul)


Lesenswert?

Martin S. schrieb:
> Die Adresse ist doch eindeutig im Bus?
Sollte so sein.

> Oder verstehe ich etwas falsch?
Oder ich.

Kannst du die Dinger per serieller Schnittstelle ansprechen und jeden 
adressieren?
Ist das System soweit vorgegeben und schon in betrieb?

von Frank K. (fchk)


Lesenswert?

Martin S. schrieb:
> Hallo,
>
> ich habe einen RS485 Bus, an dem einige Zähler angeschlossen sind. Ich
> würde gerne über das LAN einige Werte auslesen. Es gibt ja z.B. diese
> Module hier: https://www.waveshare.com/rs485-to-eth-b.htm Da benötige
> ich aber für jedes Gerät eins dieser Module.

Nein. Die Zähler müssen eineindeutige Modbus-Adressen haben. Das kann 
und muss man an den Zählern selber einstellen - werksseitig sind die 
alle meist auf 1 voreingestellt. Dann reicht eine Bridge pro Bus.

fchk

von Martin S. (lebowski)


Lesenswert?

Hallo,

nochmal von vorne:

Ich habe insgesamt 4 Zähler, alles Eastron sdm72dm-v2 und ein esp32 am 
Lesekopf des Smartmeter der auch per Modbus RTU sendet und ein weiterer 
esp32, der Daten von einzelnen Teilnehmern holt.
Alle hängen im selben Bus und haben unterschiedliche Adressen (1 bis 6).

Ich möchte nun von einem rpi im Netzwerk (mit ioBroker) von den 
einzelnen Zählern Werte holen. Der rpi hängt im Lan.

Ich brauche jetzt eine Gateway/Bridge. Gerne mit Link.

Danke

von Martin S. (strubi)


Lesenswert?

Mit libmodbus kannst du dir eine solche Bridge doch direkt auf dem RPi 
stricken.
Allerdings bin ich mir nicht sicher, ob neuere RPi einen UART haben, der 
von Haus aus die modbus-timings (DTR/RTS-Ansteuerung also nicht per 
GPIO) per Hardware schafft, per Software brauchte es haessliche und eher 
aufwendige Klimmzuege, sonst gab es unter gewissen Szenarien alle paar 
Tage sporadische Fehler...

von Rahul D. (rahul)


Lesenswert?

Martin S. schrieb:
> Allerdings bin ich mir nicht sicher, ob neuere RPi einen UART haben, der
> von Haus aus die modbus-timings (DTR/RTS-Ansteuerung also nicht per
> GPIO) per Hardware schafft, per Software brauchte es haessliche und eher
> aufwendige Klimmzuege, sonst gab es unter gewissen Szenarien alle paar
> Tage sporadische Fehler...

Ansonsten gibt es von FTDI (und vermutlich auch von anderen) 
USB-RS485-Konverter (mit Modbus-Modus).

Martin S. schrieb:
> Alle hängen im selben Bus und haben unterschiedliche Adressen (1 bis 6).

Die Info fehlte. Es gibt auch "doofe" Geräte, die 1:1 per Modbus 
angesprochen werden, weil man die Adresse nicht einstellen kann (immer 
nur eins pro Bus möglich). Für die bräuchte man dann jeweils einen 
Konverter.

von Bauform B. (bauformb)


Lesenswert?

Martin S. schrieb:
> Allerdings bin ich mir nicht sicher, ob neuere RPi einen UART haben, der
> von Haus aus die modbus-timings (DTR/RTS-Ansteuerung also nicht per
> GPIO) per Hardware schafft

Rahul D. schrieb:
> Ansonsten gibt es von FTDI (und vermutlich auch von anderen)
> USB-RS485-Konverter (mit Modbus-Modus).

Ein Modbus-Slave ohne Hardware-Unterstützung macht keinen Spaß, aber der 
RPi als Modbus-Master muss doch nur RTS (= Driver Enable) passend 
einschalten? Ja, ganz trivial ist das auch nicht, aber doch kein 
spezielles Modbus-Problem?

Mit so einem Konverter ist es noch einfacher, der weiß doch dank USB 
wann er seinen Sender einschalten muss. Jedenfalls, solange man weniger 
als 63 Byte am Stück sendet.

von Rahul D. (rahul)


Lesenswert?

Bauform B. schrieb:
> Ein Modbus-Slave ohne Hardware-Unterstützung macht keinen Spaß, aber der
> RPi als Modbus-Master muss doch nur RTS (= Driver Enable) passend
> einschalten? Ja, ganz trivial ist das auch nicht, aber doch kein
> spezielles Modbus-Problem?

Hä?
DerDatenversand eines Modbus-Slave ist doch Pippifax: Wenn der seine 
Daten gesendet hat, lauscht er wieder auf dem Bus.
Und bevor er irgendwas sendet, muss er erkennen, dass die Anfrage an ihn 
gerichtet ist (inkl. Broadcast).
Der muss nur schnell genug antworten, weil es sonst zu einem Timeout 
kommt.

Beim Master ist es auch nicht anders. Den interessiert eigentlich alles 
auf dem Bus, solange er es nicht selber gesendet hat.

Die Umschaltung wird bei manchen Konvertern automatisch ohne 
RTS-Erkennung gemacht (z.B. ICPCOM).
Maxim hat(te) auch RS485-Transceiver mit automatischer Umschaltung.

von Frank K. (fchk)


Angehängte Dateien:

Lesenswert?

Martin S. schrieb:

> Ich habe insgesamt 4 Zähler, alles Eastron sdm72dm-v2 und ein esp32 am
> Lesekopf des Smartmeter der auch per Modbus RTU sendet und ein weiterer
> esp32, der Daten von einzelnen Teilnehmern holt.
> Alle hängen im selben Bus und haben unterschiedliche Adressen (1 bis 6).

Warum nicht gleich so?

> Ich möchte nun von einem rpi im Netzwerk (mit ioBroker) von den
> einzelnen Zählern Werte holen. Der rpi hängt im Lan.

Mache ich ohne Gateway. Ich habe mir auf meinem Pi 4 UART4 mit RTS/CTS 
hinkonfiguriert und einen MAX3483 angeklemmt. Den Rest macht libmodbus, 
einschließlich der Ansteuerung des RTS-Signals für DE/!RE am 
Transceiver. Dafür brauchts nur ein
modbus_rtu_set_rts(conn->ctx, MODBUS_RTU_RTS_DOWN);

Am Bus hängt ein SDM630V3 auf Adresse 1 sowie ein SDM230V2 auf Adresse 
2.

Funktioniert einwandfrei.

fchk

von Martin S. (strubi)


Lesenswert?

Bauform B. schrieb:
> Ein Modbus-Slave ohne Hardware-Unterstützung macht keinen Spaß, aber der
> RPi als Modbus-Master muss doch nur RTS (= Driver Enable) passend
> einschalten? Ja, ganz trivial ist das auch nicht, aber doch kein
> spezielles Modbus-Problem?

Nein, es ist ein Linux-Echtzeitproblem. Wenn explizit ein GPIO 
angesteuert werden muss, geht der Spass los. Dasselbe trifft auch fuer 
die FT232-Adapter zu.
Nicht alle Geraete kommen mit so jitterigen Timings klar. Ist auch schon 
vorgekommen, dass sich der ganze Bus aufgehangen hat, und der 
Sensorenhersteller verwies auf die strikten Timings.

Siehe auch hier:
https://github.com/stephane/libmodbus/issues/606

Deswegen wurde die Industrievariante eines solchen Gateways auch mit 
einer CPU eindesignt, deren UART-Kern die harten Timings beherrscht. 
Wird vor allem dann relevant, wenn man auf hoehere Baudraten geht.

von Christian K. (christian_rx7) Benutzerseite


Lesenswert?

Wenn deine Geräte am Modbus RTU sauber adresiert sind. Dann klappt das 
mit dem von dir vorgeschlagenen Gateway. Ich verwende die vermutlich 
baugleichen ZLAN 5143D 
https://www.aliexpress.com/item/1005006310914219.html . Die laufen seit 
über einem Jahr ohne Neustart und Probleme. Bei denen musst du nur in 
der Konfiguration aufpassen, dass du sie auf Modbus stellst und nicht 
als RS485-Konverter verwendest, dann erledigen sie auch die 
Protokollkonvertierung von RTU auf TCP. Großer Vorteil der Konverter, im 
Vergleich zur direkt am RPi angestrickten Methode, ist dass du sie 
einfach per PC debuggen kannst, da sie mehrerer parallele TCP 
Verbindungen unterstützen.

von Hmmm (hmmm)


Lesenswert?

Martin S. schrieb:
> Nein, es ist ein Linux-Echtzeitproblem. Wenn explizit ein GPIO
> angesteuert werden muss, geht der Spass los.

Das Hauptproblem dabei ist gar nicht mal die Latenz des 
Multitasking-Betriebssystems, sondern dass man durch den FIFO im UART 
und sonstiges Buffering nicht weiss, wann das letzte Byte tatsächlich 
gesendet wurde.

Unter Windows habe ich seinerzeit den Empfänger eingeschaltet gelassen 
und das eigene Echo mitgelesen, das funktionierte recht gut.

Martin S. schrieb:
> Dasselbe trifft auch fuer die FT232-Adapter zu.

Der FT232 entschärft das o.g. Problem, indem er sich selbst um die 
Umschaltung kümmert.

Für einen standardkonformen Modbus-Master reicht das aus, im 
Slave-Betrieb könnte ein ungeduldiger Master Probleme bereiten.

von Heinz R. (heijz)


Lesenswert?

schau mal hier, da hast es quasi fix und fertig:

https://espeasy.readthedocs.io/en/latest/Plugin/P078.html

Es braucht dann einen ESPxx, einen RS485 Umsetzer, diese 
ESPEasy-Software

Du kannst dann direkt in ESPEasy die gewünschten Werte per Webinterface 
auswählen
iDe Abfrage von IOBroker ist dann sehr einfach, z.B. auch per MQTT

Schau Dir auch das mal an:

https://www.smarthome-tricks.de/esp8266/espeasy-datenaustausch-mit-iobroker/

von Harald K. (kirnbichler)


Lesenswert?

Martin S. schrieb:
> Wenn explizit ein GPIO angesteuert werden muss, geht der Spass los.

Ja, das Timing von Modbus/RTU ist knapp (3.5 Bytezeiten als Minimalpause 
zwischen zwei Telegrammen. Wenn man nicht mit Waffengewalt dazu 
gezwungen wird, ungeeignete UARTs zur Ansteuerung zu verwenden, lässt 
man das besser sein.

> Dasselbe trifft auch fuer die FT232-Adapter zu.

Das ist Humbug. Der FT232 enthält Hardwareunterstützung für die 
Sender-/Empfänger-Umschaltung eines RS485-Treibers und ist vollkommen 
ausreichend, um als Master-, aber auch als Slave-Device mit Modbus/RTU 
verwendet zu werden

Hmmm schrieb:
> Für einen standardkonformen Modbus-Master reicht das aus, im
> Slave-Betrieb könnte ein ungeduldiger Master Probleme bereiten.

Wieso? Der Slave gibt vor, wie schnell er antwortet, da darf ein Master 
nicht "ungeduldig" werden. Sieh Dir mal an, was in 
https://www.modbus.org/docs/Modbus_over_serial_line_V1_02.pdf zum Thema 
Timeout steht (z.B. auf S.10/44).

von Martin S. (strubi)


Lesenswert?

Harald K. schrieb:
>
> Das ist Humbug. Der FT232 enthält Hardwareunterstützung für die
> Sender-/Empfänger-Umschaltung eines RS485-Treibers und ist /vollkommen/
> ausreichend, um als Master-, aber auch als Slave-Device mit Modbus/RTU
> verwendet zu werden
>

Das ist alles schoen und gut, bringt nur nix, wenn ein USB-Bus 
dazwischenhaengt. Zuverlaessigen Slave-Betrieb bekommt man damit mit 
einem Standard-Linux sowieso nicht hin, und knifflige Timings in 
dichten Netzen werden dann problematisch, wenn mehrere Master und 
anstaendig viele Knoten (hier 32) vorliegen. Been there...

von Hmmm (hmmm)


Lesenswert?

Harald K. schrieb:
> Wieso? Der Slave gibt vor, wie schnell er antwortet, da darf ein Master
> nicht "ungeduldig" werden.

Theoretisch ja. In der Praxis lässt "long enough for any slave to 
process the request" Platz für Probleme, wenn man z.B. einen bestehenden 
Slave durch ein eigenes Gerät ersetzt.

Aber abgesehen von solchen Murks-Szenarien sehe ich keinen Fall, wo ein 
FT232-Adapter mit Hardware-TX/RX-Umschaltung Probleme bereiten sollte. 
Als Master sowieso nicht.

von Harald K. (kirnbichler)


Lesenswert?

Martin S. schrieb:
> Zuverlaessigen Slave-Betrieb bekommt man damit mit
> einem Standard-Linux sowieso nicht hin,

Aha. Wer ist "man", und warum sollte das so sein? Hast Du das irgendwo 
gelesen?

von Hmmm (hmmm)


Lesenswert?

Harald K. schrieb:
> Wer ist "man"

Offenbar jemand, der auf wilde Ideen kommt, die eher nach CAN schreien:

Martin S. schrieb:
> knifflige Timings

Martin S. schrieb:
> mehrere Master

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.