Testweise habe ich am WR die Modbus-Einstellungen von float
auf int + SF
umgestellt:
Das ergibt eine geänderte Ausgabe:
2025-08-17T11:15:40,828 [teWorker] INFO [onent.AbstractOpenemsComponent] [modbus0] Activate Bridge.Modbus.Tcp
2025-08-17T11:15:40,831 [teWorker] WARN [ponentmanager.EdgeConfigWorker] Component [modbus0] was missing!
2025-08-17T11:15:55,750 [orker-15] INFO [appmanager.ResolveDependencies] Resolved dependencies.
2025-08-17T11:16:25,261 [fb8792a)] INFO [onent.AbstractOpenemsComponent] [modbus0] Deactivate Bridge.Modbus.Tcp
2025-08-17T11:16:25,266 [modbus0 ] INFO [ridge.modbus.api.task.WaitTask] WaitDelayTask [delay=610] interrupted: sleep interrupted
2025-08-17T11:16:40,521 [108f757)] INFO [onent.AbstractOpenemsComponent] [modbus0] Activate Bridge.Modbus.Tcp
2025-08-17T11:16:40,522 [teWorker] WARN [ponentmanager.EdgeConfigWorker] Component [modbus0] was missing!
2025-08-17T11:16:57,227 [298534d)] INFO [bstractOpenemsSunSpecComponent] [MeterFroniusImpl] Reinitialize SunSpec channels [force=true]
2025-08-17T11:16:57,235 [298534d)] INFO [onent.AbstractOpenemsComponent] [meter0] Activate Meter.Fronius
2025-08-17T11:16:57,240 [teWorker] WARN [ponentmanager.EdgeConfigWorker] Component [meter0] was missing!
2025-08-17T11:16:57,244 [298534d)] INFO [onent.AbstractOpenemsComponent] [meter0] Deactivate Meter.Fronius
2025-08-17T11:16:57,249 [teWorker] INFO [bstractOpenemsSunSpecComponent] [MeterFroniusImpl] Reinitialize SunSpec channels [force=true]
2025-08-17T11:16:57,251 [teWorker] INFO [onent.AbstractOpenemsComponent] [meter0] Activate Meter.Fronius
2025-08-17T11:17:01,519 [modbus0 ] INFO [bstractOpenemsSunSpecComponent] [meter0] Adding SunSpec-Model [1:Common] starting at [40002]
2025-08-17T11:17:04,074 [modbus0 ] INFO [bstractOpenemsSunSpecComponent] [meter0] Ignoring SunSpec-Model [203] starting at [40069]
2025-08-17T11:17:06,320 [modbus0 ] INFO [meter.fronius.MeterFroniusImpl] [meter0] SunSpec initialization finished. 40 Channels available.
Und es führt gleichzeitig dazu, dass in OpenEMS der WR keine Daten mehr liefert – sprich für den WR ist es wohl relevant, dass die Einstellung auf float
bleiben. Float
scheint mir auch für den EnergyMeter (EM) richtig, siehe enum S213
in DefaultSunspecModel.java
:
A(new ScaledValuePoint(//
"S213_A", //
"Amps", //
"Total AC Current", //
FLOAT32, //
true, //
READ_ONLY, //
Unit.AMPERE, //
"A_SF")), //
Die Einstellung float
würde ich dann noch in der readme.adoc
ergänzen.
@fanass noch eine Frage zum grundsätzlichen Set-Up (ohne zu wissen wie relevant es ist), du hast den EM auch hinter dem WR hängen und fragst den EM mittels Modbus TCP
via dem WR ab? Oder greifst du direkt mittels Modbus RTU
auf den EM zu?
Edit 1:
Ich habe im WebUI des WR auch noch keinen Hinweis auf die Modbus Unit-ID
des EM gefunden, um zu prüfen ob die 240
korrekt ist. Wobei die im vorherigen Post genannte Fehlermeldung nur bei dieser Unit-ID
auftritt und vielleicht ein Hinweis darauf ist, dass sie stimmt. 
Edit 2:
In der Hoffnung, dass es hilft das Problem zu lösen: Ich habe mir mal die Modbus-Register-Dokumentation in der Datei Meter_Register_Map_Float_v1.0.xlsx aus dem Fronius-Download-ZIP genommen und folgende Config-Datei für modpoll
erstellt (die als register not supported kommentierten Register habe ich ausgelassen, für Register 73 habe ich den Datentyp uint32
genutzt da bitfield32
von modpoll
laut Doku nicht unterstützt wird):
device,emfronius01,240,,
poll,holding_register,40000,121,BE_BE
ref,holding_reg001:_SID____________,40000,uint32,r
ref,holding_reg002:_ID_____________,40002,uint16,r
ref,holding_reg003:_L______________,40003,uint16,r,Registers
ref,holding_reg004:_Mn_____________,40004,string32,r
ref,holding_reg005:_Md_____________,40020,string21,r
ref,holding_reg006:_Opt____________,40036,string16,r
ref,holding_reg007:_Vr_____________,40044,string16,r
ref,holding_reg008:_SN_____________,40052,string32,r
ref,holding_reg009:_DA_____________,40068,uint16,r
ref,holding_reg010:_ID_____________,40069,uint16,r
ref,holding_reg011:_L______________,40070,uint16,r,Registers
ref,holding_reg012:_A______________,40071,float32,r,A
ref,holding_reg013:_AphA___________,40073,float32,r,A
ref,holding_reg014:_AphB___________,40075,float32,r,A
ref,holding_reg015:_AphC___________,40077,float32,r,A
ref,holding_reg016:_PhV____________,40079,float32,r,V
ref,holding_reg017:_PhVphA_________,40081,float32,r,V
ref,holding_reg018:_PhVphB_________,40083,float32,r,V
ref,holding_reg019:_PhVphC_________,40085,float32,r,V
ref,holding_reg020:_PPV____________,40087,float32,r,V
ref,holding_reg021:_PPVphAB________,40089,float32,r,V
ref,holding_reg022:_PPVphBC________,40091,float32,r,V
ref,holding_reg023:_PPVphCA________,40093,float32,r,V
ref,holding_reg024:_Hz_____________,40095,float32,r,Hz
ref,holding_reg025:_W______________,40097,float32,r,W
ref,holding_reg026:_WphA___________,40099,float32,r,W
ref,holding_reg027:_WphB___________,40101,float32,r,W
ref,holding_reg028:_WphC___________,40103,float32,r,W
ref,holding_reg029:_VA_____________,40105,float32,r,VA
ref,holding_reg030:_VAphA__________,40107,float32,r,VA
ref,holding_reg031:_VAphB__________,40109,float32,r,VA
ref,holding_reg032:_VAphC__________,40111,float32,r,VA
ref,holding_reg033:_VAR____________,40113,float32,r,VAr
ref,holding_reg034:_VARphA_________,40115,float32,r,VAr
ref,holding_reg035:_VARphB_________,40117,float32,r,VAr
ref,holding_reg036:_VARphC_________,40119,float32,r,VAr
poll,holding_register,40121,76,BE_BE
ref,holding_reg037:_PF_____________,40121,float32,r,cos()
ref,holding_reg038:_PFphA__________,40123,float32,r,cos()
ref,holding_reg039:_PFphB__________,40125,float32,r,cos()
ref,holding_reg040:_PFphC__________,40127,float32,r,cos()
ref,holding_reg041:_TotWhExp_______,40129,float32,r,Wh
ref,holding_reg045:_TotWhImp_______,40137,float32,r,Wh
ref,holding_reg049:_TotVAhExp______,40145,float32,r,VAh
ref,holding_reg053:_TotVAhImp______,40153,float32,r,VAh
ref,holding_reg073:_Evt____________,40193,uint32,r
ref,holding_reg074:_ID_____________,40195,uint16,r
ref,holding_reg075:_L______________,40196,uint16,r,Registers
Ich habe also nirgends einen Skalierungsfaktor angegeben (wie in Register Map angegeben). Damit bekomme ich folgende Ausgabe:
Modpoll v1.5.0 - A New Command-line Tool for Modbus and MQTT
2025-08-17 16:43:18,630 | I | modpoll.main | No MQTT host specified, skip MQTT setup.
2025-08-17 16:43:18,630 | I | modpoll.modbus_task | Loading config from: fronius.csv
2025-08-17 16:43:18,631 | I | modpoll.modbus_task | Added 1 device(s)...
2025-08-17 16:43:18,631 | I | modpoll.main | Loaded 1 Modbus config(s).
2025-08-17 16:43:18,631 | I | modpoll.main | === Modpoll is polling at rate:10.0s, actual:10.0s ===
Device: emfronius01
+---------------------------------+----------------------+-----------+
| Reference | Value | Unit |
+---------------------------------+----------------------+-----------+
| holding_reg001:_SID____________ | 1400204883 | |
| holding_reg002:_ID_____________ | 1 | |
| holding_reg003:_L______________ | 65 | Registers |
| holding_reg004:_Mn_____________ | Fronius | |
| holding_reg005:_Md_____________ | Smart Meter TS 5kA-3 | |
| holding_reg006:_Opt____________ | 3.32.1-2 | |
| holding_reg007:_Vr_____________ | 1.5 | |
| holding_reg008:_SN_____________ | 0123456789 | |
| holding_reg009:_DA_____________ | 240 | |
| holding_reg010:_ID_____________ | 213 | |
| holding_reg011:_L______________ | 124 | Registers |
| holding_reg012:_A______________ | -127.8 | A |
| holding_reg013:_AphA___________ | -32.16 | A |
| holding_reg014:_AphB___________ | -48.0 | A |
| holding_reg015:_AphC___________ | -47.64 | A |
| holding_reg016:_PhV____________ | 241.1 | V |
| holding_reg017:_PhVphA_________ | 240.0 | V |
| holding_reg018:_PhVphB_________ | 242.1 | V |
| holding_reg019:_PhVphC_________ | 241.2 | V |
| holding_reg020:_PPV____________ | 417.567 | V |
| holding_reg021:_PPVphAB________ | 417.5 | V |
| holding_reg022:_PPVphBC________ | 418.5 | V |
| holding_reg023:_PPVphCA________ | 416.7 | V |
| holding_reg024:_Hz_____________ | 49.9 | Hz |
| holding_reg025:_W______________ | -29516.801 | W |
| holding_reg026:_WphA___________ | -6816.1 | W |
| holding_reg027:_WphB___________ | -11446.6 | W |
| holding_reg028:_WphC___________ | -11253.9 | W |
| holding_reg029:_VA_____________ | 30358.801 | VA |
| holding_reg030:_VAphA__________ | 7601.9 | VA |
| holding_reg031:_VAphB__________ | 11448.2 | VA |
| holding_reg032:_VAphC__________ | 11308.5 | VA |
| holding_reg033:_VAR____________ | 4667.5 | VAr |
| holding_reg034:_VARphA_________ | 3366.0 | VAr |
| holding_reg035:_VARphB_________ | 191.6 | VAr |
| holding_reg036:_VARphC_________ | 1109.8 | VAr |
| holding_reg037:_PF_____________ | 0.988 | cos() |
| holding_reg038:_PFphA__________ | 0.896 | cos() |
| holding_reg039:_PFphB__________ | 1.0 | cos() |
| holding_reg040:_PFphC__________ | 0.995 | cos() |
| holding_reg041:_TotWhExp_______ | 82063192.0 | Wh |
| holding_reg045:_TotWhImp_______ | 486680896.0 | Wh |
| holding_reg049:_TotVAhExp______ | nan | VAh |
| holding_reg053:_TotVAhImp______ | nan | VAh |
| holding_reg073:_Evt____________ | 0 | |
| holding_reg074:_ID_____________ | 65535 | |
| holding_reg075:_L______________ | 0 | Registers |
+---------------------------------+----------------------+-----------+
Der Wert in Register 25 stimmt mit dem im Web-UI des WR angezeigten Wert überein (negativer Wert = Einspeisung).
Register 49 und 53 geben nan
zurück. Wenn ich die Registeradresse um eins verschiebe (bspw. für Register 49 von 40145
auf 40146
), bekomme ich 0.0
zurück. Ich weiß nicht, ob dies ein Problem ist.
Register 9 ist dann wohl ein Hinweis darauf, dass 240
stimmt. 