Skip to content

Latest commit

 

History

History
198 lines (153 loc) · 18.9 KB

log14184.md

File metadata and controls

198 lines (153 loc) · 18.9 KB

HS ModbusTCP Reader

Dieser GIRA Homeserver Logikbaustein liest mittels Modbus TCP Werte aus Geräten wie Wärmepumpen, Wallboxen etc. aus. Hierzu muss das Gerät ModbusTCP sprechen und eine Register-Beschreibung vorliegen. Bei der Anbindung von Modbus ist es sehr wichtig sehr genau vorzugehen. Sprich auch Little/Big Endian sowie die Register-Typen korrekt zu wählen.

Getestet und unterstützt im Forum wird HS-Firmware 4.12

Bei Problemen bitte hier unter Best-Pratices und häufige Fehler lesen!

Eingänge

Nummer Datentyp Default Beschreibung
1 Zahl 0 Schaltet den Intervall-Timer des Baustein an oder aus. 0 = Aus, 1 = an. Ist der Timer deaktiviert, so sind noch manuelle Abrufe möglich.
2 Zahl 5 Sekunden Ist die Frequenz des Intervalls, wie oft der Baustein die Werte abfragt. - Nur wenn Intervall-Abfrage aktiv!
3 Zahl 1 Bei einer 1 fragt der Baustein von außen gesteuert alle Werte ab
4 Text 127.0.0.1 Die IP-Adresse für den Wechselrichter. Hostname aktuell nicht implementiert.
5 Zahl 502 Der TCP-Port für Modbus.
6 Zahl 1 Die Modbus Unit ID.
7 Text Spezielle Optionen, Kommagetrennt. Siehe Doku!
8 Zahl 0 Word Order bei Multi-Byte Elementen. Per default: LittleEndian. (0: LittleEndian, 1: BigEndian)
9 Zahl 1 Byte Order bei Multi-Byte Elementen. Per default: BigEndian. (0: LittleEndian, 1: BigEndian)
10 Zahl 0 Offset, bewegt alle Register in eine oder andere Richtung. In der Regel 0, gern aber auch -1
11 Zahl 0 Eintrag in Debug-Seite. 0: Nein, 1: Ja
12 Zahl -1 Abfrage 1: Modbus-Register in Dezimal Darstellung. -1: Abfrage wird deaktiviert
13 Zahl 3 Abfrage 1: Lese-Mechanismus / -Function: 1=Coil, 2=Discrete, 3=Holding, 4=Input
14 Text uint16 Abfrage 1: Datentyp
15 Zahl 1 Abfrage 1: Bei numerischen Datentypen: Multiplikator, bei String: Länge des Strings für Abfrage
16 Zahl -1 Abfrage 2: Modbus-Register in Dezimal Darstellung. -1: Abfrage wird deaktiviert
17 Zahl 3 Abfrage 2: Lese-Mechanismus / -Function: 1=Coil, 2=Discrete, 3=Holding, 4=Input
18 Text uint16 Abfrage 2: Datentyp
19 Zahl 1 Abfrage 2: Bei numerischen Datentypen: Multiplikator, bei String: Länge des Strings für Abfrage
20 Zahl -1 Abfrage 3: Modbus-Register in Dezimal Darstellung. -1: Abfrage wird deaktiviert
21 Zahl 3 Abfrage 3: Lese-Mechanismus / -Function: 1=Coil, 2=Discrete, 3=Holding, 4=Input
22 Text uint16 Abfrage 3: Datentyp
23 Zahl 1 Abfrage 3: Bei numerischen Datentypen: Multiplikator, bei String: Länge des Strings für Abfrage
24 Zahl -1 Abfrage 4: Modbus-Register in Dezimal Darstellung. -1: Abfrage wird deaktiviert
25 Zahl 3 Abfrage 4: Lese-Mechanismus / -Function: 1=Coil, 2=Discrete, 3=Holding, 4=Input
26 Text uint16 Abfrage 4: Datentyp
27 Zahl 1 Abfrage 4: Bei numerischen Datentypen: Multiplikator, bei String: Länge des Strings für Abfrage
28 Zahl -1 Abfrage 5: Modbus-Register in Dezimal Darstellung. -1: Abfrage wird deaktiviert
29 Zahl 3 Abfrage 5: Lese-Mechanismus / -Function: 1=Coil, 2=Discrete, 3=Holding, 4=Input
30 Text uint16 Abfrage 5: Datentyp
31 Zahl 1 Abfrage 5: Bei numerischen Datentypen: Multiplikator, bei String: Länge des Strings für Abfrage
32 Zahl -1 Abfrage 6: Modbus-Register in Dezimal Darstellung. -1: Abfrage wird deaktiviert
33 Zahl 3 Abfrage 6: Lese-Mechanismus / -Function: 1=Coil, 2=Discrete, 3=Holding, 4=Input
34 Text uint16 Abfrage 6: Datentyp
35 Zahl 1 Abfrage 6: Bei numerischen Datentypen: Multiplikator, bei String: Länge des Strings für Abfrage
36 Zahl -1 Abfrage 7: Modbus-Register in Dezimal Darstellung. -1: Abfrage wird deaktiviert
37 Zahl 3 Abfrage 7: Lese-Mechanismus / -Function: 1=Coil, 2=Discrete, 3=Holding, 4=Input
38 Text uint16 Abfrage 7: Datentyp
39 Zahl 1 Abfrage 7: Bei numerischen Datentypen: Multiplikator, bei String: Länge des Strings für Abfrage
40 Zahl -1 Abfrage 8: Modbus-Register in Dezimal Darstellung. -1: Abfrage wird deaktiviert
41 Zahl 3 Abfrage 8: Lese-Mechanismus / -Function: 1=Coil, 2=Discrete, 3=Holding, 4=Input
42 Text uint16 Abfrage 8: Datentyp
43 Zahl 1 Abfrage 8: Bei numerischen Datentypen: Multiplikator, bei String: Länge des Strings für Abfrage

