Stromzähler mit RS485

Ok, Danke!

Habe viel Probiert und habe es geschafft!
Ich habe mal eine kleine Anleitung erstellt.

Funktioniert alles ohne Skript!

Wie bekomme ich das Komando für die baud Rate 9600 an das DRS-210C gesendet?

Modbus RTU DRS210C DE Anleitung.pdf (447 KB)

Das ist ja prima.
Beim Schreiben z.B. der Geschwinfidgkeit soll man erst einmal etwas lesen (Seriennummer) und dann das Register 0x1020 mit 10 schreiben können, wobei 03 und 04 zum Lesen ist. Probiert habe ich aus Zeitgründen noch nicht. Hatte das auch schon angefragt, vielleicht meldet man sich bei mir.

Und A und B muss man tauschen?

PS: Sehe gerade im pdf steht ganz unten ein Beispiel.

Ja beim testen habe ich nie was empfangen außer Daten Mist.
Habe dann Spaßeshalber mal die Polung der Datenleitung gedreht und alles klappte aufeinmal.

Wo kann man mit schreiben? Skript?

Hi dein Anleitung Funktioniert auch beim SMD630 !!! Hammer kein Umrechnen mehr kein Script !!!

Anleitung folgt !!!

Hallo drapple.

warte mit Spannung auf deine Anleitung. Mit der alten Lösung komme ich nicht weiter. Zu viele Fehler auch wenn nur ein Wert ausgelesen wird.

siehe Frequenz

Habe es mal einen Freund gezeigt, der meint es läge an der fehlenden CRC-Prüfung. Die Leitungslänge bei mir zu den Zählern beträgt ca 15 Meter und nicht wie bei dier ein paar Zentimeter.

Andreas

Ja cool, das funktioniert wirklich. Ich hab schon alles umgestellt und die Werte sehen super aus!

Hi nimm diese Anleitung :

Du musst nur bei der Leseadresse die Modbusadresse von Hex in Dec umrechnen zum Testen :

L1 = 0 L2= 2 L3=4

Kein Script kein Umrechnen mehr !!!

So ich habe fertig :wink:

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-!!!

Zum Ändern von Baudrate und ID lt. B+G:

Baudrate ändern:

00 03 10 00 00 08 41 1D

00 10 10 20 09 12 09 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1B F7

ID ändern:

00 03 10 00 00 08 41 1D

00 10 10 18 00 09 12 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2E 52

Hat das mal jemand probiert? Bei mir klappt das nicht. Ich komme immer noch mit 1200 baud an den Zähler, würde ihn aber auf 9600 umstellen wollen, um den 630er auch mit auf den Bus zu bekommen.

Hallo,
da der Thread hier so einfach endet und ich selbst suchen musste wie man die Baudrate am DRS-210C umstellt,
hier meine Vorgehensweise dazu:

Zum ändern der Baudrate habe ich QModMasterverwendet.
Damit habe ich in die Startadresse 4128 den Wert 2580 geschrieben.
Bilder sagen mehr als tausend Worte, deshalb Screenshot im Anhang.
Die ModbusID kann mit Startadresse 4120 geändert werden.
Achtung nach schreiben von z.B. Baudrate muss man die Verbindungseinstellungen natürlich in QModMaster anpassen.

140517-ModbusMaster-05.png
140517-ModbusMaster-02.png

Hallo Forum,

ich habe mir 2 DRS110M von R+G Tech erworben und versuche diese mit folgenden Script auszulesen.


 <? 
include("IPSInstaller.ips.php");
$sleep = 300;
$password = "(00000000)"; 
$BGETechComPortID=41163;
$BGETechRegVarID=11604;
$BGETechMetersID = 17971;
define ("SOH", "\x01"); // StartofHeader
define ("STX", "\x02"); // StartofText
define ("ETX", "\x03"); // EndofText
define ("ACK", "\x06"); // Acknowledge

