NEWS
Modbus ILLEGAL DATA ADDRESS
-
Hallo,
ich verwende den IObroker und den Modbusadapter. Ich versuche mit meinem Wechselrichter (SolarEdge) zu kommunizieren. Die Register um 40000 aufwärts lassen sich problemlos lesen. Der Versuch das Register 57665 zu lesen wird mit
"Poll error count: 6 code: {"errorCode":131,"exceptionCode":2,"message":"ILLEGAL DATA ADDRESS"}"
abgebrochen. Nun dachte ich ich mache einen Fehler und die Register existieren bei mir irgendwie nicht. Ich habe lange gesucht und viel ausprobiert. Letztendlich habe ich ein pythonscript gefunden, welches darüber über MODBUS TCP die Register ausließt. Da geht es auf einmal die Adresse 57665 zu lesen. Bei IObroker habe ich dann die Adresse um +-1 geändert, jedoch ohne Erfolg. Was kann ich noch tun damit das funktioniert?
-
@soeni sagte in Modbus ILLEGAL DATA ADDRESS:
57665
Gerade mal die Technical Note SUNSpec Doku durchgeblättert von SolarEdge.
Da steht nichts von dieser Register Nummer. Wo hast du die denn her? Welches Gerät genau?
https://www.solaredge.com/sites/default/files/sunspec-implementation-technical-note-de.pdf
-
Die Doku findet sich hier (Seite 20):
https://www.photovoltaikforum.com/core/attachment/157903-power-control-open-protocol-for-solaredge-inverters-pdf/Das ist das Pythonprojekt, welches funktioniert:
https://pypi.org/project/solaredge-modbus/Wie gesagt, mit dem Pythonscrpt kommen folgende Daten:
{ "c_manufacturer": "SolarEdge", "c_model": "SE7K-RWS48BNN4", "c_version": "0004.0011.0030", "c_serialnumber": "7E044687", "c_deviceaddress": 1, "c_sunspec_did": 103, "current": 228, "p1_current": 73, "p2_current": 79, "p3_current": 75, "current_scale": -2, "p1_voltage": 4005, "p2_voltage": 4000, "p3_voltage": 4005, "p1n_voltage": 2319, "p2n_voltage": 2304, "p3n_voltage": 2310, "voltage_scale": -1, "power_ac": 22500, "power_ac_scale": -2, "frequency": 4999, "frequency_scale": -2, "power_apparent": 5292, "power_apparent_scale": -1, "power_reactive": -4790, "power_reactive_scale": -1, "power_factor": -4246, "power_factor_scale": -2, "energy_total": 477563, "energy_total_scale": 0, "current_dc": 27903, "current_dc_scale": -5, "voltage_dc": 8186, "voltage_dc_scale": -1, "power_dc": 22842, "power_dc_scale": -2, "temperature": 4617, "temperature_scale": -2, "status": 4, "vendor_status": 0, "meters": { "Meter1": { "c_sunspec_did": 203, "current": 44, "p1_current": 10, "p2_current": 19, "p3_current": 14, "current_scale": -1, "voltage_ln": 23185, "p1n_voltage": 23185, "p2n_voltage": 23106, "p3n_voltage": 23144, "voltage_ll": 0, "p12_voltage": 0, "p23_voltage": 0, "p31_voltage": 0, "voltage_scale": -2, "frequency": 4999, "frequency_scale": -2, "power": 164, "p1_power": 19, "p2_power": 100, "p3_power": 44, "power_scale": 0, "power_apparent": 924, "p1_power_apparent": 212, "p2_power_apparent": 413, "p3_power_apparent": 300, "power_apparent_scale": 0, "power_reactive": -909, "p1_power_reactive": -211, "p2_power_reactive": -400, "p3_power_reactive": -297, "power_reactive_scale": 0, "power_factor": -3503, "p1_power_factor": -3479, "p2_power_factor": -3729, "p3_power_factor": -3300, "power_factor_scale": -2, "export_energy_active": 52866, "p1_export_energy_active": 54355, "p2_export_energy_active": 104741, "p3_export_energy_active": 112320, "import_energy_active": 973402, "p1_import_energy_active": 385829, "p2_import_energy_active": 637810, "p3_import_energy_active": 168312, "energy_active_scale": 0, "export_energy_apparent": 0, "p1_export_energy_apparent": 0, "p2_export_energy_apparent": 0, "p3_export_energy_apparent": 0, "import_energy_apparent": 0, "p1_import_energy_apparent": 0, "p2_import_energy_apparent": 0, "p3_import_energy_apparent": 0, "energy_apparent_scale": -32768, "import_energy_reactive_q1": 0, "p1_import_energy_reactive_q1": 0, "p2_import_energy_reactive_q1": 0, "p3_import_energy_reactive_q1": 0, "import_energy_reactive_q2": 0, "p1_import_energy_reactive_q2": 0, "p2_import_energy_reactive_q2": 0, "p3_import_energy_reactive_q2": 0, "export_energy_reactive_q3": 0, "p1_export_energy_reactive_q3": 0, "p2_export_energy_reactive_q3": 0, "p3_export_energy_reactive_q3": 0, "export_energy_reactive_q4": 0, "p1_export_energy_reactive_q4": 0, "p2_export_energy_reactive_q4": 0, "p3_export_energy_reactive_q4": 0, "energy_reactive_scale": -32768 } }, "batteries": { "Battery1": { "c_manufacturer": "48V_BYD", "c_model": "BYD Premium LVS 8.0", "c_version": "48V DCDC 2.2.91 BMS 0.0.0", "c_serialnumber": "7E044687", "c_deviceaddress": 112, "c_sunspec_did": 0, "rated_energy": 8000.0, "maximum_charge_continuous_power": 6600.0, "maximum_discharge_continuous_power": 6600.0, "maximum_charge_peak_power": 7500.0, "maximum_discharge_peak_power": 7500.0, "average_temperature": 25.0, "maximum_temperature": 0.0, "instantaneous_voltage": 820.45361328125, "instantaneous_current": -2.4808738231658936, "instantaneous_power": 2078.0, "lifetime_export_energy_counter": 141, "lifetime_import_energy_counter": 304, "maximum_energy": 8000.0, "available_energy": 8000.0, "soh": 100.0, "soe": 15.0, "status": 3, "status_internal": 5, "event_log": 0, "event_log_internal": 0 } } }
-
@soeni Aha....
57665 entspricht E141 -->
Denke das Python Script könnte diesen Wert einfach überspringen oder steht das Register extra aufgeführt im Script ?
-
@wendy2702
OK Fehler meinerseits. nehmen wir Register E140 -> 57664 Auch hier +-1 ausprobiert, gleiches Phänomen.So sieht das bei mir aus.
Und so die Einstellungen.
-
Hi, kann es sein, dass es deswegen nicht geht, weil die Adresse außerhalb des "Adressbereichs" von Holdingregistern ist? Also bis 49999? Wenn ja was kann man da machen?
-
Hat jemand für mich eine Idee, woran das liegen könnte? Wie ich das lösen kann?
-
@soeni Adresse zum Testen mal bei Eingangs Register eingetragen?
Ist das ein Register das auch beschrieben werden kann?
-
@wendy2702 Hi, habe ich ausprbiert, hier lautet der Fehler dann " Poll error count: 6 code: {"errorCode":132,"exceptionCode":1,"message":"ILLEGAL FUNCTION"}"
-
Kannst du hiermit etwas anfangen , zum auslesen der Batterie :
-
Bist du mit dem im Link aufgeführten Register der Batterieabfrage weiter gekommen !?
-
@glasfaser
Hi, hat leider etwas gedauert. ich habe auch die ausprobiert aber es geht nicht. Was halt komisch ist, wie oben beschrieben das Pythonprojekt funktioniertclass Battery(SolarEdge): def __init__(self, offset=False, *args, **kwargs): self.model = f"Battery{offset + 1}" self.wordorder = Endian.Little super().__init__(*args, **kwargs) self.offset = BATTERY_REGISTER_OFFSETS[offset] self.registers = { "c_manufacturer": (0xe100 + self.offset, 16, registerType.HOLDING, registerDataType.STRING, str, "Manufacturer", "", 1), "c_model": (0xe110 + self.offset, 16, registerType.HOLDING, registerDataType.STRING, str, "Model", "", 1), "c_version": (0xe120 + self.offset, 16, registerType.HOLDING, registerDataType.STRING, str, "Version", "", 1), "c_serialnumber": (0xe130 + self.offset, 16, registerType.HOLDING, registerDataType.STRING, str, "Serial", "", 1), "c_deviceaddress": (0xe140 + self.offset, 1, registerType.HOLDING, registerDataType.UINT16, int, "Modbus ID", "", 1), "c_sunspec_did": (0xe141 + self.offset, 1, registerType.HOLDING, registerDataType.UINT16, int, "SunSpec DID", "", 1), "rated_energy": (0xe142 + self.offset, 2, registerType.HOLDING, registerDataType.SEFLOAT, float, "Rated Energy", "Wh", 2), "maximum_charge_continuous_power": (0xe144 + self.offset, 2, registerType.HOLDING, registerDataType.SEFLOAT, float, "Maximum Charge Continuous Power", "W", 2), "maximum_discharge_continuous_power": (0xe146 + self.offset, 2, registerType.HOLDING, registerDataType.SEFLOAT, float, "Maximum Discharge Continuous Power", "W", 2), "maximum_charge_peak_power": (0xe148 + self.offset, 2, registerType.HOLDING, registerDataType.SEFLOAT, float, "Maximum Charge Peak Power", "W", 2), "maximum_discharge_peak_power": (0xe14a + self.offset, 2, registerType.HOLDING, registerDataType.SEFLOAT, float, "Maximum Discharge Peak Power", "W", 2), "average_temperature": (0xe16c + self.offset, 2, registerType.HOLDING, registerDataType.SEFLOAT, float, "Average Temperature", "°C", 2), "maximum_temperature": (0xe16e + self.offset, 2, registerType.HOLDING, registerDataType.SEFLOAT, float, "Maximum Temperature", "°C", 2), "instantaneous_voltage": (0xe170 + self.offset, 2, registerType.HOLDING, registerDataType.SEFLOAT, float, "Instantaneous Voltage", "V", 2), "instantaneous_current": (0xe172 + self.offset, 2, registerType.HOLDING, registerDataType.SEFLOAT, float, "Instantaneous Current", "A", 2), "instantaneous_power": (0xe174 + self.offset, 2, registerType.HOLDING, registerDataType.SEFLOAT, float, "Instantaneous Power", "W", 2), "lifetime_export_energy_counter": (0xe176 + self.offset, 4, registerType.HOLDING, registerDataType.UINT64, int, "Total Exported Energy", "Wh", 2), "lifetime_import_energy_counter": (0xe17A + self.offset, 4, registerType.HOLDING, registerDataType.UINT64, int, "Total Imported Energy", "Wh", 2), "maximum_energy": (0xe17e + self.offset, 2, registerType.HOLDING, registerDataType.SEFLOAT, float, "Maximum Energy", "Wh", 2), "available_energy": (0xe180 + self.offset, 2, registerType.HOLDING, registerDataType.SEFLOAT, float, "Available Energy", "Wh", 2), "soh": (0xe182 + self.offset, 2, registerType.HOLDING, registerDataType.SEFLOAT, float, "State of Health (SOH)", "%", 2), "soe": (0xe184 + self.offset, 2, registerType.HOLDING, registerDataType.SEFLOAT, float, "State of Energy (SOE)", "%", 2), "status": (0xe186 + self.offset, 2, registerType.HOLDING, registerDataType.UINT32, int, "Status", BATTERY_STATUS_MAP, 2), "status_internal": (0xe188 + self.offset, 2, registerType.HOLDING, registerDataType.UINT32, int, "Internal Status", BATTERY_STATUS_MAP, 2), "event_log": (0xe18a + self.offset, 2, registerType.HOLDING, registerDataType.UINT16, int, "Event Log", "", 2), "event_log_internal": (0xe192 + self.offset, 2, registerType.HOLDING, registerDataType.UINT16, int, "Internal Event Log", "", 2), }
nach dem Codeausschnitt sind das Holdingregister
-
Ist nur komisch ... laut dem Thread geht es .
Würde es gerne selber testen , aber ich habe meine Solaredge PV Anlage noch nicht .Was ist hiermit :
Register 62836 als float(swap) steht für Batterieleistung [W], neg= Entladung, pos=Ladung der Batterie Register 62852 als float(swap) steht für Batterieladung [%] Register 62854 als uint16 steht für Betriebszustand, nämlich: 1: Aus 3: Laden 4: Entladen 6: Erhaltungsladen ---------------
-
@glasfaser ja ich habe da auch mal gefragt, aber die mit denen ich gesprochen habe nutzen nicht iobroker sondern andere Tools um dann über modbus zu kommunizieren. Deshalb dachte ich, dass iobroker hier vielleicht ein problem hat. auch weil die Register eigentlich außerhalb der Adressbereiche liegen.
-
@soeni Mal ohne den Offset probiert?
-
@wendy2702 ja +-1 habe ich jeweisl probiert.
-
@soeni Ich bin beim Einrichten des iobrokers über deine Frage gestolpert.
Ich hatte dasselbe Problem. Der Datentyp muss floatsw sein.
Hier meine Konfig:_address name description unit type len factor offset formula role room poll wp cw isScale 40000 C_SunSpec_ID "Wert = ""SunS"" (0x53756e53). Identifiziert dies eindeutig als eine SunSpec Modbus-Karte" uint32be 2 1 0 value true false false false 40002 C_SunSpec_DID Wert = 0x0001. Identifiziert dies eindeutig als einen SunSpec “Common Block“ uint16be 1 1 0 value true false false false 40003 C_SunSpec_Länge 65 = Länge eines Blocks in 16-bit Registern uint16be 1 1 0 value true false false false 40004 C_Hersteller "Bei SunSpec eingetragener Wert = ""SolarEdge""" string 16 1 0 value true false false false 40020 C_Modell Spezifischer SolarEdge Wert string 16 1 0 value true false false false 40044 C_Version Spezifischer SolarEdge Wert string 8 1 0 value true false false false 40052 C_Seriennummer Eindeutiger SolarEdge Wert string 16 1 0 value true false false false 40069 C_SunSpec_DID 101 = Einphasig, 102 = Spaltphase, 103 = Dreiphasig uint16be 1 1 0 value true false false false 40071 I_AC_Strom AC-Gesamtstromwert A uint16be 1 1 0 value true false false false 40072 I_AC_StromA AC-Phase A (L1) Stromwert A uint16be 1 1 0 value true false false false 40073 I_AC_StromB AC-Phase B (L2) Stromwert A uint16be 1 1 0 value true false false false 40074 I_AC_StromC AC-Phase C (L3) Stromwert A uint16be 1 1 0 value true false false false 40075 I_AC_Strom_SF AC-Strom Skalierungsfaktor SF int16be 1 1 0 value true false false true 40083 I_AC_Leistung AC-Leistungswert W uint16be 1 1 0 value true false false false 40084 I_AC_Leistung_SF AC-Leistung Skalierungsfaktor SF int16be 1 1 0 value true false false true 40087 I_AC_VA Scheinleistung VA uint16be 1 1 0 value true false false false 40088 I_AC_VA_SF Scheinleistung Skalierungsfaktor SF int16be 1 1 0 value true false false true 40089 I_AC_VAR Blindleistung VAR uint16be 1 1 0 value true false false false 40090 I_AC_VAR_SF Blindleistung Skalierungsfaktor SF int16be 1 1 0 value true false false true 40091 I_AC_PF Leistungsfaktor % uint16be 1 1 0 value true false false false 40092 I_AC_PF_SF Leistungsfaktor Skalierungsfaktor SF int16be 1 1 0 value true false false true 40093 I_AC_Energie_WH AC Gesamt-Energieproduktion Wh uint32be 2 1 0 value true false false false 40095 I_AC_Energie_WH_SF AC Gesamtenergie Skalierungsfaktor SF uint16be 1 1 0 value true false false true 40096 I_DC_Strom DC-Stromwert A uint16be 1 1 0 value true false false false 40097 I_DC_Strom_SF DC-Strom Skalierungsfaktor SF int16be 1 1 0 value true false false true 40098 I_DC_Spannung DC-Spannungswert V uint16be 1 1 0 value true false false false 40099 I_DC_Spannung_SF DC-Spannung Skalierungsfaktor SF int16be 1 1 0 value true false false true 40100 I_DC_Leistung DC-Leistungswert W uint16be 1 1 0 value true false false false 40101 I_DC_Leistung_SF DC-Leistung Skalierungsfaktor SF int16be 1 1 0 value true false false true 40103 I_Temp_Kühler Kühlkörpertemperatur °C uint16be 1 1 0 value true false false false 40106 I_Temp_SF Kühlkörpertemperatur Skalierungsfaktor SF int16be 1 1 0 value true false false true 40107 I_Status Betriebszustand (1 = Aus, 2 = Schlafen (Automatisches Herunterfahren) – Nachtmodus, 3 = Aufwachen/Starten, 4 = Wechselrichter ist AN und wandelt Energie, 5 = Begrenzte Produktion, 6 = Herunterfahren, 7 = Fehler, 8 = Wartung/Setup) uint16be 1 1 0 value true false false false 40108 I_Status_Anbieter Anbieter-spezifischer Betriebszustand sowie Fehlercodes: 1 = Aus, 2 = Schlafen (Automatisches Herunterfahren) – Nachtmodus, 3 = Aufwachen/Starten, 4 = Wechselrichter ist AN und wandelt Energie, 5 = Begrenzte Produktion, 6 = Herunterfahren, 7 = Fehler, 8 = Wartung/Setup uint16be 1 1 0 value true false false false 40123 C_Manufacturer Meter manufacturer string 32 1 0 value true false false false 40139 C_Model Meter model string 32 1 0 value true false false false 40155 C_Option Export + Import, Production, consumption string 16 1 0 value true false false false 40190 M_AC_Current AC Current (sum of active phases) A uint16be 1 1 0 value true false false false 40194 M_AC_Current_S F AC Current Scale Factor SF int16be 1 1 0 value true false false false 40206 M_AC_Power Total Real Power (sum of active phases) W int16be 1 1 0 value true false false false 40210 M_AC_Power_SF AC Real Power Scale Factor SF int16be 1 1 0 value true false false false 40226 M_Exported Total Exported Real Energy Wh uint32be 2 1 0 value true false false false 40234 M_Imported Total Imported Real Energy Wh uint32be 2 1 0 value true false false false 40242 M_Energy_W_SF Real Energy Scale Factor SF int16be 1 1 0 value true false false false 57666 Battery_Rated_Energy Rated Energy Wh floatsw 1 1 0 value true false false false 57716 Battery__Power Battery Power W floatsw 1 1 0 value true false false false
-
@Soeni
hast du hier schon eine Lösung?
Ich habe exakt das gleiche Problem. -
habt ihr 2 ne Lösung für die Register der Batterien gefunden? Ich kann den Wechselrichter (Register 40001 bis 40109) und den Meter (Register 40140 bis 40243) auslesen. Leider aber nicht die Batterie.
Ich habe diese Register gefunden:
https://pastebin.com/khDMXu5Lund da bekomme ich genau eure Fehlermeldung
modbus.0 2023-10-23 00:37:09.605 warn Poll error count: 6 code: {"errorCode":131,"exceptionCode":2,"message":"ILLEGAL DATA ADDRESS"} modbus.0 2023-10-23 00:37:04.329 warn Poll error count: 5 code: {"errorCode":131,"exceptionCode":2,"message":"ILLEGAL DATA ADDRESS"} modbus.0 2023-10-23 00:36:59.125 warn Poll error count: 4 code: {"errorCode":131,"exceptionCode":2,"message":"ILLEGAL DATA ADDRESS"} modbus.0 2023-10-23 00:36:53.899 warn Poll error count: 3 code: {"errorCode":131,"exceptionCode":2,"message":"ILLEGAL DATA ADDRESS"} modbus.0 2023-10-23 00:36:48.728 warn Poll error count: 2 code: {"errorCode":131,"exceptionCode":2,"message":"ILLEGAL DATA ADDRESS"} modbus.0 2023-10-23 00:36:43.561 warn Poll error count: 1 code: {"errorCode":131,"exceptionCode":2,"message":"ILLEGAL DATA ADDRESS"}
ich komme nicht weiter...
Marcus
-
@mguenther sagte in Modbus ILLEGAL DATA ADDRESS:
Leider aber nicht die Batterie.
Welche Batterie !?
Du schreibst :
und den Meter (Register 40140 bis 40243) auslesen
Der beginnt aber laut deiner Vorlage bei 40123 und endet bei 40242.
Hast du dort das Register um +1 verschoben !?Du kannst mal testen :
Modbus Instanz die du schon hast ausschalten .
Eine neue Instanz erstellen mit den Verbindungseinstellungen die du brauchst , dann aber nur erstmal ein Regiester dazu abfragen :57666 Battery 1 Rated Energy Batterie Nennkapazität Wh floatsw 2 1 0 value true false false false
wenn nicht dann +1 oder -1 das Register verschieben . ( 57665 / 57668 )
oder dieses Register ( eventuell auch + 1 / - 1 ) :
102833 Batterie_Volt V floatsw 2 1 0 level true false false false