Zwei Modbus Register als ein Hex-Wert in Gleitkomma

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Drohne
User
Beiträge: 3
Registriert: Freitag 5. Juni 2020, 20:19

Hallo,

folgendes Aufgabe:
Auslesen zweier Modbusregister in Liste, Darstellung der Registerinhalte als Gleitkommazahl (Ergebnis wird im Bereich 11.547,000 +- 5% liegen).
Zwei Drittel der Aufgabe kann ich umsetzen. Nur habe ich ein Problem in der Mitte.

Auslesen:

Code: Alles auswählen

regs = c.read_holding_registers(19000,2)
Das Auslesen ergibt eine int-Liste "regs" mit z.B.: [17977, 26788]

Debug ergibt: Rx [D2 25 00 00 00 07 01] 03 04 46 39 68 A4 --> 0x 463968A4 --> 11866,1601562 (check mit https://www.h-schmidt.net/FloatConverter/IEEE754.html ) --> zu erwartender Wert, --> OK

Ich muss also die Int-Werte 17977 in hex 0x4639 und 26788 in hex 0x68A4 wandeln.
Das ist auch nicht das Problem mit:

Code: Alles auswählen

hex (regs[0]) # 0x4639
hex (regs[1]) # 0x68A4
Die Frage ist, wie bekomme ich die beiden Werte aus der int-Liste in einen hex-Wert der Form 0x xxxxxxxx oder in einen String der From 'xxxxxxxx'? Komme trotz intensiver google Suche und try&error nicht weiter. Ich denke aber, dass das nicht wirklich schwierig umzusetzen ist. Wahrscheinlich habe ich nur nicht den Richtigen Suchbegriff gefunden.

Als Test habe ich mal die den String "regs_hex" definiert um die Aufgabe weiter zu verfolgen:

Code: Alles auswählen

regs_hex = '463968A4'
print(struct.unpack('!f', bytes.fromhex(regs_hex))[0])
Ausgabe: 11866.16015625 --> i.O.

Für eine Lösungsvorschlag des mittleren Teils der Aufgabe wäre ich dankbar.

Danke im Voraus.
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du hast eines der üblichen Missverständnisse, das du “hex” bräuchtest. Das stimmt nicht. Dein Problem ist nur, dass du die 4 Byte als zwei zahlen zu jeweils 2 Byte bekommst. Die Lösung liegt also darin, zb zweimal struct zu verwenden.

Code: Alles auswählen

zahl, = struct.unpack("!f", struct.pack("HH", *regs))
Drohne
User
Beiträge: 3
Registriert: Freitag 5. Juni 2020, 20:19

__deets__ hat geschrieben: Samstag 6. Juni 2020, 08:41 Du hast eines der üblichen Missverständnisse, das du “hex” bräuchtest. Das stimmt nicht. Dein Problem ist nur, dass du die 4 Byte als zwei zahlen zu jeweils 2 Byte bekommst. Die Lösung liegt also darin, zb zweimal struct zu verwenden.

Code: Alles auswählen

zahl, = struct.unpack("!f", struct.pack("HH", *regs))
Vielen Dank.
Das funktioniert genau so wie es soll. Jetzt versuche ich mal nachzuvollziehen was genau da passiert. Das hätte ich auf jeden Fall selbst nicht hin bekommen.
Danke nochmal.
Drohne
User
Beiträge: 3
Registriert: Freitag 5. Juni 2020, 20:19

Drohne hat geschrieben: Samstag 6. Juni 2020, 18:00
__deets__ hat geschrieben: Samstag 6. Juni 2020, 08:41 Du hast eines der üblichen Missverständnisse, das du “hex” bräuchtest. Das stimmt nicht. Dein Problem ist nur, dass du die 4 Byte als zwei zahlen zu jeweils 2 Byte bekommst. Die Lösung liegt also darin, zb zweimal struct zu verwenden.

Code: Alles auswählen

zahl, = struct.unpack("!f", struct.pack("HH", *regs))
Vielen Dank.
Das funktioniert genau so wie es soll. Jetzt versuche ich mal nachzuvollziehen was genau da passiert. Das hätte ich auf jeden Fall selbst nicht hin bekommen.
Danke nochmal.
In meinem Fall musste ich noch das ! beim zweiten struct ergänzen.
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Schoen das es geht. Aber bitte nicht immer den Post davor voll zitieren - der steht da ja schon.
Antworten