Ankündigung

Einklappen
Keine Ankündigung bisher.

LBS19001586 ModBus Read GENERIC

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • saegefisch
    antwortet
    Versuch mal hinter dem folgenden 3-zeiligen Kommentar und vor dem try ein usleep(5000000); einzufügen
    Code:
    //
    // Library: Register setzen (einmalig) -> für geänderte Register muss der LBS angehalten und neu gestartet werden
    //
    usleep(5000000);    // TESTWEISE einfügen zB für 5s-Pause
    try {
    und ein paar Zeilen weiter noch mal zwischen Kommentar und while
    Code:
    // =========================================
    // Dauer-Schleife
    // - Hauptschleife (wird beim Beenden oder Neustart von EDOMI verlassen) | logic_getEdomiState() sorgt zudem dafür, dass die Datenbank-Verbindung aufrechterhalten wird!
    // - Zusätzlich auch beenden, wenn E1 auf 0 gesetzt wird
    // =========================================
    usleep(5000000);    // TESTWEISE einfügen zB für 5s-Pause
    while (logic_getEdomiState()==1 && $E[1]['value']==1) {
    Die erste Pause ist vermutlich Mumpiz, weil erst danach die gewünschten Register an die Library gesendet werden, aber wir versuchen mal zunächst beides für eine stabile Verbindung und kannst es dann ja wieder entfernen und wieder versuchen. Sollten die Probleme weiter bestehen, kannst Du die 2. Pause mal von 5 auf 10s verlängern.
    Darüber hinaus kannst Du zusätzlich auch mal versuchen, E4 auf 10000 zu setzen, das ist die Zeit zwischen 2 Abfragen.
    Und bitte zunächst mit nur 1 bis max 3 Registern, damit wir keine Chunks bekommen. Erstmal einfach stabilisieren...

    Ich bin nur vorsichtig optimistisch zu dem obigen Versuch, weil ich vermute, dass der Connect und Read in einem Lib-Befehl stecken. Vielleicht gibt es eine Pausenzeit der Lib, die ich nicht kenne, die man noch übergeben könnte.
    Wir werden sehen, was Deine Tests bringen

    Nachtrag:
    habe gerade gesehen, dass ich E13 auf zwei Übergabe-Paramter der Lib schreibe/übergebe: readTimeoutSec und connectTimeoutSec.
    Damit müsste ein hoher Wert an E13 das heilen, z.b. 10 oder gar 15.
    Vielleicht versuchst Du das zunächst, bevor die obigen Code-Änderungen versuchst
    Zuletzt geändert von saegefisch; 03.02.2022, 00:46.

    Einen Kommentar schreiben:


  • saegefisch
    antwortet
    Zitat von Buntbarsch Beitrag anzeigen
    WICHTIG!! Nach dem connecten per Mbus TCP MUSS eine Timeout oder Sleep oder whatever von ca. 5-10 Sekunden erfolgen, wenn man sofort nach connecten anfängt Daten zu lesen, fühlt der WR sich da noch nicht bereit dazu.
    Ah, ein wertvoller Hinweis und mag von zentraler Bedeutung sein für das Gerät. Ich melde mich noch mal dazu, und sage Dir, wo Du mal was testweise im Code etwas einbauen kannst. Wenn das funktioniert müsste ich das als weiteren Parameter anbieten
    Zuletzt geändert von saegefisch; 02.02.2022, 12:08.

    Einen Kommentar schreiben:


  • Buntbarsch
    antwortet
    Danke schon mal für die Antwort.
    ich habe ja bereits mit Zeiten bis 20s alles mögliche probiert. Auch gelegentliches wieder ein und Ausschalten des LBS. Daten zu bekommen ist eher Zufall beim Huawei WR. Aber ich habe mal in anderen Foren gelesen und da konnte ich folgendes finden:

    WICHTIG!! Nach dem connecten per Mbus TCP MUSS eine Timeout oder Sleep oder whatever von ca. 5-10 Sekunden erfolgen, wenn man sofort nach connecten anfängt Daten zu lesen, fühlt der WR sich da noch nicht bereit dazu.

    Ich vermute das ich hier genau dieses Problem auch habe. Kannst du mir vielleicht sagen welche passenden Befehl ich mal testweise in welche Zeile setzen kann. Leider sind meine Programierkenntnisse sehr begrenzt.

    Einen Kommentar schreiben:


  • saegefisch
    antwortet
    E4 sagt nur, wie lange der LBS zwischen zwei Abfragen wartet, dürfte hier also nicht relevant sein, Je kleiner, desto höher Abfrage-Frequenz, aber auch die System-Last. Lieber erst mal selten, aber stabil, daher lieber größer wählen.

    E11: siehe Hilfe = wie viele Register pro Requests abgefragt werden, mag zwischen 1-10 sinnvoll sein -> geräte-spezifisch, vielleicht gibt es Foren (abseits edomi) zu Deinem Gerät, die eine Info dazu haben. Oder technische Beschreibung deines Geräts

    E12: zeitlicher Abstand zwischen zwei Chunks/Requests, weil die Geräte da ein Päuschen brauchen. Wenn Du anfangs mal nur wenige Register liest, wird dieser Wert nie relevant, weil es nie mehrere Chunks gibt

    E13 reiche ich nur durch an die Library. Ich habe nicht mehr genau paart, wie die definiert war. Vermutlich dürfte es auch durchaus länger sein, z.B. 5s oder vielleicht sogar 10s wenn Dein Geräte etwas zäh liefert und dann langsam runter, bis es instabil wird.

    Ich würde erst mal mit genau einem Register beginnen und schauen, ob ich das verlässlich und stabil bekomme, dann langsam steigern, bis ich auch das erste Mal Chunks bekomme. Dann muss man vielleicht wieder etwas justieren und probieren. Das dürfte sehr geräte-spezifisch sein und daher kann ich Dir dazu nicht konkret helfen.

    Zum Thema disconnect: Wenn Dein Gerät sich gerne trennt, kannst Du den LBS auch vermutlich einfach zyklisch an E1 aktiv kurz auf 0 gehen und dann wieder auf 1. Damit wird der LBS/die Library sich wieder neu verbinden. Wenn Du merkst, das passiert z.B nach 2 min, dann schalte alle 1-1,5min kurz auf 0. Das sollte Last-technisch nicht optimal sein, aber auch kein Problem.
    Oder Du machst das wie ich an A16: Wenn der TS nicht innerhalb von einer Zeit neu gesetzt wird, dann automatisch eine 1 an E1 senden (per watchdog + Telegrammgenerator). Das ist meine Fallback-Lösung-Selbstheilung bei einem disconnect. passiert aber selten bei mir.

    Einen Kommentar schreiben:


  • Buntbarsch
    antwortet
    Hallo,

    ich versuche gerade mit diesen LBS einen Huawei WR auszulesen. Mit dem QModMaster klappt das auch ganz gut. Aber auch dort kommt es nach ein paar Minuten immer zum Timeout. Da hilft dann dort immer nur Disconnect und dann wieder Connect (manchmal auch mehrmals). Folgende Einstellungen hab ich dort getätigt:
    Bild 2.jpg Bild 1.jpg

    Ich hab mal in anderen Foren gelesen das der Huawei WR sich viel Zeit genehmigt zum Antworten und gerne den Takt vorgibt.

    Ob Big oder Little macht beim Ergebnis kein Unterschied, es kommen die 3 Netzspannungen raus (anscheinend mit einer Kommastelle). Leider kommt beim LBS in edomi gefühlt fast immer timeout. Ich hab es aber auch hin und wieder schon geschafft in edomi Antwort zu bekommen:

    Bild 3.jpg
    Meine Einstellungen in Edomi sind:
    Bild 5.jpg
    Bei den 3 Zeitangaben die man in edomi machen kann, hab ich auch schon jede Menge ausprobiert, leider ohne Erfolg. Ist eigentlich die Pausenzeit mit der ScanRate ( in QModMaster) gleichzusetzen und timeout Modbus Lib mit der Response Timeout?

    Ansonsten wäre ich für jeden Tip dankbar.

    Gruß Hendrik

    Einen Kommentar schreiben:


  • DustinR
    antwortet
    Vielen Dank. Das ist wirklich ein richtig gut zusammengefasster Beitrag dazu. :-)

    Mir hat das aber auch schon sehr weitergeholfen, dass ich die LBS nun immer nur über einen kurzen Impuls starte und selbst entscheide, wann das passiert. Die Werte sind dadurch viel genauer.

    Einen Kommentar schreiben:


  • saegefisch
    antwortet
    DustinR : Fein, danke!

    Zum Thema Vergleichbarkeit und Gleichzeitigkeit von Werten habe ich mal etwas allgemeine Gedanken hier notiert und und den folgenden Beiträgen konkrete Informationen - vielleicht findest Du es interessant für Deine Frage. Vielleicht hilft Dir (der dort notierte) LBS 19001585 zur Fragestellung.

    Ansonsten sollte der (hinreichend lange) kurzzeitige 1-Impuls an E1 zu einer 1-maligen Abfrage führen - vermute ich. Im Live-View habe ich das öfter so gemacht: mal kurz 1 dann wieder 0.

    Aber am Ende wirst Du immer mit den selben Problem leben müssen: Die Werte sind nicht exakt gleichzeitig bei IST-Werten. Du kannst versuchen, alles auf einen Takt zu bringen (15s, 1min, 5min whatever), aber faktisch wird ein EM immer etwas asynchron zu einem WR oder der Batterie sein. Mir scheint dies für IST ein wenig akademisch auf die letzten Prozent, weil was will ich daraus ziehen (aus den letzten Prozent)? Auch die Anbieter (SMA, etc kochen nur mit Wasser; als Nutzer denkt man nur, die wären ganz genau und viel besser). Das ist die Unschärfe bei IST, Wenn Du die Berechnung auf Intervalle auslegst, wird es besser. Achtung, Nicht alle Geräte liefern saubere Werte (Integrale) in beliebig kleinen Intervallen. Das muss man prüfen, habe ich in den obigen Links aber auch thematisiert.
    Zuletzt geändert von saegefisch; 06.09.2021, 22:10.

    Einen Kommentar schreiben:


  • DustinR
    antwortet
    Hey @saegefisch,

    erstmal riesen Kompliment zu deinem LBS. Das Ding funktioniert großartig. Ich habe einen Wechselrichter von SMA und eine Batterie von Varta und alle Werte werden problemlos ausgelesen. Vielen Dank also schon mal dafür. 😀

    Ein kleines Problem habe ich aber auch und wollte mal schauen, ob du dazu eine Idee hast. Aktuell ist es ja so, dass du es so programmiert hast, dass man auf dem E1 starten und stoppen kann. Ich habe nun ja einen Wechselrichter und eine Batterie, wo ich die Werte per Modbus abfrage und der Baustein immer etwas unterschiedliche lange braucht, um die Anfrage abzuarbeiten. Über den gesamten Tag gesehen, laufen also die beiden LBS immer mehr ganz leicht auseinander. Ich brauche die Werte aber ungefähr zur selben Zeit, damit ich mit den ermittelten Daten auch sinnvolle Werte (wie den Verbrauch) berechnen kann, da ich diese nicht von deinem der Geräte erhalte. Für mich wäre es im ersten Moment am einfachsten, wenn ich einen Impuls auslöse und selbst entscheiden könnte, wann der LBS einmal durchläuft und er danach dann einfach wieder stoppt.

    Wie löst ihr sowas oder habt ihr das Problem gar nicht, weil ihr die benötigten Werte alle sauber von einem Gerät bekommt?

    Wäre es denkbar, dass ich an E1 einfach nur einen Impuls mit einer 1 sende und dann direkt wieder auf 0 setze? Würde er dann sauber durchlaufen?

    Viele Grüße

    Einen Kommentar schreiben:


  • xsven80x
    antwortet
    Hey...

    irgendwie scheint das nicht zu funktionieren. Wenn ich E19 = -30000 (-40000) einstelle und in E8 entsprechend die Register lt. Doku bekomme ich keine Werte! Irgendetwas passt hier scheinbar nicht!?

    Gruß
    Sven

    Einen Kommentar schreiben:


  • saegefisch
    antwortet
    Das freut mich zu hören! Vor allem, dass der LBS offenbar tatsächlich wunderbar divers funktioniert, also sein GENERIC offenbar verdient. Daher bin ich auch sehr dankbar für Deine weiteren Geräte hier...
    Dank gebührt auch h1as mit seinen Tipps zu den Registern.

    Anhand Deiner Doku vom ersten Post bin ich erstaunt, dass es nun doch E18=4 ist. Aber egal - Hauptsache Daten
    Was Du noch probieren könntest, weil es sich vielleicht passender zur Doku anfühlt: An E8 die Register 30000, 30006, 30070 verwenden und ein Offset von E19 = -30000. Damit solltest Du zum selben Ergebnis kommen, aber mit "schöneren" Registern. Oder sind es 40000, 40006, 40070? Dann halt entsprechend E19 = -40000.

    Würde mich freuen, wenn Du das noch probieren könntest; zum neuen Offset habe ich noch nicht so viele Rückmeldungen...
    Zuletzt geändert von saegefisch; 24.06.2021, 20:57.

    Einen Kommentar schreiben:


  • xsven80x
    antwortet
    Hey...

    puh, das war ne schwere Geburt. Also für die Nachwelt festgehalten: Es funktioniert einwandfrei! ;-)

    Ziel: Auslesen von SDM-Stromzählern (SDM230 und SDM630, vermutlich auch alle anderen SDM) über Elfin EE11-Converter.


    LBS_Modbus.jpg
    Danke an saegefisch für diesen LBS und die Hilfestellungen.

    Mal wieder habe ich viel gelernt und kann jetzt hier weitermachen! :-)

    Grüße
    Sven


    Einen Kommentar schreiben:


  • saegefisch
    antwortet
    Erst mal hakt es am wissen, um mit qmodmaster die Daten auszulesen ungleich 0. wenn du das hast, hast du alles, was du für den LBS brauchst.

    dieses MBMD hat irgend ein Wissensvorsprung, den du dir noch erarbeiten musst. Aber am Ende ist es alles Modbus. Spricht das Tool zu dir bezüglich der tatsächlich abgefragten Register? Aber in der Tat gut zu wissen, dass es funktionieren muss/kann. Das ist auf jeden Fall hilfreich.

    Ich würde h1as Tipps mal mit dem qmodmaster probieren.

    Einen Kommentar schreiben:


  • xsven80x
    antwortet
    Hallo zusammen,

    ersteinmal danke für die Hilfestellungen.

    Die Id (hier ist ja die ModBus ID des Stromzählers gemeint) stimmt defintiv, das kann ich sicher sagen.

    Mit qModMoaster bekomme ich einen connect, wenn ich register abfrage, bekomme ich auch eine Antwort, leider hier ebenfalls "0".

    Es gibt es cooles Tool, um die Stromzähler auszulesen: MBMD

    Dies habe ich in einem Docker-Container laufen, wenn ich es mit den richtigen Parametern starte, dann liest er mir auch den Zähler korrekt und vollständig aus. Im Notfall wäre das der workaround, mittels MBMD an den mqtt-Broker zu senden und dann die Daten weiter zu verarbeiten. Aber eigentlich würde ich mir diesen Zwischenschritt gerne sparen, die Werte benötige ich halt in Edomi.

    Aber der Test mit MBMD gibt mir zumindest die Sicherheit, dass mein Modbus-Gateway und der Zähler an sich korrekt konfiguriert sind. Offenbar hakt es "nur" an den Einstellungen des LBS.

    Ich werde mal weiter testen... Wenn ihr noch ne Idee habt, immer her damit! ;-)

    Gruß
    Sven

    Einen Kommentar schreiben:


  • saegefisch
    antwortet
    ich würde es mit einem einzelnen Register versuchen, bei dem der Zielwert bekannt ist, z.B. Spannung ~230 oder Frequenz ~ 50. Damit ist die Wertprüfung einfacher auf Plausibilität
    E6 also z.B. =30071;"Frequenz [Hz]";int16. Wie h1as schrieb, auch Register mal variieren +/-1 oder Offset versuchen. Und auch mal uint16
    Kennst Du verlässlich die ID für E7?
    E18= 3
    Wenn Du etwas zurück bekommst, aber die Werte komisch sind, mal mit dem Endian an E9 spielen.

    Ansonsten würde ich erst mal z.B. mit dem qModMaster oder anderer SW einfacher den ersten Zugriff testen und erreichen. Wenn der geht, dann am LBS weiter. Selbst mit der performanten Lösung, dass man mit dem LBS im LiveView Register ändern kann, geht es mit dedizierter SW in Deiner Phase schneller, um überhaupt einen Connect zu erreichen.

    Einen Kommentar schreiben:


  • h1as
    antwortet
    Probier mal in E8 statt 30007 nur 6. Alternativ auch in E19 als Offset 30001 einstellen.

    Einen Kommentar schreiben:

Lädt...
X