Int als Hexadezimalwerte darstellen und in String schreiben

carki

Level-1
Beiträge
71
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

ich bin gerade dabei ein universellen MBus Baustein zu bauen. Das Auslesen und zuordnen passt soweit alles. Jetzt ist allerdings ein Problem. Die Werte sind BCD codiert. Denke an einem Besipiel ist es besser zu erklären:

Also!

Ich bekomme folgende Daten in einem Array: 100 52 52 48 was Hexadezimal folgendem entspricht: 16#64 16#34 16#34 16#30 Der tatsächliche Wert den ich brauche ist 64343430 also die der Hexadezimalschreibweise. diese will ich dann entweder als String speichern oder noch besser als Real wert um danach noch die ausgelesene Zehnerpotenz zu multiplizieren. Kann mir jmd sagen wie ich von der Int schreibweise auf meinen Tatsächlichen wert komme?!??!

Danke im Voraus

Gruß
 
Umwandeln in String geht einfach mit MEMCPY. Fürs Umwandeln in REAL können die Zahlen entspr. der Wertigkeit addiert werden. Beispiel:
Code:
VAR
    arr: ARRAY[0..3] OF BYTE;
    str: STRING(4);
    f: REAL;
END_VAR
MEMCPY(ADR(str), ADR(arr), 4);
f:= BYTE_TO_REAL(arr[1]-16#30)*100.0
    + BYTE_TO_REAL(arr[2]-16#30)*10.0
    + BYTE_TO_REAL(arr[3]-16#30);

Das in der Annahme dass die Daten ASCII codiert sind. Für diesen komischen Hex-String kann die Funktion DATA_TO_HEXSTR aus der TcUtilities.lib verwendet werden

hexstr:= DATA_TO_HEXSTR(ADR(arr), 4, FALSE);

Gruß
witkatz
 
Zuletzt bearbeitet:
Wenn die Darstellung wirklich so ist wie du sie beschreibst (ich bin da skeptisch), dann kannst du die Werte enspr. ihrer Wertigkeit addieren. Geht das vielleicht so in CODESYS?
Code:
f:= 0;
FOR i:= 0 TO 3 DO
    f:= f * 100
        + BYTE_TO_LREAL(arr[i] / 16) * 10
        + BYTE_TO_LREAL(arr[i] AND 16#0F);
END_FOR
 
Danke :)))))))))) Jap das funktioniert bestens!!!!! hast mir sehr doll weitergeholfen :):ROFLMAO::ROFLMAO:

Dann noch ne andere Frage :D hast du auch solch ein Lösungsweg um aus 2Byte 3Buchstaben zu machen?!?!? Zum Beispiel 0422h ergeben 'ABC'....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Aus 2 Byte 3 Buchstaben? ist für ein ASCII Zeichen nicht auch ein Byte erforderlich?

Aber um aus BYTE, WORD, DWORD, ARRAY of BYTE strings zu bauen hab ich dir was.
Ich benutze das immer um um aus einem ARRAY of BYTE einen string zusammenzubauen und es funktioniert einwandfrei.
Arbeitet mit Pointern, also bitte Vorsicht bei Verwendung ;-)

und es ist für TwinCat, also bei anderen Plattformen schauen ob es die Funktion F_ToCHR, oder was ähnliches, gibt.

cheers
 

Anhänge

  • FC_CONCATBYTESTOSTRING.TXT
    544 Bytes · Aufrufe: 44
Danke schonmal ich werde es gleich ausprobieren.

Ja aus 2 Byte sollte es iwie funktionieren 3 Buchstaben zu erzeugen. So sieht es das M-Bus Protokoll vor. Die Formel dafür ist folgende:

Code:
[FONT=Times New Roman] 2 Byte = [ ASCII (1. Buchstabe) - 64 ] * 32 *32[LEFT]+ [ ASCII (2. Buchstabe) - 64 ] * 32[/LEFT]+ [ ASCII (3. Buchstabe) - 64 ]
[/FONT][\code]

Ich will es jetzt allerdings anders herum haben. Also habe die 2 Bytes und möchte daraus die 3 Zeichen erhalten. Habe aber leider keine Idee wie das funktionieren soll.

P.S. Hey Witkatz wie kommst du auf die oben genannte Formel??? habe jetzt auch daten mit merh als 4 Byte und zwar maximal 8 Bytes die ich in Real ändern muss. Hast du da ein Tip für mich?

gruß
 
Zurück
Oben