Hallo,
Ich habe ein Programm geschrieben dass über Modbus TCP ein Messgerät ausliest.
Das Ergebniss des Messgeräts ist eine FLOAT-Zahl nach IEE 754 (z.B. 0x436bbc2a für 235.73502).
Mittels pymodbus erhalte ich das Ergebnis in einer Liste mit zwei Einträgen:
u1[1] = 0x436b und u1[2] = 0xbc2a
Wie bekomme ich jetzt diese zwei Einträge zusammen und daraus meine Floatzahl??
Ich hatte mir es folgendermaßen vorgestellt:
zusammen=bin(u1[0]<<16) | bin(u1[1])
zahl=float(zusammen)
Erhalte aber den Fehler:
TypeError: unsupported operand type(s) for |: 'str' and 'str'
Hab noch andere Methoden versucht aber keine hat funktioniert. Vllt steh ich ja auf dem Schlauch.
Ich hoffe es findet sich eine Lösung
FLOAT-Zahl aus 2x 16 bit HEX
Danke für den Tip!
Hab noch etwas Probleme mit Little/Big-Endian gehabt aber so funktionierst:
u1 = unpack('>f', pack('>H', u1_raw[0]) + pack('>H', u1_raw[1]))
print(hex(u1_raw[0]))
print(hex(u1_raw[1]))
print(u1[0])
Ausgabe:
0x436e
0x63dd
238.390090942
Hab noch etwas Probleme mit Little/Big-Endian gehabt aber so funktionierst:
u1 = unpack('>f', pack('>H', u1_raw[0]) + pack('>H', u1_raw[1]))
print(hex(u1_raw[0]))
print(hex(u1_raw[1]))
print(u1[0])
Ausgabe:
0x436e
0x63dd
238.390090942
@grinder25: Das ist ein wenig umständlich zweimal `pack()` aufzurufen, IMHO.
Edit:
Edit:
Code: Alles auswählen
In [43]: u1_raw
Out[43]: [17262, 25565]
In [44]: unpack('>f', pack('>2H', *u1_raw))[0]
Out[44]: 238.3900909423828