Private Website von Niklas Menke

Elektrotechnik und mehr...

Netzfrequenz: - Hz
-

Netzfrequenz


(Etwa alle 30s wird ein neuer Messwert ermittelt. Dieses Diagramm gibt nicht den exakten Verlauf der Netzfrequenz wieder.)


Vorwort

Mithilfe dieses Lesekopfes soll auf die optische SML-Schnittelle eines Smartmeters zugegriffen werden. Der Lesekopf wird dazu magnetisch am Zähler befestigt. Ein optisch eingehendes SML-Telegramm wird vom Lesekopf empfangen und analysiert.

Bausatz

Zurzeit verfüge ich über einige Bausätze des Lesekopfes. Details und ein Formular zur Anfrage eines Bausatzes finden sie hier.

Kompatibilität

Der Lesekopf unterstützt das SML Protokoll mit der Version 1.04.
Der Lesekopf wurde bereits an folgenden Zählern getestet:

Es werden auch weitere Zähler unterstützt. Achten Sie darauf, dass der Zähler das SML V1.04 Protokoll verwendet.
Falls Sie den Lesekopf an einem hier nicht aufgeführten Zähler betreiben, dann teilen Sie mir das gerne über das Kontaktformular mit.

Registertabelle
Abbildung 1: Register für Momentanwerte Abbildung 1: Register für Momentanwerte Abbildung 2: Register für Energiewerte Abbildung 2: Register für Energiewerte Abbildung 3: Allgemeine Register Abbildung 3: Allgemeine Register

Der Lesekopf sucht im Telegramm des Smartmeters die in der Registertabelle dickgedruckten Werte. Die restlichen Werte werden berechnet, falls dies mit den vom Smartmeter übergebenen Werten möglich ist. Zu beachten ist dabei, dass die Berechnungen nur die Grundschwingungsanteile berücksichtigt und Oberschwingungen unberücksichtigt bleiben. So sind die berechneten Werte immer größer gleich den tatsächlichen Werten.

Weitere Hinweise zu einigen Registern:

Lastmanagement

Dieses Projekt steht in keinem Zusammenhang mit der Firma KOSTAL.

Die Registertabelle des Lesekopfes ist mit der Registertabelle vom KOSTAL Smart Energy Meter (KSEM) kompatibel.
Damit andere Geräte den Lesekopf als KSEM erkennen, muss die Hersteller- und Gerätekennung in die entsprechenden Register eingetragen werden:

An folgenden Geräten wird der Lesekopf für das Lastmanagement eingesetzt:

Falls Sie den Lesekopf an anderen Geräten für das Lastmanagement verwenden, dann teilen Sie mir das gerne über das Kontaktformular mit.

Modbus RTU

Unterstützte Funktionen

Es werden folgende Funktionen unterstützt:


Bei einem nicht unterstützten Funktionscode oder einer ungültigen Registeradresse antwortet der Lesekopf mit einer Fehlermeldung. Bei einem ungültigen Funktionscode schaut das z.B. so aus:

0x05 0x83 0x01 0xc1 0x31

Codierung anpassen

Die unterstützten Codierungen für den Modbus sind in der nachfolgenden Tabelle 1 aufgeführt: Unterstützte Codierungen des Modbus RTU

Tabelle 1: Unterstützte Codierungen für den Modbus.

Am Lesekopf

Die Codierung kann direkt am Lesekopf mithilfe der beiden Drehcodierschalter eingestellt werden:

  1. Drehcodierschalter auf die für die gewünschte Codierung passende Position einstellen. Siehe Tabelle 1.
  2. Mithilfe zweier Kurzschlussbrücken oder eines Schraubendrehers die Baudrate 19200 Bd und 38400 Bd an der Stiftleiste XE1 gleichzeitig aktivieren und warten, bis der Lesekopf zwei Mal aufblinkt.
  3. Durch das zweifache Aufblinken wird die Eingabe der Stoppbits und der Parität bestätigt. Ohne das Aufblinken wurde keine Änderungen vorgenommen. Dann muss ggf. die Position der Drehcodierschalter überprüft werden.
  4. Ursprüngliche Konfiguration der Drehcodierschalter und der Baudrate wiederherstellen.

In der Firmware

Alternativ kann die Codierung auch in der Firmware in der Datei main_functions.c in der Funktion void general_init(void) {...} geändert werden. Dazu müssen einfach die entsprechenden Codezeilen aktiviert bzw. deaktiviert werden:

Parameterliste ändern / erweitern

