# Fronius Smartmeter mit Modbus TCP auslesen



## WolfiSPS (25 Juli 2021)

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


----------



## JoGi65 (25 Juli 2021)

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!


----------



## PN/DP (25 Juli 2021)

WolfiSPS schrieb:


> 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


----------



## WolfiSPS (25 Juli 2021)

Anbei mein Bitmuster:




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..


----------



## PN/DP (26 Juli 2021)

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 😲 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


----------



## Frohnius (26 Juli 2021)

2 Word in Real zusammenfügen Ecockpit
					

Hallo Leute  Bitte seht es mir nach ich bin Codesys Neuling und hab da ein kleineres Problem. Ich möchte Daten von einem Schreiber via Modbus mit RS485 auslesen. Jetzt mein Problem die Werte werden als Float bzw Doublefloat vom Schreiber ausgegeben in der Steuerung werden sie als Array of Word...




					www.sps-forum.de
				




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


----------



## PN/DP (26 Juli 2021)

Frohnius schrieb:


> 2 Word in Real zusammenfügen Ecockpit
> 
> 
> Hallo Leute  Bitte seht es mir nach ich bin Codesys Neuling und hab da ein kleineres Problem. Ich möchte Daten von einem Schreiber via Modbus mit RS485 auslesen. Jetzt mein Problem die Werte werden als Float bzw Doublefloat vom Schreiber ausgegeben in der Steuerung werden sie als Array of Word...
> ...


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


----------



## DeltaMikeAir (26 Juli 2021)

PN/DP schrieb:


> ...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....


Genau, weil:


----------



## JoGi65 (26 Juli 2021)

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?


----------



## Frohnius (26 Juli 2021)

PN/DP schrieb:


> 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


----------



## PN/DP (26 Juli 2021)

Der Fragesteller hier programmiert vermutlich irgendwas mit irgendeinem Codesys-Dialekt. Vermutlich kann das Gerät kein python ...

Harald


----------



## Frohnius (26 Juli 2021)

naja .. habs ja erklärt was zu tun ist  ... is jetzt nicht sooooo schwer das in st zu machen ....


----------



## WolfiSPS (30 Juli 2021)

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...


----------



## PN/DP (30 Juli 2021)

WolfiSPS schrieb:


> 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.



WolfiSPS schrieb:


> 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 ... 



WolfiSPS schrieb:


> 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


----------



## WolfiSPS (30 Juli 2021)

Ich hab diese Liste von der Fronius Webseite geladen... 
Bei mir ist 40074 eindeutig der Wert der B-Phase. (mit dem Smartmeter Display abgeglichen... )


----------



## Steuerungsgeri (8 September 2021)

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 ?!?!


----------



## JoGi65 (8 September 2021)

Ich denke da wird es ein Multiplikator Register geben. Das gehört auch in Deine Rechnung einbezogen.


----------



## Steuerungsgeri (9 September 2021)

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.


----------



## Blockmove (9 September 2021)

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.


----------



## Steuerungsgeri (9 September 2021)

Das stimmt alles aber wie kann es sein das ein INT Wert (-2147483648..2147483647) keinen Wert mit zb.: 10000 anzeigen kann?


----------



## Oberchefe (9 September 2021)

> ein INT Wert (-2147483648..2147483647) keinen Wert


Ein INT in der Steuerungstechnik hat üblicherweise 16 Bit und geht daher von -32768 bis 32767.

Nicht zu verwechseln mit einem INT in Visual Basic oder dergleichen.


----------



## DeltaMikeAir (9 September 2021)

Oberchefe schrieb:


> Nicht zu verwechseln mit einem INT in Visual


Bzw. mit einem DINT


----------



## WolfiSPS (20 September 2021)

Ich hab nun einen weiteren Smart Meter angehängt. in der Solarweb liefert er brauchbare Daten. Leider kommt im Codesys nun alle paar Sekunden ein Dreieck Symbol und der Error zählt nach oben.



