Modbus Verständnis problem

OP #7651700
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?

Angehängte Dateien:
#7651715
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.

#7651731
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

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

#7651751
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren