Hallo,
ich habe seit 2012 schon zwei eHZ Zähler für meine Photovoltaikanlage in
Betrieb. Jetzt habe ich von Westnetz einen eHZ Zähler für
Wärmepumpenstrom bekommen.
1 | Hersteller: EMH metering GmbH & Co. KG
|
2 | Typ : eHZB, Elektronischer Basiszähler
|
Ich lese die Zähler mittels IR-Lesekopf und RS232 Verbindung aus. Die
Verarbeitung erfolgt mit VB.NET.
Ich will den Wert für den verbrauchten Strom auslesen. In der
Gebrauchsanleitung stehen auch einige OBIS-T-Kenzahlen.
Die Kennzahl ist die "01 00 01 08 00 FF", Zählwerk positive Wirkenergie
tariflos. In der Datei LogDatei.png habe ich die Log-Auszüge von drei
Werten wiedergegeben.
Die Zählerstände betrugen 108 kWh, 114 kWh und 117 kWh. Man sieht in der
Sequenz zum Schluß 8 Stellen. Die 8. Stelle zeigt den Zählerstand an,
Stelle 1 bis 7 sind 00.
Man sollte vermuten das beim Überlauf dann in der 7. Stelle weiter
geschrieben wird. Wenn dem so sein sollte, dann wäre meine Frage schon
gelöst.
Jedenfalls läuft das Auslesen in bei den eHZ aus dem Jahr 2012 etwas
anders aus.
bStartsequenz = New Byte() {&H1B, &H1B, &H1B, &H1B, &H1, &H1, &H1, &H1}
bEndsequenz = New Byte() {&H1B, &H1B, &H1B, &H1B, &H1A}
b_1_8_0 = New Byte() {&H77, &H7, &H1, &H0, &H1, &H8}
b_2_8_0 = New Byte() {&H77, &H7, &H1, &H0, &H2, &H8}
Die wichtigsten Sequenzen sind gleich geblieben. Die Suche nach den
Zählerstand läuft über eine 6 stellige OBIS-T-Kenzahl. An der 8. Stelle
befindet sich ein Wert der offensichtlich als Zeiger für den Beginn der
Zählerwerte im String dient. Dort kommen wohl die Hex-Werte für Dezmal
98, 99 und 100 vor.
Ich finde an dieser Stelle bei mir Hex 64, das wären Dez 100.
Bei dem neuen Zähler fängt die Sequenz an der 26. Stelle an. Es folgen
zur Zeit 7 x 00 und an der achten Stelle ein Hex Wert für den
Zählerstand.
1 | '1.8.0
|
2 | i = BytesSuchen(bData, b_1_8_0, 0)
|
3 |
|
4 | If i = -1 Then
|
5 | If blnAllesProtokollieren Then
|
6 | cText = "1.8.0 nicht gefunden"
|
7 | WrProtokoll(cText)
|
8 | End If
|
9 | Else
|
10 | If Convert.ToInt64(bData(i + 8)) = 98 Then
|
11 | i = i + 17
|
12 | ElseIf Convert.ToInt64(bData(i + 8)) = 99 Then
|
13 | i = i + 18
|
14 | ElseIf Convert.ToInt64(bData(i + 8)) = 100 Then
|
15 | i = i + 19
|
16 | Else
|
17 | cText = "Lesefehler bei 1.8.0."
|
18 | WrProtokoll(cText)
|
19 | blnRet = False
|
20 | Exit Do
|
21 | End If
|
22 | Zählerstand = Convert.ToInt64(bData(i))
|
23 | Zählerstand = Zählerstand * 256 + Convert.ToInt64(bData(i + 1))
|
24 | Zählerstand = Zählerstand * 256 + Convert.ToInt64(bData(i + 2))
|
25 | Zählerstand = Zählerstand * 256 + Convert.ToInt64(bData(i + 3))
|
26 | d180Ausgelesen = Zählerstand / 10000
|
27 | End If
|
Ich muß zum Code sagen, diesen Kern hatte ich irgendwo her und er
funktionierte. Im neuen Zähler liegt zur Zeit der kleinste Wert an 8.
Stelle. Bei den alten Zählern ist es offensichtlich andersherum.
Für mich sieht es so aus das jeder Hersteller seine eigenen
Vorstellungen umsetzt und nur die OBIS-T-Kennzahlen genormt sind. Aber
selbst die Kennzahl für den Hersteller hat sich geändert. Ich mußte
tatsächlich die OBIS-T-Kennzahl aus der Gebrauchsanleitung des
Herstellers entnehmen um die entsprechende Stelle zu finden. Der alte
Code wurde nicht gefunden.
Liege ich mit der Vermutung richtig, daß beim neuen Zähler der kleinste
Wert an 8. Stelle liegt und liegen bleibt?
mfg Klaus