Janitza PV-UMG604 Modbus TCP auslesen

Diskutiere Janitza PV-UMG604 Modbus TCP auslesen im Forum News, Informationen & Feedback im Bereich ALLGEMEINES - Guten Tag. Ich bin neu hier, und hätte am Anfang schon direkt eine Frage. Und zwar möchte ich beim Janitza PV-UMG604 die Variable 'Float...
M

Marcel15160

Beiträge
4
Guten Tag.

Ich bin neu hier, und hätte am Anfang schon direkt eine Frage. Und zwar möchte ich beim Janitza PV-UMG604 die Variable 'Float _G_P_SUM3' mit der Adresse '19026' auslesen. Ich habe dafür schon das Diagnose Tool der Firma verwendet, und damit erfolgreich die richtigen Werte ausgelsen.

Ich möchte jetzt aber die Values mit meinem Java (Jlibmodbus) Programm (zum Testen auch gerne mit QModMaster) auslesen.
Ich verwende dafür Modbus TCP, die Adresse 19026, und 4 register, die ich auslese (in meinen Augen liegt hier irgendwo der Fehler). Auf jeden Fall, ich bekomme ganz andere Werte zurück, und weiß nicht, wie ich diese umrechnen muss, um auf die richtige Anzahl an Watt komme. Und (wie eben schon erwähnt) vielleicht liegt das Problem auch an der Anzahl der Register, oder an einer anderen EInstellung. Der Wert, der unter Float(4Byte) ganz links steht, ist der richtige.

Ich steh auf jeden fall leider an, und hoffe jmd von euch könnte mir helfen.

Lg Marcel
https://media.discordapp.net/attachments/1009083745908826126/1009083768126046228/unknown.png
 
in dem Janitza Ausdruck ließt Du 4 Byte aus in dem anderen "4 Register"
Wie viel Byte sind denn die "4 Register" ?

Das Datenformat ist zudem float und nicht Dec und vermutlich auch "signed" also mit +/-.
 
Wenn die Software mit "Register" die Modbusadressen meint sollte da "2" drin stehen denn die Float Zahl verteilt sich auf die Adressen 19026 und 19027
 
Wenn die Software mit "Register" die Modbusadressen meint sollte da "2" drin stehen denn die Float Zahl verteilt sich auf die Adressen 19026 und 19027
Naja, schon. Aber ich hab schon allerlei möglichen Konfigs probiert, mit verschiedenen "number of Registers", mit und ohne "signed"... Und egal was ich mach, die Werte Passen einfach nd. Kann es nd sein, dass ich irgendwie umrechnen muss oder so?

Und ja, der Datentyp ist anders, aber ich kann hier nur zwischen Dezimal, Binär und Hexadezimal auswählen kann.

aber danke für dir schnelle Antwort
 
Was sind denn die Ergebnisse des Auslesens der Software?
diese 4 Zahlen neben den roten "x"en?
das kann ja schon nicht passen denn es darf ja nur eine Zahl sein, auch die Anzahl der Stellen passt nicht.
kann das sein, daß die Weichware für jedes Byte eine eigene Zahl erzeugt?
 
vielleicht liegt es auch daran:
"Leider hat auch das Modbus-Protokoll ein paar Defizite. In der Heimautomatisierung und den dabei eingesetzten einfachen Komponenten sind diese jedoch praktisch nicht von Bedeutung. So lässt das Modbus-Protokoll bei seiner Interpretation einigen Spielraum, sodass es Unterschiede in den Implementierungen gibt. Ein Beispiel hierfür ist der Umgang mit Datenwerten höherer Auflösung (mehr als 16 Bit) in Geräten mit analogen Ein- oder Ausgängen. Allein für die Darstellung von Zahlenwerten größer als 65535 gibt es drei Vorgehensweisen: die Interpretation zweier 16-Bit-Wörter als 32-Bit-Ganzzahlenwert, die Darstellung als Gleitkommazahl nach IEEE754 oder die Darstellung im MK10-Format."

hab ich eben hier gefunden:
Feldbussysteme unter Linux konfigurieren und einsetzen - Seite 2 von 5
 
