Mein Stromzähler geht in Rente!! Und nun?

Hast schon mal mit den Datenbits in den Comport Einstellungen in IPS rumgespielt. Ansonsten würde ich fast sagen dass das ein Bug ist.

Hallo RWN,

hab ich auch schon ausprobiert.
Hab sogar einen zweiten Rechner ausprobiert.
Aber alles ohne Erfolg.:frowning:

Häng doch mal einen Portsniffer dazwischen.

Hallo RWN,

anbei einmal zwei Logdateien.
Vielleicht siehst Du ja einen entscheidenen Unterschied.

Ich hab davon nicht so die Ahnung.
Aufgefallen ist mir nur das beim Hyperterminal in Zeile 25 ein „Set DTR“ steht. Bei IPS finde ich das nicht.
Stattdessen steht dort in Zeile 36 ein „Clear DTR“.

Ob das aber was zu bedeuten hat erschließt sich mir nicht ganz.

Gruß
Stefan

Log_Hyperterminal.txt (8.89 KB)

Log_IPS.txt (3.28 KB)

Hallo,

zu deinem Set DTR;

Das musst du per Skript in IPS aktivieren;


COMPort_SetDTR(12345 /*Instance ID*/  , true);

Gruß
Hollowman

Hallo Hollowman,
hallo RWN,

vielen Dank für die entscheidenden Hinweise.
Ein kleines

COMPort_SetDTR(12345 /*Instance ID*/  , true);

oder

COMPort_SetDTR(12345 /*Instance ID*/  , false);

und schon kann ich den Datenstrom über den Com Port Ein oder Aus schalten.
Hatte im Forum leider immer nach „Serial Port“ gesucht.:rolleyes:

Nun hab ich es auch mit Hilfe der Doku geschafft den Datenstrom in eine Registervariable zu schreiben.
Aber wie gehe ich nun am sinnvollsten vor um den Inhalt der RegisterVariable so aufzuteilen das ich meine entscheidenen Informationen (Zählerstand, Phasenleistung und Summenleistung) auch in Variablen angezeigt bekomme?

Zum Auslesen der RegVar hilft dir vlt. das.

@ Stefan,

mal eine andere Frage. Was für einen OKK hast Du denn zum auslesen drauf. USB, Seriell und von welcher Firma.

Ich baue meine Zähler jetzt auch um, leider sind die OKK nicht allzu sehr verbreitet.

Hallo,

ich habe einen eHZ von Hager im Betrieb, der die Daten nach demselben Format liefern müsste. :slight_smile:
Dort war auch der Rohdatensatz beschrieben.
Die richtigen Daten bekomme ich mit folgendem mit der heißen Nadel:eek: gestrickten Skript:

<?

