Vorstellung: Generischer ModBus-READ (FC3) mit JSON/CSV (Register-Parametrisierung) und JSON (Ausgabe) auf Basis moderner ModBus-Library (https://github.com/aldas/modbus-tcp-client)
Aufbereitung Ausgabe z.B. mit 19001208 "JSON Extractor". Damit hat jeder "leichten Fußes" freie Registerwahl für seine ModBus-Geräte. Im Gegenzug muss man sich um die Aufbereitung der Werte selber kümmern.
Ich nutze ihn bereits produktiv und denke nach einigen Rückmeldungen nun, dass der LBS hinreichend stabil ist. Bin dennoch weiter auf Eure Rückmeldungen gespannt.
Motivation: Alle mir bekannten ModBus-Lösungen hier basieren auf der selben Library. Auch wenn ich damals dankbar für die Vorlage war und bin, so ist diese meines Erachtens verwirrend in der Installation mit speziellen handoptimierten Dateien und zudem nicht modern im Sinne aktiv gepflegt, aktuelles PHP und einfach in der Anwendung. Bei meiner Suche bin ich auf eine andere Library gestoßen, die letztlich sehr einfach und klar in der Anwendung ist, nach meiner Erfahrung spürbar weniger Last erzeugt und aktuell und aktiv gepflegt auf Git: Der Modbus-Aufruf selber ist neben den includes nur 4 Zeilen Code, der Rest ist ChiChi...
Ziele:
oder
Der folgenden LBS ist seit einigen Tagen bei mir nun gereift und fehlerfrei und verlässlich gelaufen für 3 SMA-Geräte, d.h. 3 Instanzen des LBS. Meinen "alten" SMA-spezifischen LBS habe ich bereits seit dem komplett deaktiviert. Logik:
Unbenannt.JPG Nötig ist nur der LBS und der JSON-Extractor. Die Watchdogs sind nur optional.
Und hier beispielhaft "Division/Konstante" für alle Werte eines ModBus-Geräts mit entsprechender Skalierung (hier: Netzfrequenz 5000 -> 50,00Hz).
Unbenannt.JPG
Test eines neuen Registers: Im Live-Modus Register an E8 hinzufügen, passenden Eintrag im JSON Extractor, LSB neu triggern, voilá!
Bitte lasst mich wissen, wenn bei der Installationsanleitung etwas fehlt/falsch ist. Hier ein kleines Testscript, um die Installation/Funktion der Library abseits edomi testen zu können. Wenn das Script geht, wird edomi und der LBS sehr wahrscheinlich sofort gehen.
Bitte schreibt Euren Erfahrungen mit unterschiedlichen ModBus-Geräten. Außer für SMA ist der LBS völlig ungetestet; daher NICHT Euer Produktivsystem umbauen, ohne vorher ein paar Tage getestet zu haben.
E8 zum copy & paste: Es folgt unten ein Beitrag mit Register-Parametersätzen für SMA, die ich verwende.
Wenn jemand mit dem LBS mit anderen ModBus-Geräten erfolgreich ist, wäre jeweils ein Beitrag mit dem erfolgreich verwendeten Register-Parametersatz sinnvoll.
Ergänzende Details
weitere Logik-Beispiele:
Umsetzen der ENUM-Codes auf Texte für den SMA SI - Quelle (und sicher auch die Rechte darauf): SMA bzw. aus diversen SMA.-Modbus-Dokus zusammen geschrieben
Unbenannt.JPG
jeweils E3 und E4 für den Wenn-Dann-Sonst-Variabel-LBS:
303;1461;1462;1463
Aus (303);Netz zugeschaltet (1461);Backup nicht verfügbar (1462);Backup (1463)
46;1773;1774;1775;1776;1777;1778
Batterie (46);Keine Anforderung (1773);Last (1774);Zeitsteuerung (1775);Manuell eine Stunde (1776);Manueller Start (1777);Externe Quelle (1778)
1779;1780;1781
Getrennt (1779);Öffentliches Stromnetz (1780);Inselnetz (1781)
303;1394;1461;1466;1787;2183;2184;2185;2186;3068;1 6777213
Aus(303);Warte auf gültiges AC-Netz (1394);Netz zugeschaltet (1461);Warten (1466);Initialisierung (1787);Netzbetrieb ohne Rückspeisen (2183);Energiesparen am Netz (2184);Beenden des Energiesparens am Netz (2185);Starten des Energiesparens am Netz (2186);Netzbetrieb mit Rückspeisen (3068); keine Info (16777213)
303;1392;1787;1788;1789;1790;1791;1792;1793;1794;1 795;1796
Aus (303);1392 = Fehler (1392);Initialisierung (1787);Bereit (1788); Warmlauf (1789);Synchronisieren (1790);Zugeschaltet (1791);Neusynchronisieren (1792);Generatortrennung (1793);Nachlauf (1794);Verriegelt (1795);Gesperrt nach Fehler (1796)
2614;2615;2616;2617;2618
Eigenverbrauchsbereich (2614);Ladezustandserhaltungsbereich (2615);Ersatzstrombereich (2616);Tiefentladeschutzbereich (2617);Tiefentladebereich (2618)
35;303;307;455
Fehler (35);Aus (303);OK (307);Warnung (455)
0;51;276;295;303;308;309;311;336;337;338;381;455;4 61;973;1041;1042;1069;1070;1071;1072;1073;1074;107 5;1076;1077;1078;1079;1387;1388;1389;1390;1391;139 2;1393;1394;1395;1396;1455;1466;1467;1468;1469;147 0;1471;1472;1473;1474;1475;1476;1477;1478;1479;148 0
kein Event (0); Geschlossen (51);Momentanwert (276);MPP (295);Aus (303);Ein (308);Betrieb (309);Offen (311);Hersteller kontaktieren (336);Installateur kontaktieren (337);Ungültig (338);Stopp (381);Warnung (455);SMA (Herstellerangabe) (461);Nicht eingestellt (973);Kapazitiv (1041);Induktiv (1042);Blindleistungs-/Spannungskennlinie Q(U) (1069);Blindleistung Q, direkte Vorgabe (1070);Blindleistung konst. Q (kvar) (1071);Blindleistung Q, Vorgabe durch Anlagensteuerung (1072);Blindleistung Q(P) (1073);cos ?, direkte Vorgabe (1074);cos ?, Vorgabe durch Anlagensteuerung (1075);cos ?(P)-Kennlinie (1076);Wirkleistungsbegrenzung P (W) (1077);Wirkleistungsbegrenzung P in (%) von PMAX (1078);Wirkleistungsbegrenzung P durch Anlagensteuerung (1079);Blindleistung Q, Vorgabe über analogen Eingang (1387);Cos ?, Vorgabe über analogen Eingang (1388);Blindleistungs-/Spannungskennlinie Q(U) mit Hysterese und Totband (1389);Wirkleistungsbegrenzung P über analogen Eingang (1390);Wirkleistungsbegrenzung P über digitale Eingänge (1391);Fehler (1392);Warte auf PV-Spannung (1393);Warte auf gültiges AC-Netz (1394);DC-Bereich (1395);AC-Netz (1396);Not-Aus (1455);Warten (1466);Starten (1467);MPP-Suche (1468);Herunterfahren (1469);Störung (1470);Warn-/Fehler-Mail OK (1471);Warn-/Fehler-Mail nicht OK (1472);Anlageninfo-Mail OK (1473);Anlageninfo-Mail nicht OK (1474);Fehler-Mail OK (1475);Fehler-Mail nicht OK (1476);Warn-Mail OK (1477);Warn-Mail nicht OK (1478);Warten nach Netzunterbrechung (1479);Warte auf EVU (1480)
71;84;87;89;90;125;132;133;134;141;145;148;156;168 ;189;208;520;540;542;543;546;547;973;1004;1007;125 5;1598
Gerätestörung (71);Überstrom Netz (HW) (84);Netzfrequenzstörung (87);Netztrennstelle(89);Netzspannungsmessung Abweichung (90);Überspannung Eingang A (SW) (125);Systemdaten defekt (132);Zugriff auf Systemdaten nicht möglich (133);Systemdaten hergestellt (134);Derating lag vor (141);Relaisfehler (145);Interne Kommunikation (148);Programmablauf (Betrieb) (156);Codespeicher defekt (168);Programmablauf (Statusmaschine) (189);Programmablauf (Watchdog) (208);Übertemperatur Trafobereich (520);GFDI Fuse Open (PV ist ungleich Erde) (540);Interne Messvergleichsstörung (542);Interne Messvergleichsstörung (543);Störung in der Messwerterfassung (546);Netzstörung von einem anderem Gerät gemeldet (547);Keine Meldung (973);Automatische Netztyperkennung ist fehlgeschlagen (1004);Zu großer Strom in der GFDI/Erdstrom Strommessung (1007);Netzüber/-unterspannung wurde festgestellt (1255);Transformator falsch angeschlossen (1598)
Aufbereitung Ausgabe z.B. mit 19001208 "JSON Extractor". Damit hat jeder "leichten Fußes" freie Registerwahl für seine ModBus-Geräte. Im Gegenzug muss man sich um die Aufbereitung der Werte selber kümmern.
Ich nutze ihn bereits produktiv und denke nach einigen Rückmeldungen nun, dass der LBS hinreichend stabil ist. Bin dennoch weiter auf Eure Rückmeldungen gespannt.
Motivation: Alle mir bekannten ModBus-Lösungen hier basieren auf der selben Library. Auch wenn ich damals dankbar für die Vorlage war und bin, so ist diese meines Erachtens verwirrend in der Installation mit speziellen handoptimierten Dateien und zudem nicht modern im Sinne aktiv gepflegt, aktuelles PHP und einfach in der Anwendung. Bei meiner Suche bin ich auf eine andere Library gestoßen, die letztlich sehr einfach und klar in der Anwendung ist, nach meiner Erfahrung spürbar weniger Last erzeugt und aktuell und aktiv gepflegt auf Git: Der Modbus-Aufruf selber ist neben den includes nur 4 Zeilen Code, der Rest ist ChiChi...

Ziele:
- Generisch und robust und niedrige Systemlast
- Aktuelle ModBus-Library
- Ausgabe generisch per JSON, um sie mit jonofe Andrés wunderbaren 19001208 "JSON Extractor" simpel und nachvollziehbar weiter zu verarbeiten.
- Damit beliebig skalierbar und auch inhaltlich strukturierbar, weil beliebig viele Instanzen des JSON Extractors aus A1 versorgt werden können.
- spezifische Format-Aufbereitungen nun nach gelagert, z.B. sendet SMA Hz und Temperaturen als "4999" (=49,99Hz) oder "206" (20,6°C); es ist für bestimmte Ausgabewerte nach dem JSON-Extractor daher eine nach gelagerte "Division/Konstante" erforderlich (z.B. mit 100; siehe Screenshot). Der (kleine) Preis für eine generische ModBus-Abfrage.
- wenn jemand partout einen geräte-spezifischen LBS bauen möchte, könnte dieser das JSON nehmen und mundgerecht aufbereiten (ersetzt damit den 19001208)
- ModBus-Parametrisierung einfach und sollte abseits der IP/Port/ID mit Default-Werten (hoffentlich) bereits für die meisten Geräten funktionieren.
- Dennoch weitere Optionen für bessere Performance und Anpassung der Robustheit
- Register-Parametrisierung
- so minimal wie möglich: Register + Name + Format. Fertig. Keine Spezifika (siehe unten zu E8)
- Und flexibel.
- entweder als JSON
- oder mit einem toleranten CSV-Format. Tolerant in Bezug auf Trennzeichen und auch auf die Besonderheit von edomi: Beim Kopieren von Werte-Listen (mit Umbrüchen) in ein KO-Initialwert werden die Umbrüche durch ein Leerzeichen ersetzt. Das ist unglücklich, weil die Vorbereitung zeilenbasiert viel einfacher ist. Daher unterstützt die Lösung dies auch. Tabellarisch vorbereiten und per copy&paste "gedankenlos" für den LBS verwendbar.
Code:
[ { "address" : "30775", "type" : "int32", "name" : "Ladeleistung [W]"},{ "address" : "30845", "type" : "uint32", "name" : "Batteriestatus [%]" } ]
Code:
30845;"Ladeleistung [W]";uint32;30775;"Batteriestatus [%]";int32
Code:
30845;"Ladeleistung [W]";uint32 30775;"Batteriestatus [%]";int32
Der folgenden LBS ist seit einigen Tagen bei mir nun gereift und fehlerfrei und verlässlich gelaufen für 3 SMA-Geräte, d.h. 3 Instanzen des LBS. Meinen "alten" SMA-spezifischen LBS habe ich bereits seit dem komplett deaktiviert. Logik:
Unbenannt.JPG Nötig ist nur der LBS und der JSON-Extractor. Die Watchdogs sind nur optional.
Und hier beispielhaft "Division/Konstante" für alle Werte eines ModBus-Geräts mit entsprechender Skalierung (hier: Netzfrequenz 5000 -> 50,00Hz).
Unbenannt.JPG
Test eines neuen Registers: Im Live-Modus Register an E8 hinzufügen, passenden Eintrag im JSON Extractor, LSB neu triggern, voilá!
Bitte lasst mich wissen, wenn bei der Installationsanleitung etwas fehlt/falsch ist. Hier ein kleines Testscript, um die Installation/Funktion der Library abseits edomi testen zu können. Wenn das Script geht, wird edomi und der LBS sehr wahrscheinlich sofort gehen.
Bitte schreibt Euren Erfahrungen mit unterschiedlichen ModBus-Geräten. Außer für SMA ist der LBS völlig ungetestet; daher NICHT Euer Produktivsystem umbauen, ohne vorher ein paar Tage getestet zu haben.
E8 zum copy & paste: Es folgt unten ein Beitrag mit Register-Parametersätzen für SMA, die ich verwende.
Wenn jemand mit dem LBS mit anderen ModBus-Geräten erfolgreich ist, wäre jeweils ein Beitrag mit dem erfolgreich verwendeten Register-Parametersatz sinnvoll.
Ergänzende Details
- E4: Pausenzeit zwischen zwei Abfragen (in ms), z.B. alle 15sec = "15000". Dies ist der einzige Wert, der jederzeit geändert werden kann. Damit kann man das Abfrage Intervall dynamisch beschleunigen, wenn man gerade auf einer bestimmten Visu-Seite ist. Alle anderen Werte bedingen ein neues Triggern/Neustart des LBS.
- E9 + E10: Jedes Geräte codiert seine Daten unterschiedlich; der spezifische Endian (testen oder Geräte-Doku) kann festgelegt werden (E9). Es kommt vor, dass Register mit String-Werten einen abweichenden Endian nutzen (E10)
- E11 + E12: Gewünschte Register müssen (protokollbedingt von der Library intern) auf mehrere Requests verteilt werden; zunehmend mit Anzahl und Verteilung der Registeradressen. Durch eine Sortierung wird versucht , die Requestzahl niedrig zu halten. ModBus-Geräte können eine unterschiedliche Anzahl Requests in einer Abfrage verarbeiten. Wird sie überschritten, kommt es zu einem ConnectionTimeout. Dieses gerätespezifische Limit kann an E11 gesetzt werden. Wird sie überschritten, werden sie auf weitere Abfragen/Chunks verteilt, die mit etwas Verzögerung (E12) angefragt werden. SMA hat eine Grenze von 4, WAGO nach meiner Info 10. Eine höhere Zahl beschleunigt - solange die Grenze nicht überschritten wird. Nur relevant bei vielen Registern! Es lohnt ein Blick im DebugMode, ob überhaupt mehrerer Chunks gebildet werden.
- E13 + E14: Prinzipbedingt kommt es bei ModBus zu timeouts (E13). Die resultierenden Exceptions der Library werden für eine wählbare Anzahl (E14) abgefangen und mit einer (ansteigenden) Wartezeit wiederholt. Mit den Standardwerten sollten alle üblichen Verzögerungen (Generator-Start, etc) hinreichend abgedeckt sein. Kommt es regelmäßig zu Fehlern im Fehler-Log, sollte die Ursache geprüft werden und ggf. E14 erhöht werden - solange man damit keine systematischen Probleme verschattet/nicht bemerkt. Da ich derlei sehen will (FehlerLog), aber auch sicher sein will, dass es weiter geht, kann man eine "Selbstheilung für diese Fälle einbauen durch ein erneutes Triggern per Watchdog. Wenn man das nicht will, einfach E14 noch höher wählen und den Watchdog-Krams weglassen.
- E15 + E16: Manche Register liefern im Betrieb Bursts oder auch mal länger Extremwerte (x8000000, xFFFFFFFF,... z.B. SMA-WR nachts als Momentanleistung), die man nicht in seinen Datenarchieven ahben möchte. Daher kann man übliche Werte per Werteliste ausfiltern (E15) und durch einen Wert für alle oder für jeden Filterwert spezifisch ersetzen. Meist dürfte eine E16 = 0 passen.
- E18: Auswahl,ob per FC3 oder FC4 ausgelesen werden soll. Bei manchen Geräten kann FC3 nur 3xxxxx-Register, und FC4 nur 4xxxxx-Register lesen; bei anderen ist es egal. Default ist 3 = FC3
- E19: Optionales RegisterOffset: Entweder kein Offset oder ein statisches oder ein Typ-Abhängiges oder eine Kombination dessen.
- A16: Timestamp letzte Aktualisierung; dient vor allem dem Triggern von Watchdogs
- A17: Timestamp letzte Aktualisierung für Visu
weitere Logik-Beispiele:
Umsetzen der ENUM-Codes auf Texte für den SMA SI - Quelle (und sicher auch die Rechte darauf): SMA bzw. aus diversen SMA.-Modbus-Dokus zusammen geschrieben
Unbenannt.JPG
jeweils E3 und E4 für den Wenn-Dann-Sonst-Variabel-LBS:
303;1461;1462;1463
Aus (303);Netz zugeschaltet (1461);Backup nicht verfügbar (1462);Backup (1463)
46;1773;1774;1775;1776;1777;1778
Batterie (46);Keine Anforderung (1773);Last (1774);Zeitsteuerung (1775);Manuell eine Stunde (1776);Manueller Start (1777);Externe Quelle (1778)
1779;1780;1781
Getrennt (1779);Öffentliches Stromnetz (1780);Inselnetz (1781)
303;1394;1461;1466;1787;2183;2184;2185;2186;3068;1 6777213
Aus(303);Warte auf gültiges AC-Netz (1394);Netz zugeschaltet (1461);Warten (1466);Initialisierung (1787);Netzbetrieb ohne Rückspeisen (2183);Energiesparen am Netz (2184);Beenden des Energiesparens am Netz (2185);Starten des Energiesparens am Netz (2186);Netzbetrieb mit Rückspeisen (3068); keine Info (16777213)
303;1392;1787;1788;1789;1790;1791;1792;1793;1794;1 795;1796
Aus (303);1392 = Fehler (1392);Initialisierung (1787);Bereit (1788); Warmlauf (1789);Synchronisieren (1790);Zugeschaltet (1791);Neusynchronisieren (1792);Generatortrennung (1793);Nachlauf (1794);Verriegelt (1795);Gesperrt nach Fehler (1796)
2614;2615;2616;2617;2618
Eigenverbrauchsbereich (2614);Ladezustandserhaltungsbereich (2615);Ersatzstrombereich (2616);Tiefentladeschutzbereich (2617);Tiefentladebereich (2618)
35;303;307;455
Fehler (35);Aus (303);OK (307);Warnung (455)
0;51;276;295;303;308;309;311;336;337;338;381;455;4 61;973;1041;1042;1069;1070;1071;1072;1073;1074;107 5;1076;1077;1078;1079;1387;1388;1389;1390;1391;139 2;1393;1394;1395;1396;1455;1466;1467;1468;1469;147 0;1471;1472;1473;1474;1475;1476;1477;1478;1479;148 0
kein Event (0); Geschlossen (51);Momentanwert (276);MPP (295);Aus (303);Ein (308);Betrieb (309);Offen (311);Hersteller kontaktieren (336);Installateur kontaktieren (337);Ungültig (338);Stopp (381);Warnung (455);SMA (Herstellerangabe) (461);Nicht eingestellt (973);Kapazitiv (1041);Induktiv (1042);Blindleistungs-/Spannungskennlinie Q(U) (1069);Blindleistung Q, direkte Vorgabe (1070);Blindleistung konst. Q (kvar) (1071);Blindleistung Q, Vorgabe durch Anlagensteuerung (1072);Blindleistung Q(P) (1073);cos ?, direkte Vorgabe (1074);cos ?, Vorgabe durch Anlagensteuerung (1075);cos ?(P)-Kennlinie (1076);Wirkleistungsbegrenzung P (W) (1077);Wirkleistungsbegrenzung P in (%) von PMAX (1078);Wirkleistungsbegrenzung P durch Anlagensteuerung (1079);Blindleistung Q, Vorgabe über analogen Eingang (1387);Cos ?, Vorgabe über analogen Eingang (1388);Blindleistungs-/Spannungskennlinie Q(U) mit Hysterese und Totband (1389);Wirkleistungsbegrenzung P über analogen Eingang (1390);Wirkleistungsbegrenzung P über digitale Eingänge (1391);Fehler (1392);Warte auf PV-Spannung (1393);Warte auf gültiges AC-Netz (1394);DC-Bereich (1395);AC-Netz (1396);Not-Aus (1455);Warten (1466);Starten (1467);MPP-Suche (1468);Herunterfahren (1469);Störung (1470);Warn-/Fehler-Mail OK (1471);Warn-/Fehler-Mail nicht OK (1472);Anlageninfo-Mail OK (1473);Anlageninfo-Mail nicht OK (1474);Fehler-Mail OK (1475);Fehler-Mail nicht OK (1476);Warn-Mail OK (1477);Warn-Mail nicht OK (1478);Warten nach Netzunterbrechung (1479);Warte auf EVU (1480)
71;84;87;89;90;125;132;133;134;141;145;148;156;168 ;189;208;520;540;542;543;546;547;973;1004;1007;125 5;1598
Gerätestörung (71);Überstrom Netz (HW) (84);Netzfrequenzstörung (87);Netztrennstelle(89);Netzspannungsmessung Abweichung (90);Überspannung Eingang A (SW) (125);Systemdaten defekt (132);Zugriff auf Systemdaten nicht möglich (133);Systemdaten hergestellt (134);Derating lag vor (141);Relaisfehler (145);Interne Kommunikation (148);Programmablauf (Betrieb) (156);Codespeicher defekt (168);Programmablauf (Statusmaschine) (189);Programmablauf (Watchdog) (208);Übertemperatur Trafobereich (520);GFDI Fuse Open (PV ist ungleich Erde) (540);Interne Messvergleichsstörung (542);Interne Messvergleichsstörung (543);Störung in der Messwerterfassung (546);Netzstörung von einem anderem Gerät gemeldet (547);Keine Meldung (973);Automatische Netztyperkennung ist fehlgeschlagen (1004);Zu großer Strom in der GFDI/Erdstrom Strommessung (1007);Netzüber/-unterspannung wurde festgestellt (1255);Transformator falsch angeschlossen (1598)
Kommentar