Forum: Haus & Smart Home RS232-Problem beim Auslesen eines WMZ


von Alexey O. (Firma: AO) (aloz77)


Lesenswert?

Ich will unsere Wärmemengenzähler (Typ: Hydrometer Sharky 773) über 
RS232 unter Linux auslesen. Der Zähler hat eine RS232-Schnittstelle mit 
M-Bus-Protokoll drauf (Doku: 
http://www.wms.nl/Downloads/Hydrometer%20Sharky773%20%28E%29.pdf).

Das RS232-Kabel war bislang an eine Box angeschlossen, die früher die 
Daten des Zählers an ein Pilotprojekt einer Firma per Internet ständig 
gefunkt hat. Ich kann mit der Box zwar per HTTP kommunizieren. Die 
wichtigsten Infos (z.B. den Zählerstand) gibt sie aber nicht her. 
Deswegen will ich den Zähler nun selbst auslesen.

Ich habe erstmal erfolglos mit libmbus-Tools 
(http://www.rscada.se/libmbus/) versucht, den Zähler anzusprechen. Dann 
habe ich angefangen selbst zu basteln und Sachen auszuprobieren. Mein 
Hardwareaufbau: ein altes Notebook mit Ubuntu drauf plus ein 
FTDI-kompatibler USB-RS232-Adapter. Ich habe das Notebook über RS232 
erstmal an die Box (über ein Null-Modem-Kabel) angeschlossen und 
geschaut, was diese an den Zähler rausschickt, um diesen abzufragen. Die 
gefundene Bytereihenfolge (10 7B FE 79 16), die die Box alle paar 
Sekunden rausschickt, soll auch laut jeder M-Bus-Doku zum Abrufen der 
Daten geeignet sein. Die Verbindung mit der Box habe ich mit 2400 Baud 
8E1 ohne Flow Control eingestellt (so wie bei M-Bus-Protokoll auch 
nötig/üblich).

Wenn ich mich jetzt von meinem Notebook aus über RS232 mit den gleichen 
Port-Einstellungen (B2400 8E1 etc.) die gleiche Byte-Reihe an den WMZ 
schicke, schweigt dieser, anstatt mir irgendeine Antwort zu schicken. 
Zumindest es kommt beim Notebook nichts an. Das war auch das Problem mit 
libmbus: der Zähler schweigt, egal was man dahin schickt.

Jetzt frage ich euch, wie das sein kann, dass der Zähler auf die Anfrage 
der Box offensichtlich die Infos rausrückt und auf meine (identische) 
Anfrage nicht. Worin könnte sich der Unterschied im RS232 noch 
verstecken? Oder warum kann ich die Antwort des Zählers evtl. nicht 
sehen?

(Der USB-RS232-Adapter funktioniert grundsätzlich. Unter Windows kann 
ich mit der Software des WMZ-Herstellers über den selben Adapter auf den 
Zähler zugreifen und Sachen lesen/ändern. Also unter Windows läuft er 
einwandfrei. Unter Linux auch keinerlei hinweise auf Fehlfunktion. Der 
Loopback-Test (Pins 2 und 3 kurzschalten) läuft richtig. Die Anfragen 
der Box kann ich damit ebenfalls sehen.)

von Uwe H. (uwehermann) Benutzerseite


Lesenswert?

Hast du einen Logic Analyzer um den UART-Traffic mal mitzuschneiden?

Wie öffnest du den seriellen Port unter Linux, welche Software? 
Terminalprogramm (welches?) oder eigener C-/Python-Code (wie sieht der 
aus)? Bist du sicher, dass du alle relevanten termio settings gemacht 
hast? Sendest du ein abschließendes \r oder \n oder \r\n, und wenn ja, 
erwartet das Gerät diese Zeichen auch oder nicht?

Uwe.

von Alexey O. (Firma: AO) (aloz77)


Angehängte Dateien:

Lesenswert?

Ich exprimentiere mit dem Com-Port jetzt mit meinem eigenen kleinen 
Tool. Vollständiger Code in der Anlage. Öffnen mach ich so:
1
    memset(&newtio, 0, sizeof(newtio));
2
    newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD | PARENB; // | CRTSCTS; 
3
    newtio.c_iflag = IGNPAR;
4
    newtio.c_lflag = 0;
5
    newtio.c_cc[VTIME]    = 20;
6
    newtio.c_cc[VMIN]     = 0;
7
    tcflush(fd, TCIFLUSH);
8
    tcsetattr(fd,TCSANOW,&newtio)

Bei CRTSCTS bin ich unsicher, aber schon beides probiert. Ich habe auch 
schon mit den Steuerleitungen RTS und DTR versucht. Die anderen Settings 
ergeben sich so aus der Spezifikation in diesem PDF: 
http://www.wms.nl/Downloads/Hydrometer%20Sharky773%20%28E%29.pdf.

Der Anfragecode, den ich rausschicke, stimmt sehr wahrscheinlich auch. 
Er entspricht der Spezifikation und die Box sendet auch den gleichen 
Code.

Aber irgendwas stimmt ja nicht, sonst würde das ja funktionieren. 
Irgendwas macht die Box und die Windows-Software anders als ich, aber 
ich komme nicht dahinter. Ich habe leider auch keine Hardware, um den 
Traffic genauer zu analysieren.

von Alexey O. (Firma: AO) (aloz77)


Lesenswert?

Korrektur. Die Protokollbeschreibung des Zählers ist in dieser PDF-Datei 
zu finden: 
http://www.wms.nl/Downloads/Sharky773%20M-Bus%20telegram%20v29%20%28E%29.pdf

von Uwe H. (uwehermann) Benutzerseite


Lesenswert?

Die Initialisierung ist evtl. zu kurz, da gibts noch einen Haufen 
weitere Flags die du evtl. brauchst.

Siehe z.B.:
http://en.wikibooks.org/wiki/Serial_Programming/termios#Basic_Configuration_of_a_Serial_Interface
http://www.taurus.com/~jeff/2100/emulator/ttyaccess.txt
usw.

Uwe.

von Alexey O. (Firma: AO) (aloz77)


Lesenswert?

Ich habe schon einige Webseiten zum Thema RS232-Programmierung 
durchgearbeitet. Das ist für mich die beste und umfassendste, auch wenn 
sie ziemlich kompakt ist.

http://www.netzmafia.de/skripten/hardware/Seriell/

Ich komme trotzdem noch nicht auf die Lösung meines Probles. Natürlich 
gibt's viele Einstellungen bei RS232. Frage ist, welche könnten dafür 
verantwortlich sein, dass das Schreiben (?) ins RS232 nicht 
funktioniert, während das Lesen geht.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Achtung: M-Bus arbeitet zwar hardwaremäßig wie RS-232, hat aber ein 
eigenartiges Timing, welches genau eingehalten werden muss.

ich spreche selbst mit meiner Wärmepumpe per M-Bus, hab da auch mal was 
für den AVR programmiert, kann dir gerne mal ein paar Sourcen 
reinstellen, vielleicht hilft dir das weiter...

Edit: verdammt, hab da was verwechselt: M-Bus und Modbus. meine Sachen 
sind für Modbus. M-Bus hatte ich mal, hab ich alles rausgeworfen...

btw, da hätt ich noch einen M-Bus zu RS232 umsetzer günstig abzugeben 
:-)

von Martin B. (statler)


Lesenswert?

Wenn der WM-Zähler Batteriebetrieben ist, dann darf man diesen nicht zu 
häufig abfragen, da der Zähler die RS232 nur begrenzt bedient, um die 
Batterie zu schonen. Ich kann mich nicht mehr genau erinnern, aber die 
Beschränkung war, glaube ich 1 bis 2 mal pro Stunde, also wirklich 
selten :(

von Alexey O. (Firma: AO) (aloz77)


Lesenswert?

Ich habe jetzt verschiedene USB-RS232-Adapter ausprobiert. 
Interessanterweise funktionieren sie unter Windows alle einwandfrei, so 
dass der WMZ ohne Probleme ausgelesen werden kann.

Unter Linux ist das Ergebnis wie folgt ausgefallen. Der Adapter mit 
HL340-Chip bekommt gar keine Antwort vom WMZ. Der Adapter mit 
Prolific-Chip bekommt meist die ersten paar Bytes der Antwort, dann 
bricht die Übertragung meistens ab, noch bevor das Ende des Telegramms 
erreicht ist. Nur der Adapter mit einem FTDI-Chip funktioniert 100%. Ich 
vermute mal, dass die Linux-Treiber im Zusammenspiel mit den beiden 
billigeren Chips nicht ganz das tun, was sie sollen.

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.