Der Datentyp ist nur nötig bei Registertypen 3 (Holding) und 4 (Input). Bei den Anderen (Coil, Discrete) wird dieser ignoriert, da es sich um boolische Rückgabewerte handelt (0 oder 1).

Änderungen von Eingängen die keine Werte darstellen werden beim nächsten Wert berücksichtigt - führen aber NICHT zu einem neu-senden der bestehenden Werte.

Ausgänge

Alle Ausgänge senden bei jedem Abruf den entsprechenden Wert -- unabhängig davon, ob dieser sich geändert hat oder nicht. Der Datentyp des KO, das mit dem Ausgang verbunden wird hängt vom Modbus-Register ab: Je nach Länge machen auch nur größere Genauigkeiten beim KO Sinn.

Nummer Beschreibung
1 Gibt eine 1 aus nach einem erfolgreichen Durchlauf. Kann mit Eingang 3 verbunden werden für eine Verkettung
2 Register 1: Ausgelesener nummerischer Wert (nur wenn nummerisch!)
3 Register 1: Ausgelesener Wert als String
4 Register 2: Ausgelesener nummerischer Wert (nur wenn nummerisch!)
5 Register 2: Ausgelesener Wert als String
6 Register 3: Ausgelesener nummerischer Wert (nur wenn nummerisch!)
7 Register 3: Ausgelesener Wert als String
8 Register 4: Ausgelesener nummerischer Wert (nur wenn nummerisch!)
9 Register 4: Ausgelesener Wert als String
10 Register 5: Ausgelesener nummerischer Wert (nur wenn nummerisch!)
11 Register 5: Ausgelesener Wert als String
12 Register 6: Ausgelesener nummerischer Wert (nur wenn nummerisch!)
13 Register 6: Ausgelesener Wert als String
14 Register 7: Ausgelesener nummerischer Wert (nur wenn nummerisch!)
15 Register 7: Ausgelesener Wert als String
16 Register 8: Ausgelesener nummerischer Wert (nur wenn nummerisch!)
17 Register 8: Ausgelesener Wert als String

