Fronius Smartmeter mit Modbus TCP auslesen

WolfiSPS

Level-2
Beiträge
78
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

Ich probiere schon seit Tagen per Modbus TCP die aktuelle Leistung von Smartmeter auszulesen.. leider vergeblich...

Meine PV_Anlage hat einen Fronius symo mit geräte ID 001 die Daten kommen einwandfrei raus.
Allerdings habe ich lange probiert, da bei der Register Adresse immer 1 abgezogen werden muss.

Ich hab nun auch den Smartmeter erreicht, Adresse 240. Es kommen auch Daten raus die aber nicht real sind.

Z.B. 40098 sollte AC Power Value sein. Länge 2 also 2 Werte im Format WORD da Codesys nur dieses Datenformat auslesen kann.
Laut Tabelle von Fronius ist der Datentyp aber Float32.

Ich habe versucht die 2 Word-Werte mit dem DWord of Word Baustein umzurechnen.
Ergibt aber keinen Sinn. Auch andere Werte sind nicht Real.

Vermutlich nur ein kleiner Fehler, vielleicht kann mir jemand weiterhelfen???

Vielen Dank im Voraus!
MFG
Wolfi
 
Einstellung im Wechselrichter kontrollieren, wie die Daten auszulesen sind, oder entsprechend einstellen. (float oder int + sf)
Dann vom entsprechenden Protokoll die Register wählen und das (zB) 40122 nicht vergessen - Power Factor value. das ist der Rechenfaktor (bin nicht ganz sicher, glaube Multiplikator) für ALLE ...POWER Werte!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Z.B. 40098 sollte AC Power Value sein. Länge 2 also 2 Werte im Format WORD da Codesys nur dieses Datenformat auslesen kann.
Laut Tabelle von Fronius ist der Datentyp aber Float32.

Ich habe versucht die 2 Word-Werte mit dem DWord of Word Baustein umzurechnen.
Ergibt aber keinen Sinn. Auch andere Werte sind nicht Real.
Du musst die 2 WORD zu einem DWORD zusammenfügen, dabei eventuell die Reihenfolge der WORDs oder der BYTEs vertauschen. Und dann das entstandene 32 Bit Bitmuster OHNE Konvertierung direkt in eine REAL-Variable übernehmen. Das geht in Codesys allerdings nur über Pointer oder UNION (Codesys 3).

Wie sieht das Bitmuster (der hexadezimale Wert) der 2 WORDs aus?

Harald
 
Anbei mein Bitmuster:

1627243009545.png

Register 1 von 40122 schwankt bei mir extrem, zwischen 2000 und 30000.
WR ist auf Float eingestellt.

Ich hab schon versucht w0 und w1 zu tauschen leider ändert sich am wert nicht viel.

Pointer und Union ist mir noch nicht bekannt muss ich mir noch ansehen..
 
Jetzt hast Du meine Frage maximal umständlich beantwortet...

OK, ich kann mir die Informationen auch selber ausrechnen:
40122[0] (%IW97) = 10486 = 16#28F6
40122[1] (%IW98) = 16186 = 16#3F3A

0x28F63F3A = 2.73389065563e-14 😲:unsure: Für mich ein eher unwahrscheinlicher Wert. Hat Deine SPS da schon Bytes vertauscht? Oder gehören die beiden Register gar nicht zusammen?
Nachtrag: falls nur die WORD vertauscht sind, dann ergibt sich 0x3F3A28F6 = 0.727187514305 - ist das die Ziffernfolge die Du erwartest?

Modbus verwendet Big Endian. Deine SPS verwendet vermutlich Little Endian. Welche SPS programmierst Du mit welcher Software?

Dein Problem wurde hier im Forum schon oft behandelt. Benutze die Forumssuche mit den Stichworten "pointer union modbus", da findest Du Programmierbeispiele. Z.B. hier: https://www.sps-forum.de/threads/dw...eal-unterschiedlich.101233/page-2#post-766709

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren

^^ glaube hier findest du die lösung ...
 

^^ glaube hier findest du die lösung ...
Könntest Du bitte die Lösung zitieren, wo Du glaubst daß es die Lösung ist? Direkt in dem von Dir verlinkten Beitrag, aber auch in dem ganzen Thread, finde ich nur allgemeines Blabla wie eine Lösung sein könnte, aber keine verwendbare Lösung.
Ich finde es schade, daß speziell bei diesem Problem mit Codesys und Modbus und REAL keiner der Fragesteller nach dem Abgreifen der Hinweise klipp und klar den Programmcode seiner funktionierenden Lösung gepostet hat.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich arbeite weder mit codesys noch mit float sondern mit int + sf, deswegen kann ich leider nicht weiterhelfen.

Aber für die, die sich damit auskennen, hilft vielleicht die Angabe vom Smartmeter, dass sich der tatsächliche Wert aus diesen 4 Registern zusammensetzen sollte (Jedenfalls ist es bei int+sf so, aber halt andere Register Nummern):

Floating Point Darstellung – „float“
40098 40099 float32 - W - AC Power value
40122 40123 float32 - % - Power Factor value

Eventuell sind die Register in die falsche Richtung verschoben in Deiner Abfrage, weil ja ein Versatz von 1 drinnen ist?
 
