hardware:channels:meters:power:vsm-103
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| hardware:channels:meters:power:vsm-103 [2011/05/14 16:09] – [Modbus] - Registerbeschreibung ergänzt megamax | hardware:channels:meters:power:vsm-103 [2018/03/25 10:59] (aktuell) – jau | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | ====== VSM-103 von Conrad ====== | + | #redirect voltcraft_vsm-103 |
| - | Conrad hat einen preisgünstigen Drehstromzähler mit S0-Schnittstelle und Modbus in RS-485 Variante und Infrarot. Leider gibt es dazu kaum Doku. | + | {{indexmenu_n>99}} |
| - | http:// | + | |
| - | + | ||
| - | Nach dem Kauf des Komplettsystems (http:// | + | |
| - | + | ||
| - | Bei weiteren Infos oder Fragen am Besten hier eintragen. | + | |
| - | + | ||
| - | ===== Allgemeines ===== | + | |
| - | *Preisgünstig | + | |
| - | *Undokumentierte Schnittstelle | + | |
| - | *Hoher Eigenverbrauch (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:// | + | |
| - | 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: | + | |
| - | + | ||
| - | === Datenformat === | + | |
| - | Die Antworten liegen (soweit bisher bekannt) in den 4 Byte als 32Bit Gleitkommazahl vor: http:// | + | |
| - | + | ||
| - | === CRC === | + | |
| - | Auch hier http:// | + | |
| - | + | ||
| - | === 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|--> | + | |
| - | |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|?? | + | |
| - | |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|--> | + | |
| - | |354|0162|Z2|Zaehlerstand Blindenergiebezug? | + | |
| - | |358|0160|Z3|Zaehlerstand Wirkenergieabgabe? | + | |
| - | |360|0168|Z4|Zaehlerstand Blindenergieeinspeisung? | + | |
| - | |1318|0526|?? | + | |
| - | |1560|0618|?? | + | |
| - | + | ||
| - | 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, | + | |
| - | + | ||
| - | ===== 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> | + | |
| - | # | + | |
| - | + | ||
| - | # Nur bischen Zeit fuer die Logdatei aufbereiten... | + | |
| - | $unix_time = time; | + | |
| - | ($jahr, $monat, $tag, $stunde, $minute, $sekunde) = (localtime)[5, | + | |
| - | $monat=$monat+1; | + | |
| - | $jahr=$jahr+1900; | + | |
| - | if ($tag< | + | |
| - | if ($monat< | + | |
| - | if ($stunde< | + | |
| - | if ($minute< | + | |
| - | if ($sekunde< | + | |
| - | + | ||
| - | # Anfrage an den Terminalserver (http:// | + | |
| - | # Sollte auch ueber normale Serielle gehen. Dann mit Adapter RS-232< | + | |
| - | use IO:: | + | |
| - | $socket = IO:: | + | |
| - | PeerPort=> | + | |
| - | Proto => " | + | |
| - | or die " | + | |
| - | + | ||
| - | # Vordefinierte Register, CRC ist da schon berechnet :-) Hier nur zwei, sonst wird's arg unuebersichtlich. | + | |
| - | # Momentanleistung 150 | + | |
| - | $frage[0]=pack(' | + | |
| - | # Zaehlerstand > 352 | + | |
| - | $frage[1]=pack(' | + | |
| - | # Wie erhaelt man nochmal die Laenge eines Arrays? ;-) | + | |
| - | $fragen=2; | + | |
| - | + | ||
| - | # Nun fuer jeden Angfragestring durchlaufen | + | |
| - | for ($anfrage=0; | + | |
| - | # 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, | + | |
| - | $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], | + | |
| - | } | + | |
| - | close($socket); | + | |
| - | + | ||
| - | # Jetzt werden die ermittelten Werte in einer Zeile die Logdatei angehaengt, mit ';' | + | |
| - | open (LOG,">>/ | + | |
| - | or die " | + | |
| - | print LOG $jahr.$monat.$tag." | + | |
| - | for ($anfrage=0; | + | |
| - | print LOG $wert[$anfrage].";" | + | |
| - | } | + | |
| - | print LOG " | + | |
| - | close(LOG); | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | sub parse32b # 32bit nach Dezimal wandeln, http:// | + | |
| - | { | + | |
| - | ($byte0, $byte1, $byte2, $byte3) = @_; | + | |
| - | + | ||
| - | # So klappts nicht. Vielleicht irgend was falsch herum? | + | |
| - | #print " | + | |
| - | #$ra = unpack(' | + | |
| - | #print $ra." | + | |
| - | + | ||
| - | ## So klappen' | + | |
| - | $bin=unpack(' | + | |
| - | + | ||
| - | $sign=substr($bin, | + | |
| - | if ($sign==1){$sign=-1; | + | |
| - | if ($sign==0){$sign=+1; | + | |
| - | + | ||
| - | $exponent=substr($bin, | + | |
| - | $exponent=oct(" | + | |
| - | $exponent=$exponent-127; | + | |
| - | + | ||
| - | $mantisse=substr($bin, | + | |
| - | $mantisse=oct(" | + | |
| - | $mantisse=$mantisse/ | + | |
| - | $mantisse=1+$mantisse; | + | |
| - | + | ||
| - | $wert= $sign * $mantisse * ( 2 ** $exponent ) ; | + | |
| - | return($wert); | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | ===== Beispiele ===== | + | |
| - | ==== Verbrauch morgens ==== | + | |
| - | Momentanleistung der drei Phasen (linke y-Achse) und Zählerstand (rechte y-Achse), Abfrageintervall ca. 10 Sekunden. | + | |
| - | + | ||
| - | {{: | + | |
hardware/channels/meters/power/vsm-103.1305382169.txt.gz · Zuletzt geändert: (Externe Bearbeitung)