Ankündigung

Einklappen
Keine Ankündigung bisher.

Einbindung von Modbus TCP

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

  • Tom Bombadil
    antwortet
    Zitat von manhartm Beitrag anzeigen
    Warum kann ich so keine Werte in den Fronius Gen24 schreiben ? Habe ich etwas übersehen ?
    Nur ein Gedanke dazu, der gleichzeitig eine Frage/Bitte darstellt:

    Es gibt Geräte (z.B. meine Samson Trovis), bei denen Schreibvorgänge erst 'erlaubt' werden müssen. Bei der Trovis muss z.B. erst die Geräte-Pin in ein bestimmtes Register geschrieben werden, um das Schreiben für die nächsten 30 Minuten freizugeben. Die 'sichere Bank' wäre also, vor jedem Schreibvorgang zuerst die Geräte-Pin in ein bestimmtes Register zu schreiben.

    Ich bin mir nicht sicher, ob sich solch ein Vorgehen bereits im generischen Modbus-Plugin abbilden lässt - möglicherweise ist Dein Problem ähnlich gelagert. Und vielleicht kann der Entwickler oder einer der aktiven Nutzer des Plugins da Licht in's Dunkel bringen.

    /tom

    Einen Kommentar schreiben:


  • manhartm
    antwortet
    Ich verwende das Plugin für die Abfrage der Register meines Wechselrichters Fronius Gen24. Das Lesen der Register funktioniert einwandfrei.

    HTML-Code:
    fronius:
        plugin_name: modbus_tcp
        host: 192.168.10.211
        port: 502
        cycle: 30
        plugin_enabled: true
    Auszug aus meiner yaml:

    HTML-Code:
    PV_GEN_24:
        I_ges:                             # [A] AC Current
            type: num
            value: '0'
            modBusAddress: 40071
            modBusUnit: '1'
            modBusDataType: float32
        StorCtl_Mod:                       # [StorCtl_Mod] Activate hold/discharge/charge storage control mode. Bitfield value. (bit 0: CHARGE, bit 1: DiSCHARGE)
            type: num
            modBusAddress: 40358           # 40359 bitfield16
            modBusUnit: '1'
            modBusDataType: 'uint16'       # bitfield16 (0 bis 0x7FFF)
            modBusDirection: 'read_write'
            visu_acl: rw
    Nun wollte ich das Register PV_GEN_24.StorCtl_Mod schreiben. Trage ich den Wert 3 ein, wird nach kurzer Zeit der Wert 0 wieder angezeigt.

    In der Konfiguration des Fronius Gen24 habe ich die Option "Wechselrichter-Steuerung über Modbus" aktiviert.

    Fronius_Modbus.jpg

    Warum kann ich so keine Werte in den Fronius Gen24 schreiben ? Habe ich etwas übersehen ?

    In der Log-Datei finde ich keine Fehlermeldungen (Warnings).

    Gruss Matthias

    Einen Kommentar schreiben:


  • Cannon
    antwortet
    Zitat von Tom Bombadil Beitrag anzeigen
    Lieber eine Bibliothek mit items-Dateien für ein allgemeingültiges ModbusTCP-Plugin, als 20 verschiedene Modbus-Implementierungen, denen man ständig hinterherhechelt
    Naja, wenn man sich das wie bei einem KNX-Plugin vorstellt, ist das nachvollziehbar. Allerdings wäre es dann wirklich schön, wenn es entsprechende Vorlagen gesammelt gibt. Also z.B. structs für die einzelnen Modbus-Geräte.

    Zitat von Tom Bombadil Beitrag anzeigen
    Und privat gewinne ich mehr Freizeit - muss keine Plugins mehr pflegen.
    Naja ganz so ist das ja nicht. Die Vorlagen sollten dann auch aktuell gehalten werden. Aber zumindest muss man sich nicht mehr auf ständige Modbus-Änderungen einlassen. Wobei ich hoffe, dass das Thema jetzt auch durch ist.

    Einen Kommentar schreiben:


  • Tom Bombadil
    antwortet
    Zitat von Cannon Beitrag anzeigen
    Wäre es nicht sinnvoll die Plugins entsprechend zu erweitern, anstatt da "lose" einzelne Items für zu haben?
    Da bin komplett gegenteiliger Meinung.

    Ich bin ernsthaft am Überlegen, 'meine' Plugins für Helios und Trovis durch das generische ModbusTCP-Plugin abzulösen. Bisher war das wegen RTU nicht möglich; durch die neuen Adapter mit integriertem TCP/RTU Gateway ist das aber nun kein Problem mehr. Ist bei mir seit über einem Jahr stabil und fehlerfrei im Einsatz.

    Lieber eine Bibliothek mit items-Dateien für ein allgemeingültiges ModbusTCP-Plugin, als 20 verschiedene Modbus-Implementierungen, denen man ständig hinterherhechelt - und sich bei jeder woanders reindenken und rumwurschteln muss. Und privat gewinne ich mehr Freizeit - muss keine Plugins mehr pflegen.

    /tom
    Zuletzt geändert von Tom Bombadil; 05.12.2023, 00:47.

    Einen Kommentar schreiben:


  • Cannon
    antwortet
    Zitat von beckerth Beitrag anzeigen
    für das Modbus Write ab Zeile 403 fehlt die Unterscheidung von unit/slave in Abhängigkeit der pymodbus Version.
    Ich würde den Support der alten Pymodbus-Version entfernen. Ohnehin schleppt man dann immer mehr Ballast mit rum. Da es auch innerhalb der 3er Version zum Teil Änderungen gab, die Probleme verursachten und man nicht jede Evntualität abfragen kann. Ich habe meine requirements auf 3.5.2 umgestellt. Darunter geht nichts mehr.

    Zitat von beckerth Beitrag anzeigen
    Wäre es sinnvoll auf Plugins wie kostalmodbus und KSEMmodbus zu verzichten (weil z.B. nicht Multi-Instance-fähig, kein Modbus Write definiert) und stattdessen für dieses generische Modbus Plugin Item Stucts zu definieren?
    Wäre es nicht sinnvoll die Plugins entsprechend zu erweitern, anstatt da "lose" einzelne Items für zu haben?

    Einen Kommentar schreiben:


  • bmx
    antwortet
    Zitat von knx75knx Beitrag anzeigen

    In der Log Datei finde ich dennoch eine Meldung:

    Code:
    WARNING lib.item.item Item Photovoltaik.Speicher_Status.Text: problem evaluating 'sh.Photovoltaik.Speicher_Status.Text.lookup()[value]': ''


    Hallo Andre (@knx75knx​),

    ja, beim Initialisieren hat der value keinen bekannten Wert, daher kann der aus dem Dict auch nicht ausgelesen werden. Ich habe das leicht anders geschrieben:

    Code:
            Speicher_Status:
                type: num
                name: S_Status
                modBusAddress@se_inverter: 59782
                modBusDataType@se_inverter: uint32
                Text:
                    type: str
                    eval_trigger: ..
                    eval: sh..lookup().get(value,'None')
                    lookup:
                        type: dict
                        initial_value: "{ None: 'None', 0: 'Aus', 1: 'Standby', 2: 'Init', 3: 'Laden', 4: 'Entladen', 5: 'Fehler', 6: 'Leerlauf', 7: 'sieben', 8: 'acht', 9: 'neun', 10: 'Energiesparmodus'}"
    Zuletzt geändert von bmx; 03.12.2023, 20:05.

    Einen Kommentar schreiben:


  • beckerth
    antwortet
    Hi,

    für das Modbus Write ab Zeile 403 fehlt die Unterscheidung von unit/slave in Abhängigkeit der pymodbus Version.

    Code:
        if objectType == 'Coil':
            result = self._Mclient.write_coil(address, value, unit=slaveUnit)
        elif objectType == 'HoldingRegister':
            registers = builder.to_registers()
            result = self._Mclient.write_registers(address, registers, unit=slaveUnit)
    -->

    Code:
            if objectType == 'Coil':
                if pymodbus_baseversion > 2:
                    result = self._Mclient.write_coil(address, value, slave=slaveUnit)
                else:
                    result = self._Mclient.write_coil(address, value, unit=slaveUnit)
            elif objectType == 'HoldingRegister':
                registers = builder.to_registers()
                if pymodbus_baseversion > 2:
                    result = self._Mclient.write_registers(address, registers, slave=slaveUnit)
                else:
                    result = self._Mclient.write_registers(address, registers, unit=slaveUnit)​
    Generell:
    Wäre es sinnvoll auf Plugins wie kostalmodbus und KSEMmodbus zu verzichten (weil z.B. nicht Multi-Instance-fähig, kein Modbus Write definiert) und stattdessen für dieses generische Modbus Plugin Item Stucts zu definieren?
    Ich benötige sowohl Multi-Instance als auch Modbus Write für das kostalmodbus Plugin. Dann würde ich mal versuchen die Item Structs für Kostal Plenticore, KSEM und zwei Energiezähler mit Modbus anzulegen.




    Einen Kommentar schreiben:


  • loeserman
    antwortet
    Alles klar. danke für die schnelle Hilfe. Nun geht bei mir auch. Klasse!

    Einen Kommentar schreiben:


  • ooUrmeloo
    antwortet
    Zitat von bmx Beitrag anzeigen
    Du musst den Attributen jeweils die Instanz mitgeben wie hier beschrieben ist.
    Code:
    instance: modbus_wr2_fast
    Aus meinem Verständnis müsste da also stehen:

    Code:
    %YAML 1.1
    ---
    R03:
    WR2:
    DC_CURRENT:
    type: num
    name: DC_CURRENT
    modBusObjectType@modbus_wr2_fast: HoldingRegister
    modBusDirection@modbus_wr2_fast: read
    modBusAddress@modbus_wr2_fast: 40273
    modBusDataType@modbus_wr2_fast: int16
    modBusDirection@modbus_wr2_fast: read
    modBusFactor@modbus_wr2_fast: 0.0001
    Bestätigung ... So klappt's bei mir mit mehreren Modbus Instanzen ...

    Einen Kommentar schreiben:


  • bmx
    antwortet
    Du musst den Attributen jeweils die Instanz mitgeben wie hier beschrieben ist.
    Code:
    instance: modbus_wr2_fast
    Aus meinem Verständnis müsste da also stehen:

    Code:
    %YAML 1.1
    ---
    R03:
        WR2:
            DC_CURRENT:
                type: num
                name: DC_CURRENT
                modBusObjectType@modbus_wr2_fast: HoldingRegister
                modBusDirection@modbus_wr2_fast: read
                modBusAddress@modbus_wr2_fast: 40273
                modBusDataType@modbus_wr2_fast: int16
                modBusDirection@modbus_wr2_fast: read
                modBusFactor@modbus_wr2_fast: 0.0001
    Schreib mal ob es klappt. Alternativ kannst Du Dir auch ein struct bauen für Deinen WR und dann ein instance: modbus_wr2_fast

    Einen Kommentar schreiben:


  • loeserman
    antwortet
    Hallo zusammen,
    irgendwie stehe ich auf dem Schlauch. Ich habe zwei Wechselrichter, die ich beide per Modbus TCP anfragen möchte. Aber woher weiss eigentlich die item YAML, welche modbus_tcp sie ansprechen soll?

    Anbei meine plugin.yaml
    Code:
    ...
    modbus_wr2_fast:
        plugin_name: modbus_tcp
        host: 192.168.122.231
        port: '502'
        webif_pagelength: 100
        instance: modbus_wr2_fast
        cycle: 30
        slaveUnit: 1
    
    modbus_wr1_fast:
        plugin_name: modbus_tcp
        host: 192.168.122.230
        port: '502'
        webif_pagelength: 100
        instance: modbus_wr1_fast
        cycle: 30
        slaveUnit: 1
    Und meine item.yaml im Verzeichnis items
    Code:
    %YAML 1.1
    ---
    R03:
        WR2:
            DC_CURRENT:
                type: num
                name: DC_CURRENT
                modBusObjectType: HoldingRegister
                modBusDirection: read
                modBusAddress: 40273
                modBusDataType: int16 
                modBusDirection: read
                modBusFactor: 0.0001
    Im Webinterface sagt er, dass die Verbindung connected ist, aber ich sehe keine Items. Mir ist auch gerade nicht klar, wie sie den Weg zur richtigen Plugin-Instanz finden.
    Gebt mir doch mal nen Tipp, was ich hier übersehe.

    Danke euch!

    Einen Kommentar schreiben:


  • fuppy
    antwortet
    Sorry bmx dass ich mich nicht mehr gemeldet hab.

    Ich bin den Weg des geringsten Widerstands gegangen und bin auf Node-RED umgestiegen. Ich hatte seitdem einmal das Problem, dass der Zähler gar keine Werte mehr lieferte. Nach einem "Reset" des Zählers und der Anpassung der Cycle-Time sowie der Anzahl der ausgelesenen Register ist seitdem Ruhe.

    Ich vermute mal, dass das Problem mit dem Plugin auch irgendwas damit zu tun hatte...

    Sorry, dass ich nicht mehr hierzu beitragen kann...

    Einen Kommentar schreiben:


  • bmx
    antwortet
    Zitat von fuppy Beitrag anzeigen
    Ich halte euch auf dem Laufenden!
    fuppy Wie sieht's denn mittlerweile aus...?

    Einen Kommentar schreiben:


  • tsb2001
    antwortet
    Zitat von Sipple Beitrag anzeigen
    Danke.
    Die SunSpec Spezifikation ist da wohl viel Rauch um nichts.
    ​​​​​….
    Ich hoffe, ich bekomme den mit dem Plugin abgefragt.
    SunSpec ist nichts anderes als Modbus.
    Es haben sich halt nur einige Hersteller zusammengeschlossen und die Kommunikation über Modbus durch die https://sunspec.org zu definieren.
    Das wichtigste dabei: die arbeiten seltener mit Gleitkommazahlen, sondern häufig mit Integern in einem Register und Skalierungsfaktoren in einem weiteren Register. Daraus ergibt sich der eigentliche Wert. Berechnungsmethoden dazu finden sich hier weiter vorne.
    Die Register selbst sind nicht in den Spezifikationen festgeschrieben. Diese stellt aber (zumindest in meinem Fall bei Fronius) der Hersteller kostenfrei zur Verfügung. Wegen der schieren Menge an Werten und den zugehörigen Faktoren ist das einfache „Ausprobieren“ mit Registern nicht zielführend.

    Einen Kommentar schreiben:


  • ooUrmeloo
    antwortet
    Zitat von Sipple Beitrag anzeigen
    Ich bekomme demnächst einen Kaco Blueplanet NX3. Deren Anleitungen zum Thema Modbus TCP sind schwammig, unvollständig, nichtssagend und manchmal schlichtweg falsch. Ich hoffe, ich bekomme den mit dem Plugin abgefragt.
    Ich habe da am Anfang immer erstmal mit dem Windows Tool "qModMaster" ein bisschen getestet ... stimmt die IP, der Port, in welchen Registern steht was drin ...

    Einen Kommentar schreiben:

Lädt...
X