3 Phasen Stromzähler SDM630M DC alle Werte auslesen !!!! Installationssript !

Hi, ich habe jetzt 4 3-Phasen Stromzähler zum testen mit IPS mir bestellt gehabt, den Voltkraft 102 usw.

Aber keiner hat mir wirklich gute „Daten“ geliefert…

Bis ich den SDM630M DC gefunden habe.

Link zum Shop: http://bg-etech.de/os/product_info.php?products_id=50&osCsid=1mal7atdkn9iu97e8s9ocatig5

Nach vielen Emails mit dem Support von B+G und der super Hilfe von User Lokla habe ich es endlich hinbekommen :slight_smile:

Ich habe mich erstmal nur um den Part vom Auslesen der Werte gekümmert !

Das Ding spuckt alles aus was man nur als Datensammler haben will aus :

Ich lasse es alle 30sec auslesen :slight_smile:

Installation

Vorwort:

Man benötigt noch einen usb RS485 Adapter, den bekommt man bei Ebay für 2€ inkl. aus China…

Los geht’s:

Ich habe den Installer für IPS angehängt, einfach ein neues Script anlegen und den Inhalt 1:1 des angehängte Script in das angelgete Script Kopieren und ausführen.

Es wird alles automatisch anlegt (hoffe ich zumindest) :wink:

Jetzt legt man einen Serial Port an, folgende Einstellungen in IPS und im Gerätemanager für den Serial Port setzten :

Bildschirmfoto 2014-02-15 um 22.25.39.png

Bildschirmfoto 2014-02-15 um 22.25.56.png

Legt unter den Serial Port eine Variable mit Float und nennt die Buffer !

Es braucht man noch eine Register Variable, R.V. anlegen und mit dem Serial Port verbinden.

Legt ein neues Script an und kopiert 1:1 das:

<?
$RegVar = 59976 /*[Stromzähler Gesamt\Stromzähler Gesamt]*/   ; //Register Variable
$buffer = 48720 /*[Stromzähler Gesamt\Stromzähler Gesamt\Buffer]*/; // Buffer Variable

//ab hier nix mehr ändern !!!!


if($_IPS['SENDER'] == "RegisterVariable") {

    $data = RegVar_GetBuffer($_IPS['INSTANCE']);
    $data .= $_IPS['VALUE'];
   RegVar_SetBuffer($_IPS['INSTANCE'], $data);

}


//**********************Funktion für String in Hex umzuwandeln !!!!*************
function string2hex ( $string ) {
  $hex = NULL;
  for ( $ix=0; $ix < strlen($string); $ix=$ix+1 ) {
    $char =  substr( $string, $ix, 1 );
    $ord = ord ( $char );
    if ( $ord < 16 ) {
      $hex .= '0'.dechex( $ord );
    }
    else {
      $hex .= dechex( $ord );
    }

    // add line break or space
    if ( $ix && ($ix % 16) == 15 ) {
      $hex .= "
";
    }
    else {
      $hex .= " ";
    }
  }

  // strip trailing space or linebreak
  return substr( $hex, 0, -1 );
}