Dabei fällt mir auf dass immer wieder im bei IChannalIndex der Wert -1 steht und darauf hin ComState auf Connecting wechselt. Wenn ich dann das letzte Gerät wieder deaktiviere sind die Fehler wieder weg.
hat jemand eine Idee woher dies kommt?


----------



## JoGi65 (21 September 2021)

Fragst Du die Geräte hintereinander ab, nach Fertigmeldung vom letzten?


----------



## WolfiSPS (21 September 2021)

JoGi65 schrieb:


> Fragst Du die Geräte hintereinander ab, nach Fertigmeldung vom letzten?


daran hab ich auch schon gedacht mir ist aber nicht klar wie ich das umstellen kann...


----------



## JoGi65 (21 September 2021)

Sorry, da kann ich Dir bei Codesys nicht helfen.
Bei der SPS liefert der Modbusbaustein ein - Done - und mit dem startet man die nächste Subadresse im Subnet der Wechselrichter IP.


----------



## WolfiSPS (4 Oktober 2021)

Ich hab auch schon versucht die Werte mit unterschiedlichen Zykluszeiten abzufragen bringt leider auch nichts...


----------



## Siegfried (25 November 2021)

Versuchsmal mit ADDR Wechselrichter und SmartMeter:  ADDR 440072  Eigenheit von Siemens .

LG
Siegfried


----------



## WolfiSPS (26 November 2021)

Siegfried schrieb:


> Versuchsmal mit ADDR Wechselrichter und SmartMeter:  ADDR 440072  Eigenheit von Siemens .
> 
> LG
> Siegfried


Danke, hat leider nicht funktioniert.
Macht es einen Unterschied ob ich mit Float oder INT+SF Werte auslese?


----------



## holgermaik (26 November 2021)

schmeis die Oscat raus und die Pointer Adressierung, Bringt nur Probleme beim Nachladen.
Convertierung: Word, DWord, Real, Word alles über Union machen.
.
Eine Schrittkette für die Abfrage der Geräte. Einen Masterbaustein. Port 502 gilt für alle Geäte, darum ->
Connect -> Lesen -> Disconnect, --> nächstes Gerät.


----------



## JoGi65 (26 November 2021)

WolfiSPS schrieb:


> Macht es einen Unterschied ob ich mit Float oder INT+SF Werte auslese?



Sollte keinen Unterschied machen. Ich kann mich nicht mehr erinnern warum, aber ich lese mit Int+SF. Aber in dem Beitrag - https://www.sps-forum.de/threads/s7-1200-modbus.84914/page-3#post-810875 - lesen einige mit Float. Beim Wechselrichter kann man es umstellen, beim Smartmeter weiß ich es nicht mehr.


----------



## holgermaik (28 November 2021)

Beispiel Union


----------



## WolfiSPS (29 November 2021)

Ich hab in meinem Codesys Projekt modbus Master und Slaves definiert und folgende Parameter werden in Variablen erfasst.
Diese Variablen gehen dann in meine Funktionsblock und wandeln in Real um. (siehe Bilder)

 und mein Problem mit 3 Modbus Teilnehmer klappt es. aber wenn der 4 Teilnehmer aktiviert wird kommen keine Werte mehr zurück. mit der Fehlermeldung Folgefehler weil XDone vom vorigen Modbusteilehmer nicht erfolgt ist. Daher suche ich eine Lösung dafür. alle Teilnehmer hängen am RS485 und die App von Fronius liefert genau Werte von allen 4 Modbusteilnehmern. es kann also nur an der Übertragung/Umsetzung liegen..


----------



## PN/DP (29 November 2021)

Modbus-Anfragen über RS485 müssen zwingend streng nacheinander abgewickelt werden. Also: 1. Teilnehmer fragen - Antwort oder Timeout abwarten - 2. Teilnehmer fragen - Antwort oder Timeout abwarten - 3. Teilnehmer fragen ...
Da bietet sich eine Schrittkette an.


----------