Switch ($IPS_SENDER) {
  Default:
      IPS_LogMessage("BGETech_Controller","Sender unbekannt: ".$IPS_SENDER);
     break;
  Case "RunScript":  //Zählerstände löschen
    foreach(IPS_GetChildrenIDs($idBGETechMeters) as $meter) {   // alle Unterobjekte durchlaufen
      RegVar_SetBuffer($BGETechRegVarID, ""); 
      $serial = GetValue(IPS_GetVariableIDByName("MeterID", $meter));
      $cmd = "/?".$serial."!
"; 
      COMPort_SendText($BGETechComPortID, $cmd); 
      IPS_Sleep($sleep); 
      $cmd = ACK."0:1
";  //ACK / Option Select Message senden ('Programming Mode') 
      COMPort_SendText($BGETechComPortID, $cmd); 
      IPS_Sleep($sleep); 
      $cmd = "P1".STX.$password.ETX; 
      COMPort_SendText($BGETechComPortID, genCmd($cmd)); 
      IPS_Sleep($sleep); 
      $cmd = "W1".STX."00000040(0)".ETX; 
      COMPort_SendText($BGETechComPortID, genCmd($cmd)); 
      IPS_Sleep($sleep); 
      $cmd = "B0".ETX; 
      COMPort_SendText($BGETechComPortID, genCmd($cmd)); 
      IPS_Sleep($sleep); 
      $data = RegVar_GetBuffer($BGETechRegVarID);
      /*  Antwortbuffer: 
        0 -18 /YTL:xxxxxxxxxxxx..
        19-32 .P0.(00000000).
        34 (ACK)
        35 (ACK)
      */ 
      IPS_LogMessage("BGETech_Controller","Reset Zählerstand Meter ".bin2hex($data));
      if (strlen($data) == 36) {
        IPS_LogMessage("BGETech_Controller","Reset Zählerstand Meter ".$serial."Ok");
      }
      else {
        IPS_LogMessage("BGETech_Controller","Reset Zählerstand Meter ".$serial."nOk");
        $id=CreateVariable("ComError", 1, $idBGETechMeters);
        SetValue($id,GetValue($id)+1);
      } 
      IPS_Sleep($sleep); 
      RegVar_SetBuffer($BGETechRegVarID, ""); 
    }
    break;
  Case "WebFront":
  Case "Execute":  //Meter anlegen MeterID schreiben
    RegVar_SetBuffer($BGETechRegVarID, "");
    $cmd = "/?000000000000!
";
    COMPort_SendText($BGETechComPortID, $cmd);
    IPS_Sleep($sleep); 
    //ACK / Option Select Message senden ('Programming Mode') 
    $cmd = ACK."0:1
"; 
    COMPort_SendText($BGETechComPortID, $cmd); 
    IPS_Sleep($sleep); 
    $cmd = "P1".STX.$password.ETX;
    COMPort_SendText($BGETechComPortID, genCmd($cmd));
    IPS_Sleep($sleep);
    $cmd = "R1".STX."00000034()".ETX;
    COMPort_SendText($BGETechComPortID, genCmd($cmd)); 
    IPS_Sleep($sleep*2);
    $data = RegVar_GetBuffer($BGETechRegVarID);
    /*  Antwortbuffer: 
      0 -18 /YTL:xxxxxxxxxxxx..
      19-34 .P0.(00000000)..
      35 (ACK)
      36-60 .00000034(xxxxxxxxxxxx)..
    */ 
    RegVar_SetBuffer($BGETechRegVarID, ""); 
    if (strlen($data) == 61) {
      $serial = (substr($data, 46, 12));
      $cmd = "W1".STX."00000036(".$serial.")".ETX;
      COMPort_SendText($BGETechComPortID, genCmd($cmd));
      IPS_Sleep($sleep); 
      $cmd = "B0".ETX; 
      COMPort_SendText($BGETechComPortID, genCmd($cmd)); 
      IPS_Sleep($sleep); 
      $data = RegVar_GetBuffer($BGETechRegVarID);
      /*  Antwortbuffer: 
        0 (ACK)
      */ 
      RegVar_SetBuffer($BGETechRegVarID, ""); 
      if ((strlen($data) == 1) && ($data[0]==ACK)) {
        $archiveHandlerID = IPS_GetInstanceIDByName("Archive Handler", 0);
        $item = CreateDummyInstance($serial, $BGETechMetersID);
        IPS_SetHidden(CreateVariable("MeterID", 3, $item, 0, "", 0, $serial),true);
        $id=CreateVariable("Leistung", 2, $item, 0, "~Watt.3680", 0, 0);
        AC_SetLoggingStatus($archiveHandlerID,$id,true);
        AC_SetAggregationType($archiveHandlerID, $id, 0); 
        $id=CreateVariable("Gesamtverbrauch", 2, $item, 0, "~Electricity", 0, 0); //~Electricity
        AC_SetLoggingStatus($archiveHandlerID,$id,true);
        AC_SetAggregationType($archiveHandlerID, $id, 1); 
        printf("Meter ".$serial." created
");
      }
    }
    else printf ("Falsche Antwort: ".bin2hex($data)."
".strlen($data));
    //break;
  Case "TimerEvent":
    $errorid=CreateVariable("ComError", 1, IPS_GetParent($BGETechMetersID));
    $lasterror=GetValue($errorid);
    foreach(IPS_GetChildrenIDs($BGETechMetersID) as $meter){   // alle Unterobjekte durchlaufen
      $ok=false;
      $ec=0;
      $data="";
      RegVar_SetBuffer($BGETechRegVarID, ""); 
      $serial = GetValue(IPS_GetVariableIDByName("MeterID", $meter));
      $cmd = "/?".$serial."!
";
      COMPort_SendText($BGETechComPortID, $cmd); 
      if (getAnswer(19)) { 
        $cmd = ACK."0:1
";  //ACK / Option Select Message senden ('Programming Mode') 
        COMPort_SendText($BGETechComPortID, $cmd); 
        if (getAnswer(35)) { 
          $cmd = "P1".STX.$password.ETX; 
          COMPort_SendText($BGETechComPortID, genCmd($cmd)); 
          if (getAnswer(36)) { 
            $cmd = "R1".STX."00000010()".ETX; 
            COMPort_SendText($BGETechComPortID, genCmd($cmd)); 
            if (getAnswer(57)) {
              $cmd = "R1".STX."00000003()".ETX; 
              COMPort_SendText($BGETechComPortID, genCMD($cmd)); 
              if (getAnswer(73)) {
                $cmd = "B0".ETX; 
                COMPort_SendText($BGETechComPortID, genCmd($cmd)); 
                if (getAnswer(74)) {
                  $data = RegVar_GetBuffer($BGETechRegVarID);
                  $ok=true;
                }
              }
            }
          }
        }
      }
      if (!$ok) {
        $data = RegVar_GetBuffer($BGETechRegVarID);
        $ec=1;
      }
      else if (substr($data,0,34)<>"/YTL:".$serial."
".SOH."P0".STX."(00000000)".ETX) {
        $ok=false;
        $ec=2;
      }
      else if ($data[35]!=ACK) {
        $ok=false;
        $ec=3;
      }
      if ($ok) {
        /*  Antwortbuffer: 
          0 -18 /YTL:xxxxxxxxxxxx..
          19-34 .P0.(00000000)..
          35 (ACK)
          36-56 .00000010(xxxxxxxx)..
          57-73 .00000003(xxxx)..
        */ 
        if (substr($data,37,9)=="00000010(") {
          $value = floatval(substr($data, 46, 8)); 
                SetValue(IPS_GetVariableIDByName("Gesamtverbrauch", $meter), floor($value/100)/10);
        } else $ec=4;
        if (substr($data,58,9)=="00000003(") {
          $value = floatval(substr($data, 67, 4));
          SetValue(IPS_GetVariableIDByName("Leistung", $meter), $value*10);
        } else $ec+=5;
      }
      if ($ec) {
        // 1 nok 2 Header falsch 3 kein Ack  4 Leistung 5 Power 9 L+P
        IPS_LogMessage("BGETech_Controller","Errorcause:".$ec."/".$serial."-".$data);
        SetValue($errorid,GetValue($errorid)+1);
        RegVar_SetBuffer($BGETechRegVarID, "");
      } 
      if ($ok) IPS_Sleep($sleep); else IPS_Sleep($sleep*5); 
    }   
    if ((GetValue($errorid)-$lasterror)>5) {
         COMPort_SetOpen( $BGETechComPortID /*[Plugwise]*/, false );
        IPS_ApplyChanges( $BGETechComPortID /*[Plugwise]*/ );
        COMPort_SetOpen( $BGETechComPortID /*[Plugwise]*/, true );
        IPS_ApplyChanges( $BGETechComPortID /*[Plugwise]*/ );
    }
        else SetValueString(CreateVariable("LastUpdate", 3, IPS_GetParent($BGETechMetersID)),date("d.m.y H:i:s"));
    break;
  Case "RegisterVariable": //
    $datenFrame = RegVar_GetBuffer($IPS_INSTANCE); // Buffer Registervariable auslesen
    $datenFrame .= $IPS_VALUE;
    RegVar_SetBuffer($IPS_INSTANCE,$datenFrame);
    break;
}

function genCmd($cmd) { //generiert Sendestring mit SOH und Checksumme
  $cc=0;
  for($i=0; $i<strlen($cmd); $i++) $cc ^=ord($cmd[$i]);
  return chr(1).$cmd.chr($cc);
} 
 
function getAnswer($len) {
  global $BGETechRegVarID,$sleep;
  $i=0;
  $x=strlen(RegVar_GetBuffer($BGETechRegVarID));
  while (($x!=$len) && ($i++<($sleep/5))) {
   IPS_Sleep(10);
   $x=strlen(RegVar_GetBuffer($BGETechRegVarID));
  }
  return ($x>=$len);
} 
?> 

Ich erhalte folgende Rückmeldung vom Script:

Falsche Antwort: 0
Warning: Objekt #1 existiert nicht in C:\IP-Symcon\scripts\53704.ips.php on line 109
Warning: Objekt #1 existiert nicht in C:\IP-Symcon\scripts\53704.ips.php on line 111
Warning: Invalid argument supplied for foreach() in C:\IP-Symcon\scripts\53704.ips.php on line 111
Warning: Objekt #1 existiert nicht in C:\IP-Symcon\scripts\53704.ips.php on line 186

Diese Werte sehe ich im Debugmodus:

Meine Frage, was läuft hier noch nicht ganz rund ??

Hat hier jemand einen Rat oder nützlichen Tip um das ans laufen zu bekommen?
( oder gibt es darüber hinaus mittlerweile bessere Wege, die Zähler auszulesen ? )

Vielen Dank im voraus.

Gruß Achim

Hallo Forum,

ich kämpfe seit Tage mit diesem Script von Marmangra.

 <?
$serialID = "000000000032";        //auszulesende Zähler-ID (12 Stellen), Standard: "000000000000"
$sleep = 280;                //Bei Ausleseschwierigkeiten erhöhen! Standard: 280
$password = "(00000000)";        //Passwort (8 Stellen), Standard: "(00000000)"
$ComPort = 10587 /*[Serial Port RS232-485 com 8 - Elektrozähler]*/;              //Serial Port
$RegVar = 10239 /*[Info\Elektrozähler\Register Variable]*/;                   //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 /*[Info\Elektrozähler\Administration\Spannung]*/, $value);
$value = substr($data, strpos($data, "00000001(")+9,4)/10; //Strom                                               //Strom / 10 A
echo "Strom:                    $value A 
";
//SetValue(45094 /*[Info\Elektrozähler\Administration\Strom]*/, $value);
$value = substr($data, strpos($data, "00000002(")+9,4)/10;                                                            //Frequenz / 10 HZ
echo "Frequenz:                $value Hz 
";
//SetValue(51097 /*[Info\Elektrozähler\Administration\Frequenz]*/, $value);
$value = substr($data, strpos($data, "00000003(")+9,4)*10;                                                    //Wirkleistung x 10 W
echo "Wirkleistung:            $value W 
";
//SetValue(14053 /*[Info\Elektrozähler\Administration\Wirkleistung]*/, $value);
$value = substr($data, strpos($data, "00000004(")+9,4)*10;                                                            //Blindleistung x 10 VAr (nur bei induktiver Last)
echo "Blindleistung:            $value VAr 
";
//SetValue(52726 /*[Info\Elektrozähler\Administration\Blindleistung]*/, $value);
$value = substr($data, strpos($data, "00000005(")+9,4)*10;                                                           //Scheinleistung x 10 VA
echo "Scheinleistung:        $value VA 
";
//SetValue(14444 /*[Info\Elektrozähler\Administration\Scheinleistung]*/, $value);
$value = substr($data, strpos($data, "00000006(")+9,4)/1000;                                                         //Leistungsfaktor / 1000
echo "Leistungsfaktor:        $value 
";
//SetValue(24547 /*[Info\Elektrozähler\Administration\Leistungsfaktor]*/, $value);
$value = substr($data, strpos($data, "00000010(")+9,8)/1000;                                                        //Gesamtleistung/Zählerstand / 1000 kWh
echo "Zählerstand 1:            $value kWh 
";
//SetValue(23900 /*[Info\Elektrozähler\Administration\Zählerstand / Gesamtleistung -1-]*/, $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 /*[Info\Elektrozähler\Administration\Zählerstand / Gesamtleistung -2-]*/, $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 /*[Info\Elektrozähler\Administration\Energie rückwärts]*/, $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 /*[Info\Elektrozähler\Administration\Zeit]*/, $value);
$value = substr($data, strpos($data, "00000032(")+9,4)/1;                                                            //Temperatur / °C (ändert sich nicht)
echo "Temperatur:                $value °C 
";
//SetValue(52124 /*[Info\Elektrozähler\Administration\Temperatur (ignorieren)]*/, $value);
$value = substr($data, strpos($data, "00000034(")+9,12);                                                                //Seriennummer
echo "Seriennummer:            $value 
";
//SetValue(47632 /*[Info\Elektrozähler\Administration\Seriennummer]*/, $value);
$value = substr($data, strpos($data, "00000035(")+9,4)*1;                                                            //Baudrate
echo "Baudrate:                $value    (1=1200; 2=2400; 3=4800; 4=9600)
";
//SetValue(52967 /*[Info\Elektrozähler\Administration\Baud]*/, $value);
$value = substr($data, strpos($data, "00000036(")+9,12);                                                                //Zähler-ID
echo "Zähler-ID:                $value 
";
//SetValue(23885 /*[Info\Elektrozähler\Administration\Zähler-ID]*/, $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));
   }
//_____________________________________________________________________________________________________________________________________________________________

?> 

Beim Auslösen sehe ich im Debugmodus auf dem ComPort folgedens:

2.6.2014 11:24:44.00 | TRANSMITTED | 2F 3F 30 30 30 30 30 30 30 30 30 30 30 30 21 0D 0A
2.6.2014 11:24:44.00 | RECEIVED | 2F 59 54 4C 3A 30
2.6.2014 11:24:44.00 | RECEIVED | 30 30 30 30 30 30 30 30 30 30 30 0D 0A
2.6.2014 11:24:44.00 | TRANSMITTED | 06 30 3A 31 0D 0A
2.6.2014 11:24:44.00 | RECEIVED | 01 50 30 02 28 30 30 30 30 30 30 30 30
2.6.2014 11:24:44.00 | RECEIVED | 29 03 60
2.6.2014 11:24:45.00 | TRANSMITTED | 01 50 31 02 28 30 30 30 30 30 30 30 30 29 03 61
2.6.2014 11:24:45.00 | RECEIVED | 06
2.6.2014 11:24:45.00 | TRANSMITTED | 01 52 31 02 30 30 30 30 30 30 30 30 28 29 03 63
2.6.2014 11:24:45.00 | RECEIVED | 02 30
2.6.2014 11:24:45.00 | RECEIVED | 30 30 30 30 30 30 30 28 32 32 35 37 29
2.6.2014 11:24:45.00 | RECEIVED | 03 00
2.6.2014 11:24:46.00 | TRANSMITTED | 01 52 31 02 30 30 30 30 30 30 30 31 28 29 03 62
2.6.2014 11:24:46.00 | RECEIVED | 02 30 30 30 30 30 30
2.6.2014 11:24:46.00 | RECEIVED | 30 31 28 30 30 31 35 29 03 07
2.6.2014 11:24:46.00 | TRANSMITTED | 01 52 31 02 30 30 30 30 30 30 30 32 28 29 03 61
2.6.2014 11:24:46.00 | RECEIVED | 02 30 30 30 30 30 30 30
2.6.2014 11:24:46.00 | RECEIVED | 32 28 30 34 39 39 29 03 04
2.6.2014 11:24:47.00 | TRANSMITTED | 01 52 31 02 30 30 30 30 30 30 30 33 28 29 03 60
2.6.2014 11:24:47.00 | RECEIVED | 02
2.6.2014 11:24:47.00 | RECEIVED | 30 30 30 30 30 30 30 33 28 30 30 33 36
2.6.2014 11:24:47.00 | RECEIVED | 29 03 04
2.6.2014 11:24:47.00 | TRANSMITTED | 01 52 31 02 30 30 30 30 30 30 30 34 28 29 03 67
2.6.2014 11:24:47.00 | RECEIVED | 02 30 30 30 30
2.6.2014 11:24:47.00 | RECEIVED | 30 30 30 34 28 30 30 30 30 29 03 06
2.6.2014 11:24:48.00 | TRANSMITTED | 01 52 31 02 30 30 30 30 30 30 30 35 28 29 03 66
2.6.2014 11:24:48.00 | RECEIVED | 02 30 30 30
2.6.2014 11:24:48.00 | RECEIVED | 30 30 30 30 35 28 30 30 33 36 29 03 02
2.6.2014 11:24:48.00 | TRANSMITTED | 01 52 31 02 30 30 30 30 30 30 30 36 28 29 03 65
2.6.2014 11:24:48.00 | RECEIVED | 02 30 30 30 30 30 30 30 36 28 31 30 30
2.6.2014 11:24:48.00 | RECEIVED | 30 29 03 05
2.6.2014 11:24:49.00 | TRANSMITTED | 01 52 31 02 30 30 30 30 30 30 31 30 28 29 03 62
2.6.2014 11:24:49.00 | RECEIVED | 02 30 30 30 30 30 30 31 30 28 30 30
2.6.2014 11:24:49.00 | RECEIVED | 34 34 34 38 31 34 29 03 0A
2.6.2014 11:24:49.00 | TRANSMITTED | 01 52 31 02 30 30 30 30 30 30 31 31 28 29 03 63
2.6.2014 11:24:49.00 | RECEIVED | 02 30 30 30 30 30 30 31 31 28
2.6.2014 11:24:49.00 | RECEIVED | 30 30 34 34 34 38 31 34 29 03 0B
2.6.2014 11:24:50.00 | TRANSMITTED | 01 52 31 02 30 30 30 30 30 30 32 30 28 29 03 61
2.6.2014 11:24:50.00 | RECEIVED | 02
2.6.2014 11:24:50.00 | RECEIVED | 30 30 30 30 30 30 32 30 28 30 30 32 36
2.6.2014 11:24:50.00 | RECEIVED | 31 30 34 31 29 03 00
2.6.2014 11:24:50.00 | TRANSMITTED | 01 52 31 02 30 30 30 30 30 30 32 31 28 29 03 60
2.6.2014 11:24:50.00 | RECEIVED | 02 30 30 30 30 30 30 32 31 28 30
2.6.2014 11:24:50.00 | RECEIVED | 30 32 36 31 30 34 31 29 03 01
2.6.2014 11:24:51.00 | TRANSMITTED | 01 52 31 02 30 30 30 30 30 30 33 31 28 29 03 61
2.6.2014 11:24:51.00 | RECEIVED | 02 30 30 30 30
2.6.2014 11:24:51.00 | RECEIVED | 30 30 33 31 28 30 32 30 37 30 34 30 35
2.6.2014 11:24:51.00 | RECEIVED | 30 30 35 34 35 31 29 03 01
2.6.2014 11:24:51.00 | TRANSMITTED | 01 52 31 02 30 30 30 30 30 30 33 32 28 29 03 62
2.6.2014 11:24:51.00 | RECEIVED | 02 30 30 30 30
2.6.2014 11:24:51.00 | RECEIVED | 30 30 33 32 28 30 30 32 33 29 03 02
2.6.2014 11:24:52.00 | TRANSMITTED | 01 52 31 02 30 30 30 30 30 30 33 34 28 29 03 64
2.6.2014 11:24:52.00 | RECEIVED | 02 30 30 30 30 30 30 33 34 28 30 30 30
2.6.2014 11:24:52.00 | RECEIVED | 30 30 30 30 30 30 30 30 30 29 03 05
2.6.2014 11:24:52.00 | TRANSMITTED | 01 52 31 02 30 30 30 30 30 30 33 35 28 29 03 65
2.6.2014 11:24:52.00 | RECEIVED | 02 30 30 30 30 30 30 33 35 28 30 30
2.6.2014 11:24:52.00 | RECEIVED | 30 34 29 03 00
2.6.2014 11:24:53.00 | TRANSMITTED | 01 52 31 02 30 30 30 30 30 30 33 36 28 29 03 66
2.6.2014 11:24:53.00 | RECEIVED | 02 30 30 30 30 30 30
2.6.2014 11:24:53.00 | RECEIVED | 33 36 28 30 30 30 30 30 30 30 30 30 30
2.6.2014 11:24:53.00 | RECEIVED | 30 30 29 03 07
2.6.2014 11:24:53.00 | TRANSMITTED | 01 42 30 03 71

und auf der RegisterVariabel im Debug Fenster folgendens:

2.6.2014 11:24:44.00 | Received Data | 2F 59 54 4C 3A 30
2.6.2014 11:24:44.00 | Received Data | 30 30 30 30 30 30 30 30 30 30 30 0D 0A
2.6.2014 11:24:44.00 | Received Data | 01 50 30 02 28 30 30 30 30 30 30 30 30
2.6.2014 11:24:44.00 | Received Data | 29 03 60
2.6.2014 11:24:45.00 | Received Data | 06
2.6.2014 11:24:45.00 | Received Data | 02 30
2.6.2014 11:24:45.00 | Received Data | 30 30 30 30 30 30 30 28 32 32 35 37 29
2.6.2014 11:24:45.00 | Received Data | 03 00
2.6.2014 11:24:46.00 | Received Data | 02 30 30 30 30 30 30
2.6.2014 11:24:46.00 | Received Data | 30 31 28 30 30 31 35 29 03 07
2.6.2014 11:24:46.00 | Received Data | 02 30 30 30 30 30 30 30
2.6.2014 11:24:46.00 | Received Data | 32 28 30 34 39 39 29 03 04
2.6.2014 11:24:47.00 | Received Data | 02
2.6.2014 11:24:47.00 | Received Data | 30 30 30 30 30 30 30 33 28 30 30 33 36
2.6.2014 11:24:47.00 | Received Data | 29 03 04
2.6.2014 11:24:47.00 | Received Data | 02 30 30 30 30
2.6.2014 11:24:47.00 | Received Data | 30 30 30 34 28 30 30 30 30 29 03 06
2.6.2014 11:24:48.00 | Received Data | 02 30 30 30
2.6.2014 11:24:48.00 | Received Data | 30 30 30 30 35 28 30 30 33 36 29 03 02
2.6.2014 11:24:48.00 | Received Data | 02 30 30 30 30 30 30 30 36 28 31 30 30
2.6.2014 11:24:48.00 | Received Data | 30 29 03 05
2.6.2014 11:24:49.00 | Received Data | 02 30 30 30 30 30 30 31 30 28 30 30
2.6.2014 11:24:49.00 | Received Data | 34 34 34 38 31 34 29 03 0A
2.6.2014 11:24:49.00 | Received Data | 02 30 30 30 30 30 30 31 31 28
2.6.2014 11:24:49.00 | Received Data | 30 30 34 34 34 38 31 34 29 03 0B
2.6.2014 11:24:50.00 | Received Data | 02
2.6.2014 11:24:50.00 | Received Data | 30 30 30 30 30 30 32 30 28 30 30 32 36
2.6.2014 11:24:50.00 | Received Data | 31 30 34 31 29 03 00
2.6.2014 11:24:50.00 | Received Data | 02 30 30 30 30 30 30 32 31 28 30
2.6.2014 11:24:50.00 | Received Data | 30 32 36 31 30 34 31 29 03 01
2.6.2014 11:24:51.00 | Received Data | 02 30 30 30 30
2.6.2014 11:24:51.00 | Received Data | 30 30 33 31 28 30 32 30 37 30 34 30 35
2.6.2014 11:24:51.00 | Received Data | 30 30 35 34 35 31 29 03 01
2.6.2014 11:24:51.00 | Received Data | 02 30 30 30 30
2.6.2014 11:24:51.00 | Received Data | 30 30 33 32 28 30 30 32 33 29 03 02
2.6.2014 11:24:52.00 | Received Data | 02 30 30 30 30 30 30 33 34 28 30 30 30
2.6.2014 11:24:52.00 | Received Data | 30 30 30 30 30 30 30 30 30 29 03 05
2.6.2014 11:24:52.00 | Received Data | 02 30 30 30 30 30 30 33 35 28 30 30
2.6.2014 11:24:52.00 | Received Data | 30 34 29 03 00
2.6.2014 11:24:53.00 | Received Data | 02 30 30 30 30 30 30
2.6.2014 11:24:53.00 | Received Data | 33 36 28 30 30 30 30 30 30 30 30 30 30
2.6.2014 11:24:53.00 | Received Data | 30 30 29 03 07
2.6.2014 11:24:54.00 | Buffer |

Für mich sieht es so aus, dass die Kommunikation grundsätzlich zwischen den DRS155M und IP-Symcon funktioniert, es werden aber keine Daten letzten Endes ausgegeben.

Das ist das Ergebnis:
Antwort Hersteller:
Antwort Zähler-ID:
Spannung: 0 V
Strom: 0 A
Frequenz: 0 Hz
Wirkleistung: 0 W
Blindleistung: 0 VAr
Scheinleistung: 0 VA usw…

Woran kann das liegen ? Das letzte ECHO aus der RegisterVariabel Buffer ist leer. Hängt es vielleicht damit zusammen. Kann mir jemand den entscheiden Hinweis geben? Bin echt mittlerweile Ratlos :frowning:

Bin über jeden Ansatz einer Hilfe mehr wie dankbar.

Gruß Achim

Hallo Achim,
hast du die Kategrie angelegt und in den Zeilen 5-7 die korrekten ID’s aus deinem System eingetragen (wie in Post #18 beschrieben)?
Gruß Thomas

Hallo Thomas,

ja das habe ich. Keine der Variablen werden gefüllt. Lediglich in der Variabel Zeit kommt ein Wert " …20; :: +Umbruch"

Hast Du solch einen DRS110M bei dir am laufen und eine Idee woran das liegen könnte?

Gruß Achim

Meine Antwort bezog sich auf deinen Post vorher (#72), da war mein Script vom Post #29 zitiert. Das habe ich im Einsatz.
Das Script von Marmangra verwende ich nicht.

Gruß Thomas

@drdigital: das ist ja traumhaft. Hatte mir zwischenzeitlich einen weiteren RS485-Wandler für ein paar Euro besorgt. Aus Interesse: welche Baudrate verbirgt sich denn hinter dem Wert 2580 und wie kamst du darauf?

Sorry Andreas,
habe erst jetzt deine Frage gesehen.
2580 entspricht 9600 bps
Ich habe den Wert aus der PDF-Datei, die
im Beitrag 45 eingefügt war/ist

Die erste Spalte ist die Startadresse die muss man in Dezimal umrechnen.

Ich habe nun 3 Stück Zähler DRS-210C ein paar Wochen im Einsatz.
Alle 3-Zähler hängen an einem RS485 LAN Adapter (Modbus ID 1+2+3)
Seltsamerweise hängt die Kommunikation so ca. alle 3-5 Tage abwechselnd an dem ein oder anderen Zähler.
Dann bekomme ich keine Werte mehr ausgelesen.
Neustarten des RS485 to LAN Adapter bringt nichts,
IPS neustarten beseitigt den Fehler auch nicht.

Die Kommunikation geht erst wieder, wenn ich den Zähler kurz Stromlos mache.
Hat sonst jemand die gleichen Probleme?

Hier noch ein Screenshot dazu.

Wie man sehen kann ist die Kommunikation an einem Zähler am 26.06.2014 um 23:52 Uhr ausgefallen,
am anderen am 27.06.2014 um 00:48 Uhr, während der dritte weiterhin einwandfrei kommuniziert.
Deshalb kann es meiner Meinung nach nicht am RS485 LAN Adapter liegen.

Hallo liebes Forum,

ich versuche schon geraume Zeit, meinen DRS110M in Verbindung mit einem in circuit USB - Serial Konverter in IPS zu bekommen, bis jetzt leider ohne Erfolg.
Der USB-Serial Wandler funktioniert, ich bekomme eine Verbindung zum Zähler und kann die Werte auch auslesen, siehe Fotos:

Jetzt möchte ich diese Werte in IPS bringen, hierzu habe ich einen Serial Port erstellt:

Weierhin habe ich mich an die Anweisung von Thomas gehalten und folgendes Verzeichnis erstellt:

Die Registervariable schaut so aus:

Und das Skript habe ich entsprechend angepasst:

2014_09_18_16_33_29_IP_Symcon_Verwaltungskonsole.png

Sollte ja soweit alles passen, oder? Jetzt dachte ich, wenn ich das Skript von Thomas aufrufe, werden die restlichen Variablen automatisch angelegt, leider bekomme ich folgende Fehlermeldung:

2014_09_18_16_35_20_IP_Symcon_WebFront.png

Kann mal jemand, der erfolgreich seinen DRS110M an IPS gekoppelt hat und auslesen kann, mir ein paar Tipps geben, was hier falsch ist? Eventuell verwende ich auch ein falsches Skript oder habe irgendwas falsch angelegt?

Wäre schön, eine Antwort und Hilfe zu bekommen.

Danke und schöne Grüße
Daniel

Irgendwo musst Du doch in dem Skript auch deine MeterID angeben. Eventuell passt die einfach nicht?