Ankündigung

Einklappen
Keine Ankündigung bisher.

Einbindung von Modbus TCP

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

  • manhartm
    antwortet
    Habe einen ersten Fehler in meiner Item-Definition gefunden:

    HTML-Code:
        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'
            modBusObjectType: 'HoldingRegister'
            visu_acl: rw
    Ohne den modBusObjectType explizit in den Attributen des Items wird das Item nicht geschrieben. Nun sehe ich im Log:

    HTML-Code:
    2023-12-08  12:45:53 DEBUG    plugins.modbus_tcp  update_item:PV_GEN_24.StorCtl_Mod value:3 regToWrite:HoldingRegister.40358.1
    2023-12-08  12:45:53 INFO     plugins.modbus_tcp  connected to ModbusTcpClient(192.168.10.211:502)
    2023-12-08  12:45:53 DEBUG    plugins.modbus_tcp  write 3 to HoldingRegister.40358.1 (address.slaveUnit) dataType:uint16
    2023-12-08  12:45:53 ERROR    plugins.modbus_tcp  something went wrong in the __write_Registers function: __init__() got multiple values for argument 'unit'
    Leider ist die Fehlermeldung nicht sehr hilfreich. Hat jemand hier eine Idee ?

    Einen Kommentar schreiben:


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

    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.
    Ich habe für das Plugin modbus_tcp das Logging auf DEBUG umgeschaltet und in einem kleinen Test-Plugin das Item PV_GEN_24.StorCtl_Mod gelesen und geschrieben.

    In der Logdatei finde ich zu diesem Item folgende Einträge:

    HTML-Code:
    2023-12-08  12:03:02 DEBUG    plugins.modbus_tcp  parse item: PV_GEN_24.StorCtl_Mod
    2023-12-08  12:03:02 INFO     plugins.modbus_tcp  parse item: PV_GEN_24.StorCtl_Mod Attributes {'regAddr': 40358, 'slaveUnit': 1, 'dataType': 'uint16', 'factor': 1, 'byteOrder': '>', 'wordOrder': '>', 'item': Item: PV_GEN_24.StorCtl_Mod, 'value': 0, 'objectType': 'HoldingRegister', 'dataDir': 'read_write'}
    ...
    2023-12-08  12:03:21 DEBUG    plugins.modbus_tcp  read HoldingRegister.40358.1 (address.slaveUnit) regCount:1 result:ReadHoldingRegistersResponse (1)
    ...
    2023-12-08  12:03:56 DEBUG    plugins.modbus_tcp  read HoldingRegister.40358.1 (address.slaveUnit) regCount:1 result:ReadHoldingRegistersResponse (1)
    ...
    2023-12-08  12:04:26 DEBUG    plugins.modbus_tcp  read HoldingRegister.40358.1 (address.slaveUnit) regCount:1 result:ReadHoldingRegistersResponse (1)
    ...
    2023-12-08  12:04:50 DEBUG    plugins.modbus_tcp  read HoldingRegister.40358.1 (address.slaveUnit) regCount:1 result:ReadHoldingRegistersResponse (1)
    ...
    Ich finde keine Schreibzugriffe auf das Item im Log. Ich würde erwarten, dass im Plugin die Routine "__write_Registers" aufgerufen wird und ich einen entsprechenden Eintrag "write ..." in der Log-Datei finden würde.

    Einen Kommentar schreiben:


  • bmx
    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 - und sich bei jeder woanders reindenken und rumwurschteln muss
    So würde ich das auch sehen. Lieber ein Plugin was alles abdeckt und ein paar structs oder item.yaml mitbringt in einzelnen Dateien als jeden Code in zig Variationen aufgequirlt.


    Einen Kommentar schreiben:


  • 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:

Lädt...
X