Forum: Mikrocontroller und Digitale Elektronik Modbus Verständnis problem


von Werner M. (werner-m)


Angehängte Dateien:

Lesenswert?

Ich habe einige DDM18SD und würde gerne die Adresse ändern.
Das ändern der Adresse klappt auch aber ich verstehe die Bytes nicht.
[2,16,0,8,0,2,4,67,0,0,0]; // ist adr 128
[2,16,0,8,0,2,4,66,0,0,0]; // ist adr 32
[2,16,0,8,0,2,4,65,0,0,0]; // ist adr 8
[8,16,0,8,0,2,4,64,0,0,0]; // ist adr 2

[8,16,0,8,0,2,4,64,64,0,0]; // ist adr 3
[8,16,0,8,0,2,4,64,128,0,0]; // ist adr 4

Laut Beschreibung
You can set the meter address to any value from 1 – 247. Remember value 
written to unit is in HEX, so its 01 to F7 in HEX.
Check out this example to change the parameter:
DDM18SD change address

Ich könnte das jetzt sicher durchprobieren aber hat jemand eine 
Erklärung warum das so ist?

von Harald K. (kirnbichler)


Lesenswert?

Werner M. schrieb:
> Das ändern der Adresse klappt auch aber ich verstehe die Bytes nicht.
> [2,16,0,8,0,2,4,67,0,0,0]; // ist adr 128

Es ist hilfreich, sowas in hexadezimaler Notation zu schreiben.

Zerlegen wir mal das, was Du da geschrieben hast.

Ein Modbus-RTU-Frame beginnt mit einem Adressbyte, hier also 0x02.

Dann kommt der Funktionscode, hier also 0x10 (16), das bedeutet "Write 
Multiple Registers" (beschrieben auf Seite 30 von [1]).

Die nächsten beiden Bytes (0x00 0x08) sind das erste Register, das 
beschrieben wird, hier also Register 8 (wenn man bei 0 mit dem Zählen 
beginnt*).

Die nächsten beiden Bytes (0x00 0x02) geben die Anzahl der Register an, 
die beschrieben werden sollen, hier also werden zwei Register 
beschrieben.

Darauf folgt, daß jetzt vier Nutzbytes folgen müssen, denn ein 
Register ist immer zwei Bytes groß.

Die Nutzbytes sind demnach 0x04 0x43 0x00 0x00.

Für ein gültiges Modbus/RTU-Telegramm (siehe [2]) müssten jetzt noch 
zwei Bytes mit einem CRC-Wert kommen, da oben steht aber nur noch eine 
Null.

Das sieht irgendwie kaputt aus.

Gibt es eine Dokumentation, die über das Bildschnipselchen von Dir da 
hinausgeht?

Woher hast Du Deine Bytefolgen?


[1] https://modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf
[2] https://modbus.org/docs/Modbus_over_serial_line_V1_02.pdf
*) Der hier beschriebene Registertyp heißt "Holding Register". Nach 
einer etwas schrägen Konvention werden "Holding Register" beginnend mit 
40001 numeriert - das bedeutet, daß die 8 hier im Protokoll als 40009 zu 
interpretieren ist. Klingt schwachsinnig, ist es auch.

von Tassilo H. (tassilo_h)


Lesenswert?

Nach der Anleitung ist das Holding Register 8 ein 
Floating-Point-Register (warum auch immer), d.h. an den Registeradressen 
8 und 9 befindet sich eine 4-Byte Gleitkommazahl, üblicherweise im 
IEE754 singe/binary32 Format. Die byte-order bei der Übertragung ist 
meist mit dem most significant byte als erstes in den übertragenen Daten 
(d.h. Modbus-Register 8 enthält die oberen 16 bit und Register 9 die 
unteren 16 bit der Gleitkommazahl).
Das Format hat ein Vorzeichenbit, 7 Bits für den Exponenten, und 23 Bits 
für die Mantisse, also z.B. für den Wert 3 aus deinen obigen Beispielen:

8: Adresse des Modbus-Gerätes
16: Write multiple holding registers
0,8: ab Registeradresse 8
0,2: zwei Register
4: 4 Daten-Bytes folgen
64,64: Wert für Register 8
0,0: Wert für Register 9