Sollen andere oder weitere Parameter aus dem Smartmeter abgefragt werden als in der Registertabelle angegeben sind, dann kann der Quellcode entsprechend angepasst werden. Dazu sind die folgenden Schritte zu bearbeiten.

  1. In der Funktion void sml_analyse(void) (Zeile 190 ff.) ist ein Array aus C-Strukturen mit der Bezeichnung obis-legal (Zeile 196 ff.) vorhanden, in der alle unterstützten OBIS-Codes aufgelistet sind.

    Ein Eintrag ist folgend aufgebaut:

    {obis_code, register_start, register_number, register_type, scaler}

    Die einzelnen Einträge haben diese Bedeutung:
    1. obis_code: Die drei Teile eines OBIS-Codes in Hexadezimaldarstellung [C.D.E].
    2. register_start: Registeradresse des ersten Registers für diesen Eintrag.
    3. register_number: Anzahl der Register. Vorbereitete Makros:
      #define REG_BOOL    0x01
      #define REG_INT8 0x01
      #define REG_INT16 0x01
      #define REG_INT32 0x02
      #define REG_INT64 0x04
    4. register_type: Datentyp der Werte im Register. Vorbereitete Makros:
      #define REG_SIGNED      0x50    // Register is signed
      #define REG_UNSIGNED 0x60 // Register is unsigned
      #define REG_STRING 0x00 // Register is a string array
    5. scaler: Anzahl der Nachkommastellen, mit dem der Wert abgespeichert werden soll. Ein negativer Wert ist möglich. Beispiel: -3 -> Kilo
    Beispiel:
    {0x1f0700, 60, REG_INT32, REG_UNSIGNED, 3},     // Current L1
    1. obis_code: 0x1f0700 (OBIS-Code Strom L1: 31.7.0 -> 0x1f.0x07.0x00 -> 0x1f0700).
    2. register_start: 60 (Wert wird ab dem Register 60 eingetragen).
    3. register_number: REG_INT32 (0x02 -> 2 -> 2 Register).
    4. register_type: REG_UNSIGNED (Wert ohne Vorzeichen).
    5. scaler: 3 (Drei Nachkommastellen, z.B. 1,234 A. Im Register steht dann 1234 bzw. 0x4d2).

    Es kann entweder ein neuer Eintrag hinzugefügt oder ein bestehender geändert werden.
    Wird ein bestehender Eintrag geändert und die Registeranzahl erhöht (register_number), dann muss ggf. bei allen nachfolgenden Registern das Startregister entsprechend nach oben verschoben werden, da der vergrößerte Eintrag sonst mit dem nachfolgenden Einträgen in der Registertabelle kollidieren kann. Wird hingegen die Registeranzahl verringert, dann sollte das Startregister der nachfolgenden Einträge reduziert werden, um Lücken in der Registertabelle zu verhindern.

  2. Wurde ein neuer Eintrag in dem Array obis-legal hinzugefügt, dann muss das Makro SUPPORTED_OBIS_CODES_NUMBER in der Datei sml.h (Zeile 51) entsprechend erhöht werden.
  3. Nun muss in der Datei modbus_RTU.c ggf. die Registertabelle angepasst werden. Die einzelnen Tabellen sind in einem Array register_tables aufgeführt.

    Ein Eintrag in diesem Array ist wie folgt aufgebaut:

    {address_first, address_last, storage, buffer}

    Die einzelnen Einträge haben diese Bedeutung:
    1. address_first: Erste Adresse der Tabelle.
    2. address_last: Letzte Adresse der Tabelle.
    3. storage: Zeiger auf ein Array zum Speichern der Registerwerte. Diese Werte können über den Modbus ausgelesen werden.
    4. buffer: Zeiger auf ein Array zum Speichern der Registerwerte. Dieser Speicher wird benutzt, um die per SML empfangenden Daten des Lesekopfes zwischenzuspeichern. Erst nachdem die CRC-Checksumme des SML-Telegramms geprüft wurde, werden diese Werte in den storage-Speicher übernommen.
    Beispiel:
    static uint16_t table_04[16];   // 40-47
    {40, 47, table_04, table_04+8},
    1. address_first: Tabelle beginnt mit der Adresse 40
    2. address_last: Tabelle endet mit der Adresse 47
    3. storage: Zeiger auf das Array table_04
    4. buffer: Zeiger auf das Array table_04 mit einem Adressoffset von 8
    Im Beispiel wird der storage und der buffer in einem Array gespeichert. Da die Beispiel-Tabelle über 8 Register verfügt, muss das Array über die doppelte Größe (16) verfügen. Der buffer hat dementsprechend einen Adressoffset von 8.
Schaltplan
Abbildung 4: Schaltplan des Lesekopfes.

Abbildung 4: Schaltplan des Lesekopfes.

