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 einer modernen Messeinrichtung (mME, Smartmeter) 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.

Zum Bausatz

Es stehen keine Bausätze mehr zur Verfügung.

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 der Messeinrichtung die in der Registertabelle dickgedruckten Werte. Die restlichen Werte werden berechnet, falls dies mit den von der Messeinrichtung übergebenen Werten möglich ist. Zu beachten ist dabei, dass die Berechnungen nur die Grundschwingungsanteile berücksichtigt und Oberschwingungen unberücksichtigt bleiben.

Weitere Hinweise zu einigen Registern:

Software

Für den Lesekopf steht eine Software zur Verfügung, siehe Abbildung 4. Hauptsächlich dient die Software zum Parametrieren des Lesekopfes und zum gelegentlichen Auslesen der Momentanwerte bzw. Energiewerte.

Zur Software Abbildung 4: Übersicht der Software.

Abbildung 4: Übersicht der Software.

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:

Im Register 8244 wird das Messintervall angegeben. Dieses wird aus der Zeitdifferenz zwischen dem aktuellen Datensatz und dem vorhergegangenen Datensatz der modernen Messeinrichtung gebildet. Somit beträgt das Messintervall in der Regel eine oder mehrere Sekunden. Einige Wechselrichter bzw. Wallboxen fordern ein genaueres Messintervall. Dies kann über die optische Schnittstelle der modernen Messeinrichtungen leider nicht erreicht werden. Aus diesem Grund kann das Messintervall im Lesekopf manuell angegeben werden. Dabei ist zu beachten, dass das tatsächliche Messintervall dadurch nicht verändert wird. Zur manuellen Eingabe eines Messintervalls sind folgende Register anzupassen:

Zusätzlich ist zu beachten, welche Daten die moderne Messeinrichtung ausgibt. Wird nur die momentane Wirkleistung und keine Spannungen und Ströme ausgegeben, dann muss ebenfalls das Register 8250 geändert 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 der modernen Messeinrichtung 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.
Smart Message Language (SML)

Eine Beispiel in SML mit Erklärung ist hier zu finden.

Der Lesekopf ist kein Interpreter für eine eine komplette SML Nachricht. Es werden nur die notwendigen Informationen erfasst. Im Prinzip sucht der Lesekopf zunächst nach der Startsequenz (1B 1B 1B 1B) einer SML Nachricht. Wurde diese Startsequenz gefunden, dann wird nach den im Lesekopf parametrierten OBIS-Codes gesucht und die entsprechenden Werte zwischengespeichert. Dieser Vorgang wird so oft wiederholt, bis die Endsequenz (1B 1B 1B 1B) gefunden wird. Nach erfolgreicher Überprüfung der CRC-Checksumme werden die fehlenden Werte wenn möglich berechnet und an die Modbus Register übergeben. Der Prozess beginnt von vorne. Das Prinzip ist in dem nachfolgenden Flussdiagramm veranschaulicht:

Abbildung 5: Analyse einer SML Nachricht als Flussdiagramm dargestellt.

Abbildung 5: Analyse einer SML Nachricht als Flussdiagramm dargestellt.

Schaltplan
Abbildung 6: Schaltplan des Lesekopfes.

Abbildung 6: 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 einer modernen Messeinrichtung 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 7: Vorderseite der Platine.

Abbildung 7: Vorderseite der Platine.

Abbildung 8: Rückseite der Platine.

Abbildung 8: Rückseite der Platine.

Abbildung 9: Bestückte Platine.

Abbildung 9: Bestückte Platine.

Abbildung 10: Vorderseite der Platine als 3D-Ansicht.

Abbildung 10: Vorderseite der Platine als 3D-Ansicht.

Abbildung 11: Vorderseite der Platine als 3D-Ansicht.

Abbildung 11: Rückseite der Platine als 3D-Ansicht.

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 12: Gerendertes Bild des Gehäuses.

Abbildung 12: Gerendertes Bild des Gehäuses.

Abbildung 13: Komplett montierter Lesekopf.

Abbildung 13: Komplett montierter Lesekopf.

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

Abbildung 15: Einsatz des Lesekopfes an einem SGM-C4 Zähler.

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

Abbildung 15: Einsatz des Lesekopfes an einem eHZ-KW8E Zähler.

Abbildung 16: Explosionszeichnung des Lesekopfes.

Abbildung 16: Explosionszeichnung des Lesekopfes.

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