Realzahl in Hex Umwandeln in benötigte ASCII breite

ise

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, es besteht folgendes Problem:

wir haben ein MP177 ( + DP ET200S) und geben dort eine Real-Zahl ein zb. 15.5
diese muss dann um sie weiter zuverarbeiten in Hex umgewandelt werden aber jede Zahl einzeln so das es als Hex 31(für 1) 35(5) 2E(.) 35(5) rauskommen muss!!!

Desweiteren muss diese aber auch in eine bestimmtes Format gewandelt/ausgegeben werden das wie gefolgt aussieht 00000.000 , so das automatisch für die Stellen der Nullen 30 eingesetzt werden muss so das als Endergebniss für das Eingabebeispiel Real-Zahl 15.5 an sich 30 30 30 31 35 2E 35 30 30 dies ist wichtig das wir nur so denn Wert an einen Profibus Slave senden können damit er diesen verarbeiten kann!!!

Mit welchen Baustein kann ich das lösen? muss ich vorher ein UDT erstellen? und womit bekomme ich es hin das die Zahlen einzeln umgewandelt werden?

Danke schonmal

Ise
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich kenn zwar auch die Frage nicht, aber wenn du die Zahl im Panel nicht als Real sondern als DINT eingibts sollte es schon leichter werden, da du die Posiiton des Komma von vorn herein kennst. Wenn du die Stellen vor dem Komma und nach dem Komma dann entsprechend umkopierst sollte es passen.
 
Ich kenn zwar auch die Frage nicht, aber wenn du die Zahl im Panel nicht als Real sondern als DINT eingibts sollte es schon leichter werden, da du die Posiiton des Komma von vorn herein kennst. Wenn du die Stellen vor dem Komma und nach dem Komma dann entsprechend umkopierst sollte es passen.

du meinst, die eingabe mal zehn und dann zu dint und mit DI_STRNG zu string und mit INSERT das komma rein und mit RIGHT noch zurecht gestutzt?

welch teuflischer plan :rolleyes:
 
Du willst also den ASCII Code zur Real-Zahl und dann die führenden stellen mit 0 auffüllen?

Dann gib das ganze doch am Panel schon als String ein.

Oder wandele die Real-Zahl in einen String (siehe: http://www.sps-forum.de/showthread.php?t=26626).

Dann würde ich einen "Default String" mit "00000.000" vorbelegen und diesen "geschickt" überschreiben.
 
Ich will die Zahl z.B 15.5 im Panel eingeben
und als Ziel soll dieses dann als 00015.500 in unseren Slave angezeigt werden.

nur dieser reagiert auf ascii befehle und diese kann ich nicht direkt mit unsere DP schicken.
 
ich bin eigentlich kein freund davon fertige lösungen zu posten
da ich aber einen baustein habe der dint in char wandelt war das drumherum schnell gemacht ;)
 

Anhänge

  • dint2char.AWL.txt
    5,3 KB · Aufrufe: 45
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, es besteht folgendes Problem:

wir haben ein MP177 ( + DP ET200S) und geben dort eine Real-Zahl ein zb. 15.5
diese muss dann um sie weiter zuverarbeiten in Hex umgewandelt werden aber jede Zahl einzeln so das es als Hex 31(für 1) 35(5) 2E(.) 35(5) rauskommen muss!!!

Desweiteren muss diese aber auch in eine bestimmtes Format gewandelt/ausgegeben werden das wie gefolgt aussieht 00000.000 , so das automatisch für die Stellen der Nullen 30 eingesetzt werden muss so das als Endergebniss für das Eingabebeispiel Real-Zahl 15.5 an sich 30 30 30 31 35 2E 35 30 30 dies ist wichtig das wir nur so denn Wert an einen Profibus Slave senden können damit er diesen verarbeiten kann!!!

Mit welchen Baustein kann ich das lösen? muss ich vorher ein UDT erstellen? und womit bekomme ich es hin das die Zahlen einzeln umgewandelt werden?

Danke schonmal

Ise

Also zu Fuss kann man das so programmieren- als Idee gedacht:

Realzahl * 1000
in DINT wandeln = DOUBLEINTEGER = MD10

MD10 durch 10 dividieren (mit MOD)
Rest (steht im Akku) in ASCII wandeln und an 1/1000 Adresse schreiben
MD10 durch 10 dividieren und in MD10 speichern

MD10 durch 10 dividieren (mit MOD)
Rest (steht im Akku) in ASCII wandeln und an 1/100 Adresse schreiben
MD10 durch 10 dividieren und in MD10 speichern

MD10 durch 10 dividieren (mit MOD)
Rest (steht im Akku) in ASCII wandeln und an 1/10 Adresse schreiben
MD10 durch 10 dividieren und in MD10 speichern

usw. bis alle 8 Stellen durch sind (bei negativen Zahlen muss man noch ein bissl was dazuüberlegen)

lG
Karl
 
Danke sehr versuchen es mal damit, sorry sind nicht wirklich experten im Programmieren und brauchen es nur für unsere Schule.

Bin aber trotzdem für weitere Lösungswege offen!!!
 
Ich würde es umrechnen. Also erst einmal das komma weg.

schließlich hast du dein Format ja schon vorgegeben

00015.500

also 15.5 x 100 = 15500.0

Diese zahl würde ich in ein DINT wandeln (155000). Und dann nen kleinen Baustein schreiben der das Indirekt in einen vorgefertigten String packt.
Also die 8 Stellen erst zerlegt um diese dann +30Hex zu rechnen und sie dann Zahl für zahl den String zu schreiben. Den Punkt kannst du ja fest machen. Der liegt immer an der vierten stelle v. r.

Also:

15.5 = 15500.0 = 15500

=1 = 31Hex = Byte 6
=5 = 35Hex = Byte 7
Punkt = 2E = Byte 8
=5 = 35Hex = Byte 9
=0 = 30Hex = Byte 10
=0 = 30Hex = Byte 11

ASCII-Tabelle = http://de.wikipedia.org/wiki/ASCII

damit kein Alter Wert wie zB. 100.0 deinen Wert verfälscht lädtst du vorher natürlich 00000.000 in den String.


So VL... sag ma an wie es vieeelll leichter geht xD


MFG Befree


Edit: Bis ich das geschrieben hab stehen 2 neue Antworten auf dem Plan..
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
wieso weitere lösungswege?

ein paar worte zur fc469
zuerst wird ermittel wie lang die zahl ist
dann wird die zahl in bcd gewandelt
in einer schleife (abhängig von der ermittelten länge) wird jedes byte geprüft und 30hex (= 0 ascii) hinzuaddiert.
 
Zur Frage warum weitere Lösungswege, ist die Antwort weil wir bisher nur FUP programmiert haben ist meine weitere Frage ob das so einfach ist die Lösung darin umzusetzten?
 
Zurück
Oben