Was sind denn die Ergebnisse des Auslesens der Software?
diese 4 Zahlen neben den roten "x"en?
das kann ja schon nicht passen denn es darf ja nur eine Zahl sein, auch die Anzahl der Stellen passt nicht.
kann das sein, daß die Weichware für jedes Byte eine eigene Zahl erzeugt?
Ja, sind die Zahlen neben roten X sind die Werte. Und ja, es sind vier Zahlen. Aber das liegt daran, das man in Modbus immer nur verschiedenen Register ausliest (hier in dem Fall 19026 + 19027 + 19028 und 19029). Ja, in dem fall sind es 64 bit und nicht 32 (jedes Register ist, so weit ich weiß 16 Bit groß), aber selst Wenn ich nur 2 register auslese, passt der Wert nicht.

Und es ist ja genau mein Problem, dass ich nicht weiß, wie ich die Werte Interpretieren kann. Denn mein Tool (QModMaster) ließt nur die Integer der Register aus, während das Tool von Janitza die Werte im Hintergrund schon interpretiert.

Allein für die Darstellung von Zahlenwerten größer als 65535 gibt es drei Vorgehensweisen: die Interpretation zweier 16-Bit-Wörter als 32-Bit-Ganzzahlenwert, die Darstellung als Gleitkommazahl nach IEEE754 oder die Darstellung im MK10-Format."
 