Der Versorgungsspannung (6,5 bis max. 24 V / DC) des Lesekopfes wird über die Anschlussklemme (XZ1, max. 1,00 mm2) bereitgestellt. Die Spannungsversorgung ist durch einen MOSFET (QA1) vor Verpolung geschützt. Eine Zenerdiode (FA1) begrenzt die Gate-Source-Spannung am MOSFET. Die Eingangsspannung wird mit einem Spannungswandler (TA1) auf 5 V / DC gesetzt. Der Spannungswandler wird durch eine Schottkydiode (RA2) vor einer rückwärtigen Einspeisung geschützt.

Der Lesekopf verfügt über einen Fototransistor (BR1) um die optischen Signale eines Smartmeters zu empfangen. Mit einer Infrarot-Diode (EF1) können ebenfalls Informationen an den Zähler geschickt werden (Mehr Informationen folgen).

Die RS485-Schnittelle für den MODBUS RTU wird über einen MAX485-IC (TF1) bereitgestellt. Ein interner Abschlusswiderstand (RA3, RB1) kann über eine Stiftleiste (XG1) aktiviert werden.
Über die Anschlussklemme kann eine hingehende und eine abgehende Datenleitung angeschlossen werden, sodass die Daisy-Chain-Topologie des Bussystems bestmöglich beibehalten wird und keine größeren Stichleitungen entstehen.
Die Baudrate des Modbus kann über eine Stiftleiste zwischen 9600, 19200 oder 38400 gewählt werden. Die Geräteadresse des Lesekopfes kann über zwei Drehcodierschalter eingestellt werden.

Das Herzstück ist der AtTiny 1626 Mikrocontroller (AF1). Dieser Controller verfügt über zwei USARTs, sodass der Betrieb der SML-Schnittstelle und des Modbus leicht umgesetzt werden kann. Die Programmierung erfolgt über eine UPDI-Schnittstelle.

Platine
Abbildung 5: Vorderseite der Platine.

Abbildung 5: Vorderseite der Platine.

Abbildung 6: Rückseite der Platine.

Abbildung 6: Rückseite der Platine.

Abbildung 7: Bestückte Platine.

Abbildung 7: Bestückte Platine.

Gehäuse

Das Gehäuse besteht aus drei Teilen und kann mit einem 3D-Drucker produziert werden.
Zunächst wird ein Ringmagnet in dem Gehäuse platziert. Anschließend wird die Zwischenplatte eingebaut und mit einer Schraube befestigt, sodass der Magnet fixiert und von der Platine isoliert ist. Darauffolgend kann die Platine in das Gehäuse gesteckt und ebenfalls mit einer Schraube befestigt werden.
Der Deckel wird aufgesteckt und mit zwei weiteren Schrauben befestigt. Mithilfe von Lichtleitern wird das Licht der beiden Status-LEDs nach außen geführt. Auf der Vorderseite des Deckels ist eine Einbuchtung vorhanden, in der eine Informationen über den Lesekopf eingeklebt werden kann, z.B. mit einem 9mm-Schriftband.

Es ist eine M12-Kabelverschraubung als Leitungseinführung vorgesehen, sodass die Hin- und Rückführung des Datensignals innerhalb einer Leitung stattfinden muss. Als Datenleitung wird z.B. die UNITRONIC® Li2YCY (TP) 4x2x0,22 empfohlen. Allerdings verwende ich daheim ein Cat6-Netzwerkkabel, was für die private Bastler-Lösung ebenfalls seinen Zweck erfüllt.

Abbildung 8: Gerendertes Bild des Gehäuses.

Abbildung 8: Gerendertes Bild des Gehäuses.

Abbildung 9: Komplett montierter Lesekopf.

Abbildung 9: Komplett montierter Lesekopf.

Abbildung 10: Einsatz des Lesekopfes an einem SGM-C4 Smartmeter.

Abbildung 10: Einsatz des Lesekopfes an einem SGM-C4 Smartmeter.

Abbildung 11: Einsatz des Lesekopfes an einem eHZ-KW8E Smartmeter.

Abbildung 11: Einsatz des Lesekopfes an einem eHZ-KW8E Smartmeter.

Gehäuse des Lesekopfes

Für eine aktive 3D-Ansicht wird der Dienst von Sketchfab verwendet.
Bitte stimmen Sie der Nutzung von Sketchfab zu, um die 3D-Ansicht zu aktivieren.
(Die Cookie-Präferenzen können am Ende der Seite jederzeit angepasst werden.)

Materialliste

Bei den angegebenen Händlern handelt es sich um unabhängige Beispiele. Die Waren können selbstverständlich über andere Quellen bezogen werden.


