[vz-dev] Inbetriebnahme ZMD120AR Landis & Gyr mit IR Lesekopf über RS232

Peter Kreutzer kreutzer.peter at gmail.com
Sun May 19 21:20:14 CEST 2013


Hi ,

nun habe ich mit einen skript, welches ich bei euch in der mailingliste
gefunden haben.
http://volkszaehler.org/pipermail/volkszaehler-dev/2012-April/001826.html

ich habe leicht modifiziert um nur die werde anzuzeigen.


#!/usr/bin/perl

# Zaehlerabfrage fuer Zaehler nach Protokoll IEC 62056-21 / OBIS
# Ein Anfrage-Telegramm ist mit 300 Baud, 7 Bit, 1 Stoppbit
use warnings;
use strict;
use Device::SerialPort;
use RRDs;

### KONFIGURATION ###
my $device="/dev/ttyS0";        #Schnittstelle
my $request = "/?!\r\n";        #Anforderungstelegramm "/?!" \r\n
entspricht CR-LF
my $ga = "0/0/4";               #Gruppenadresse DPT9
my $obiskey="1.8.0(";           #Schluessel vor Angabe des Zaehlerstandes
z.B. "1.8.0(0001234.5 kWh)"

my $file = "/var/tmp/Zaehler_WP.log";                           #Logdatei
wird automatisch angelegt!
### ENDE KONFIGURATION ###

### Seriellen Port initialisieren
my $port = new Device::SerialPort($device) || die "can't open $device: $!";
$port->baudrate(300)      || die 'fail setting baudrate';
$port->databits(7)        || die 'fail setting databits';
$port->stopbits(1)        || die 'fail setting stopbits';
$port->parity("even")     || die 'fail setting parity';
$port->write_settings     || die 'fail write settings';
$port->rts_active(1);
$port->dtr_active(1);
$port->read_char_time(500);     # 0.5 seconds for each character
$port->read_const_time(3000);   # 3 second per unfulfilled "read" call


### Anforderungstelegramm senden
my $num_out = $port->write($request);
die "write failed\n" unless ($num_out);
die "write inclomplete\n" unless ($num_out == length($request));
print "send request telegram : $num_out Bytes written\n";

### AUSLESEN

my $STALL_DEFAULT=2; # how many seconds to wait for new input
my $timeout=$STALL_DEFAULT;
my $chars=0;
my $buffer="";

while ($timeout>0) {
        my ($count,$saw)=$port->read(255);      # Liest 255 Zeichen je
Durchlauf aus
        if ($count > 0) {
                $chars+=$count;
                $buffer.=$saw;
                print $buffer;                  # Ausgabe der eingelesenen
Daten
        }
        else
        {
                $timeout--;
        }
}

if ($timeout<=0){
        $port->close || die "can't close $device: $!";
        print "Waited $STALL_DEFAULT seconds and never saw what I wanted\n";
}


### SUBS
sub encode_dpt9 { # 2byte signed float
    my $state = shift;
    my $data;

    my $sign = ($state <0 ? 0x8000 : 0);
    my $exp  = 0;
    my $mant = 0;

    $mant = int($state * 100.0);
    while (abs($mant) > 2047) {
        $mant /= 2;
        $exp++;
    }
    $data = $sign | ($exp << 11) | ($mant & 0x07ff);
    return $data >> 8, $data & 0xff;
}


Soweit so gut.
Die Startsequenz und die Einstellungen der Seriellen Schnittstelle sind nun
bekannt.

Als nächstes werde ich mit dann den vzlogger von peter evertz mal anschauen.
Da er nicht im als ubuntu package vorhanden ist werde ich ihn selber
compiliere...

Geben euch noch eine Rückmeldung wenn es gelaufen ist.

Grüsse und Danke



Am 18. Mai 2013 20:03 schrieb Peter Kreutzer <kreutzer.peter at gmail.com>:

