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

Modbus:

Mein Script:

<?
$id_modbus = 44853 /*[Strom\Stromzähler SDM630M DC\Andreas ModBus\Spannung L1]*/;
$id_modbus_value = 18999 /*[Strom\PV-Anlage\SDM630M DC\Total Power\Value]*/;
$id_float = 34823 /*[Strom\Stromzähler SDM630M DC\Andreas ModBus\Spannung L1]*/;

    //********************************************** Total System Power ****************************************
    $successful = ModBus_RequestRead($id_modbus);
//    $successful = ModBus_RequestRead(IPS_GetParent($id_modbus_value));
    if($successful) {
     $data = GetValueInteger($id_modbus_value);
     echo "\$data = " . $data . "
";
     $ergebnis = GetFloatValue($data);
      echo "\$ergebnis = " . $ergebnis . "
";
     SetValueFloat($id_float,$ergebnis);

    }


        function GetFloatValue($data)
    {
        $value = dechex($data);

        $wert1=hexdec(substr($value, 0, 2));
        $wert2=hexdec(substr($value, 2, 2));
        $wert3=hexdec(substr($value, 4, 2));
        $wert4=hexdec(substr($value, 6, 2));

        $sign = $wert1 >> 7;
        $exponent = (($wert1 & 0x7F) << 1) + (($wert2 & 0x80) >> 7) - 127;
        $mantisse = (($wert2 | 0x80) << 16) + ($wert3 << 8) + $wert4;
        $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;
        }

        return($zaehler);
    }


?>



Ich habe mal das Register für die Frequenz 46 (hex) bzw. 70 (dec) genommen oder die Spannung L3 (04 bzw. 4) - egal welches Register - immer nur diese Werte:

$data = 1125775978
$ergebnis = 153.97819828727


![1.JPG|812x676](upload://97H8ec0Qq9aYNBm6wDUGpfTuiRa.jpeg)



![2.JPG|812x676](upload://pdpd2GTIrXJ28kOn1r4o5bouU6c.jpeg)

Kann es sein, dass Deine Variablen falsch gesetzt werden?

Du hast als ModBus Adresse:

$id_modbus = 44853 /*[Strom\Stromzähler SDM630M DC\Andreas ModBus\Spannung L1]*/; 

eingetragen und das Value das Du ausliest, wenn der Aufruf geklappt hat liegt hier:

$id_modbus_value = 18999 /*[Strom\PV-Anlage\SDM630M DC\Total Power\Value]*/; 

Bei mir liegt das Value immer genau unter dem ModBus Gerät!

Deshalb nehme ich auch das Value als Variable und lese das zugehörige ModBus Gerät aus (so wie Du es in der Kommentarzeile stehen hast) und schreibe den Float dann entsprechend weg.

Hier mal ein Beispiel nur für die Frequenz:

<?

	//ModBus
	//Frequenz
	$mbhz = 37082 /*[Geräte\Erdgeschoss\Wirtschaftsraum\Hauptzähler\Frequenz\Value]*/;
	
	// Ergebniswerte
	// Frequenz
	$hz=48985 /*[Program\Energie\Hauptzähler\Data\Sonstiges\Frequenz]*/ ;

	//*********************************************Frequenz auslesen****************************************
	$successful = ModBus_RequestRead(IPS_GetParent($mbhz));
	if($successful) {
	 $data = GetValueInteger($mbhz);
	 $ergebnis = GetFloatValue($data);
	 SetValueFloat($hz,$ergebnis);
	}

	function GetFloatValue($data)
	{
		$value = dechex($data);

		$wert1=hexdec(substr($value, 0, 2));
		$wert2=hexdec(substr($value, 2, 2));
		$wert3=hexdec(substr($value, 4, 2));
		$wert4=hexdec(substr($value, 6, 2));

		$sign = $wert1 >> 7;
		$exponent = (($wert1 & 0x7F) << 1) + (($wert2 & 0x80) >> 7) - 127;
		$mantisse = (($wert2 | 0x80) << 16) + ($wert3 << 8) + $wert4;
		$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;
		}

		return($zaehler);
	}
?>

Ansonsten scheinen die Einstellungen richtig zu sein.

Ich Hirn!:confused:

Das kommt davon, wenn man in der Schule (fast) nie abschreiben brauchte und es demnach nie wirklich richtig lernen musste.:smiley: Nun kommen unterschiedliche Werte. Danke. Also Guttenb… ist auch nicht immer gut.

Die aktuelle Gesamtleistung ist die Summe von P1, P2 und P3? Und wird als Total system power aus dem Register 34hex gelesen? Diese liegt gerade bei 0.002334. Das kann doch nicht sein. Greife ich evtl. das falsche Register ab?

Das Register ist richtig. Hast Du im Zähler ggf. eine andere Einheit stehen? Das kann man über die Konfiguration glaube ich einstellen. Der Wert der in der Float Var steht sollte der gleiche sein, der auch auf dem Display angezeigt wird!

SO vergisst alles was ich und @mws geschrieben haben, wir haben die perfekte Lösung gefunden:

So ich habe fertig

Hier die neue und letzte Version meiner Anleitung für den SMD 630 DC:

http://www.ip-symcon.de/forum/threads/24525-3-Phasen-Stromzähler-SDM630M-DC-alle-Werte-auslesen-!!!-Nativ-auslesen-!!!

Hallo wolte mal nachfragen ob mir wer sagen kann ob die hier beschriebenen skribte auch für diesen Zägler gehn: DRT710M
http://bg-etech.de/os/product_info.php?cPath=25_28&products_id=31
Danke im voraus

Die Anleitung ist auch für Dein Messgerät anwendbar, Du hast nur andere Modbusadressen, ev. auch 'ne andere ID.

Schau Dir das PDF an, rechne die Modbusadressen von Hex nach Dec um, fertig.

Gruß Helmut

Danke für die Antwort

Ich arbeite bei meiner Hausautomatisierung per Funk. (Z-Wave, bald noch mit enOcean)

Wie kann ich am besten die Daten des RS485 USB-Adapters per Funk übertragen?

In der Bucht nach HC-12 mit 433MHz suchen oder goggel mal nach RS232 433MHz HC 12. Damit habe ich gute Erfahrungen.

Siehe Beitrag Wasserstand Sensor mit Ultraschall von mir.

Gruß Helmut