Real to Hex

TwinCatBeginner

Level-1
Beiträge
17
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe Community,

ich hoffe ihr könnt mir bei meinem Problem weiterhelfen.
Und zwar versuche ich eine Real bzw eine LReal in eine Hex umzuwandeln.
Beispiel:
12.34 -> 0x414570a4

Ich möchte gerne eine IDN(SoE-Parameter, in diesem Fall ein Offset) beschreiben dies geht aber anscheinend nur im Hex-Format.
Um nun aus der Steuerung die Fließkommazahl auf den Paramter zu schreiben, habe ich bisher leider keine brauchbare Funktion gefunden und wenn ging es halt nur so, dass die Nachkommastellen wegefallen sind. Diese werden aber dringend benötigt!
Daher meine Frage kann man eine Fließkommazahl wie Real in eine Hexadezimal konvertieren?

Ich würde mich mich sehr freuen, wenn einer eine Idee hat.

Gruß
TwinCatBeginner :)
 
Hexadezimal ist kein Zahlenformat, sondern eine Darstellungsweise des gespeicherten Wertes.
Alle Werte werden binär gespeichert. Das ergibt aber ziemlich lange Zahlenreihen von 0 oder 1. Deshalb stellt man oft jeweils 4 bit als einen Hexadezimalwert dar. Sprich wenn irgendwo 1111 binär gespeichert ist, kann man das auch als F hexadezimal darstellen, aber umwandeln muss man da nichts.

Fazit: Dein Wert ist (auch) schon hexadezimal. Du musst nur die Darstellung umschalten, um das (selbst) auch so zu sehen. Die SPS sieht eh' alles als binär.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
hucki hat zwar recht, trotzdem ist es wichtig den Datentyp zu beachten und eventuell zu konvertieren.

Welches Datenformat hat der Zielparameter ? DINT, UDINT, REAL ???

Machst du eine Zuweisung : "Para = Realwert" ?

Falls ja, dann müssen ja die Datentypen übereinstimmen sonst gibt's einen Fehler.

Aber machst du das vielleicht anders, z.B. memcpy() ??, dann musst du eventuell vorher REAL->ZIELFORMAT eine Konvertierung machen.

z.B. Realwert = 12.3, nun soll der INTEGER Zielparameter = 123 sein. REAL->INT würde nur 12 ergeben, also (REAL * 10) --> INT, in dieser Art.


Wenns nicht klar ist, poste noch mal mehr Infos.

bg
bb
 
Ein uralter Post aber ich habe doch eine Frage hierzu:

Ich möchte Farbenwerte (BYTE, 0-255) für ROT GRÜN und BLAU in der Visualisierung als Mischfarbe anzeigen.
Laut Codesys Hilfe muss im Feld der Farbvariablen eine Zahl im HEX-Format angeben werden (z.B. 16#00ff00ff) dabei sind die ersten beiden 00 nur zum Ausfüllen des benötigen DWORD da.

Nun frage ich mich aber, wie ich z.B. die Werte 127 (=Rot), 55 (=Grün), und 200 (=Blau) in ein HEX Format dieser Form bekomme.

Ich steh total auf dem Schlauch, benutze sonst nie das HEX Format.

Danke schon mal und Grüße,
Flo

edit:// Achja: mein erster Lösungsansatz war folgender:

dwMischfarbe:= (bFarbeRot * 1000000) + (bFarbeGrün * 1000) + bFarbeBlau;

Aber das war Schmarn ;)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
ggf. hilft dir das weiter:
Kann man ja ausbauen...

