« Elektrotechnik & Smarthome  |

Hilfe bei Modbus Anbindung von SDM72D-M Stromzähler

Teilen: facebook    whatsapp    email
  •  kljsfdkj
4.7. - 6.7.2024
9 Antworten | 4 Autoren 9
9
Hallo liebe Community!
Ich will, um den Verbrauch von meinem E-Auto entsprechend tracken zu können, einen Stromzähler von Eastron SDM72D-M per Modbus auslesen. Dazu bin ich initial nach einer Anleitung w w w . kraweuschuasta . at / modbus-per-raspberrypi . html und nach diversen Einträgen diverser Foren vorgegangen (u.a. auch dieses).
Zu meinem Setup:
- RaspberryPI 2 Model B V1.1 von 2014 mit Raspbian GNU/Linus 7 (wheezy)
- JOY-IT Schnittstellenwandler, TTL-RS485 (94-811110 bei pollin.de)
- Eastron SDM72D-M
Die Verbindung zwischen dem SDM72D-M und dem Schnittstellenwandler wird mit einem geschirmten Kabel hergestellt, wobei die Masse des Schnittstellenwandlers mit dem Schirm und mit dem G-Anschluss am SDM72D-M verbunden ist.
Zur Kommunikation nutze ich (nach der Anleitung) das modpoll-Tool per Konsolenaufruf. Problem ist, dass ich egal was ich mache, immer ein Timeout vom modpoll zurückbekomme.
Die Einstellungen habe ich schon mehrfach geprüft (am SDM72D-M) und sind wie folgt:
- 9600 Baud
- kein Parity-Bit
- 1 Stopbit
- Adresse 1

Mit folgendem Kommando teste ich:
- modpoll -1 -b 9600 -p none -m rtu -c 1 -a 1 -r 343 -t 4:float /dev/ttyUSB0

Ich hänge parallel mit dem Oszi auf beiden Leitungen gegen den GND des Raspberry und habe somit verifiziert dass zumindest vom Raspberry was geschickt wird.
Probiert habe ich schon mehrfach die beiden Leitungen zu tauschen, ohne Abschlusswiderstand, mit Abschlusswiderstand (120 Ohm, 333 Ohm, 500 Ohm, 1kOhm), verschiedene Baudraten von 4800 bis 19200 Baud, verschiedene Lese-Adressen, verschiedene Adressen am SDM, aber bislang kein Erfolg.
Ich bin jetzt bei Modbus nicht so fit, daher kann ich nicht sagen wie es aussehen soll und im Internet find ich nix gscheites.

Vielleicht hat schon jemand mit dem Teil Erfahrung und kennt eventuelle Stolpersteine, oder hat ansonsten irgendeine Idee was man noch probieren könnte.
Vielen Dank schonmal, 
Christoph

_aktuell/20240704395891.png

_aktuell/20240704827817.png

_aktuell/20240704126166.png

  •  gdfde
  •   Gold-Award
