Stromzähler mit RS485

Hallo dfhome,

danke für die Antwort.
So wie ich es verstanden habe, schließt man den Zähler an, führt das Skript aus, und dieses liest den angeschlossenen Zähler aus und erstellt die Variablen.

Habe ich da was falsch verstanden? Verwendest du auch den Zähler?

Grüße
Daniel

Hallo Leute,

ich nochmal. Habe mir jetzt mal den Debug der RegisterVariable angeschaut, hier kommen die Werte an.
Wieso werden diese jetzt nicht weiter verarbeitet?

Habe jetzt allerdings wieder das Skript von marmanga laufen. Was fehlt jetzt noch, um die Daten sauber darzustellen?

Hier der Auszug aus dem Meldungsfenster:

Irgendwelche Ideen?

Danke und schöne Grüße
Daniel

Warum nimmst Du nicht gleich eine ModBus Instanz?
Das ist viel effektiver als über die Systemvariable zu gehen.
Schau mal in der Anleitung von drapple an: http://www.ip-symcon.de/forum/threads/24525-3-Phasen-Stromzähler-SDM630M-DC-alle-Werte-auslesen-!!!-Nativ-auslesen-???p=224363#post224363
Damit sollte es auch möglich sein den DRS110M auszulesen.

Ah sorry, habe grade gesehen, dass du in dem Thread auch aktiv bist.

Hallo mws

