Ankündigung
Einklappen
Keine Ankündigung bisher.
Einbindung von Modbus TCP
Einklappen
X
-
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...
Kommentar
-
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
Und meine item.yaml im Verzeichnis itemsCode:... 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
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.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
Gebt mir doch mal nen Tipp, was ich hier übersehe.
Danke euch!
Kommentar
-
Du musst den Attributen jeweils die Instanz mitgeben wie hier beschrieben ist.
Aus meinem Verständnis müsste da also stehen:Code:instance: modbus_wr2_fast
Schreib mal ob es klappt. Alternativ kannst Du Dir auch ein struct bauen für Deinen WR und dann ein instance: modbus_wr2_fastCode:%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
Kommentar
-
Bestätigung ... So klappt's bei mir mit mehreren Modbus Instanzen ...Zitat von bmx Beitrag anzeigenDu musst den Attributen jeweils die Instanz mitgeben wie hier beschrieben ist.
Aus meinem Verständnis müsste da also stehen:Code:instance: modbus_wr2_fast
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
Kommentar
-
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)
Generell: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)
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.
Kommentar
-
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.
Kommentar
-
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 anzeigenfür das Modbus Write ab Zeile 403 fehlt die Unterscheidung von unit/slave in Abhängigkeit der pymodbus Version.
Wäre es nicht sinnvoll die Plugins entsprechend zu erweitern, anstatt da "lose" einzelne Items für zu haben?Zitat von beckerth Beitrag anzeigenWä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?
Kommentar
-
Da bin komplett gegenteiliger Meinung.Zitat von Cannon Beitrag anzeigenWäre es nicht sinnvoll die Plugins entsprechend zu erweitern, anstatt da "lose" einzelne Items für zu haben?
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.
/tomZuletzt geändert von Tom Bombadil; 05.12.2023, 00:47.
- Likes 1
Kommentar
-
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 anzeigenLieber eine Bibliothek mit items-Dateien für ein allgemeingültiges ModbusTCP-Plugin, als 20 verschiedene Modbus-Implementierungen, denen man ständig hinterherhechelt
Naja ganz so ist das ja nicht. Die Vorlagen sollten dann auch aktuell gehalten werden.Zitat von Tom Bombadil Beitrag anzeigenUnd privat gewinne ich mehr Freizeit - muss keine Plugins mehr pflegen.
Aber zumindest muss man sich nicht mehr auf ständige Modbus-Änderungen einlassen. Wobei ich hoffe, dass das Thema jetzt auch durch ist.
Kommentar
-
Ich verwende das Plugin für die Abfrage der Register meines Wechselrichters Fronius Gen24. Das Lesen der Register funktioniert einwandfrei.
Auszug aus meiner yaml:HTML-Code:fronius: plugin_name: modbus_tcp host: 192.168.10.211 port: 502 cycle: 30 plugin_enabled: true
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.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
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
Kommentar
-
Nur ein Gedanke dazu, der gleichzeitig eine Frage/Bitte darstellt:Zitat von manhartm Beitrag anzeigenWarum kann ich so keine Werte in den Fronius Gen24 schreiben ? Habe ich etwas übersehen ?
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
Kommentar
-
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.Zitat von Tom Bombadil Beitrag anzeigenLieber 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
Kommentar
-
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.Zitat von manhartm Beitrag anzeigenIch 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.
In der Logdatei finde ich zu diesem Item folgende Einträge:
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.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) ...
Kommentar


Kommentar