4.7.2024  (#1)
Ich glaub, du mußt den SDM nach Konfigänderungen nochmal neu starten/stromlos machen, damit die Änderungen aktiv werden.

1
  •  Benji
  •   Gold-Award
5.7.2024  (#2)
versuch mal ob "-0" was bringt (First reference is 0 (PDU addressing) instead 1)

bist du sicher dass der Wert "float" ist?

lass mal das "-1" weg (ich hatte schon den Fall dass die erste Abfrage ins Leere ging, ab der zweiten hats dann funktioniert)

häng ein "-v" (verbose) an dann siehst du was gesendet wird (und auch ggf. eine Antwort)

ist dein Oszi-Bild "vollständig"? Mir kommt es zu kurz vor, selbst bei einer einfachen Abfrage sollten 8 Byte gesendet werden:

-- Polling slave 2... Ctrl-C to stop)
[02][03][00][C8][00][02][45][C6]
<02><03><04><00><00><56><2D><36><8E>
[200]:  22061



1
  •  Benji
  •   Gold-Award
5.7.2024  (#3)

Ich bin nicht sicher ob ich deine Oszi-Bilder richtig interpretiere: Welche Pegel-Differenz hast du zwischen den A/B Leitungen? "nur" 2 Volt? Das wäre zu wenig, soweit ich weiß muss der Pegel midestens +/- 1.5Volt sein, also 3 Volt Differenz


1


  •  kljsfdkj
5.7.2024  (#4)
Danke schonmal für die Antworten!!
Das mit dem -0 habe ich zuvor eh auch schon probiert gehabt, ohne Erfolg leider.
Ich habe jetzt nochmal getestet ob es etwas ändert wenn man nicht nur einmal eine Übertragung sendet (-1 weggelassen), leider auch ohne Erfolg.
Die Übertragung ist zumindest im oberen Bild komplett. Mehr schickt der Raspberry nicht. Das mit dem -v kennt mein modpoll nicht. Welche Version hast du denn da? Ich bin bei modpoll v3.11.

_aktuell/20240705431875.png
Zum Pegel der A/B Leitungen: Dieser ist halbwegs abhängig vom verwendeten Abschlusswiderstand: ohne Abschlusswiderstand habe ich +/- 5V, das Bild vom Originaleintrag wurde mit 333 Ohm gemacht mit ca. +0/- 2V. Das ist mitunter doch zu wenig. Ohne Abschlusswiderstand sind die Flanken auch schön und die Differenzspannung passt, also nehm ich mal das 👍
Zur Belegung nochmal:
Auf A ist der Ruhepegel jetzt 5V, auf B 0V. Soweit ich das gelesen habe müsste das so stimmen, oder?

_aktuell/20240705829574.jpg
_aktuell/20240705260373.png

Das Oszi hat eine Dekodierfunktion, allerdings nur für RS232. Aktuell scheint es so als würde es die 8 Bytes erkennen, wenn man allerdings am Oszi für die Dekodierung eine Baudrate von 19200 einstellt. Aber ich denk das funktioniert in dem Fall nicht richtig, weil es die Stop-Bits scheinbar nicht erkennt
Laut dem Datenblatt des Zählers sollte der Parameter 30343 ein Float 4 Byte Wert sein:
_aktuell/20240705545635.png
stromzähler . eu / media / 5f / b6 / aa / 1696582672 / sdm72dm-v2 . pdf
Wobei mir nicht klar ist warum man die ersten beiden Ziffern weglassen kann (zumindest so in der Anleitung von kraweuschuasta at
Liefert Modbus auch keine Fehlertelegramme? Wenn quasi die abgeholte Datenmenge nicht stimmt, würde ich mir Zumindest ein Error-Telegramm erwarten...


1
  •  Benji
  •   Gold-Award
5.7.2024  (#5)

zitat..
kljsfdkj schrieb: Das mit dem -v kennt mein modpoll nicht. Welche Version hast du denn da? Ich bin bei modpoll v3.11.

sorry da hab ich mich verschaut: ich verwende nicht modpoll, sondern mbpoll (allerdings auch nicht auf einem Raspi, sondern auf einer "großen" Linux-Kiste mit Debian.

https://github.com/epsilonrt/mbpoll

zitat..
kljsfdkj schrieb: Wobei mir nicht klar ist warum man die ersten beiden Ziffern weglassen kann (zumindest so in der Anleitung von kraweuschuasta

Was meinst du mit "die ersten beiden Ziffern"?


zitat..
kljsfdkj schrieb: Liefert Modbus auch keine Fehlertelegramme? Wenn quasi die abgeholte Datenmenge nicht stimmt, würde ich mir Zumindest ein Error-Telegramm erwarten...

doch, modbus kennt schon Fehler, aber nur wenn die Abfrage auch ankommt / verstanden wird




1
  •  gdfde
  •   Gold-Award
5.7.2024  (#6)

zitat..
kljsfdkj schrieb: Zum Pegel der A/B Leitungen: Dieser ist halbwegs abhängig vom verwendeten Abschlusswiderstand:

Das ist bei so Miniinstallationen meiner Erfahrung nach vernachlässigbar, kraweuschuasta hat gar keinen Abschlußwiderstand in seiner Teststellung verwendet.

Baudraten funktionieren sowohl 9600 wie auch 19200...muß halt auf beiden Seiten gleich konfiguriert sein.

Ich bin damals über den Adapter/Wandler gestolpert und hab zig Stunden investiert.
Da gibts nämlich offensichtlich durchaus Unterschiede...

Ich hab dann nochmal die paar Euro investiert und genau das Modell gekauft, das in der Anleitung oder dem Beispiel verwendet wurde.

Das spart auf jedenfall Zeit und vor allem Nerven emoji


1
  • ▾ Anzeige
    Energiesparhaus.at ist Teilnehmer des Amazon-Partnerprogramms, das zur Bereitstellung eines Mediums für Webseiten konzipiert wurde, mittels dessen durch die Platzierung von Partner-Links zu Amazon.de Entgelte verdient werden können.
Hallo kljsfdkj,
hier gibt es dazu Erfahrungen und Preise: Hilfe bei Modbus Anbindung von SDM72D-M Stromzähler

  •  kljsfdkj
5.7.2024  (#7)
Nach gefühlt tausendfachen Überprüfungen und Tests hab ich mir gedacht, ich probiers mal mit Windows: Programm Modbus Poll installiert, Parameter eingestellt: ZACK geht

_aktuell/2024070521402.png
_aktuell/20240705627755.png
_aktuell/20240705236984.png
Das führt mal zu wertvollen Erkenntnissen:
- USB-Serial Wandler geht
- Stromzähler geht, ist ansprechbar und liefert per Modbus auch das was am Display steht
- Pinbelegung passt
- Kabel passt
- Abschlusswiderstand stört nicht wenn er fehlt

Wenn man die Telegramme vergleicht wunderts mich auch nicht warums mit dem Raspberry nicht geht. Jedoch bleibt die Frage warum!
Du hattest recht @Benji, es sind 8 Byte die übertragen werden:

_aktuell/20240705537651.png
mit dem Kommando modpoll -0 -b 9600 -p none -s 2 -m rtu -a 127 -c 2 -r 384 -t 3:float /dev/ttyUSB0 würde ich mir das gleiche Signal erwarten, jedoch leider nein

_aktuell/20240705767308.png
Erstens sinds zu wenig bytes, zweitens sieht nur das erste Byte gleich aus, der Rest absolut nicht. Ideen, Vorschläge was es damit auf sich haben könnte? Vom Timing her müsste es passen, sonst würden die Flanken des Ersten bytes nicht fluchten.

Btw: Ich hab zwischenzeitlich die Stop bits und die Adresse am Stromzähler geändert. Man wird ja direkt abergläubisch ;)

@Benji: Wie sieht denn dein mbpoll Aufruf auf? die Programme scheinen sich ziemlich zu ähneln...


1
  •  Benji
  •   Gold-Award
5.7.2024  (#8)
Gratuliere, dann bist du wirklich mal einen großen Schritt weiter!

Einer meinr Aufrufe lautet:

mbpoll -m rtu -b 19200 -d 8 -s 1 -P none /dev/ttyUSB0 -a 2 -0 -r 200 -c 1 -t 4:int -B -v

# Opening /dev/ttyUSB0 at 19200 bauds (N, 8, 1)
# Protocol configuration: Modbus RTU
# Slave configuration...: address = [2]
#                         start reference = 200, count = 1
# Communication.........: /dev/ttyUSB0,      19200-8N1 
#                         t/o 1.00 s, poll rate 1000 ms
# Data type.............: 32-bit integer (big endian), output (holding) register table

-- Polling slave 2... Ctrl-C to stop)
[02][03][00][C8][00][02][45][C6]
<02><03><04><00><00><56><2D>< 36><8E>
[200]:  22061

(in meinem Fall frage ich meine Heizung ab, und Register 200 ist die Raumtemperatur als int, multipliziert mit 1000)

Falls du dann weiter kommst: man kann das natürlich so wie kraweuschuasta per bash-Skript machen, ich mach das zB in Perl, mit https://metacpan.org/pod/Device::Modbus::RTU::Client und schreib die Daten dann in eine PostgreSQL Datenbank

Ich gehe davon aus dass es ähnlich komfortable Bibliotheken auch zB für Python (igitt!) usw. gibt, ich bin halt old-school mit Perl unterwegs

1
  •  pred
  •   Bronze-Award
6.7.2024  (#9)
Ich hab zwar nur die SDM630 im Einsatz, verwend dafür den ModBus Measurement Daemon (https://github.com/volkszaehler/mbmd) der auch den SDM72 laut Liste unterstützt.

Evtl. damit probieren, ob hier die "scan" Option etwas zurückliefert?

Läuft zuverlässig seit einigen Jahren und schickt die Daten an einen MQTT Broker.


1


Beitrag schreiben oder Werbung ausblenden?
Einloggen

 Kostenlos registrieren [Mehr Infos]

Nächstes Thema: Vorsicherung Unterverteiler