ASCII in Real wandeln ? Thema Festkommazahl

Waelder

Level-2
Beiträge
978
Reaktionspunkte
121
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo miteinander,

Ich bekomm via Profibus über 6 Bytes eine ASCII Festkommazahl von -XX.XX bis XXX.XX
die muss ich nun umlegen in Real oder DINT mein Gedanke war die einzelnen
Chars erst zu prüfen ob sie gültig sind und anschliessend zu multiplizieren die Summe zusammen zu zählen.
Code:
Prüfen, wen i.O dann
L #Byte1 //ASCII Code 0 = 48 DEZ  
L 48 //Abziehen
-I
L     1
*I    
T     #EINZER

L #Byte2
L 48
-I
L     1
*I    
T     #ZEHNER

L #Byte3
L 48
-I
L     1
*I    
T     #HUNDERTER

usw. dann alle ergebnisse addieren
Komma lass ich ausser acht.
So nun muss ich aber das umgekehrte machen von REAL oder DINT nach Festkommazahl von -XX.XX bis XXX.XX da hab ich nun meine sorgen.
Vielleicht hat von euch einer schon ne gute Idee.

Merci noch The Wälder
 
Hallo Waelder,
was hälst du von den Umwandlungs-Bausteinen aus der System-Bibliothek ?
Dort gibt es INT_TO_String (FC16) und umgekehrt (FC38), DINT_to_String (FC5) und umgekehrt (FC37) und natürlich auch REAL_To_String (FC30) und umgekehrt (FC39).
Aus den Strings kannst du dir doch dann deine ASCII-Kette bauen bzw. umgekehrt.

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@LL
Danke noch vorab hat sehr gehilft. Du hast mein Suchbereich angeregt.

Also da hab ich auch noch aus TI-S7 den FC94 ATH gefunden der macht das einlesen in einer aufwäsche :-) Der macht aus ner anzahl ASCIIs eine HEX Zahl
Das Komma nehm ich einfach raus.
Vielleicht geht der FC95 HTA für den rückwärtsgang das werde ich am Montag Testen.
 
Zuletzt bearbeitet:
Der FC39 der IEC Function blocks wäre die Lösung. Er soll Strings in REAL wandeln.
Nur wir da ein Format des Strings verlangt das nicht der Frage entspricht (eine Ziffer vor dem Komma, dann 7 Ziffern nach dem Komma, dann E und endich 2 Ziffen Exponent).
Also wird es wohl manuell erledigt...
 
Hallo,
ich habe im Moment das gleiche Problem. Ich bekomme Acht Bytes in Hex angezeigt. Diese werden in einem Array abgespeichert. Ich möchte nun, dass diese Werte in einen Realen wert umgewandelt werden. Ist das möglich? Wie kann man da vorgehen?
Danke!
 
Vielen Dank Larry Laffer!
Im Array stehen 8 Hexadezimal Zahlen. Hierbei handelt es sich um eine Zahl mit drei Vorkomma- und vier Nachkommastellen und das Komma ist natürlich auch kodiert. Funktioniert die Konvertierung mit der CONV Awendung. Konnte Array leider nicht finden :confused:... Muss vllt. genauer suchen;)
 
... um aus einem Array of Byte einen String zu machen gibt es keine fertige Funktion / Methode. Das mußt du dir schon selbst erstellen ...
Im einfachsten Fall String erstellen , Header-Bytes des String richtig beschreiben, die Daten-Bytes aus dem Array einzeln darein schreiben und dann das ganze nach Real konvertieren.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
[..] und dann das ganze nach Real konvertieren.
Du meinst mit FC39 STRING_R ?
Ist nicht so einfach.
Den Format von den BYTE Array von Peter L, und den Format von den STRING für STRING_R sind total unterschiedlich.
Von Peter L etwa wie: "xxx.yyyy"
Für STRING_R muss es "±v.nnnnnnnE±xx" ein, wobei
erste "±" ist das vorzeichen für den Mantissa,
"v" ist den Ziffer vor den Dezimalpunkt,
"nnnnnnn" sind die 7 Ziffern nach den Dezimal punkt,
zweite "±" ist das vorzeichen für den exponent,
und "xx" ist den Exponent.
Es wird sehr vaufwendig.

Ich wurde jeden "x" in Peter L's BYTE Array in ein INT wandeln, und dann multiplizieren mit ein Faktor abhängig von Position (100x, 10x, 1x) und dann suzammen addieren in ein INT für "ganzzahlteil".
Und dann jeden "y" in Peter L's BYTE Array in ein INT wandeln, und dann multiplizieren mit ein Faktor abhängig von Position (1000x, 100x, 10x, 1x) und dann suzammen addieren in ein INT für "nachkommateil".
Den REAL Wert bekommt man dann inden man die zwei Werte zusammenfügt:

L "nachkommateil"
ITD
DTR
L 0.0001 // 1234.0 ins 0.1234 wandeln
*R
L "ganzzahlteil"
ITD
DTR
+R
T "realwert"
 
Zurück
Oben