Natürlich passen die Werte nicht, denn Dein Ausleser rechnet jedes Byte in eine Zahl um und das geht so eben nicht
Für die Float zahl sind die ganzen 32Bit für die Eine Zahl zuständig wobei eines für das Vorzeichen ist und die anderen für die zahl sowie die Position des Kommas.
bin für so was jetzt nciht so der Rechner, wikipedia schreibt folgendes zur 32Bit float zahl:
Berechnung einer IEEE single precision Gleitkommazahl (32-Bit-Gleitkommazahl)
Hier werden die genauen Rechenschritte vorgestellt, um einen Dezimalbruch in eine binäre Gleitkommazahl vom Typ Single nach IEEE 754 umzuwandeln. Dazu müssen nacheinander die drei Werte (Vorzeichen v {\displaystyle v} https://wikimedia.org/api/rest_v1/media/math/render/svg/e07b00e7fc0847fbd16391c778d65bc25c452597 (1 bit), Mantisse m {\displaystyle m} https://wikimedia.org/api/rest_v1/media/math/render/svg/0a07d98bb302f3856cbabc47b2b9016692e3f7bc und Exponent e {\displaystyle e} https://wikimedia.org/api/rest_v1/media/math/render/svg/cd253103f0876afc68ebead27a5aa9867d927467) berechnet werden, aus denen sich die Zahl x {\displaystyle x} https://wikimedia.org/api/rest_v1/media/math/render/svg/87f9e315fd7e2ba406057a97300593c4802b53e4 zusammensetzt:

x = ( − 1 ) v ⋅ m ⋅ 2 e {\displaystyle x=(-1)^{v}\cdot m\cdot 2^{e}} https://wikimedia.org/api/rest_v1/media/math/render/svg/c8308cc8e5d86d3fb0ee4c81906ed94b287d64a1

Vorzeichen

Je nachdem, ob die Zahl positiv oder negativ ist, ist v {\displaystyle v} https://wikimedia.org/api/rest_v1/media/math/render/svg/e07b00e7fc0847fbd16391c778d65bc25c452597 0 oder 1: ( − 1 ) 0 = 1 {\displaystyle (-1)^{0}=1} https://wikimedia.org/api/rest_v1/media/math/render/svg/723000d5cf5074d316ecfe0f8613a43f95581813 oder ( − 1 ) 1 = − 1 {\displaystyle (-1)^{1}=-1} https://wikimedia.org/api/rest_v1/media/math/render/svg/bd08ddafb88d0dfddcab07d4e3fc9d18925db6ce

Alle weiteren Berechnungen erfolgen mit dem Betrag der Zahl.

Exponent

Als Nächstes wird der Exponent gespeichert. Beim IEEE single-Datentyp sind dafür 8 Bit vorgesehen. Der Exponent muss so gewählt werden, dass die Mantisse einen Wert zwischen 1 und 2 erhält:

e = ⌊ log 2 ⁡ ( | x | ) ⌋ {\displaystyle e=\left\lfloor \log _{2}(|x|)\right\rfloor } https://wikimedia.org/api/rest_v1/media/math/render/svg/2fedc5c08b8b001109ef6ee1b03ba20c713d0406

Wenn hierbei ein Wert für den Exponenten herauskommt, der kleiner −126 oder größer 127 ist, kann die Zahl mit diesem Datentyp nicht gespeichert werden. Stattdessen wird die Zahl als 0 (Null) oder als „unendlich“ abgespeichert.

Der Wert für den Exponenten wird jedoch nicht direkt gespeichert, sondern um einen Bias-Wert erhöht, um negative Werte zu vermeiden. Bei IEEE single ist der Bias-Wert 127. Somit werden die Exponentenwerte −126…+127 als sogenannte „Charakteristik“ zwischen 1…254 gespeichert. Die Werte 0 und 255 als Charakteristik sind reserviert für die speziellen Zahlenwerte „Null“, „Unendlich“ und „NaN“.

Mantisse

Die Mantisse wird nun in den verbleibenden 23 Bit abgespeichert:

m = ( | x | 2 e − 1 ) ⋅ 2 23 {\displaystyle m=\left({\frac {|x|}{2^{e}}}-1\right)\cdot 2^{23}} https://wikimedia.org/api/rest_v1/media/math/render/svg/2891ebb64022418d49139f4341a09fa452d6ddb8

Zahlenbeispiel mit der Zahl 11,25

Zahl = +11,25

Vorzeichen = + → 0binär

Exponent = ⌊ log 2 ⁡ ( 11 , 25 ) ⌋ = ⌊ 3 , 49 ⌋ = 3 {\displaystyle {\text{Exponent}}=\left\lfloor \log _{2}(11{,}25)\right\rfloor =\left\lfloor 3{,}49\right\rfloor =3} https://wikimedia.org/api/rest_v1/media/math/render/svg/90e234dc595f4a0e13ef2b5797f8985bd2149e5c → 3 + 127 = 130 → 10000010binär

Mantisse = ( 11 , 25 2 3 − 1 ) ⋅ 2 23 = ( 1,406 25 − 1 ) ⋅ 2 23 = 3407872 {\displaystyle {\text{Mantisse}}=\left({\frac {11{,}25}{2^{3}}}-1\right)\cdot 2^{23}=(1{,}40625-1)\cdot 2^{23}=3407872} https://wikimedia.org/api/rest_v1/media/math/render/svg/c5a50e7dbb06ad9143144922f92951f3ad6d6df8 → 01101000000000000000000binär

Damit ergibt sich folgende Gleitkommazahl einfacher Genauigkeit:

0 10000010 01101000000000000000000

Umkehrung

Will man aus einer Gleitkommazahl im Maschinenwort (32 Bit) eine Dezimalzahl errechnen, so kann man dies mit folgender Formel recht schnell erledigen:

Z = ( − 1 ) V Z ⋅ ( 1 , 0 + M / 2 23 ) ⋅ 2 E − 127 {\displaystyle Z=(-1)^{VZ}\cdot (1{,}0+M/2^{23})\cdot 2^{E-127}} https://wikimedia.org/api/rest_v1/media/math/render/svg/2b2959e7d2d81d6fcbfc892f1c3ab931388ce82d


Hier mal der Link zu einem Umrechner: IEEE-754 Konverter für Fließkommazahlen

dazu mußt du deine zwei Zahlen aus den Bytes 19026 und 19027 aber erst in eine Binärzahl umwandeln und dann aneinander reihen.
 
Hier mal der Link zu einem Umrechner: IEEE-754 Konverter für Fließkommazahlen

dazu mußt du deine zwei Zahlen aus den Bytes 19026 und 19027 aber erst in eine Binärzahl umwandeln und dann aneinander reihen.

Danke! musste zwar einen anderen Konverter suchen, aber die Info mit den Binären Zahlen und einem online converter war Gold wert! Danke für deine Mühen!

Beste Grüße!

Der Konverter, der bei mir die richtigen Werte ausgegeben hat
Dezimalzahl ↔ IEEE 754
 
Thema: Janitza PV-UMG604 Modbus TCP auslesen

Neueste Themen

Zurück
Oben