Datentypen

Folgende Datentypen werden unterstützt. Unbekannte Typen werden übersprungen! Bei RegisterType 'Coil' spielt der Datentyp keine Rolle: Es wird 1 für True und 0 für False zurückgegeben.

Typ Register-Anzahl Beschreibung
int8 1 Vorzeichenbehafteten Wert aus: -128 - 127
uint8 1 Vorzeichenlosen Wert aus: 0 - 255
int16 1 Vorzeichenbehafteten Wert aus: -32.768 - 32.767
uint16 1 Vorzeichenlosen Wert aus: 0 - 65.535
int32 2 Vorzeichenbehafteten Wert aus: −2.147.483.648 - 2.147.483.647
uint32 2 Vorzeichenlosen Wert aus: 0 - 4.294.967.295
int64 4 Vorzeichenbehafteten Wert aus: −9.223.372.036.854.775.808 - 9.223.372.036.854.775.808
uint64 4 Vorzeichenlosen Wert aus: 0 - 18.446.744.073.709.551.615
float32 2 Gleitkommazahl mit einfacher Genauigkeit
float64 4 Gleitkommazahl mit doppelter Genauigkeit

Register Types / Modicon Notation

Sind die Register in Modicon Notation, so ist der Typ manuell zu wählen und die vorderste Stelle zu streichen. Beispiel: 40001 => Holding Register, Function Type 3 mit Register 1

Register Adressen Function Type Typ
00000 - 09999 1 Coil: 1bit-Register für boolische Representationen. Kann gelesen und geschrieben werden
10000 - 19999 2 Discrete Register: 1bit-Register für boolische Representationen. Kann nur gelesen werden
30000 - 39999 4 Input Register: 16bit-Register - können nur gelesen werden
40000 - 49999 3 Holding Register: 16bit-Register - können gelesen und geschrieben werden

Spezialoptionen (Eingang 7)

Komma-separiert dort angeben, was für Spezialdinge man aktivieren möchte. Beispiel: KeepAlive,Sleep100ms Eingabe ist nicht Case-Sensitiv.

KeepAlive

Lässt die TCP-Verbindung offen für die nächste Iteration / Intervall. Sollte bei mehreren Bausteinen, die den gleichen Master abfragen NICHT verwendet werden. Macht zudem mit mehreren Modbus-Implementierungen Probleme. Wenn es aber funktioniert, reduziert es die TCP-Handshakes, da die Verbindung dauerhaft aufgebaut bleibt.

Sleep100ms

Nach einer Abfrage wartet der Baustein 100ms bevor er die nächste Abfrage macht. Manche Geräte sind mit den vielen Abfragen überfordert, da kann etwas Ruhe helfen.

Sleep500ms

Nach einer Abfrage wartet der Baustein 500ms bevor er die nächste Abfrage macht. Manche Geräte sind mit den vielen Abfragen überfordert, da kann etwas Ruhe helfen.

Sleep1s

Nach einer Abfrage wartet der Baustein 1s bevor er die nächste Abfrage macht. Manche Geräte sind mit den vielen Abfragen überfordert, da kann etwas Ruhe helfen. Wichtig: Achte darauf, dass die Durchläufe sich nicht einholen: 8 Register abfragen je eine Sekunde: Nimm mehr als 10s Intervall!

Sleep2s

Nach einer Abfrage wartet der Baustein 2s bevor er die nächste Abfrage macht. Manche Geräte sind mit den vielen Abfragen überfordert, da kann etwas Ruhe helfen. Wichtig: Achte darauf, dass die Durchläufe sich nicht einholen: 8 Register abfragen je eine Sekunde: Nimm mehr als 10s Intervall!

