So, der Zähler (DZG DVH4013) 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!