Könntest Du bitte die Lösung zitieren, wo Du glaubst daß es die Lösung ist? Direkt in dem von Dir verlinkten Beitrag, aber auch in dem ganzen Thread, finde ich nur allgemeines Blabla wie eine Lösung sein könnte, aber keine verwendbare Lösung.
Ich finde es schade, daß speziell bei diesem Problem mit Codesys und Modbus und REAL keiner der Fragesteller nach dem Abgreifen der Hinweise klipp und klar den Programmcode seiner funktionierenden Lösung gepostet hat.

Harald

soweit ich mich erinnere waren low und high vertauscht und das 1. bit war das vorzeichen ...
benötigt ein paar rechenschritte .. hab ich irgendwann mal in python gemacht ..

und dann hab ich hier noch geschrieben ...

ergebnis= master.execute(1, cst.READ_HOLDING_REGISTERS, regnr, regzahl )
a=ergebnis [0] & 0xFF ; b=(ergebnis [0] >> 8) & 0xFF ; c=ergebnis [1] & 0xFF ; d=(ergebnis [1] >> 8) & 0xFF
res = (d << 24) | (c << 16) | (b << 8) |a
rep = struct.pack('>I', res)
myfloat = struct.unpack('>f', rep)[0]
print ((time.asctime()), (myfloat), ('V zwischen L1 und L2'))

also in ergebnis [0] und ergebnis [1] ist je eine 16 bit - "zahl" ..
müssen in je 2 byte zerlegt werden ... also a, b, c, d ...
und dann in der reihenfolge d,c,b,a wieder zusammengepakt werden ...
und schon gibts einen real-wert

also das ist python .. lässt sich aber natürlich in st genauso machen ...
also in st mit union
 
Es sieht schon nicht mehr soo verkehrt aus... siehe Bild
Das einzige die Registerzahl fehlt immer noch um 1...
Die Werte kommen ca. 3 Sek. Zeitverzögert. Ich hab jetzt nur mal den Phasenstrom ausgewertet.
Bei 40074 kommt der Wert von Phase 2 raus, also 40076.

Leistungsauswertung muss ich erst testen ob die Werte zusammen multipliziert einen Sinn ergeben. die Werte kommen meistens negativ zurück obwohl am Smartmeter positiv dargestellt..

Zur Frage welche Software und welchen Master: Codesys mit Raspi Masterlizenz...

Hintergrund für die Auswertung ist bei mir dass die Überspannung vom Fronius WR nur über SmartGrid ausgewertet wird aktuell, also mit Schwellwert. Ich hätte aber geplant je nach Höhe vom PV-Überschuss verschiedene Verbraucher zu aktivieren...

1627647237479.png
 
Es sieht schon nicht mehr soo verkehrt aus... siehe Bild
Sieht so aus als ob Du nur die beiden Register/Words H/L-tauschst, aber nicht auch noch die Bytes in den Words.

Das einzige die Registerzahl fehlt immer noch um 1...
Du meinst, daß die vom ModbusClient-Baustein auszulesende Registernummer um 1 neben der für das Gerät/ModbusServer dokumentierten Registernummer liegt? Das ist normal, vermutlich historisch bedingt, weil eine Sorte Programmierer die Register ab 0 durchnummeriert und eine andere Sorte Programmierer durchnummeriert wie sie "mit den Fingern" zählen: das erste Register hat Nummer 1, das zweite Register hat Nummer 2 ... ;)

Bei 40074 kommt der Wert von Phase 2 raus, also 40076.
Echt? Kein Fehler Deinerseits? Ein Versatz von 2 wäre ungewöhnlich bzw. sowas habe ich noch nicht erlebt. Vielleicht hat da der Programmierer des ModbusClients oder der Programmierer des Gerätes/ModbusServers von dem üblichen Versatz gewusst und wollte ihn kompensieren und hat dabei dummerweise den Versatz verdoppelt? ;)

Harald
 
Zuletzt bearbeitet:
Hallo, ich beschäftige mich gerade mit dem selben Thema.
Mein Ansatz: Ich lese die Werte des Zählers /(D 240) aus dies aber mit der Einstellung INT auf dem fronius WebUI.
Das funktioniert, jedoch kommt zb die Leistung um den Faktor 10 in Watt gesehen zu groß auf das Register, was eigentlich kein Problem wäre (denke ich bei INT ist der wertebereich weit weit größer ) dennoch...

...und das ist mein Problem: wenn die Leistung über eine gewisse Schwelle steig zeigt mir das Register keinen Richtigen wert an so als ob es überläuft ?!?!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber wennn das so wäre müsste ich das Register um den Multiplikator verkleinern bevor ich es in Codesys weiterverarbeite? Habe ich das Richtig verstanden das du meinst das Werte bis „3000Watt“ normal bzw mit dem Faktor 10 angezeigt werden und alles größere dann nur mit Faktor 1. Denn so sieht das jetzt komischerweise aus.
 
Viele Umrichterhersteller verwenden mittlerweile das SunSpec Profil für die Kommunikation.
Dort kommen die Register mit den Faktoren her. Das Profil deckt damit halt vom Balkonkraftwerk bis zum hektargroßen Solarpark alles ab.
Wenn man also Werte auslesen will, dann erstmal nen Blick in die Spezifikation, ob die Werte einen Faktor brauchen oder nicht.
 
Zurück
Oben