// Daten kommen vom Server aus
if ($IPS_SENDER == "RegisterVariable")
{
	$Frame = $IPS_VALUE; // Daten von Registervariable übernehmen
	
	if (($Frame != '/HAG5eHZ010C_EHZ1WA02') and ($Frame != '!')) // Wenn es sicht nicht um die Zählertypbezeichnung oder Telegrammende handelt
	{
		$Parameter = explode('(',$Frame); // String in einzeln Werte zerlegen
		$Kennzahl = $Parameter[0];
		$Daten = $Parameter[1];
	}
	// IPS_LogMessage("Kennzahl : ",$Kennzahl);

	switch((string)$Kennzahl) // Befehl auswerten, Aktoren ansteuern **********************
		{
			case '1-0:31.7.0*255': // Wenn es sich um die Angabe des Stromes für L1 handelt
			   $Nutzdaten = explode('*',$Daten);
				$Wert = $Nutzdaten[0];
				SetValue(49411 /*[eHZ Cutter\Register Variable\Strom L1]*/ , (float)$Wert);
				// IPS_LogMessage("Strom L1: ",(float)$Wert);
			   return; // Script beenden
      	break;
      	case '1-0:51.7.0*255': // Wenn es sich um die Angabe des Stromes für L2 handelt
				$Nutzdaten = explode('*',$Daten);
				$Wert = $Nutzdaten[0];
				SetValue(31131 /*[eHZ Cutter\Register Variable\Strom L2]*/ , (float)$Wert);
				// IPS_LogMessage("Strom L2: ",(float)$Wert);
				return; // Script beenden
      	break;
			case '1-0:71.7.0*255': // Wenn es sich um die Angabe des Stromes für L3 handelt
				$Nutzdaten = explode('*',$Daten);
				$Wert = $Nutzdaten[0];
				SetValue(47444 /*[eHZ Cutter\Register Variable\Strom L3]*/ , (float)$Wert);
				// IPS_LogMessage("Strom L2: ",(float)$Wert);
			return; // Script beenden
			break;
			case '1-0:1.8.0*255': // Wenn es sich um die Angabe des Zählerstandes handelt
				$Nutzdaten = explode(')',$Daten);
				$Wert = $Nutzdaten[0];
				SetValue(28623 /*[eHZ Cutter\Register Variable\Zählerstand]*/ , (float)$Wert);
				// IPS_LogMessage("Strom L2: ",(float)$Wert);
			return; // Script beenden
      	break;
			case '1-0:0.0.0*255': // Wenn es sich um die Angabe der Eigentumsnummer handelt
				$Nutzdaten = explode(')',$Daten);
				$Wert = $Nutzdaten[0];
				SetValue(11206 /*[eHZ Cutter\Register Variable\Eigentumsnummer]*/ , (int)$Wert);
				// IPS_LogMessage("Strom L2: ",(int)$Wert);
			return; // Script beenden
      	break;
			case '1-0:32.7.0*255': // Wenn es sich um die Angabe der Spannung für L1 handelt
			   $Nutzdaten = explode('*',$Daten);
				$Wert = $Nutzdaten[0];
				SetValue(53377 /*[eHZ Cutter\Register Variable\Spannung L1]*/ , (float)$Wert);
				// IPS_LogMessage("Spannung L1: ",(float)$Wert);
			   return; // Script beenden
      	break;
      	case '1-0:52.7.0*255': // Wenn es sich um die Angabe der Spannung für L2 handelt
				$Nutzdaten = explode('*',$Daten);
				$Wert = $Nutzdaten[0];
				SetValue(56428 /*[eHZ Cutter\Register Variable\Spannung L2]*/ , (float)$Wert);
				// IPS_LogMessage("Spannung L2: ",(float)$Wert);
				return; // Script beenden
      	break;
			case '1-0:72.7.0*255': // Wenn es sich um die Angabe der Spannung für L3 handelt
				$Nutzdaten = explode('*',$Daten);
				$Wert = $Nutzdaten[0];
				SetValue(10541 /*[eHZ Cutter\Register Variable\Spannung L3]*/ , (float)$Wert);
				// IPS_LogMessage("Spannung L3: ",(float)$Wert);
			return; // Script beenden
			break;
			case '1-0:21.7.0*255': // Wenn es sich um die Angabe der Wirkleistung für L1 handelt
			   $Nutzdaten = explode('*',$Daten);
				$Wert = $Nutzdaten[0];
				SetValue(45352 /*[eHZ Cutter\Register Variable\Leistung L1]*/ , (float)$Wert);
				// IPS_LogMessage("Leistung L1: ",(float)$Wert);
			   return; // Script beenden
      	break;
      	case '1-0:41.7.0*255': // Wenn es sich um die Angabe der Wirkleistung für L2 handelt
				$Nutzdaten = explode('*',$Daten);
				$Wert = $Nutzdaten[0];
				SetValue(41424 /*[eHZ Cutter\Register Variable\Leistung L2]*/ , (float)$Wert);
				// IPS_LogMessage("Leistung L2: ",(float)$Wert);
				return; // Script beenden
      	break;
      	case '1-0:61.7.0*255': // Wenn es sich um die Angabe der Wirkleistung für L3 handelt
				$Nutzdaten = explode('*',$Daten);
				$Wert = $Nutzdaten[0];
				SetValue(43752 /*[eHZ Cutter\Register Variable\Leistung L3]*/ , (float)$Wert);
				// IPS_LogMessage("Leistung L3: ",(float)$Wert);
				return; // Script beenden
      	break;
			case '1-0:96.50.0*0': // Wenn es sich um die Angabe vom Netzstatus(bitcodiert handelt
				$Nutzdaten = explode(')',$Daten);
				$Wert = $Nutzdaten[0];
				SetValue(33176 /*[eHZ Cutter\Register Variable\Netzstatus Bitcodiert]*/ , (string)$Wert);
			return; // Script beenden
			break;
			case '0-0:96.1.255*255': // Wenn es sich um die Angabe vom Status(bitcodiert) handelt
				$Nutzdaten = explode(')',$Daten);
				$Wert = $Nutzdaten[0];
				SetValue(57363 /*[eHZ Cutter\Register Variable\Status Bitcodiert]*/ , (string)$Wert);
			return; // Script beenden
			break;
			case '1-0:96.50.0*1': // Wenn es sich um die Angabe vom Netzfrequenz handelt
				$Nutzdaten = explode(')',$Daten);
				$Wert = hexdec($Nutzdaten[0]);
		  		$Frequenz = (float)(100000/$Wert);
				SetValue(53860 /*[eHZ Cutter\Register Variable\Frequenz]*/ , (float)$Frequenz);
			return; // Script beenden
			break;
		}
}

