TIA Signed integer in Real umwandeln

--alex--

Level-2
Beiträge
92
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,
ich lese über Modbus eine Temperatur (signed Integer) als Word ein.

Das Word schiebe ich auf einen DINT, konvertiere DINT to REAL / 100 und habe meinen gewünschten Wert

zB. ergibt 16#0111 2,73°C

Soweit so gut.
Jetzt handelt es sich dabei aber um einen signed Integer welcher auch negativ sein kann.
Per Definition bekomme ich den Wert von 0...12000

Negative Werte bekomme ich in folgenden Format: 16#FF9E ergibt zB. -0,98 °C
D.h. ich muss dem eingelesenen Word "FFFF FFFF FFFF" vorne hinzufügen.
FFFF FFFF FFFF FF9E = -98

Und genau da stehe ich an.
Die Abfrage ab wann der Wert negativ ist, prüfe ich einfach ob mein DINT Wert > 12000 ist.
Aber wie kann ich dann FF9E zu -98 umwandeln?


Ich hoffe ihr habt mein Problem verstanden und könnt mir da weiterhelfen.

Danke
Alex
 
Wenn's darum geht, dass Du K in °C umrechnen musst ... einfach 273,15 draufaddieren.

PS:
Ich glaube, ich habe die Aufgabenstellung gründlich nicht verstanden. :confused:

PPS:
Per Definition? Wer definiert das und wie genau?
Welche Anzeige soll dem Wert 0 entsprechen und welche dem Wert 12000?
Wahlweise bitte 2 andere Werte (die möglichst weit auseinander liegen sollten) nennen und die dazugehörigen Anzeigen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Es geht nicht darum dass ich K in °C umwandeln muss.

Vielleicht habe ich das Ganze ja auch nur einfach etwas umständlich erklärt;)

Die Definition kommt vom Hersteller den wir über Modbus auslesen.
0 .... 16#0000
12000 ..... 16#2EE0
Diese kann ich direkt umwandeln.


Negative Werte bekomme ich so:
16#FFFF ... -1
16#FF9C ... -100
16#FB28 ... -1240
16#F768 ... -2200

Hier müsste ich theoretisch immer FFFF FFFF FFFF voran stellen.
Zu mindestens gibt mir das mein Taschenrechner aus wen ich die HEX und DEC Werte vergleiche

HEX DEC
FFFF FFFF FFFF FFFF ... -1
FFFF FFFF FFFF FF9C ... -100
FFFF FFFF FFFF FB28 ... -1240
FFFF FFFF FFFF F768 ... -2200

Und genau daran scheitere ich.
 
Dank Zweierkomplement kann man direkt losrechnen:

AWL
Code:
L #modbusword
ITD
DTR
L 100.0
/R
T #myTemperature

SCL
Code:
#myTemperature := DINT_TO_REAL(INT_TO_DINT(WORD_TO_INT(#modbusword))) / 100.0;

Harald
 
Da muss ich dich kurz zitieren:

Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

Tatsächlich war das "Zweierkomplement" Neuland für mich.

Vielen Dank
 
Zurück
Oben