[vz-users] DVH 4013 Modbus?

Marc Haber mh+volkszaehler-users at zugschlus.de
Sun Oct 30 17:47:04 CET 2016


On Wed, Oct 26, 2016 at 08:39:22AM +0200, Marc Haber wrote:
> On Wed, Oct 26, 2016 at 08:30:16AM +0200, Daniel Lauckner wrote:
> > am Montag, 24. Oktober 2016 um 19:05 hast du geschrieben:
> > > hat hier zufällig jemand Erfahrungen mit dem DZG DVH 4013 als
> > > Modbus-Zähler?
> > 
> > Scheinbar keiner. Aber Hinweise zu Mod-Bus gibts in der ML ein paar.
> 
> Jupp, die hab ich auch gelesen. Ich hab den 4013 dann mal bestellt und
> tauche ggf. mit konkreteren Fragen auf. Vielleicht funktioniert's ja
> auf Anhieb. Nicht, das ich das glaube, aber ein wenig Optimismus muss
> man sich ja lassen.

So, der Zähler ist jetzt da und scheint in meinem Laborsetup auch zu
funktionieren. Nur - hier war mein leichter Pessimismus dann ja doch
angebracht - funktioniert die Abfrage per Modbus nicht: Connection
timed out.

Die Hardware angeschlossen habe ich wie in 
http://www.modbus.org/docs/Modbus_over_serial_line_V1.pdf
auf Seite 22 Abschnitt 3.2.2 angeschlossen. Die +5V und Masse habe ich
aus einem freien USB-Port des Computers gezogen; als RS485 Interface
dient der MENGS® USB-485 USB zu RS485 Konverter 
https://www.amazon.de/gp/product/B01EFMBBEM/ref=oh_aui_detailpage_o05_s01?ie=UTF8&psc=1

Schwierigkeit hierbei ist, dass auf dem Zähler die zwei RS485-Adern
mit B und A beschriftet sind; auf dem Adapter ist B mit D- und A mit
D+ ergänzt. Dummerweise ist im Schaltplan nur von D0 und D1 die Rede.
Wie herum gehört es? Kann ich hier gefahrlos einfach tauschen, oder
laufe ich damit Gefahr, Hardware zu grillen?

Was mich noch verwirrt, wo ich am Stromzähler die Masse der
RS485-Verbindung anschließen muss. Ich hoffe, gar nicht, denn an die
N-Klemme meines 230V-Stromkreises möchte ich das wirklich ungerne
anschließen.

Linux sieht den Adapter als:
1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
und lädt das Modul ch341. Damit erscheint der Adapter als /dev/ttyUSB0

Für die Softwareseite habe ich mich an
http://wiki.volkszaehler.org/hardware/channels/meters/power/edl-ehz/sdm630_modbus
orientiert: libmodbus 3.1.4 von http://libmodbus.org/download/
heruntergeladen, ./configure --enable-static; make. mbrtu von
https://github.com/gitaeuber/mbrtu heruntergeladen, libmodbus.a
hinkopiert, die zwei Pfade im LFLAGS und im mbrtu-Target an die
Realität angepasst und make.

Die Modbus-Seite des Stromzählers ist in
http://www.dzg.de/fileadmin/downloads/en/Manual-DVH4013.pdf
beschrieben. Hier (und auch am Wiki-Artikel zum SDM630) irritiert
mich, dass ich an einem RS485-Bus den Slave adressieren muss, aber
beide Artikel sich über die Adresse des Stromzählers ausschweigen. Das
log_powermeter.sh nimmt immerhin die Adresse des SDM630
stillschweigend als 65 an.

Ich habe nun versucht, aus meinem DVH 4013 das Register 0x0004
(Spannung L1) auszulesen:
./mbrtu -d/dev/ttyUSB0 -a65 -fi -tf32_dcba -n1 -r0x0004
und bekomme nur "Connection timed out". Bei Adressen ab 249
weint das mbrtu etwas anderes:
mbrtu: modbus-rtu.c:110: _modbus_rtu_build_request_basis: Assertion `ctx->slave != -1' failed.

Ein strace des mbrtu-Prozesses zeigt, dass einfach keine Antwort
zurückkommt:
sudo strace -s 2000 -r ./mbrtu -d/dev/ttyUSB0 -a247 -fi -tf32_dcba -n1 -r0x0004
(...)
     0.000224 open("/dev/ttyUSB0", O_RDWR|O_EXCL|O_NOCTTY|O_NONBLOCK|O_CLOEXEC) = 3
     0.137597 ioctl(3, TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
     0.000241 ioctl(3, TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
     0.000120 ioctl(3, SNDCTL_TMR_START or TCSETS, {B9600 -opost -isig -icanon -echo ...}) = 0
     0.000471 ioctl(3, TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
     0.000103 write(3, "\367\4\0\4\0\1d\235", 8) = 8
     0.000120 select(4, [3], NULL, NULL, {0, 500000}) = 0 (Timeout)
     0.500857 write(2, "ADDR=247 REG=4 ERROR: Connection timed out\n", 43ADDR=247 REG=4 ERROR: Connection timed out) = 43
     0.000112 ioctl(3, TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
     0.000071 ioctl(3, SNDCTL_TMR_START or TCSETS, {B9600 -opost -isig -icanon -echo ...}) = 0
     0.000856 ioctl(3, TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
     0.000211 close(3)                  = 0
     0.005591 exit_group(1)             = ?
     0.000166 +++ exited with 1 +++

Kann mir jemand sagen, was ich hier falsch mache?

Müsste ich mit einem zweiten RS485-USB-Adapter, einem zweiten Rechner
und zwei Terminalprogrammen (ohne/mit Adressierung?) über RS485
kommunizieren können? Ich hab aktuell den Verdacht dass mein RS485
einfach nicht korrekt funktioniert.

Ich bin für Tipps jederzeit dankbar!

Grüße
Marc

-- 
-----------------------------------------------------------------------------
Marc Haber         | "I don't trust Computers. They | Mailadresse im Header
Leimen, Germany    |  lose things."    Winona Ryder | Fon: *49 6224 1600402
Nordisch by Nature |  How to make an American Quilt | Fax: *49 6224 1600421


More information about the volkszaehler-users mailing list