$Gesamtleistung = (GetValue(43752 /*[eHZ Cutter\Register Variable\Leistung L3]*/)+GetValue(41424 /*[eHZ Cutter\Register Variable\Leistung L2]*/)+GetValue(45352 /*[eHZ Cutter\Register Variable\Leistung L1]*/));
SetValue(34671 /*[eHZ Cutter\Register Variable\Gesamtleistung]*/ , (float)$Gesamtleistung);
$Gesamtstrom = (GetValue(49411 /*[eHZ Cutter\Register Variable\Strom L1]*/)+GetValue(31131 /*[eHZ Cutter\Register Variable\Strom L2]*/)+GetValue(47444 /*[eHZ Cutter\Register Variable\Strom L3]*/));
SetValue(53341 /*[eHZ Cutter\Register Variable\Gesamtstrom]*/ , (float)$Gesamtstrom);

?>

Allerdings kommt IPS bei ständiger Verbindung kaum mit dem verarbeiten hinterher…
(Liegt wahrscheinlich an meiner rangehensweise im Skript…):confused:
Ich habe es so gelöst, dass ich die Verbindung um Tastkopf immer zur vollen Minute für 2 Sekunden herstelle, dann funktioniert es.
Wenn Du die Zählerkennung anpasst müsste es auch mit Deinem ähler klappen.

Vielleicht hilft das Skript ein wenig weiter…:cool:

Gruß Matthias

Hallo nochmal,

wollte nochmal näher die IPS-Symtome bei ständiger Verbindung beschreiben.
Wenn man nach längerer Zeit die Verbindung zum Tastkopf trennt laufen im Meldungsfenster noch Variablenaktualisierungen ein, die (je nach Dauer) schon mal 5 Minuten zurückliegen können.

Gruß Matthias

Hallo RWN,

mein Netzbetreiber hat mir zu dem Zähler einen Tastkopf verkauft.Der past genau auf die oben liegende IR-Sendediode. Sieht aus wie der von co-met angebotene „com-IR Q3D
Hat einen 4 poligen Westernstecker und Adapter auf RS232.
Dann haben sie noch einen Adapter auf USB dazu gelegt. Den nutzte ich aber derzeitig nicht.

Wenn du die Schnittstellen-Spezifikation deines Zählers kennst hilft Dir vielleicht auch dieser Link weiter.

Gruß
Stefan

Hallo Matthias,

danke für Dein Skript.
Werde ich mir mal anschauen und versuchen bei mir zu installieren. Werde dann berichten (oder Fragen stellen:D)

Gruß Stefan

Moin RWN,

leider kommen die Daten bei mir nicht gleichmäßig in der RegisterVariable an.
Mit dem Skript aus der Dokubekomme ich die Daten zwar (anscheinend?) alle in eine Registervariable gespeichert. Sieht im Meldefenster jedenfalls so aus.