64,64,0,0 = 0x40400000 entspricht 3.0 als IEE754-Single Gleitkommazahl, 
siehe
https://www.h-schmidt.net/FloatConverter/IEEE754de.html

von Tassilo H. (tassilo_h)


Lesenswert?

Harald K. schrieb:
> Das sieht irgendwie kaputt aus.

Du hast den Byte-Count vergessen, das sind schon korrekte 
Modbus-Bytefolgen, die CRC ist wohl nicht gezeigt.

von Harald K. (kirnbichler)


Lesenswert?

Tassilo H. schrieb:
> Du hast den Byte-Count vergessen, das sind schon korrekte
> Modbus-Bytefolgen, die CRC ist wohl nicht gezeigt.

Oh.


Gut, dann also nochmal:

Zerlegen wir mal das, was Du da geschrieben hast.

Ein Modbus-RTU-Frame beginnt mit einem Adressbyte, hier also 0x02.

Dann kommt der Funktionscode, hier also 0x10 (16), das bedeutet "Write
Multiple Registers" (beschrieben auf Seite 30 von [1]).

Die nächsten beiden Bytes (0x00 0x08) sind das erste Register, das
beschrieben wird, hier also Register 8 (wenn man bei 0 mit dem Zählen
beginnt*).

Die nächsten beiden Bytes (0x00 0x02) geben die Anzahl der Register an,
die beschrieben werden sollen, hier also werden zwei Register
beschrieben.

Darauf folgt, daß jetzt vier Nutzbytes folgen müssen, denn ein
Register ist immer zwei Bytes groß.

[hier kommt die Korrektur]
Das folgende Byte sollte demnach eine Vier enthalten, und siehe da: Das 
macht es auch: 0x04, n


Die Nutzbytes sind demnach 0x43 0x00 0x00 0x00.

Wird diese Bytefolge als 32-Bit-Float nach IEE745 interpretiert*, so 
ergibt sich der Wert 128.

Stimmt also!



*) https://www.h-schmidt.net/FloatConverter/IEEE754.html, hier in die 
Zeile "Hexadecimaal representation" eintragen und Return drücken, das 
füllt die restlichen Felder auf.

von Rainer W. (rawi)


Lesenswert?

Harald K. schrieb:
> Wird diese Bytefolge als 32-Bit-Float nach IEE745 interpretiert*, so
> ergibt sich der Wert 128.

... warum auch immer jemand auf die bescheuerte Idee kommt, eine 1-Byte 
Adresse als Float zu übertragen.

von Harald K. (kirnbichler)


Lesenswert?

Rainer W. schrieb:
> ... warum auch immer jemand auf die bescheuerte Idee kommt, eine 1-Byte
> Adresse als Float zu übertragen.

Ich habe aufgegeben, die Motivation idiotischer Entscheidungen zu 
gründlich zu untersuchen. Das macht nur übellaunig.

Das ist eine der wenigen Möglichkeiten, mit der zu beobachtenden 
steigenden Idiotendichte ohne Omeprazol*-Abo zurechtzukommen.

*) oder Pantoprazol

von N. M. (mani)


Lesenswert?

Rainer W. schrieb:
> ... warum auch immer jemand auf die bescheuerte Idee kommt, eine 1-Byte
> Adresse als Float zu übertragen.

Typisches China Modul.
Wright 😂

von Werner M. (werner-m)


Lesenswert?

https://www.h-schmidt.net/FloatConverter/IEEE754.html
Dankeschön. Wie man das selber berechnet versteh ich zwar noch nicht 
aber egal. Meine paar Geräte haben jetzt ihre Adresse und wenn ich die 
in ein paar Jahren mal ändern will werde ich diese Seite finden :)

Das warum das so kompliziert sein muss hinterfrage ich besser nicht.

von N. M. (mani)


Angehängte Dateien:

Lesenswert?

Werner M. schrieb:
> Wie man das selber berechnet versteh ich zwar noch nich

Harald K. schrieb:
> Die Nutzbytes sind demnach 0x43 0x00 0x00 0x00.
> Wird diese Bytefolge als 32-Bit-Float nach IEE745 interpretiert*, so
> ergibt sich der Wert 128.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.