LG
Shrimps
Code:
VAR CONSTANT
(* Definition der Normfarben *)
(* http://www.farb-tabelle.de/de/farbtabelle-html4.htm   *)
(* führende 00 wegen DWORD, dann BBGGRR Blau,Grün,Rot als Hex *)

def_col_black   : dword := 16#00000000;
def_col_navy    : dword := 16#00800000;
def_col_blue    : dword := 16#00FF0000;
def_col_green   : dword := 16#00008000;
def_col_teal    : dword := 16#00808000;
def_col_lime    : dword := 16#0000FF00;
def_col_aqua    : dword := 16#00FFFF00;
def_col_maroon  : dword := 16#00000080;
def_col_purple  : dword := 16#00800080;
def_col_olive   : dword := 16#00008080;
def_col_gray    : dword := 16#00808080;
def_col_silver  : dword := 16#00C0C0C0;
def_col_red     : dword := 16#000000FF;
def_col_fuchsia : dword := 16#00FF00FF;
def_col_yellow  : dword := 16#0000FFFF;
def_col_white   : dword := 16#00FFFFFF;
END_VAR
 
edit:// Achja: mein erster Lösungsansatz war folgender:

dwMischfarbe:= (bFarbeRot * 1000000) + (bFarbeGrün * 1000) + bFarbeBlau;

Aber das war Schmarn ;)

Der Lösungsansatz war gar nicht soooo Schmarrn, du hast nur den Unterschied in der Zahlenbasis 10 und 16 nicht beachtet.

Beispiel:
16#FF = 10#255. So weit so gut
16#FF00 != 10#255000, sondern 10#65280
und so weiter...

Du müsstest Rot mal 10000hex und Grün mal 100hex nehmen.

Zwei Lösungen fallen mir ein:

R*(16#FF0000 / 10#255) + G*(16#FF00/10#255) + B
ist dasselbe wie
R*16#10000 + G*16#100 + B
heißt also
R*10#65536 + G*10#256 + B

Sonst geht auch (je nach Programmierumgebung)
(R<<16)+(G<<8)+B

Sonst kann man wahrscheinlich mit Google und "RGB to hex" auch viel finden.

, wie ich z.B. die Werte 127 (=Rot), 55 (=Grün), und 200 (=Blau) in ein HEX Format dieser Form bekomme.
127*65536 + 55*256 + 200 = 8337352 und das ist automatisch 16#7F37C8.
Das müsste deine Visu dann problemlos schlucken.
 
Zuletzt bearbeitet:
So als Schnellschuss:
Jede der 3 Farben von Dez nach Hex wandeln (gibts Funktionen für)
und dann alles mit String-Concat aneinanderhängen !

LG
Shrimps
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das lies mir keine Ruhe :)

Viel Spaß
Shrimps

Code:
PROGRAM MAIN
VAR
    rot        : BYTE := 127;
    gruen    : BYTE := 5;
    blau    : BYTE := 200;
    hex        : STRING;
    tmp : STRING;
END_VAR
hex := '00';

tmp := DWORD_TO_HEXSTR(blau,2,FALSE);
hex := CONCAT(hex,tmp);

tmp := DWORD_TO_HEXSTR(gruen,2,FALSE);
hex := CONCAT(hex,tmp);

tmp := DWORD_TO_HEXSTR(rot,2,FALSE);
hex := CONCAT(hex,tmp);
 
@shrimps. Ich glaub du hast KH missverstanden.
Laut Codesys Hilfe muss im Feld der Farbvariablen eine Zahl im HEX-Format angeben werden (z.B. 16#00ff00ff) dabei sind die ersten beiden 00 nur zum Ausfüllen des benötigen DWORD da.
KH möchte die Farbe eines Felds dynamisieren damit, wenn er z.B. 255/0/0 eingibt, das Feld rot wird.
Der Parmater ist dezimal vom Typ DWORD. Es geht also nicht um Textanzeige von "FF0000".

Edit: Falls es die Funktion HEXSTR_TO_DWORD gibt, könnte man ja deinen zusammengesetzten String zurückwandeln... ;)
 
Zuletzt bearbeitet:
Ich würde es auch über Bitshifting machen, so wie es Ronin schon geschrieben hat.
Also RGB := SHL(R,16) + SHL(G,8 )+ B;

Alle Variablen sollten vom Typ DWORD sein oder wenigstens in der SHL Funktion zu DWORD konvertiert werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey Jungs,

Danke vielmals.
Hatter nicht daran gedacht, dass HEX ja auf der 16 basiert.
Dann muss man logischerweise anders multiplizieren.

Aber ich bin froh, dass ich wenigstens grundsätzlich den richtigen Lösungsweg gefunden hatte ;)

Danke euch vielmals!

Grüße und schönes Wochenende,
Flo
 
Zurück
Oben