Anbei einmal ein Screenshoot.

Bei dem Versuch diese Daten dann mit Deinem Skript auszuwerten scheitere ich aber leider.
Hier fehlt mir die Erfahrung im Umgang mit RegisterVariablen und mit php:o

Gruß Stefan

so Stefan,

vergiss alles was ich bisher geschrieben hatte. :slight_smile:

Leg Dir einen Cutter an wie auf dem Bild, als übergeordnete Instanz deinen Comport eintragen. Die Registervariable mit dem Cutter verbinden.
Stringvariablen anlegen und im Script eintragen.

Das Script der Registervariable zuordnen. Wenn Du dann alles richtig gemacht hast, stehen deine Daten in deinen Variablen.

Wenn du das ganze im Webfront anzeigen willst, leg Dir ein Profil mit Suffix W und eines mit KWh an und weise es den entsprechenden Variablen zu.

<?
$eHZdata = array("1-0:0.0.0*255" => 15447, 
                "1-0:1.8.0*255" => 27081, 
                "1-0:1.7.255*255" => 11938, 
                "1-0:96.5.5*255" => 14262, 
                "0-0:96.1.255*255" => 55994, 
                "1-0:21.7.255*255" => 35652, // Wirkleistung L1
                "1-0:41.7.255*255" => 40687, // Wirkleistung L2
                "1-0:61.7.255*255" => 20592  // Wirkleistung L3
               );

