hardware:channels:meters:power:edl-ehz:siemens_td3511
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende ÜberarbeitungLetzte ÜberarbeitungBeide Seiten der Revision | ||
hardware:channels:meters:power:edl-ehz:siemens_td3511 [2014/04/23 13:01] – [Test #3] emc2 | hardware:channels:meters:power:edl-ehz:siemens_td3511 [2023/05/17 21:18] – [Kommunikation] Hinweis mit Parametrierung MSB hinzu kantetaete | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ===== Siemens TD-3511 ===== | + | ====== Siemens TD-3511 |
- | {{ : | + | {{ : |
- | Bei der Installation einer Solaranlage haben die Stadtwerke bei mir Zähler | + | Beim TD-3511 von Siemens |
+ | <note important> | ||
+ | </ | ||
===== Hardware ===== | ===== Hardware ===== | ||
- | Man benötigt den [[hardware: | + | Gelesen werden kann mittels |
- | Die linke der beiden Punkte | + | ===== Kommunikation ===== |
+ | Die Datenübertragung erfolgt gemäß Hersteller-Anleitung per IEC 62056-21 in Mode " | ||
+ | Das im vzlogger zu konfigurierende Protokoll | ||
+ | Der Zähler arbeitet im Pull-Modus, d.h. er sendet die Daten ert nach Anforderung. | ||
- | Wahrscheinlich funktionieren auch die Befehle des [[hardware: | + | <note important> |
- | ===== Test #1 ===== | + | ---- |
- | Zum Testen habe ich [[http:// | + | |
- | Einzustellen sind:\\ | + | |
- | Port: bei Windows: | + | |
- | Baud: 300\\ | + | |
- | Data: 7\\ | + | |
- | Stop: 1\\ | + | |
- | Parity: Even\\ | + | |
- | Bei "input control": | + | |
- | Auf " | + | |
- | ===== Test #2 ===== | + | Der Zähler erwartet |
- | Das folgende Perlscript automatisiert | + | < |
- | < | + | und antwortet mit seinem Identifikationstelegramm. |
- | #!/usr/ | + | |
- | # | + | Nach der an den Zähler gesendeten Startsequenz |
- | # (m)ein Stromzähler mit IR-Schnittstelle blubbert nach einem "Anforderung- | + | < |
- | # telegramm" Daten raus. Das Telegramm ist mit 300 Baud, 7 Bit, 1 Stoppbit | + | sendet er bei Option " |
- | # und gerader Parität zu senden. Das ist der Initialmodus von Geräten, | + | Beispiel: " |
- | # die das Protokoll IEC 62056-21 implementieren. | + | |
- | # | + | |
- | # Autor: Andreas Schulze | + | |
- | # Bugfix: Eric Schanze | + | |
- | # Datum: 20120302 | + | |
- | # | + | |
- | my $PORT='/ | ||
- | my $anforderungstelegramm = " | ||
- | use warnings; | + | Ausschnitt aus der Hersteller-Anleitung (s. Quellen - Benutzerhandbuch (Siemens AG Österreich)): |
- | use strict; | + | > |
- | use utf8; | + | >< |
- | use Device:: | + | Code Übertragungsrate |
+ | 0 300 Bit/s | ||
+ | 1 600 Bit/s | ||
+ | 2 1.200 Bit/s | ||
+ | 3 2.400 Bit/s | ||
+ | 4 4.800 Bit/s | ||
+ | 5 9.600 Bit/s | ||
+ | 6 | ||
+ | 9 115.200 Bit/s | ||
+ | </ | ||
+ | >Der Zähler meldet sich aus Kompatibilitätsgründen mit der normkonformen Baudratenkennung " | ||
- | my $tty = new Device:: | + | ---- |
- | $tty-> | + | |
- | $tty-> | + | |
- | $tty-> | + | |
- | $tty-> | + | |
- | $tty-> | + | |
- | # | + | |
- | my $num_out = $tty-> | + | Wahrscheinlich funktionieren auch die Befehle des [[hardware: |
- | die "write failed\n" | + | < |
- | die "write inclomplete\n" unless ($num_out == length($anforderungstelegramm)); | + | |
- | print " | + | |
- | my ($num_read, $s); | + | ---- |
- | $tty->read_const_time(10); | + | <note tip>Je nach Messstellenbetreiber kann auch eine niedrigere, als die vom Hersteller angegebene, maximal mögliche Baudrate parametriert sein.\\ |
- | while(1) { | + | Falls die Kommunikation bei einer höheren Baudrate nicht funktioniert, sollte in der Startsequenz manuell die niedrigste Baudrate von 300Bit/s eingestellt werden (automatische Erkennung deaktivieren).</note> |
- | ($num_read, $s) = $tty->read(1); | + | |
- | print $s if $s; | + | |
- | } | + | |
- | $tty->close || die "can't close $PORT: $!"; | + | |
+ | ---- | ||
+ | |||
+ | |||
+ | ===== Beispielkonfiguration ===== | ||
+ | <note tip>Im Gegensatz zu anderen Zählern müssen beim TD-3511 | ||
+ | </ | ||
+ | |||
+ | |||
+ | <code base vzlogger.conf> | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | //" | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | ] | ||
+ | } | ||
+ | ] | ||
+ | } | ||
</ | </ | ||
- | ===== Test #3 ===== | + | ---- |
- | Das folgende C Programm kann alle Daten mit dem [[hardware: | + | |
+ | |||
+ | ===== Auslesen mit anderen Methoden als vzlogger ===== | ||
+ | |||
+ | ==== Auslesen per PHP ==== | ||
+ | Dieses Script übergibt die Daten ganz normal an die Middleware. | ||
+ | Das Script verwendet als Geschwindigkeit 9600. Wer 19200 möchte muss die beiden Zeilen im Script einkommentieren. | ||
+ | <code php> | ||
+ | <?php | ||
+ | |||
+ | $urlBase=' | ||
+ | $device='/ | ||
+ | |||
+ | $channels=array( | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ); | ||
+ | |||
+ | error_reporting(E_ALL); | ||
+ | |||
+ | function setSerial($device, | ||
+ | echo "setze Schnittstelle auf $bps bps\n"; | ||
+ | $output=array(); | ||
+ | $returnVar=0; | ||
+ | $cmd=" | ||
+ | exec($cmd, $output, | ||
+ | echo " | ||
+ | print_r($output); | ||
+ | } // function initSerial | ||
+ | |||
+ | function setSerialInital($device, | ||
+ | echo "setze Schnittstelle auf $bps bps\n"; | ||
+ | $output=array(); | ||
+ | $returnVar=0; | ||
+ | $cmd=" | ||
+ | exec($cmd, $output, | ||
+ | echo " | ||
+ | print_r($output); | ||
+ | } // function initSerial | ||
+ | |||
+ | function checkLine($line) { | ||
+ | global $channels; | ||
+ | global $urlBase; | ||
+ | |||
+ | echo "Line: ' | ||
+ | $line=trim($line); | ||
+ | if ($line==' | ||
+ | foreach(array_keys($channels) as $orbis) { | ||
+ | if(substr($line, | ||
+ | echo "match für $orbis\n"; | ||
+ | $part=(float)substr($line, | ||
+ | // 2.8.0(885.259*kWh) | ||
+ | $part=strstr(substr($line, | ||
+ | if ((' | ||
+ | echo " | ||
+ | $url=$urlBase.$channels[$orbis].' | ||
+ | echo "rufe $url auf.\n"; | ||
+ | $dummy=curl_file_get_contents($url); | ||
+ | } // if | ||
+ | } // foreach | ||
+ | } // function checkLine | ||
+ | |||
+ | function curl_file_get_contents($URL) | ||
+ | { | ||
+ | $c = curl_init(); | ||
+ | curl_setopt($c, | ||
+ | curl_setopt($c, | ||
+ | $contents = curl_exec($c); | ||
+ | curl_close($c); | ||
+ | |||
+ | if ($contents) return $contents; | ||
+ | else return FALSE; | ||
+ | } // function curl_get_file_contents | ||
+ | |||
+ | function getTimestamp() { | ||
+ | | ||
+ | return round( ($seconds * 1000) ); | ||
+ | } | ||
+ | |||
+ | setSerialInitial($device, | ||
+ | |||
+ | $fp=fopen($device,' | ||
+ | if (!$fp) { | ||
+ | echo " | ||
+ | die; | ||
+ | } else { | ||
+ | echo "Port öffnen OK\n"; | ||
+ | } // if | ||
+ | |||
+ | echo " | ||
+ | $out = "/? | ||
+ | fwrite($fp, $out); | ||
+ | echo " | ||
+ | |||
+ | echo "Lese eine Zeile\n"; | ||
+ | echo fgets($fp); | ||
+ | echo " | ||
+ | |||
+ | /* | ||
+ | echo "Lese eine Zeile\n"; | ||
+ | echo fgets($fp); | ||
+ | echo " | ||
+ | */ | ||
+ | |||
+ | echo " | ||
+ | usleep(500 * 1000); | ||
+ | |||
+ | echo " | ||
+ | $out = " | ||
+ | $out = " | ||
+ | |||
+ | // fuer 19200: | ||
+ | // $out = " | ||
+ | |||
+ | fwrite($fp, $out); | ||
+ | echo "BPS Request OK.\n"; | ||
+ | |||
+ | echo "warte bis Zeichen ausgegeben wurden...\n"; | ||
+ | usleep(500 * 1000); | ||
+ | |||
+ | // | ||
+ | |||
+ | echo " | ||
+ | fclose($fp); | ||
+ | setSerial($device, | ||
+ | // für 19200 | ||
+ | // setSerial($device, | ||
+ | |||
+ | echo " | ||
+ | $fp=fopen($device,' | ||
+ | if (!$fp) { | ||
+ | echo " | ||
+ | | ||
+ | } else { | ||
+ | echo "Port 9600 OK\n"; | ||
+ | } // if | ||
+ | |||
+ | |||
+ | echo "lese Rest ein\n"; | ||
+ | while (!feof($fp)) { | ||
+ | echo $line=fgets($fp, | ||
+ | checkLine($line); | ||
+ | } // while | ||
+ | |||
+ | fclose($fp); | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | ==== Auslesen per C zu MySQL ==== | ||
+ | Das folgende C Programm kann alle Daten mit dem [[hardware: | ||
Dabei wird die Übertragungsrate auf 9600bps erhöht.\\ | Dabei wird die Übertragungsrate auf 9600bps erhöht.\\ | ||
Das Programm kann über PHP mit pclose(popen(" | Das Programm kann über PHP mit pclose(popen(" | ||
- | < | + | < |
#include < | #include < | ||
#include < | #include < | ||
Zeile 246: | Zeile 459: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | ==== Test mit HTerm ==== | ||
+ | Zum Testen kann [[http:// | ||
+ | Einzustellen sind:\\ | ||
+ | Port: bei Windows: | ||
+ | Baud: 300\\ | ||
+ | Data: 7\\ | ||
+ | Stop: 1\\ | ||
+ | Parity: Even\\ | ||
+ | Bei "input control": | ||
+ | Auf " | ||
+ | |||
+ | ==== Test mit Perl-Script ==== | ||
+ | <code perl> | ||
+ | # | ||
+ | # | ||
+ | # (m)ein Stromzähler mit IR-Schnittstelle blubbert nach einem " | ||
+ | # telegramm" | ||
+ | # und gerader Parität zu senden. Das ist der Initialmodus von Geräten, | ||
+ | # die das Protokoll IEC 62056-21 implementieren. | ||
+ | # | ||
+ | # Autor: Andreas Schulze | ||
+ | # Bugfix: Eric Schanze | ||
+ | # Datum: 20120302 | ||
+ | # | ||
+ | # 20171230: Andreas Schulze: speed :-) | ||
+ | |||
+ | use warnings; | ||
+ | use strict; | ||
+ | use utf8; | ||
+ | use Device:: | ||
+ | use Time::HiRes qw(usleep); | ||
+ | |||
+ | # functions | ||
+ | sub tty_init($); | ||
+ | sub tty_baudrate($$); | ||
+ | sub tty_close($); | ||
+ | sub send_telegram($$); | ||
+ | sub receive_line($); | ||
+ | |||
+ | # global vars | ||
+ | my $PORT='/ | ||
+ | my $aufforderung = "/? | ||
+ | my $speed = chr(6) . " | ||
+ | my $tty; | ||
+ | my $answer; | ||
+ | |||
+ | # main | ||
+ | $tty = tty_init($PORT); | ||
+ | send_telegram($tty, | ||
+ | print receive_line($tty); | ||
+ | |||
+ | usleep(250*1000); | ||
+ | |||
+ | send_telegram($tty, | ||
+ | usleep(250*1000); | ||
+ | tty_baudrate($tty, | ||
+ | |||
+ | do { | ||
+ | $answer = receive_line($tty); | ||
+ | print $answer; | ||
+ | } until $answer eq " | ||
+ | |||
+ | tty_close($tty); | ||
+ | exit(0); | ||
+ | |||
+ | # parameter: tty name | ||
+ | # return | ||
+ | # on error : die | ||
+ | sub tty_init($) { | ||
+ | my ($device) = @_; | ||
+ | my $tty = new Device:: | ||
+ | $tty-> | ||
+ | $tty-> | ||
+ | $tty-> | ||
+ | $tty-> | ||
+ | $tty-> | ||
+ | $tty-> | ||
+ | # | ||
+ | |||
+ | $tty; | ||
+ | } | ||
+ | |||
+ | # parameter: a tty handle | ||
+ | # on error : die | ||
+ | # return | ||
+ | sub tty_close($) { | ||
+ | my ($tty) = @_; | ||
+ | $tty-> | ||
+ | } | ||
+ | |||
+ | # parameter: a tty handle | ||
+ | # parameter: new baudrate | ||
+ | # return | ||
+ | # on error : die | ||
+ | sub tty_baudrate($$) { | ||
+ | my ($tty, $baudrate) = @_; | ||
+ | $tty-> | ||
+ | $tty-> | ||
+ | }; | ||
+ | |||
+ | # parameter: a tty handle | ||
+ | # parameter: string to send | ||
+ | # return | ||
+ | # on error : die | ||
+ | sub send_telegram($$) { | ||
+ | my ($tty, | ||
+ | |||
+ | print "send ' | ||
+ | $telegram .= " | ||
+ | my $num_out = $tty-> | ||
+ | die "write failed\n" | ||
+ | die "write inclomplete\n" | ||
+ | print " | ||
+ | } | ||
+ | |||
+ | # parameter: a tty handle | ||
+ | # return | ||
+ | # on error : - | ||
+ | sub receive_line($) { | ||
+ | my ($tty) = @_; | ||
+ | |||
+ | my ($line, $num_read, $c); | ||
+ | do { | ||
+ | ($num_read, $c) = $tty-> | ||
+ | $line .= $c; | ||
+ | } until !defined($c) || $c eq " | ||
+ | | ||
+ | $line; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Quellen ===== | ||
+ | [[https:// | ||
+ | {{: |
hardware/channels/meters/power/edl-ehz/siemens_td3511.txt · Zuletzt geändert: 2023/05/29 13:51 von gregor.wolf