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/12 15:54] – [Software] Perl Abfragescript eingestellt 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) 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? | + | |
- | (*) Soweit bisher bekannt | + | |
- | + | ||
- | === 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 ^Auflösung(*) ^Bemerkung| | + | |
- | |16|0010|U1|Spannung zwischen N und L1|?| | + | |
- | |18|0012|U2|Spannung zwischen N und L2|?| | + | |
- | |20|0014|U3|Spannung zwischen N und L3|?| | + | |
- | |78|004e|F|Frequenz|2| | + | |
- | |80|0050|I1|Strom auf L1|?| | + | |
- | |82|0050|I2|Strom auf L2|?| | + | |
- | |84|0052|I3|Strom auf L3|?| | + | |
- | |86|0054|IN|Strom auf N|?|Nur Vermutung, nicht bestätigt| | + | |
- | |88|0058|I_ges|Strom auf Gesamt|? | + | |
- | |144|0090|P1|Wirkleistung auf L1|3|in kW --> 1 Watt Auflösung| | + | |
- | |146|0092|P2|Wirkleistung auf L2|3|in kW --> 1 Watt Auflösung| | + | |
- | |148|0094|P3|Wirkleistung auf L3|3|in kW --> 1 Watt Auflösung| | + | |
- | |150|0096|P_ges|Wirkleistung gesamt|3|in kW --> 1 Watt Auflösung| | + | |
- | |208|00d0|S1|Scheinleistung L1|?|Nur Vermutung, nicht bestätigt| | + | |
- | |210|00d2|S2|Scheinleistung L2|?|Nur Vermutung, nicht bestätigt| | + | |
- | |212|00d4|S3|Scheinleistung L3|?|Nur Vermutung, nicht bestätigt| | + | |
- | |214|00d6|Sges|Scheinleistung ges|?|Nur Vermutung, nicht bestätigt| | + | |
- | |272|0110|B1|Blindleistung L1|?|Nur Vermutung, nicht bestätigt| | + | |
- | |274|0112|B2|Blindleistung L2|?|Nur Vermutung, nicht bestätigt| | + | |
- | |276|0114|B3|Blindleistung L3|?|Nur Vermutung, nicht bestätigt| | + | |
- | |278|0116|Bges|Blindleistung ges|?|Nur Vermutung, nicht bestätigt| | + | |
- | |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|2|in kWh --> 0,01 kWh Auflösung| | + | |
- | |354|0162|Z2|Zaehlerstand Blindenergiebezug? | + | |
- | |358|0160|Z3|Zaehlerstand Wirkenergieabgabe|2|in kWh --> 0,01 kWh Auflösung, Nur Vermutung, nicht bestätigt| | + | |
- | |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.1305208459.txt.gz · Zuletzt geändert: 2011/05/29 13:09 (Externe Bearbeitung)