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?
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.
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
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.
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.
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.
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
Rainer W. schrieb: > ... warum auch immer jemand auf die bescheuerte Idee kommt, eine 1-Byte > Adresse als Float zu übertragen. Typisches China Modul. Wright 😂
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.