Kann kombiniert werden mit den anderen Sleeps: Sleep1s,Sleep2s => Wartet 3s

ReconnectAfterEachRead

Während ohne KeepAlive alle (8) Register hintereinander über eine Verbindung gelesen und diese dann geschlossen wird, schließt dieser Parameter nach jedem Lese-Vorgang die Verbindung und startet danach mit einer frischen TCP-Verbindung. Dies hilft bei schlechten Implementierungen der Gegenseite, erzeugt aber mehr Last auf dem HomeServer und der Gegenseite, da jedes Mal eine neue TCP-Verbindung aufgebaut wird.

Hilft z.B. gegen Fehlermeldungen wie:

Message: Modbus Error: [Connection] ModbusTcpClient(192.168.XXX.XXX:502): Connection unexpectedly closed 0.000034 seconds into read of 8 bytes without response from unit before it closed connection

Hilft auch, dass die Verbindung nicht während der Wartezeit von z.B. Sleep500ms offengehalten wird. Kann der Modbus-Server nur eine IP-Verbindung zu Zeit ist ansonsten die Verbindung blockiert.

Best-Pratices und häufige Fehler

  • Wenn das Gerät unbekannt ist, sollte mit einem Tool auf dem PC erstmal versucht werden Register zu lesen.
  • Modbus-Beschreibung sehr gründlich bzgl. der UnitId, Endianess und den Datentypen lesen!
  • Verwende den Live-Debug vom Homeserver, um später Werte zu überprüfen und Einstellungen zur Laufzeit anzupassen
  • Schalte den Debug-Modus nur auf einem Baustein ein und überprüfe bei dem Problem-Baustein die Debug-Ausgaben!
  • Werte kommen, aber alle 32-Bit Register sind falsch? Überprüfe die Endianess: E8 mal auf 1 setzen
  • Werte sind alle falsch: Manche zählen die Register dezimal von 1 an, andere bei 0. Der Baustein arbeitet mit 0: Versuche mal E10 auf -1 zu setzen
  • Die Register sind 5-Stellig und sehen aus wie Modicon: Lasse die erste Ziffer weg und setze den Register-Typen entlang der Register-Typen Beschreibung: 34567 => Input Register 4567
  • Das Gerät antwortet unregelmäßig oder garnicht mehr: Frage es seltener ab. Füge Sleeps zwischen den einzelnen Werten hinzu - Siehe Spezialoptionen auf Eingang 7

Debug-Mode

Der Logikbaustein zeigt auch die Werte und weitere interne Status-Informationen im Debug-Fenster des Homeservers an. Dort sind auch die letzten Fehler einzusehen:

  1. Homeserver hslist aufrufen: https://>/hslist
  2. Listenschlüssel: debug, Username und Passwort von einem admin-User eingeben.
  3. Unter HSL2.0 oder hs_modbusTCP_reader14184 die Fehler suchen oder die Werte überprüfen.

Haftung / Gewährleistung

Es wird weder eine Haftung noch eine Gewährleistung übernommen. Für den Betrieb ist der Anlagenbetreiber bzw. Integrator verantwortlich.

Sourcecode / Weiterführende Doku

Lizenz & Faire Nutzung

  • Der Baustein wird unter der LGPL 2.1 frei für die private Nutzung zur Verfügung gestellt.
  • Die Nutzung des Logikbausteins ist für Endverbraucher frei, wenn sie diese selbst und selbstständig in Betrieb nehmen und konfigurieren. - Integratoren haben eine angemessene Aufwandsentschädigung zu leisten. Diese kann beim Autoren angefragt werden.
  • Freie Software heißt nicht freie Wartung & Support und geschieht auf freiwilliger Basis
  • Es wird keine Gewährleistung noch Haftung für Schäden aus der Nutzung des Bausteins übernommens der Nutzung des Bausteins übernommen
  • Er enthält folgende weiteren Libraries und Lizenzen