//Dateneingang von Registervariable
$string = explode("
", trim($IPS_VALUE));
for($i = 0; $i < count($string); $i++)
{
    $id = strstr($string[$i], "(", true);
    $value = strstr($string[$i], "(");
    $check = strpos($value, "*");
    if($check !== false)
    {
        $value = strstr($value, "*", true);
        $data = substr($value, 1);
        SetValueString($eHZdata[$id], number_format($data, 2, '.', ''));
    }
    else
    {
        $data = substr(trim($value), 1, -1);
        SetValueString($eHZdata[$id], $data);
    }
}
?>

@ Matthias,

dieses sollte dein Script ersetzen können. Trag deine Zählerkennung wie im Bild oben in den Cutter ein.

Die Kennungen mit Variablen IDs in $eHZdata

Damit sollten deine Probleme mit dem Nachlauf der Daten beseitigt sein.

Kannst ja, wenn Du es ja testen solltest mal Rückmeldung geben.

<?
$eHZdata = array("1-0:0.0.0*255" => 15447, // Spannung L2
                 "1-0:1.8.0*255" => 27081, // Spannung L3
                 "1-0:1.7.255*255" => 11938, // Strom L1
                 "1-0:96.5.5*255" => 14262, // Strom L2
                 "0-0:96.1.255*255" => 55994, // Strom L3
                 "1-0:21.7.255*255" => 35652, // Wirkleistung L1
                 "1-0:41.7.255*255" => 40687, // Wirkleistung L2
                 "1-0:61.7.255*255" => 20592  // Wirkleistung L3
                 );

$Netzperiodendauer = 0; // VariablenID der Obis Kennzahl der Netzperiodendauer
$var1 = 0; // VariablenID der Obis Kennzahl der Daten welche nicht umgrechnet werden und nur 2 Stellen haben.
$var2 = 0; // VariablenID der Obis Kennzahl der Daten welche nicht umgrechnet werden und nur 2 Stellen haben.

//Dateneingang von Registervariable
$string = explode("
", trim($IPS_VALUE));
for($i = 0; $i < count($string); $i++)
{
    $id = strstr($string[$i], "(", true);
    $value = strstr($string[$i], "(");
    $check = strpos($value, "*");
    if($check !== false)
    {
       $value = strstr($value, "*", true);
        $data = substr($value, 1);
        SetValue($eHZdata[$id], number_format((float)$data, 2, '.', ''));
    }
    else
    {
        $data = substr(trim($value), 1, -1);
        if(strlen($data) <= 4)
        {
           if($eHZdata[$id] == $Netzperiodendauer)
            {
               $data = hexdec($data)/100;
            }
            elseif(($eHZdata[$id] == $var1) || ($eHZdata[$id] == $var2))
            {
               $data = $data;
            }
            else
            {
               $data = hexdec($data); 
            }
          }
        SetValue($eHZdata[$id], (float)$data);
    }
}
?>

Hallo RWN,

da hat man mal zwei Tage was wichtigeres zu tun als im Forum zu lesen und an IPs zu arbeiten und dann sowas.:cool:

Danke für Deine Mühe, hätte ich so alleine nicht hinbekommen.
Da wag ich ja fast gar nicht zu fragen wo Du am sinnvollsten ansetzten würdest um den Zählerstand nicht alle 2 sec. abzufragen.
Ist es sinnvoll mit einem zeitlich getriggertem Skript den COMPort zu öffnen und nach einigen Sekunden wieder zu schließen oder ist es sinnvoller diese Funktion in Dein Skript mit einzubauen!?

Die Variante mit dem Öffnen erscheint mir fast sinnvoller. Da kommen dann die Daten gar nicht erst in IPS an. Anderseits weiß ich nicht ob es so sinnvoll ist immer wieder ein

<?
COMPort_SetDTR(48810 /*Instance ID*/  , true);
IPS_Sleep(6000);
COMPort_SetDTR(48810 /*Instance ID*/  , false);
?>

zu setzten?

Gruß Stefan

Hallo Stefan,

kannst Du so machen, Ich würde allerdings wenn die Zeit bis zum löschen von DTR größer 1 Sekunde ist mit dem Scripttimer arbeiten.

Das Script würde ich alle 10-15min laufen lassen. Normal sollte ein Sleep von 750ms reichen, musst Du aber mal probieren.

Da alles über den Cutter läuft schickt dieser die Daten eh erst an die Regvar wenn der Datenstring komplett ist.

Hallo RWN,

vielen Dank für das neue Skript, habe es gleich auf die Kennzahlen und Variablen angepasst, läuft auf jeden fall besser.
Beim ersten Test ist mir gleich aufgefallen, dass etwas mit den Werten nicht stimmt…
Anstatt 210W aus den Rohdaten werden mir in der Variable 21000W angezeigt…
Hast Du eine Idee?
Anbei ein dump des Cutters:

9/13/2010 13:06:16.00 | Received Data |

1-0:0.0.0255(0123456789012345)
1-0:1.8.0
255(003007.6135)
1-0:96.5.5255(82)
0-0:96.1.255
255(0000044877)
1-0:32.7.0255(228.05V)
1-0:52.7.0255(228.38V)
1-0:72.7.0255(228.83V)
1-0:31.7.0255(000.97A)
1-0:51.7.0255(000.69A)
1-0:71.7.0255(000.12A)
1-0:21.7.0255(+00138W)
1-0:41.7.0255(+00117W)
1-0:61.7.0255(+00020W)
1-0:96.50.00(EF)
1-0:96.50.0
1(07D1)
1-0:96.50.02(16)
1-0:96.50.0
3(0A)
1-0:96.50.04(21)
1-0:96.50.0
5(15)
1-0:96.50.06(003D381B2709EF408101EF0500009F80)
1-0:96.50.0
7(00)

hat das etwas mit der Konvertierung zu Number-Format im Skript

        SetValue($eHZdata[$id], number_format((float)$data, 2, '.', ''));

zu tun?

Vielen Dank schonmal :)und Gruß

Matthias

Hallo Matthias,

eigentlich nein. Was sagt denn dein Variablenprofil, hast Du dort Nachkommastellen eingegeben. Hier funktioniert es einwandfrei.

Habe z.B. bei der Leistung keine angegeben, da sie in W angezeigt wird.
Bei den Strömen sieht es so aus( dort habe ich wie in den Rohdaten 2 Nachkommastellen angegeben), dass der „.“ als Kommastelle nicht berücksichtigt wird. Dann würden meine Anzeigen passen.
Bei der Leistung gibt es vielleicht in Problem mit dem „+“ oder mit den Nullen vor dem Wert?

Gruß Matthias