> Hi Torben,
>
>  sudo strace -f -s 9999 vzlogger --config /etc/vzlogger.conf -v 20
> >vzlogger.trace
>
> [pid  3742] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=1892,
> ...}) = 0
> [pid  3742] getppid()                   = 3740
> [pid  3742] write(3, "[May 18 19:41:51][mtr0] Got 0 new readings from
> meter:\n", 55) = 55
> [pid  3742] read(4, "", 1)              = 0
> [pid  3742] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=1892,
> ...}) = 0
> [pid  3742] getppid()                   = 3740
> [pid  3742] write(2, "[May 18 19:41:51][d0]   ", 24[May 18 19:41:51][d0]
> ) = 24
> [pid  3742] write(2, "Something unexpected happened: read:281!",
> 40Something unexpected happened: read:281!) = 40
> [pid  3742] write(2, "\n", 1
> )           = 1
>
> Sieht so aus, das der Zähler einen leeren Wert senden.
>
> Ich habe ja schon versucht mit diesem script die baudrate und die
> Startsequenz zu senden. Anschliessend sehe ich in der while auch keinen
> Output auf der Konsole.
>
> #/usr/bin/pythonimport serial
>
> ser = serial.Serial('/dev/ttyS0', 300, timeout=100)
> ser.write("/?!<0D><0A>")
>
> while True:
>  x = ser.read()
>  print x,
> ser.close()
>
> Dann ist das mit der Startsequenz irgendwie doch nicht so richtig.
> Ich denke ich muss erstmal das mit der start Sequenz lösen.
>
> Das obige schickt zwar die Sequenz  aber der Zähler schickt dann keine
> Werte.
> Sonst würde die while schleife ja etwas auf die console schreiben
>
> Grüsse
>  und vielen Dank für deine Unterstützung
>
>
>
>
> Am 18. Mai 2013 14:07 schrieb Thorben Thuermer <r00t at constancy.org>:
>
> On Sat, 18 May 2013 12:19:01 +0200
>> Peter Kreutzer <kreutzer.peter at gmail.com> wrote:
>> > nun habe ich mit dem python script die Startsequenz geschickt ..
>> > #/usr/bin/python
>> > import serial
>> > ser = serial.Serial('/dev/ttyS0', 300, timeout=100)
>> > ser.write("/?!<0D><0A>")
>> >
>> > while True:
>> >  x = ser.read()
>> >  print x,
>> > ser.close()
>> >
>> > und anschliessend mit
>>
>> eigentlich musst du _waehrend_ vzlogger laeft die sequenz schicken,
>> und vzlogger die antwort lesen lassen.
>> das problem ist halt, dass vzlogger die nicht von sich aus schickt.
>> (ausser in der version von peter evertz, es waehre durchaus sinnvoll,
>>  wenn du testest ob die bei dir funktioniert.)
>> im prinzip einfach sowas wie: echo -en '/?!\r\n' >/dev/ttyS0
>> (unter linux koennen mehrere programme gleichzeitig auf die
>>  schnittstelle schreiben, gibt nur ggfs chaos - aber vzlogger schreibt
>>  von sich aus eh nichts.)
>>
>> >  sudo vzlogger --config /etc/vzlogger.conf -v 20
>> [...]
>> > Hatte ihr einen Fehler drin. Die serielle Schnittstelle ist natürlich
>> > /dev/ttyS0, war vorher /dev/tty0
>>
>> hatten wir oder hattest du? kam doch aus deinem beispiel?
>> wirklich ttyS0? nicht ttyUSB0 oder so?
>> du hast echt einen rs232 ir-kopf an COM1?
>>
>> > Das Zähler schickt nun die Werte aber der vz looger kann mit den werten
>> > wohl nicht anfangen.
>> > [d0]   Something unexpected happened: read:281!
>> >
>> > Habt ihr vielleicht noch einen Tip was ander meter konfiguration nicht
>> > stimmt?
>>
>> das dumme ist, das vzlogger nicht anzeigt, was er empfaengt.
>> moegliche ursachen:
>> * nur muell (falsche baudrate o.ae.)
>> * eine reflektion der anforderungssequenz
>> * eine variante von d0 die er nicht parsen kann
>>
>> ich wuerde das untersuchen mit:
>> # sudo strace -f -s 9999 vzlogger --config /etc/vzlogger.conf -v 20
>> >vzlogger.trace
>>
>> in vzlogger.trace kann man dann nachlesen, was vzlogger liest.
>>
>> > Danke
>> > Peter
>>
>> - Thorben
>>
>> > Am 17. Mai 2013 21:10 schrieb Thorben Thuermer <r00t at constancy.org>:
>> > > On Fri, 17 May 2013 20:29:25 +0200
>> > > Peter Kreutzer <kreutzer.peter at gmail.com> wrote:
>> > > > habe mal folgendes probiert....
>> > > > #/usr/bin/python
>> > > > import serial
>> > > > ser = serial.Serial('/dev/tty0', 300, timeout=100)
>> > > > ser.write("\x0D")
>> > > > ser.write("\0A")
>> > >
>> > > die sequenz ist: "/?!<0d><0a>"
>> > >
>> > > > ser = serial.Serial('/dev/tty0', 9600, timeout=100)
>> > >
>> > > ausserdem sollte die rate konstant sein, solange du nicht eine
>> aenderung
>> > > anforderst...?
>> > >
>> > > probiere doch mal die version von peter evertz,
>> > > die hat die funktion zum senden der sequenz eingebaut:
>> > > >>> "pullseq" : "4060200D0A", // HEX Darstellung der Pullsequenz
>> > >
>> http://volkszaehler.org/pipermail/volkszaehler-dev/2013-April/002671.html
>> > >
>> > > > /Peter
>> > >
>> > > - T.
>> > >
>> > > > Am 17. Mai 2013 00:21 schrieb Michael Wulz <michael.wulz at gmail.com
>> >:
>> > > >
>> > > > > Und die Baud Rate einstellen!
>> > > > >
>> > > > > Von meinem iPad gesendet
>> > > > >
>> > > > > Am 16.05.2013 um 21:53 schrieb Udo1 <udo1 at gmx.net>:
>> > > > >
>> > > > > > Am 16.05.2013 20:58, schrieb Peter Kreutzer:
>> > > > > >> Hier der Log
>> > > > > >> ==> /?!<0D><0A>
>> > > > > > Hallo Peter,
>> > > > > >
>> > > > > > du musst per script die Anforderungssequenz senden. Ich meine,
>> bis
>> > > jetzt
>> > > > > > ist das noch nicht in vzlogger implementiert.
>> > > > > >
>> > > > > > Gruß
>> > > > > > Udo
>> > > > >
>> > >
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://volkszaehler.org/pipermail/volkszaehler-dev/attachments/20130519/cafd8d3a/attachment.html>


More information about the volkszaehler-dev mailing list