Benutzer-Werkzeuge

Webseiten-Werkzeuge


hardware:channels:meters:power:vsm-103

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Letzte Überarbeitung Beide Seiten der Revision
hardware:channels:meters:power:vsm-103 [2012/01/28 16:56]
stv0g [VSM-103 von Conrad]
hardware:channels:meters:power:vsm-103 [2018/02/15 13:50]
jau verschoben
Zeile 1: Zeile 1:
-====== VSM-103 von Conrad ====== +#redirect voltcraft_vsm-103
-Conrad hat einen preisgünstigen [[http://www.conrad.de/ce/de/product/125442/VOLTCRAFT-VSM-103-DREHSTR-ZAeHLER|Drehstromzähler mit S0-Schnittstelle]] und Modbus in RS-485 Variante und Infrarot. Leider gibt es dazu kaum Doku. +
- +
-Nach dem Kauf des [[http://www.conrad.de/ce/de/product/125441/VOLTCRAFT-SMART-METERING-SYSTEM|Komplettsystems]] und etwas Schnittstellenauswertung und probieren gibt's dazu hier ein paar weitere Infos. +
- +
-Bei weiteren Infos oder Fragen am Besten hier eintragen. +
- +
-===== Allgemeines ===== +
-  *Preisgünstig +
-  *Undokumentierte Schnittstelle +
-  *Hoher Eigenverbrauch: ca. 2W (relativ zu anderen Zählern, jeweils laut Datenblatt) +
- +
- +
-===== RS-485 ===== +
-Der Zähler hat eine RS-485 Schnittstelle zum Abfragen. Diese arbeitet in der Betriebsart **8e2**. Bisher ist nur die Geschwindigkeit mit 1200 baud getestet worden. Laut Doku sollte es auch schneller gehen. +
- +
-==== Modbus ==== +
-Der Modbus wird binär nach RTU betrieben. Siehe dazu auch http://de.wikipedia.org/wiki/Modbus und insbesondere http://www.simplymodbus.ca/+
-Grundätzliche Idee: Es gibt einen Master und mehrere Slaves. Der Master schickt Anfragen an die Slaves die darauf antworten. +
- +
-=== Anfrage === +
-Der VSM-Zähler erkennt (mindestens und soweit bekannt) Anfragen nach dem Schema +
-| ^ID ^Funktion ^Register ^Länge ^CRC| +
-^Beschreibung |Für VMS-103: 1, 1 Byte|Für VSM-103: 4, 1 Byte|2 Byte, je nach gewünschtem Wert|2 Byte, bei VSM-103 immer 2|CRC, 2 Byte| +
-^Beispiel (hex)|01|04|00 96|00 02|91 e7|Momentanen Wirk-Gesamtleistung?+
- +
- +
-=== Antwort === +
-Auf erkannte Anfragen antwortet der Zähler dann mit einem Datentelegramm mit meist 8 Byte: +
-| ^ID ^Funktion ^Daten-Laenge ^Daten ^CRC| +
-^Beschreibung|Für VMS-103: 1, 1 Byte|Für VSM-103: 4, 1 Byte|Anzahl der Bytes der Antwort, 1 Byte|Daten|CRC| +
-^Beispiel (hex)|01|04|04|3b a3 d7 0a | d9 75|Momentanen Wirk-Gesamtleistung: 0,05 kWatt| +
- +
-=== Datenformat === +
-Die Antworten liegen (soweit bisher bekannt) in den 4 Byte als 32Bit Gleitkommazahl vor: http://de.wikipedia.org/wiki/IEEE_754. Wer damit bisher nicht zu tun hatte, hier gibt's eine Excel-Vorlage zum berechnen: http://www.simplymodbus.ca/FAQ.htm#Types +
- +
-=== CRC === +
-Auch hier http://www.simplymodbus.ca/FAQ.htm#CRC gibt's eine Excel-Vorlage um die 2-Byte CRC zu berechnen. Der VSM-103 beantwortet nur Anfragen mit korrekter CRC. +
- +
-=== Bisher bekannte Register === +
-^Register ^hex ^Art ^Beschreibung ^Einheit ^Stellen(*) ^Bemerkung| +
-|16|0010|U1|Spannung zwischen N und L1|[V]| +
-|18|0012|U2|Spannung zwischen N und L2|[V]| +
-|20|0014|U3|Spannung zwischen N und L3|[V]| +
-|78|004e|F|Frequenz|[Hz]|2| +
-|80|0050|I1|Strom auf L1|[A]| +
-|82|0050|I2|Strom auf L2|[A]| +
-|84|0052|I3|Strom auf L3|[A]| +
-|86|0054|IN|Strom auf N|[A]| |?? IN und I geben gleiche Werte?!| +
-|88|0058|I|Strom gesamt|[A]| |:::| +
-|144|0090|P1|Wirkleistung auf L1|[kW]|3|-->1 Watt Auflösung| +
-|146|0092|P2|Wirkleistung auf L2|[kW]|3| +
-|148|0094|P3|Wirkleistung auf L3|[kW]|3| +
-|150|0096|P|Wirkleistung gesamt|[kW]|3| +
-|208|00d0|S1|Scheinleistung L1|[kvar]|3| +
-|210|00d2|S2|Scheinleistung L2|[kvar]|3| +
-|212|00d4|S3|Scheinleistung L3|[kvar]|3|?? Bei mir immer Null?!| +
-|214|00d6|S|Scheinleistung ges|[kvar]|3| +
-|272|0110|Q1|Blindleistung L1|[kvar]|3| +
-|274|0112|Q2|Blindleistung L2|[kvar]|3| +
-|276|0114|Q3|Blindleistung L3|[kvar]|3| +
-|278|0116|Q|Blindleistung ges|[kvar]|3| +
-|336|0150|LF1|Leistungsfaktor L1| +
-|338|0150|LF2|Leistungsfaktor L2| +
-|340|0150|LF3|Leistungsfaktor L3| +
-|342|0150|LF|Leistungsfaktor ges| +
-|352|0160|Z1|Zaehlerstand Wirkenergiebezug|[kWh]|2|-->0,01 kWh Auflösung| +
-|354|0162|Z2|Zaehlerstand Blindenergiebezug? |[kWh]|2|nur Vermutung, nicht bestätigt| +
-|358|0160|Z3|Zaehlerstand Wirkenergieabgabe? |[kWh]|2|nur Vermutung, nicht bestätigt| +
-|360|0168|Z4|Zaehlerstand Blindenergieeinspeisung? |[kWh]|2|nur Vermutung, nicht bestätigt| +
-|1318|0526|??|VSM Antwortet mit: 0x01040456341256275c|||| +
-|1560|0618|??|Zaehlerstand ?|||| +
-|65298|ff12|??||||| +
-|65314|ff22|??||||| +
- +
-Auch bei Einträgen ohne Fragezeichen ist die Beschreibung nicht absolut sicher, solange niemand das Bestätigt bitte die erhaltenen Werte auf Sinnhaftigkeit prüfen! +
- +
-(*) Hier nur: Aussage über die Nachkommastellen, nicht über die Messgenauigkeit +
- +
-===== S0-Schnittstelle ===== +
-Der VSM-103 verfügt über zwei S0-Schnittstellen für Wirk- und Blindenergie mit einer Konstante von 400 Impulsen pro kWh. Ungetestet. +
- +
-===== Infrarot-Schnittstelle ===== +
-Per Infrarot soll ebenfalls eine Modbus-RTU Kommunikation mit 1200 baud möglich sein. Ungetestet. +
- +
-===== Software ===== +
-Bin kein guter Softwerker, aber es funktioniert ;-) Verbesserungen willkommen. +
- +
-<code perl> +
-#!/usr/bin/perl +
- +
-# Nur bischen Zeit fuer die Logdatei aufbereiten... +
-$unix_time = time; +
-($jahr, $monat, $tag, $stunde, $minute, $sekunde) = (localtime)[5,4,3,2,1,0]; +
-$monat=$monat+1; +
-$jahr=$jahr+1900; +
-if ($tag<10) {$tag='0'.$tag;+
-if ($monat<10) {$monat='0'.$monat;+
-if ($stunde<10) {$stunde='0'.$stunde;+
-if ($minute<10) {$minute='0'.$minute;+
-if ($sekunde<10) {$sekunde='0'.$sekunde;+
- +
-# Anfrage an den Terminalserver (http://wut.de/e-58631-ww-dade-000.php ) +
-# Sollte auch ueber normale Serielle gehen. Dann mit Adapter RS-232<-->RS-485 +
-use IO::Socket; +
-    $socket = IO::Socket::INET->new(PeerAddr=> "192.168.1.23",    # Terminalserver +
-                PeerPort=> "8000", +
-                Proto   => "tcp"+
-    or die "Kaputt!"; +
- +
-# Vordefinierte Register, CRC ist da schon berechnet :-) Hier nur zwei, sonst wird's arg unuebersichtlich. +
-# Momentanleistung 150 +
-$frage[0]=pack('H*',"01040096000291e7"); +
-# Zaehlerstand >     352 +
-$frage[1]=pack('H*',"01040160000fb1ec"); +
-# Wie erhaelt man nochmal die Laenge eines Arrays? ;-) +
-$fragen=2; +
- +
-# Nun fuer jeden Angfragestring durchlaufen +
-for ($anfrage=0; $anfrage < $fragen; $anfrage++) { +
-# Den Anfragestring an den Anschluss schicken. +
-print $socket $frage[$anfrage]; +
- +
-# Einlesen von 8 Byte +
-# Es werden stumpf 8 Byte erwartet, nix mit Timout oder so... +
-$i=-1; +
-while ($i < 8 ){ +
-    sysread($socket, my ($byte), 1); +
-    $i++; +
-    $antwort[$i]=$byte; +
-+
-$antwortcount=$i; +
- +
-# In der Subroutine den Wert umrechnen. +
-# Es werden stumpf die Datenbits genommen, nix CRC-Pruefung oder so... +
-$wert[$anfrage]=parse32b($antwort[3],$antwort[4],$antwort[5],$antwort[6]); +
-+
-close($socket); +
- +
-# Jetzt werden die ermittelten Werte in einer Zeile die Logdatei angehaengt, mit ';' getrennt +
-open (LOG,">>/pfad/datei"+
-    or die "Logdatei kann nicht geschrieben werden"; +
-print LOG $jahr.$monat.$tag."T".$stunde.$minute.$sekunde.';'.$unix_time.";"; +
-for ($anfrage=0; $anfrage < $fragen; $anfrage++) { +
-    print LOG $wert[$anfrage].";" +
-+
-print LOG "\n"; +
-close(LOG); +
- +
- +
- +
-sub parse32b # 32bit nach Dezimal wandeln, http://de.wikipedia.org/wiki/IEEE_754 +
-+
-($byte0, $byte1, $byte2, $byte3) = @_; +
- +
-# So klappts nicht. Vielleicht irgend was falsch herum? +
-#print "Bytes: ". unpack('H*',$byte0) ." ". unpack('H*',$byte1) ." ". unpack('H*',$byte2) ." ". unpack('H*',$byte3). "\n"; +
-#$ra = unpack('f*',$byte0. $byte1. $byte2. $byte3); +
-#print $ra."\n"; +
- +
-## So klappen's, wenn auch nicht so elegant +
-$bin=unpack('B*', $byte0.$byte1.$byte2.$byte3 ); +
- +
-$sign=substr($bin,0,1); +
-if ($sign==1){$sign=-1;+
-if ($sign==0){$sign=+1;+
- +
-$exponent=substr($bin,1,8); +
-$exponent=oct("0b".$exponent); +
-$exponent=$exponent-127; +
- +
-$mantisse=substr($bin,9); +
-$mantisse=oct("0b".$mantisse); +
-$mantisse=$mantisse/8388608; +
-$mantisse=1+$mantisse; +
- +
-$wert= $sign * $mantisse * ( 2 ** $exponent ) ; +
-return($wert); +
-+
-</code> +
- +
-===== Beispiele ===== +
-==== Verbrauch morgens ==== +
-Momentanleistung der drei Phasen (linke y-Achse) und Zählerstand (rechte y-Achse), Abfrageintervall ca. 10 Sekunden. +
- +
-{{:hardware:channels:meters:power:morgens_beschreibung.png|}}+
hardware/channels/meters/power/vsm-103.txt · Zuletzt geändert: 2018/03/25 10:59 von jau