function hex2string( $hex ) {
  $string = NULL;

  // strip linebreaks and spaces
  $hex = str_replace( array("
","\r"," "), "", $hex );

  for ( $ix=0; $ix < strlen($hex); $ix=$ix+2 ) {
    $ord = hexdec( substr( $hex, $ix, 2 ) );
    $string .= chr( $ord );
  }

  return $string;
}

// Umrechnung

$data = RegVar_GetBuffer($RegVar);
$value = String2Hex($data);


//$value = "01 04 04 43 70 80 00 00 00"; // Zum Testen, es muss 240,5 rauskommen :-)
$value = explode(' ', $value);

$wert3=hexdec($value[3]);
$wert4=hexdec($value[4]);
$wert5=hexdec($value[5]);
$wert6=hexdec($value[6]);

$sign = $wert3 >> 7;
$exponent = (($wert3 & 0x7F) << 1) + (($wert4 & 0x80) >> 7) - 127;
$mantisse = (($wert4 | 0x80) << 16) + ($wert5 << 8) + $wert6;
$zaehler= 0;
if ($sign == 0) {
        # exponent is positive
        //$zaehler= $mantisse / (0x7FFFFF >> $exponent);
          $teiler = 0x7FFFFF / pow(2, $exponent);
$zaehler = $mantisse / $teiler;
}
else
{
        $teiler = 0x7FFFFF * pow(2, $exponent);
$zaehler = $mantisse / $teiler;

}
//echo $zaehler;



setvalue($buffer ,$zaehler);
//RegVar_SetBuffer($RegVar, ""); //Variable löschen

?>

Man muss noch die $RegVar und $buffer anpassen !

Jetzt öffnet man das Script „auslesen“:

Hier muss auch noch die $RegVar , $ComPort und $buffer angepasst werden !

So wenn das alles erledigt ist, dann sollte Ihr ab jetzt mit vielen Werten bombardiert werden :wink:

Stromzaehler_v2 by_Drapple.php.zip (18.8 KB)

Hallo Drapple,
genau das, was ich noch gebraucht habe. Danke für Deine Arbeit.

Wie schaffe ich es mehrere solcher Zähler auszulesen. Kann ich die im Bus betreiben?
Wie würdest Du programmtechnisch vorgehen?

VG,
Günter

Gesendet von meinem iPad mit Tapatalk HD

Hi das sollte kein Problem sein, jeder Zähler hat seine eigene ID, die du am Zähler einstellen kannst. Der erste Zähler hat 01, den zweiten setzt man dann auf 02, schau dir mal das Ausleseskript an, die ersten zwei Zahlen, sind die ID vom Zähler, wenn du willst kann ich dir heute Abend eine Lösung präsentieren

Hi,
das wäre echt eine Maßnahme. Und ich glaube für einige interessant.

Ich bin nämlich nicht so der Programmierer. Bekomme zwar alles früher oder später hin, aber komplizierter als Profis das machen, schlechter erweiterbar und dabei gehen noch Stunden/Tage ins Land.

'Möchte aber anderen nicht meine Arbeit aufbrummen … (maximal abkupfern :wink:)

VG,
Günter

Gesendet von meinem iPad mit Tapatalk HD

Kein Thema ist in 3min gemacht :wink:

So hier eine Kurzanleitung wie man mehre Zähler einbindet :wink:

Es gibt mehre Möglichkeiten:

  1. Man kann mehrere Zähler am selben Bus haben, aber ich glaube aber nur, wenn man immer den selben Bus hat, also nicht Modbus mit M-Bus kombinieren !

Jeder Zähler hat eine ID z.B. Zähler 1 hat die ID 01 Zähler 2 hat die ID 02 usw. Die ID kann man am Zähler festlegen, siehe Handbuch.

Hier muss man nix anderes machen als die Installation mehrmals durchzuführen, man muss nur wenn ein Zähler fertig ist, die Kategorie umbenennen oder verschieben , sonst wird mein Installationsscript es überschreiben :wink: Man lässt aber ab den 2ten Zähler den Serial Port und die Register Variable usw. weg…, das ist ja alles schon vorhanden. Man kann auch das angepasste auslese Script vom 1 Zähler kopieren, und folgende Anpassungen vornehmen:

Ab den 2ten Zähler ändert man im auslesen Script nur die ID vom Zähler, hier ein Bespiel:

Hier frage ich den Zähler 1 ab, welche Spannung an L1 ist:

$cmd = chr(0x01).chr(0x04).chr(0x00).chr(0x00).chr(0x00).chr(0x02).chr(0x71).chr(0xCB); // Volt 1

Hier frage ich den Zähler 2 ab, welche Spannung an L1 ist:

$cmd = chr(0x02).chr(0x04).chr(0x00).chr(0x00).chr(0x00).chr(0x02).chr(0x71).chr(0xCB); // Volt 1

Das muss nur bei allen Abfragen geändert werden.

Nachteile : Es darf nicht zu gleichen Zeit die auslese Scripte laufen ! Ich würde sie zeitlich versetzt laufen lassen oder ein Script für alle Zähler bauen: Einfach beide auslese Scripte in eins zusammen kopieren, natürlich vorher die Anpassungen machen !

  1. Möglichkeit, pro Zähler einen USB 2 RS485 Adapter benutzen. Dafür muss man nix anderes machen als die Installation mehrmals durchzuführen, man muss nur wenn ein Zähler fertig ist, die Kategorie umbenennen oder verschieben , sonst wird mein Installationsscript es überschreiben :wink:

Vorteil: Man kann jeden Zähler gleichzeitig auslesen lassen !!!

Ich hoffe ich habe es verständlich erklärt :wink: Bei fragen einfach posten :wink:

Danke vielmals! Super Beschreibung - genau mein Niveau. Damit komme ich zurecht!

VG,
Günter

Gesendet von meinem iPad mit Tapatalk HD

Super danke dir, wenn du Hilfe oder Fragen hast, einfach posten oder PN an mich :wink:

Hallo drapple,

danke für deine gute Vorarbeit.

Nach dem Umbau unserer Einspeisung und Hauptverteilung läuft jetzt der erste Zähler.
Leider hat der Project-Importer bei mir nicht funktioniert - hab`s halt händisch erledigt.:stuck_out_tongue:

Hat es einen Grund warum du nicht alle Werte ausliest?

Ich brauche noch die folgenden Werte: CosPhi, die harmonischen Verzerrungen und wenn die PV Anlage läuft die exportierten Werte.

VG

Andreas

PS

Wenn man sich den Chart ansieht, habe ich scheinbar Lesefehler auf der L1 bei der Spannung

Hiho,

kleine Frage zu dem Thema, warum habt ihr nicht die Modbus Splitter / Instanzen direkt verwendet ?
Find das mit der Registervariable sehr Interessant.

Ich lese 10 Zähler allerdings anderer Hersteller direkt an einem Buskabel / USB Stick aus, musste allerdings ein Zyklisches Script anwenden um nicht alle gleichzeitig abzufragen und mir den Modbus zuzuballern.

Hallo,

den nächsten werde ich mal per Modbus auslesen.

Muß nur erstmal schauen woran das Problem bei der L1 liegt.

Andreas

Hast du die Modbus Adressen ? Anleitung etc ?
Dann versuch mal die Adressen -1 hat bei mir so geklappt, warum das so ist konnte mir niemand sagen :slight_smile:

Also zb. Modbus Adresse 1337 => 1336

Grüße

Hi hier mal die komplette Doku :

Hallo drapple.

Hast du auch beim Lesen solche Ausreißer wie ich bei der V L1?

Ich habe eine China RS232 to RS485 Adapter. Hast du am Adapter einen Terminator?
Die Angabe im Datenblatt ist etwas wiedersprüchlich.
Zwei Werte bei der Blindleistung sind auf dem Zähler Display mit negativem Vorzeichen. In der Variablen positiv. :confused:

Die Modbus-Tabelle hatte ich mir schon vom chinesischen Hersteller besorgt.

VG

Andreas

Wie lang ist denn dein Kabel & wieviele Zähler hast du angeschlossen ?
Terminieren solltest du bei längeren Kabeln am letzten Punkt und am ersten mit 120 ohm widerständen.

Zu deiner Frage:

Hast du auch beim Lesen solche Ausreißer wie ich bei der V L1?

Ne, aber wenn ich zu viele Werte hintereinander auslese, bekomme ich auch Fehler…

Zwei Werte bei der Blindleistung sind auf dem Zähler Display mit negativem Vorzeichen. In der Variablen positiv.

Hm dann klappt der Vorzeichenerkenner in der Rechnung nicht :frowning:

Frage von Flobo:

Wie lang ist denn dein Kabel & wieviele Zähler hast du angeschlossen ?

30cm :wink:

Terminieren solltest du bei längeren Kabeln am letzten Punkt und am ersten mit 120 ohm widerständen.

Habe ich nicht gemacht :wink:

Servus,

ich habe mich von diesem Basisscript inspirieren lassen. Ich habe zudem noch Semaphore Enter / Leave eingebaut damit das Script nicht doppelt ausgeführt wird.

Damit könnt ihr einen / mehrere Wert(e) nach dem anderen zyklisch Abfragen, wobei das nur bei mehreren Zähler sinnvoll ist.
Einen Zähler kann man auch so abfragen. Ich werd mal mein Script etwas herrichten und hier veröffentlichen.
Das Problem bei der Zyklischen Abfrage ist das man immer zeitversetzte Werte bekommt, da ist das Modbus RTU einfach zu lahmarschig.

Bei 30cm Kabel muss keine Terminierung rein das ist richtig. Bei mehr sollte man das allerdings machen das musste ich erst letztens durch harte Schule lernen :slight_smile:

Hallo,

ok - sind bis zum derzeit noch ersten Zähler locker über 10m. Werde den Adapter noch terminieren.

Eigendlich interessieren mich nur beim Hauptzähler alle Werte, bei den zusätzlichen Zählern Kann mann sich die Spannung und Frequenz sowieso schenken. :rolleyes:

Wenn endlich die 4 -fach RS485 PCI-Express-Karte für meinen Server kommt werden ich den Datenverkehr sowieso aufteilen.

Komisch wäre warum er nur die Werte für U L1 verstümmelt.

VG

Andreas

Hallo,

habe noch mal direkt am Adapter mit 120Ohm terminiert - kommt nur noch Müll rein.

Terminator bereits im Adapter verbaut.

Andreas

Nur einen ? Kannst du mir mal die Verkabelung grob aufzeichnen.

Normalerweise musst du am Stick terminieren und am Letzten Zähler auf der Busleitung.
So funzt es zumindestens bei mir ganz gut, hab ca. 600 Meter Kabel.