Bauteil Bezeichnung / Wert Gehäuse / Bauform Benennung Menge Preis*
Reichelt
Leiterplattenklemme DG308-2.54-08P-14-00A(H) 8-polig / 2.54 mm RM XZ1 1 1,26 €
MOSFET (P-Channel) NDS0610 SOT-23 QA1, QA2 2 0,24 € (0,12 € / St.)
Zenerdiode MM3Z12VT1G SOD-323 FA1 1 0,03 €
Widerstand 100 kΩ 0402 RA1, RA5, RA6 3 0,09 € (0,03 € / St.)
Kondensator 150 nF 0603 CA1 1 0,15 €
Kondensator 1 µF 0603 CA2 1 0,02 €
Schottkydiode BAT54J SOD-323F RA2 1 0,06 €
Stiftleiste 1x2 2,54 mm RM XG1 1 0,06€
Kurzschlussbrücke - 2,54 mm für XG1, XE1 2 0,08 € (0,04 € / St.)
Widerstand 120 Ω 1206 RA3 1 0,04 €
Kondensator 1 nF 0603 RB1 1 0,02 €
Drehcodierschalter Hexadezimal 3+3 SMD SF1, SF2 2 3,98 € (1,99 € / St.)
Widerstand 10 kΩ 0402 RA4 1 0,03 €
Fototransistor SFH309FA 3mm THT BR1 1 0,24 €
Stiftleiste 1x3 2,54 mm RM XG2 1 0,08 €
Stiftleiste 2x2 2,54 mm RM XE1 1 0,11 €
485 Transceiver SP485ENL SO-8 TF1 1 1,25 €
Kondensator 100 nF 0603 CA3, CA4 2 0,04 € (0,02 € / St.)
Widerstand 680 Ω 0402 RA7, RA8 1 0,06 € (0,03 € / St.)
IR-LED L-7104F3BT 3mm THT EF1 1 0,18 €
Widerstand 2.2 kΩ 0402 RA9, RA10 2 0,06 € (0x03 € / St.)
LED TLMY 1000 0603 PF1, PF2 2 0,40 € (0x20 € / St.)
Lichtleiter - Ø 3,2 mm für PF1, PF2 2 0,80 € (0x40 € / St.)
Kabelverschraubung - M12x1,5 - 1 0,62 €
Gegenmutter - M12x1,5 - 1 0,43 €
Blechschraube PAN-Head 2,9x6,5 mm - 3 (MOQ: 100) 2,20 €
Blechschraube PAN-Head 2,9x9,5 mm - 1 (MOQ: 100) 2,20 €
Mouser
Mikrocontroller ATTINY1626-SU SOIC-20 AF1 1 1,34 €**
Spannungsregler TS3480CX50 RFG SOT-23 TA1 1 0,74 €**
magnets4you
Ringmagnet Neodym Ø 26 x 12 x 9 mm - 1 5,98 €***
JLCPCB
Platine - - - 1 (MOQ: 5) 2,60 €****

SUMME: ~25,93 € (Ohne Anschlussleitung und Versandkosten)

*: Die oben genannten Preise wurden am 03.04.2022 bei Reichelt ermittelt. Die wirklichen Preise können abweichen. Zum Händler

**: Die oben genannten Preise wurden am 03.04.2022 bei Mouser ermittelt. Die wirklichen Preise können abweichen. Zum Händler

***: Der oben genannte Preis wurde am 03.04.2021 bei magnets4you ermittelt. Der wirkliche Preis kann abweichen. Zum Händler

****: Der oben genannte Preis wurde am 08.07.2021 bei JLCPCB ermittelt. Der wirkliche Preis kann abweichen. Zum Händler

Nachfolgend ist eine Materialliste bei Reichelt verlinkt (Die Produkte anderer Händler sind natürlich nicht enthalten.):

Reichelt: Lesekopf
Downloads
Creative Commons Lizenzvertrag
Dieses Werk von Niklas Menke ist lizenziert unter einer CC BY-NC-SA 4.0 Lizenz.

Aktualisierungsverlauf & Pendenzenliste


Diese Website verwendet zur Darstellung einiger Inhalte externe Dienste und Cookies.

Nachfolgend können Sie die einzelnen Dienste ein- bzw. ausschalten.
Diese Einstellungen können jederzeit im Footer der Website angepasst werden.

Technisch notwendig (Cookie-Präferenzen, Design)
Font Awesome (Symbole)
Google Fonts (Schriftart)
Google reCAPTCHA (Formularschutz)
Sketchfab (3D-Inhalte)

Weitere Informationen finden Sie in der Datenschutzerklärung.

Datenschutzerklärung