Script zum Zähler auslesen zickt herum! Python-Frage

Der chaotische Hauptfaden

Moderatoren: Heaterman, Finger, Sven, TDI, Marsupilami72, duese

Antworten
Benutzeravatar
Hightech
Beiträge: 11455
Registriert: So 11. Aug 2013, 18:37

Script zum Zähler auslesen zickt herum! Python-Frage

Beitrag von Hightech »

Moin, mein Stromzähler liefert beim Einspeisen folgenden hex-String:
fff95284
das ist ein negativer Wert

Allerdings klappt das nicht mit

Leistung = int(power, 16) / 1e2

da kommt

raw: fff95284
Leistung : 42945296.68 W

Heraus kommen sollte was mit -4kw
Im Verbrauchsbetrieb funktioniert das, da kommt der richtige Positive Wert.

Wie mache ich das richtig?
Benutzeravatar
ferdimh
Beiträge: 9415
Registriert: Fr 16. Aug 2013, 15:19

Re: Script zum Zähler auslesen zickt herum! Python-Frage

Beitrag von ferdimh »

Das ist Wweierkomplementdarstellung. Die Leistung ist damit (2^32-Zahl)/100, also 4376,28W.
Benutzeravatar
Hightech
Beiträge: 11455
Registriert: So 11. Aug 2013, 18:37

Re: Script zum Zähler auslesen zickt herum! Python-Frage

Beitrag von Hightech »

Das Ergebnis muss negativ sein! Ich speise ja ein
Benutzeravatar
eJunkie
Beiträge: 756
Registriert: Mi 14. Aug 2013, 20:05

Re: Script zum Zähler auslesen zickt herum! Python-Frage

Beitrag von eJunkie »

Ist es doch auch...

Das ist ein signed int32. -437628 kommt da raus.

Bin nicht so der Schlangenexperte, aber bei der string Umwandlung nach int ist halt wichtig wie "breit" der Integer ist und ob er signed ist oder nicht. Soweit ich weiß ist das implementierungsabhängig ob int nun 32 bit oder 64 bit ist. Als signed int64 wären das halt 4294529668, als signed int32 -437628. Im Zweifelsfall das Ergebnis der string Umwandlung explizit in int32 umzucasten.

Da -1 als Zweierkomplement so dargestellt wird das alle bits "1"sind, ist es halt wichtig wie viel den "alle" sind.

-1 als int64 ist 0xFFFFFFFFFFFFFFFF
-1 als int32 ist 0xFFFFFFFF
Benutzeravatar
Bastelbruder
Beiträge: 11540
Registriert: Mi 14. Aug 2013, 18:28

Re: Script zum Zähler auslesen zickt herum! Python-Frage

Beitrag von Bastelbruder »

Ich glaube, Boris kann heute Nacht nicht schlafen.
Benutzeravatar
Fritzler
Beiträge: 12597
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Script zum Zähler auslesen zickt herum! Python-Frage

Beitrag von Fritzler »

Kleines Problem großes Wirkung!
python nutzt intern sehr lange ints und nicht 32Bit.
Du hast da aber ne 32Bit Hexzahl, daher brauchste eine "Vorzeichenerweiterung" von 32 auf das interne python format.

Also hacken wir mal ganz böse mit der Python lib um c structs zu packen und unpacken

Code: Alles auswählen

from struct import pack, unpack
hexStr = 'fff95284'
signed = unpack('l', pack('L', int(hexStr, 16)))[0]
print (signed/100)
-4376.28
Lektüre:
https://docs.python.org/3/library/struct.html
Zuletzt geändert von Fritzler am Sa 14. Mai 2022, 21:31, insgesamt 2-mal geändert.
Benutzeravatar
Fritzler
Beiträge: 12597
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Script zum Zähler auslesen zickt herum! Python-Frage

Beitrag von Fritzler »

falscher Button, bitte killen!
Benutzeravatar
Torpert
Beiträge: 1431
Registriert: Mo 12. Aug 2013, 22:40
Wohnort: Saarland
Kontaktdaten:

Re: Script zum Zähler auslesen zickt herum! Python-Frage

Beitrag von Torpert »

oder 4294967296 (also 2^32) abziehen. Je nach Position im Script auch 42949672.96 - wenn du deinen Wert schon durch 100 geteilt hast.

42945296.68 - 42949672.96 = -4376.28
Benutzeravatar
Hightech
Beiträge: 11455
Registriert: So 11. Aug 2013, 18:37

Re: Script zum Zähler auslesen zickt herum! Python-Frage

Beitrag von Hightech »

Fritzler hat geschrieben: Sa 14. Mai 2022, 21:28 Kleines Problem großes Wirkung!
python nutzt intern sehr lange ints und nicht 32Bit.
Du hast da aber ne 32Bit Hexzahl, daher brauchste eine "Vorzeichenerweiterung" von 32 auf das interne python format.

Also hacken wir mal ganz böse mit der Python lib um c structs zu packen und unpacken

Code: Alles auswählen

from struct import pack, unpack
hexStr = 'fff95284'
signed = unpack('l', pack('L', int(hexStr, 16)))[0]
print (signed/100)
-4376.28
Lektüre:
https://docs.python.org/3/library/struct.html
Perfekt!
Mit unpack hatte ich schon mal was gemacht, kam aber nur Grüze raus.
Danke, läuft schon mal, Morgen abwarten, wenn der Zähler wieder nach - geht.
Antworten