Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Wäre klasse, wenn Du das erklärbar machen könntest.
Momentan kann ich das leider nicht, verstehe es selbst nicht.
Eventuell kann WagoKlemme etwas dazu sagen, er kann ja mit seinem LBS das E3DC erfolgreich auslesen.
Ich habe eine neu Version 0.4 bereit gestellt. Mit dem neuen E18 kann man nun wählen, mit welcher Methode FC3 = HOLDING oder FC4 = INPUT gelesen werden soll. Bitte mal testen, ob damit Deine Register liefern (mit E18 = 4).
Für alle, bei denen es bisher ging, ändert sich nichts mit dem Update: Der Default ist so gesetzt, dass alles unverändert weiter geht.
Ebenso ist der Bug mit E9 = 3 gefixt (Angabe 3 hat den LBS sofort beendet)
Zuletzt geändert von saegefisch; 28.05.2021, 22:14.
Schande über mein Haupt. Das hab ich glatt überlesen
Dafür weiß ich jetzt wo es bei mir hackt. Es scheint so, dass der Modbus Library die Adresse bereits mit abgezogenem Offset übergeben werden muss. In meinem Fall steht z.B. in Register 40001 der Zählerwert für die bezogene Energie (uint32). Wenn ich nun dem Script 40001 als Adresse übergebe, bekomme ich als Fehlercode "Illegal Adress") Wenn ich dagegen als Adresse 0 einstelle (40001 minus Offset 40001) dann bekomme ich die Werte ausgelesen.
Das mit dem 2. Zähler und FC4 teste ich gleich noch.
Dein LBS frägt ja aktuell mit FC3 die Register ab. Möchte man auf FC4 (ReadInputRegisters) umstellen.
Weiß gar nicht, ob meine Geräte auch FC4 haben. Ich schaue mal. Du kannst es ja mal selber schon mal vorab versuchen.
In diesem Abschnitt:
Code:
//
// Library: Register setzen (einmalig) -> für geänderte Register muss der LBS angehalten und neu gestartet werden
//
try {
$fc3 = ReadRegistersBuilder::newReadHoldingRegisters() // Library: Register parametrisieren
->allFromArray($registers)
->build();
könnte es reichen, newReadHoldingRegisters gegen newReadInputRegisters zu tauschen. Ein Versuch ist's wert. Wenn das auch geht, würde ich beides im LBS anbieten - aber nur lesend. Schreiben ist noch eine andere Nummer.
> Könnte es sein, dass Deine Register alle FC4 sind und wir daher nix bekommen? Anderes kann ich es garde nicht verstehen, wenn IP, Port und ID stimmen. Es könnte ja falsche Werte geben oder Null-Werte. Aber gar nichts. Das erklärt sich für mich nicht aus der Ferne.
Nachtrag: Hab's mal getestet. Mit der Änderung liefert mir der LBS die gleichen Werte wie vorher. Ist also für mich völlig transparent. Bin gespannt auf Deine Rückmeldung...
Nachtrag 2: Wohl möglich deuten Deine 4xxxx bereits auf Input-Register hin. Hatte ich noch nicht mit Details zu Modbus tiefer beschäftigt, weil die Library einem ja alles "schenkt". Und meine ModbuxGeräte auch Werte für die wenigen von mir abgefragten 4xxxx-Register mit "Holding" liefern - sonst wär' ich da vielleicht auch schon drüber gestolpert.
Daher denke ich, dass die Änderung auf "Input" Dir Ergebnisse liefern wird!
saegefisch
So wirklich konsistent ist das alles nicht.
Bisher bei allen Int32 Registern muss ich -2 rechnen. Bei den Uint16 Werten passen einige Register wie in der Dokumentation angegeben, andere Register mit Datentyp Unit16 muss ich -1 rechnen.
Ich werde das ganze mal noch mit dem Modbus Adapter im ioBroker testen ob sich das hier ähnlich verhält.
Wäre klasse, wenn Du das erklärbar machen könntest. Ich kann's gerade nicht, denn ich kann's nicht reproduzieren; habe derlei mit meinen Geräten noch gar nicht gehabt. Da passt Register in der Doku zum Ergebnis im LBS (oder auch der Library pur). Wenn Du es erklären kannst oder jemand anderes mit gleichen Symptomen, schreibe ich gerne eine spezifische Info in die LBS-Hilfe.
Immerhin ist das Probieren im LiveView ja dafür auch eine große Hilfe ohne Neuaktivierung.
Das Ansprechen eines bestimmten bits in einem Register scheint zu funktionieren. Aktuell lese ich das EMS-Register mit seinen insgesamt 7 bits aus. Momentan frage ich meine Werte mittels String im CSV-Format ab.
Sobald die Batterie wieder geladen werden kann, werde ich mir die Ausgabe noch einmal genauer anschauen.
Ganz lieben Dank für's testen. Dann kann ich das jetzt als "funktioniert offenbar " abhaken...
Zuletzt geändert von saegefisch; 28.05.2021, 19:17.
Bei der IP dem Port und der Slave ID bin ich mir relativ sicher ja. Ein andere LBS funktioniert einwandfrei. Auch mit dem Tool Simple Modbus TCP Client kann ich die Daten entsprechend abrufen. Bzgl. dem Endian steht in der Doku "High Byte first". Ich hab aber alle 4 Einstellungen durchgetestet. Bei allen das gleiche Ergebnis.
Was meinst du mit der Scriptlösung?
Noch eine andere Frage. Dein LBS frägt ja aktuell mit FC3 die Register ab. Möchte man auf FC4 (ReadInputRegisters) umstellen. Ich hab leider noch nicht tiefer in deinen Code schauen können aber auf den ersten Blick müsste man das in deinem LBS nur an der einen Stelle ändern oder?
Code:
//
// Library: Register setzen (einmalig) -> für geänderte Register muss der LBS angehalten und neu gestartet werden
//
try {
$fc3 = ReadRegistersBuilder::newReadHoldingRegisters() // Library: Register parametrisieren
->allFromArray($registers)
->build();
}
Ich hab noch einen zweiten Stromzähler (PV Anlage). Der erwartet eine Abfrage mit FC4.
Zum Bit-Typ: die Nomenklatur zu meinem LBS braucht "bit_00"bis bit_15". also z.B. (oder entsprechend als JSON)
Das Ansprechen eines bestimmten bits in einem Register scheint zu funktionieren. Aktuell lese ich das EMS-Register mit seinen insgesamt 7 bits aus. Momentan frage ich meine Werte mittels String im CSV-Format ab.
Sobald die Batterie wieder geladen werden kann, werde ich mir die Ausgabe noch einmal genauer anschauen.
Zuletzt geändert von ChrisChros; 27.05.2021, 21:44.
saegefisch
So wirklich konsistent ist das alles nicht.
Bisher bei allen Int32 Registern muss ich -2 rechnen. Bei den Uint16 Werten passen einige Register wie in der Dokumentation angegeben, andere Register mit Datentyp Unit16 muss ich -1 rechnen.
Ich werde das ganze mal noch mit dem Modbus Adapter im ioBroker testen ob sich das hier ähnlich verhält.
Zuletzt geändert von ChrisChros; 27.05.2021, 10:17.
Hast Du die Endians auch mal mit +2 versucht, also 40070. Nur so zur Vollständigkeit.
Andere Register habe ich auch schon getestet mit einem ähnlichen Ergebnis. Zumindest bei den Registern mit Datentyp Int32 muss ich bei allen -2 im Register und Endian 0 berücksichtigen.
Andere Datentypen muss ich erst noch testen und werde hier dann Rückmeldung geben.
ChrisChros :
- das vierte Beispiel sollte E9 = 3 sein mit keiner Ausgabe und dem Log? Ich kann Deine Log-Ausgabe reproduzieren. Da muss ich mal bei der Library forschen, warum das nicht geht.
- Richtige Werte kann es immer nur mit dem richtigen Endian geben Daher scheint für Dich Endian E9 = 0 richtig zu sein.
- Warum Dein Register -2 sein muss, also 40066 statt 40068, erschließt sich mir auch nicht. Aber wenn der Hersteller das schon selber schreibt... wenn es konsistent -2 ist, ist's ja fast schon wieder ok.
- Hast Du die Endians auch mal mit +2 versucht, also 40070. Nur so zur Vollständigkeit.
- wenn wir saubere Erkenntnisse haben und Du vielleicht stabile Ergebnisse für Dein Gerät hast, würde ich das in der Hilfe des LBS auch erwähnen.
h1as
Auch Dir schon mal Danke für's testen. Wer GENERIC behauptet, muss auch liefern...
Insgesamt stelle ich bei dem Blick auf Dein Log fest: Ich muss etwas Text ergänzen, um die Ausgabe selbsterklärender zu machen... mit V0.4. Mag aber WE werden, weil gerade beruflich sehr unter Feuer und am Freitag Impfung ansteht...
Ganz unten im Log müsste hinter JSON die Rückgabewerte stehen. Da steht nur [] - nicht einmal eine leer geschweifte Klammer. Das ist irgendwie wenig. Bin aus der Ferne auch etwas ratlos. Die Ersatzwerte habe nicht gegriffen, das würde ausgegeben und würde auch mindestens die Register mit "0" liefern.
Was mir auffiel: In der Array-Ausgabe nach "Register (75) haben die Typen ein SPACE, z.B. "u int32". Ich vermute mal, das ist ein Kopierfehler hier in den Forenbeitrag, richtig?
Im edomi-Error-log war auch nichts zeitgleich?
Du bist Dir mit IP, Port und auch gerade der ID = 1 sicher? Andere Lösungen/LBS kommen damit an Daten?
Mal Endian E9 = 2 versucht? Was sagt die Doku Deines Geräts zum Endian?
Ich denke nicht, dass es was bringt, aber am Ende der Schleife zum Abfragen der Register
Code:
$i++;
usleep($request_wait*1000);
steht darüber ein auskommentierter logging eintrag
Falls das alles nix hilft, würde ich mal die Script-Lösung versuchen. Da hat man die pure Ausgabe. Vielleicht gibt es Fehler, die ich unterdrücke, hier aber wichtig wären. Dann würde ich die Ausgabe ergänzen im Log
Zuletzt geändert von saegefisch; 27.05.2021, 00:14.
zunächst schonmal "Danke" für den tollen LBS. Mit der "alten" Modbus Bibliothek hatte ich auch so meine Probleme.
Ich habe mal versucht deinen LBS ans laufen zu bekommen. Mein Stromzähler liefert auf 40001 und 40003 jeweils die aktuellen Zählerwerte für Bezug und Lieferung (uint32).
E8 schaut demnach so aus: 40001;"EnergieBezug";uint32;40003;"EnergieLieferun g";uint32
Die restlichen Eingänge sollten ebenfalls passen. Ich habe die Standardwerte nur bei der IP und der Slave ID angepasst.
Leider bekomme ich am Ausgang immer nur eine leere Ausgabe: []
Hast du vielleicht eine Idee was ich falsch mache? Nachfolgend die Debug Ausgabe:
Zum Endian: https://de.wikipedia.org/wiki/Byte-Reihenfolge
Wenn ein Ergebnis aus mehr als einem Byte besteht (zB. bei int32 aus 4 Bytes) ist die Frage, in welcher Reihenfolge sie verarbeitet/zusammen gesetzt werden: aus ABCD kann da halt CDAB werden oder BADC.
Plakatives Pendant zum Endian: In manchen Teilen Deutschland, die einen sagen "...der Max Mustermann hat doch...", andernorts sagen sie "...der Mustermann Max hat doch ..." Aber was ist, wenn der Kerl Paul Walther heißt und in der Nachbarschaft auch ein Walther Paul wohnt? Oder "drei-viertel acht" <-> "viertel vor Acht". Wenn man das nicht genau versteht, hat man eine andere Zeit/Ergebnis.
Dass die Register auch mal +/- 1-2 Register-Offset sind, find' ich schon erstaunlich. Aber sei's drum. Das habe ich vorher noch nie gehört, aber mein Modbus-Erfahrungsschatz ist auch begrenzt. Allerdings waren Register schon zu PEEK/POKE-Zeiten 6802 eines Apple II oder C64 eigentlich eindeutig und es verwundert mich, warum ein Gerät heute da "fuzzy" sein sollte...
Egal: wenn man es damit hin bekommen würde... zu Register 40068 nochmal. Bitte versuch' mal
Code:
40068;"PV-Leistung [W]";int32
je mit Endian E9 = 0 bis E9 = 3.
Zum Bit-Typ: die Nomenklatur zu meinem LBS braucht "bit_00"bis bit_15". also z.B. (oder entsprechend als JSON)
Code:
40084;"EMS-Status Bit 0";bit_00
40084;"EMS-Status Bit 1";bit_01
...
Zuletzt geändert von saegefisch; 24.05.2021, 20:49.
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Einen Kommentar schreiben: