Ankündigung

Einklappen
Keine Ankündigung bisher.

Beispiele für Modbus TCP Master

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

    Beispiele für Modbus TCP Master

    Hallo zusammen,

    voller Freude habe ich die Einführung der Modbus TCP-Funktionalitäten für den EibPC² verfolgt, eröffnet diese mir doch die Möglichkeit, die vorhadnene PV-Anlage (WR Sunnyboy Tripower) über Modbus auszulesen und zu visualisieren. Eine willkommene Erweiterung zu den Smarmeter-Daten, da ich nur auch den Eigenverbrauch ohne weitere Hardware aus der Hausinstalltion bekommen kann (Erzeugung aus dem Wechselrichter, Einspeisung/Zukauf vom Smartmeter).
    In einem zweiten Schritt scheint hierüber auch die Ansteuerung eines geplanten Batteriewechselrichters ohne SMA-eigenes Smartmeter in Aussicht, da ich die dann vorhandenen Daten ja via Modbus-Schnittstelle (Steuerung über Anlagensteuerung) dem Batteriewechselrichter üebrmitten kann (nochaml Geld gespart dan EibPC², yay).

    Aber ein Schritt nach dem anderen!
    Leider bin ich noch unerfahren was den Experte-Modus des EibPC² angeht, bislang habe ich alles im Logik-Editor sowie mit dort programmierten Funktionen realisieren können. Aber man lernt ja imemr weider dazu

    In diesem Zusammenhang schaffe ich es aber aktuell leider nicht einmal, einen Modbus Master-Handle aufzusetzen, da mitr der Parser immer wieder Fehler um die Ohren zimmert.... liegt eideutig an meinem fehlenden Wissen der Programmierung in dem Bereich! Aber vielleicht finde ich hier etwas Hilfe um dabei weiter zu kommen.

    Meine Programmidee:
    - Master-Handle für PV-Wechselrichter anlegen [ MB_PV_WR = 0u08 /*Variable deklarieren*/ ; MB_PV_WR = modbusmaster(IP /*wessen IP? EibPC²? MB-Slave?*/, Port /*502?... allerdigs gitb mir eine Zahl >255 einen Parserfehler*/, timeout /*Einheit? ms oder s? Zahl >255 gibt ebenfalls einen Fehler*/, ID /*Slave Unit-ID ist 5, also 5 eingetragen*/) ]
    - Zyklisch alle 60 sec. Daten aus dem WR auslesen /*readmaster verwenden, das ist klar. Wie realisiere ich heir am Besten ein zyklisches auslesen alle x Sekunden?
    - Glesene Werte nach Abschluss der Lesevorgänge /* Rückgabewert readmaster(...) ist "2" ? */ im Logikeditor als Variablen werterwenden, um Steuerungsaufgaben zu erledigen

    Allerdings scheitere ich aktuell bereits am ersten Punkt, ich keomme den Master-Handle nicht in eine u08-Variable geschrieben, um diesen dann weiterverwenden zu können 😑
    Daher wäre ich üebr jegliche Hilfe, gerne mit einem kurzen Beispiel, dankbar.

    #2
    Hi,

    es kommen auf jeden Fall noch Logikknoten für die Modbus TCP, bin bloß noch nicht ganz sicher, wie die aussehen sollten, um möglichst universell aber auch komfortabel zu sein. Vermutlich eine Art Tabelle mit den Registern und Typen, sowie den Objektverknüpfungen. Aber mal sehen, nehme Anregungen gerne entgegen.

    Zu deinem Programm (Funktionen Handbuch S. 125):
    Du brauchst eine Handle-Variable, die kannst du aber gleich mit der modbusmaster-Funktion initialisieren:
    Code:
    Handle=modbusmaster()
    Als Host kannst du die IP-Adresse als String $192.168.1.10$ oder den Hostnamen des Modbus-Slave-Gerätes verwenden $wechselrichter$, das der EibPC abfragen soll.
    Der Port ist dann der Empfangsport des Gerätes, normalerweise 502. Da 502 aber größer als 255 (maximalwert von 1 vorzeichenlosen Byte) ist, wird dafür ein 2-Byte Datentyp u16 verwendet, also 502u16.
    Timeout kannst du auf 10 Sekunden setzen, sollte reichen. Der Timeout ist vom Datentyp u32, also 10u32 als Argument (hier fehlt die Angabe, dass es Sekunden sind. Wird im Handbuch ergänzt.)
    Und die Slave-Adresse ist die Modbus-Adresse des Gerätes. Datentyp ist u08, also braucht's keine extra Angabe: 5u08 entspricht 5.

    Also zB
    Code:
    Handle=modbusmaster($192.168.1.10$, 502u16, 10u32, 5)
    Wichtig ist, dass du keinen Code hast wie
    Code:
    Variable=5
    Variable=6
    Die erste Zuweisung legt Variable an und weist ihr den Wert 5 zu. Für jede weitere Zuweisung braucht es aber eine Bedingung, da die Variable bereits angelegt ist. Sonst meldet der Parser einen Fehler.
    Du bräuchtest in dem Fall also eine Bedingung:
    Code:
    Variable=5
    if after(systemstart(), 5000u64) then Variable=6 endif
    Das würde die Variable mit 5 initialisieren und 5 Sekunden nach dem Start den Wert 6 zuweisen.

    Zurück zur Frage:
    Zyklisch alle 60 Sekunden: dafür gibt's die Funktion cycle(m,s) mit m Minuten und s Sekunden.

    Code:
    Registerwert=0u16
    ReadStatus=255
    if cycle(1,0) then {
    ReadStatus = readmodbus(Handle, MB_INPUT_REGISTER, 1u16, Registerwert, BIG_ENDIAN, BIG_ENDIAN);
    } endif
    macht genau was du willst.

    Anhand ReadStatus kannst du im Debugger nachvollziehen, ob es ein Problem gab.

    Die Variable Registerwert wird bei Ausführung der Funktion überschrieben. Diese Variable könntest du im Anschluss in der Logik weiterverarbeiten.

    Zuletzt geändert von foobar0815; 12.07.2020, 17:35.

    Kommentar


      #3
      Vielen Dank für die schnelle umfassende Rückmeldung, das werde ich morgen gleich einmal ausprobieren.
      Meine *groben* Fehler habe ich bereits gefunden (direktes Angeben von Werten ungleich Typ u08 muss ich bekanntmachen).

      Dass noch Logikknoten geplant sind habe ich bereits gelesen gehabt, aber auch noch nicht wirklich eine Idee/Vorstellen davon, wie diese Aussehen könnten. Wenn ich über etwas interessantes bei meienr Programmierung stolpern sollte werde ich es natürlich gerne teilen!
      Zuletzt geändert von Latias1990; 12.07.2020, 21:07.

      Kommentar


        #4
        Mittlerweile bekomm ich die Daten ausgelesen, vielen Dank für die Unterstützung :-)

        Als nächstes geht's dann an die graphische Aufbereitung und die Verrechnung mit den Daten vom Smartmeter.

        Unbenannt.png

        Und als dritter Step gkommt dann in ca. 2 Monaten die Regelung des Batteriewechselrichtes, da bin ich mal gespannt, wie einfach oder kompliziert der sich regeln lässt. Und wie schnell ich den via Modbus nachgestellt bekomme...

        Kommentar

        Lädt...
        X