Bei mir hat`s über einen RS485 Bus und einer Modbus Instanz in IPS mit dem DRS110M nicht funktioniert. Ich hatte dann nach Stunden aufgegeben. Habe den Zähler zur Zeit nich hier, sönnst könnte ich es mal an einem separaten RS485-Bus testen. Zusammen mit dem SDM hatte es bei mir nicht funktioniert.

Andreas

Hallo mws und Lukky,

vielen Dank für die Antworten.

Nachdem nun ja scheinbar die Werte zumindest in der Registervariable ankommen, müsste ich diese nur noch parsen können. Dies klappt leider mit den von mir bis jetzt benutzten Skripten noch nicht bzw. irgendwas ist falsch eingestellt.

Folgend meine Konfiguration, evtl. findet jemand den Fehler oder kann mir sagen, was falsch ist:

Skript zum Auslesen:


<?
$serialID = "000000000003";        //auszulesende Zähler-ID (12 Stellen), Standard: "000000000000"
$sleep = 280;                //Bei Ausleseschwierigkeiten erhöhen! Standard: 280
$password = "(00000000)";        //Passwort (8 Stellen), Standard: "(00000000)"
$ComPort = 13507 /*[Serial Port]*/ ;              //Serial Port
$RegVar = 35977 /*[Energiedatenverwaltung\BGETech\Meters\Zaehler1\RegisterVariable]*/ ;                   //Register Variable
//-----------------------------------------------------------------------------------------------------------------------------------------------------
$Wcmd = 5;                  //Schreibbefehl; 5 = keiner; 4 = Zähler-ID; 3 = Zeit nullen; 2 = Zählerstand nullen; 1 = Zählerstand und Zeit nullen;

$ID = "000000000032";        //neue Zähler-ID (12 Stellen); z.B.: "000000000032"
//-----------------------------------------------------------------------------------------------------------------------------------------------------

//Init
COMPort_SetOpen($ComPort, true);
IPS_ApplyChanges($ComPort);
$cmd = chr(0x2F).chr(0x3F).$serialID.chr(0x21).chr(0x0D).chr(0x0A);
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
//ACK / Option Select Message senden ('Programming Mode')
$cmd = chr(0x06).chr(0x30).":".chr(0x31).chr(0x0D).chr(0x0A);
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."P1".chr(0x02).$password.chr(0x03).chr(0x61);
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);

//Schreibbefehle---------------------------------------------------------------------------------------------------------------------------------------
if ($Wcmd == 1){
        echo "Zählerstand und Zeit nullen. 
 
";
      // Zähler Reset (0)
        $cmd = chr(0x01)."W1".chr(0x02)."00000040(0)".chr(0x03).chr(0x52);
        COMPort_SendText($ComPort, $cmd);
        IPS_Sleep($sleep);
      // Zeit setzen
        $F = "00000031";
        //$datum = date("ymd",time());
        //$uhrzeit = date("His",time());
        //$W = ($datum."00".$uhrzeit);    // aktuelle Zeit oder
        $W = "00010100000000";                // nullen entspricht 01.01.2000; 00:00:00
        $cmd = "$F"."($W)";
        $bcc = CalcBCC("W1".chr(0x02).$cmd.chr(0x03));
        $CMD = chr(0x01)."W1".chr(0x02).$cmd.chr(0x03).chr($bcc);
        COMPort_SendText($ComPort, $CMD);
        IPS_Sleep($sleep);

}

if ($Wcmd == 2){
      echo "Zählerstand nullen. 
 
";
      //****************** Zähler Reset (0)
        $cmd = chr(0x01)."W1".chr(0x02)."00000040(0)".chr(0x03).chr(0x52);
        COMPort_SendText($ComPort, $cmd);
        IPS_Sleep($sleep);
}

if ($Wcmd == 3){
       echo "Zeit nullen. 
 
";
        // Zeit setzen
        $F = "00000031";
        //$datum = date("ymd",time());
        //$uhrzeit = date("His",time());
        //$W = ($datum."00".$uhrzeit);      // aktuelle Zeit oder
        $W = "00010100000000";              // nullen
        $cmd = "$F"."($W)";
        $bcc = CalcBCC("W1".chr(0x02).$cmd.chr(0x03));
        $CMD = chr(0x01)."W1".chr(0x02).$cmd.chr(0x03).chr($bcc);
        COMPort_SendText($ComPort, $CMD);
        IPS_Sleep($sleep);
}

if ($Wcmd == 4){
      echo "Zähler-ID setzen. 
";
        //Zähler-ID setzen
      $F = "00000036";
        echo "neue Zähler-ID: $ID 
 
";
        $cmd = "$F"."($ID)";
        $bcc = CalcBCC("W1".chr(0x02).$cmd.chr(0x03));
        $CMD = chr(0x01)."W1".chr(0x02).$cmd.chr(0x03).chr($bcc);
        COMPort_SendText($ComPort, $CMD);
        IPS_Sleep($sleep);
}

if ($Wcmd == 5){
      echo "Keine Schreibfunktion ausgewählt! 
 
";
}

//if ($Wcmd == 9){
        //Baudrate setzen
        //$F = "00000035";
        //$W = "0004";      //(0001=1200 (Achtung: sleep auf min. 500!); 00002=2400; 00003=4800; 00004=9600)
        //$cmd = "$F"."($W)";
        //$bcc = CalcBCC("W1".chr(0x02).$cmd.chr(0x03));
        //$CMD = chr(0x01)."W1".chr(0x02).$cmd.chr(0x03).chr($bcc);
        //COMPort_SendText($ComPort, $CMD);
        //IPS_Sleep($sleep);
//}

//Abfrage---------------------------------------------------------------------------------------------------------------------------------------
$cmd = chr(0x01)."R1".chr(0x02)."00000000()".chr(0x03).chr(0x63);                                    //****************** Spannung
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000001()".chr(0x03).chr(0x62);                                    //****************** Strom
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000002()".chr(0x03).chr(0x61);                                    //****************** Frequenz
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000003()".chr(0x03).chr(0x60);                                    //****************** Wirkleistung
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000004()".chr(0x03).chr(0x67);                                    //****************** Blindleistung
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000005()".chr(0x03).chr(0x66);                                    //****************** Scheinleistung
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000006()".chr(0x03).chr(0x65);                                    //****************** Leistungsfaktor
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000010()".chr(0x03).chr(0x62);                                    //****************** Gesamtleistung/Zählerstand
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000011()".chr(0x03).chr(0x63);                                    //****************** Gesamtleistung/Zählerstand (Kopie von ...10)
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000020()".chr(0x03).chr(0x61);                                    //****************** Energie in Rückwärtsrichtung
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000021()".chr(0x03).chr(0x60);                                    //****************** Energie in Rückwärtsrichtung (Kopie von ...20)
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000031()".chr(0x03).chr(0x61);                                    //****************** Zeit (YYMMTT??hhmmss)
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000032()".chr(0x03).chr(0x62);                                    //****************** Temperatur
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000034()".chr(0x03).chr(0x64);                                    //****************** Seriennummer
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000035()".chr(0x03).chr(0x65);                                    //****************** Baudrate
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."R1".chr(0x02)."00000036()".chr(0x03).chr(0x66);                                    //****************** Zähler-ID
COMPort_SendText($ComPort, $cmd);
IPS_Sleep($sleep);
$cmd = chr(0x01)."B0".chr(0x03).chr(0x71);
COMPort_SendText($ComPort, $cmd);
COMPort_SetOpen($ComPort, false);
IPS_ApplyChanges($ComPort);
IPS_Sleep($sleep);
//Auslesen------------------------------------------------------------------------------------------------------------------------------------------------
$data = RegVar_GetBuffer($RegVar);
echo "Data: $data 
";
$value = substr($data, strpos($data, "/")+1,3);                                                                            //Hersteller (Antwort)
echo "Antwort Hersteller:    $value 
";
$value = substr($data, strpos($data, ":")+1,12);                                                                        //Zähler-ID (Antwort)
echo "Antwort Zähler-ID:    $value 
";
$value = substr($data, strpos($data, "00000000(")+9,4)/10;                                                            //Spannung / 10 V
echo "Spannung:                $value V 
";
//SetValue(35532 /*[Objekt #35532 existiert nicht]*/, $value);
$value = substr($data, strpos($data, "00000001(")+9,4)/10; //Strom                                               //Strom / 10 A
echo "Strom:                    $value A 
";
//SetValue(45094 /*[Objekt #45094 existiert nicht]*/, $value);
$value = substr($data, strpos($data, "00000002(")+9,4)/10;                                                            //Frequenz / 10 HZ
echo "Frequenz:                $value Hz 
";
//SetValue(51097 /*[Objekt #51097 existiert nicht]*/, $value);
$value = substr($data, strpos($data, "00000003(")+9,4)*10;                                                    //Wirkleistung x 10 W
echo "Wirkleistung:            $value W 
";
//SetValue(14053 /*[Objekt #14053 existiert nicht]*/, $value);
$value = substr($data, strpos($data, "00000004(")+9,4)*10;                                                            //Blindleistung x 10 VAr (nur bei induktiver Last)
echo "Blindleistung:            $value VAr 
";
//SetValue(52726 /*[Objekt #52726 existiert nicht]*/, $value);
$value = substr($data, strpos($data, "00000005(")+9,4)*10;                                                           //Scheinleistung x 10 VA
echo "Scheinleistung:        $value VA 
";
//SetValue(14444 /*[Objekt #14444 existiert nicht]*/, $value);
$value = substr($data, strpos($data, "00000006(")+9,4)/1000;                                                         //Leistungsfaktor / 1000
echo "Leistungsfaktor:        $value 
";
//SetValue(24547 /*[Objekt #24547 existiert nicht]*/, $value);
$value = substr($data, strpos($data, "00000010(")+9,8)/1000;                                                        //Gesamtleistung/Zählerstand / 1000 kWh
echo "Zählerstand 1:            $value kWh 
";
//SetValue(23900 /*[Objekt #23900 existiert nicht]*/, $value);
$value = substr($data, strpos($data, "00000011(")+9,8)/1000;                                                        //Gesamtleistung/Zählerstand / 1000 kWh (Kopie von ...10)
echo "Zählerstand 2:            $value kWh 
";
//SetValue(35912 /*[Objekt #35912 existiert nicht]*/, $value);
$value = substr($data, strpos($data, "00000020(")+9,8)/1000;                                                         //Energie in Rückwärtsrichtung / 1000 kWh
echo "Leistung auswärts 1:    $value kWh 
";
//SetValue(54517 /*[Objekt #54517 existiert nicht]*/, $value);
$value = substr($data, strpos($data, "00000021(")+9,8)/1000;                                                         //Energie in Rückwärtsrichtung / 1000 kWh (Kopie von ...20)
echo "Leistung auswärts 2:    $value kWh 
";
$tmp = substr($data, strpos($data, "00000031(")+9,14);                                                                //Zeit (YYMMDDxxhhmmss) xx = Tage seit Reset
$value =  substr($tmp,4,2).".".substr($tmp,2,2).".20".substr($tmp,0,2)."; ".substr($tmp,8,2).":".substr($tmp,10,2).":".substr($tmp,12,2)."
";
echo "Zeit:                        $value";
//SetValue(36489 /*[Objekt #36489 existiert nicht]*/, $value);
$value = substr($data, strpos($data, "00000032(")+9,4)/1;                                                            //Temperatur / °C (ändert sich nicht)
echo "Temperatur:                $value °C 
";
//SetValue(52124 /*[Objekt #52124 existiert nicht]*/, $value);
$value = substr($data, strpos($data, "00000034(")+9,12);                                                                //Seriennummer
echo "Seriennummer:            $value 
";
//SetValue(47632 /*[Objekt #47632 existiert nicht]*/, $value);
$value = substr($data, strpos($data, "00000035(")+9,4)*1;                                                            //Baudrate
echo "Baudrate:                $value    (1=1200; 2=2400; 3=4800; 4=9600)
";
//SetValue(52967 /*[Objekt #52967 existiert nicht]*/, $value);
$value = substr($data, strpos($data, "00000036(")+9,12);                                                                //Zähler-ID
echo "Zähler-ID:                $value 
";
//SetValue(23885 /*[Objekt #23885 existiert nicht]*/, $value);

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

//Checksumme berechnen_________________________________________________________________________________________________________________________________________
function CalcBCC($string) {
    $bcc = "";
   for ($i = 0; $i <= strlen($string); $i++) {
       $bcc = $bcc ^ ord(substr($string, $i, 1));
   }
   return ("0x".dechex($bcc));
   }
//_____________________________________________________________________________________________________________________________________________________________

?>

Registervariable:

Skript der Registervariable:

Skript_Register.png

Konfiguration/Struktur:

Wäre schön, wenn mir hier jemand weiterhelfen könnte. Probiere nun schon ca. Wochen, den Stromzähler einzulesen…

Vielen Dank und schöne Grüße
Daniel

Hallo Daniel,
genau wie dein Problem, haben schon andere User bei diesen Thema beschrieben.
Dein SDM dürfte recht komplex auszulesen sein ( gegenüber den SDM630 ).
Vielleicht hat schon einer die Lösung gefunden.
Da nicht immer alle im Forum, nach der Problemlösung wieder im selben Thema online gehen,
hilft nur ein Anstoß per PM.
Habe bei mir den SDM stromlos machen müssen, dann hat es funktioniert.

Viel Glück

In dem Skript müssen nur noch die IDs angepasst werden. :wink:

Sent from my iPhone using Tapatalk