# Umwandlung Word in Real



## Eddie (12 November 2008)

Hallo zusammen,
ich hatte ein Problem bei der Umwandlung von Ganzzahlen im Word-Format in Gleitpunktzahlen.
die Umwandlung erfolgte so:

L MW...(als Word)
ITD
DTR
T MD...(als Real)

Wenn die Ganzzahl aber mehr als 32768 betrug, bekam die Gleitpunktzahl negative Werte.
Das lag daran, dass durch ITD die vorderen 16bit mit Einsen aufgefüllt wurde.

Nach langem hin und her hab ich dann das ITD einfach weggelassen und alles hat funktioniert.

In der Beschreibung zum Befehl DTR heißt es aber:Umwandlung einer Ganzzahl, 32 Bit, in eine Gleitpunktzahl, 32 Bit.

Wieso geht das dann aber nur richtig mir einer 16bit Zahl und nicht mit einer 32 bit Zahl? 
Ich bin ja froh dass jetzt alles funktioniert, wollte aber wissen ob man das wirklich so macht, oder ob das bei mit jetzt Zufall ist dass es funktioniert.
Und wenn ja, wie das richtig gemacht wird.

Ich hoffe ihr könnt mir helfen.

Grüße Eddie


----------



## jabba (12 November 2008)

Dann schau Dir mal genau ein INT an
+- 32768
Das Heisst nach +32768 wird das oberste Bit gesetzt und es geht ins Minus. Das oberste Bit ist das Vorzeichen. Also sind dies 15 Bit plus Vorzeichen. Mann kann keine Dezimal Zahl größer als 32768 mit einem INT (Word) darstellen.


----------



## vierlagig (12 November 2008)

wenn du nur positive zahlen verwendest, dann kannst du mit nur DTR auskommen ...siehe jabba

du schreibst, du möchtest ein wort wandeln, wenn dieses unsigned ist, was es ja zwangsläufig sein muß, da du werte größer 32767 bekommen kannst, mußt du sogar mit DTR arbeiten ...

das DTR interpriert dann die 16 bit zahl als 32 bit zahl ... da diese zuvor in den akku geladen wird, ist da der L-teil mit deiner zahl beladen, der H-teil wird genullt ... deswegen funktionierts halt, aber wie gesagt, nur mit positiven zahlen 

@jabba: war es nicht -32768 bis +32767 wegen 0?


----------



## kermit (12 November 2008)

nochmals zur Verdeutlichung:

Dein MW, das Du als Word interpretierst (Wertebereich 0..65535) wird vom ITD-Befehl als Integer (-32768..+32767) interpretiert und daher erweitert ITD das Vorzeichen der Integerzahl auf eine im DINT-Format.

sprich:
8000h entspricht als Word 32768.
als Integer -32767.
als Doubleinteger wieder 32768.
und ITD macht aus Integer -32768 einen DINT mit -32768, der mit FFFF8000h codiert ist.


----------



## Eddie (13 November 2008)

Vielen Dank für die vor allem schnellen Antworten.
Sowas in der Art hab ich mir gedacht, nur so ganz genau bin ich nicht durchgestiegen. aber jetzt ists klar.
und da ich nur positive zahlen verwende funktioniert auch alles.
Also nochmal vielen Dank


----------



## Larry Laffer (13 November 2008)

... wenn du das so richtig "schick" machen möchtest um damit zu verhindern, dass dir ggf ein Vorgängerwert, der noch im High-Wort des Akku herumspukt, in die Suppe spuckt, dann könntest du es so machen :
	
	



```
L#0
L MW...(als Word)
DTR
T MD...(als Real)
```
Gruß
 LL


----------



## Perfektionist (13 November 2008)

dazu so viel aus der Hilfe:





> L <Operand> lädt den Inhalt des adressierten Bytes, Wortes oder Doppelwortes in AKKU 1, *nachdem zuvor* der alte Inhalt von AKKU 1 in AKKU 2 gespeichert wurde und* AKKU 1 auf "0" zurückgesetzt wurde*.


----------



## Larry Laffer (13 November 2008)

... wenn das bei Siemens so steht ...
Allerdings frage ich mich dann, wozu die den Befehl ITD gemacht haben ... hast du mal nachgesehen, was der Befehl mit den Akku's macht ...?


----------



## vierlagig (13 November 2008)

Larry Laffer schrieb:


> ... wozu die den Befehl ITD gemacht haben



um vorzeichenrichtig zu wandeln, oder? verstehe die frage nicht!


----------



## Perfektionist (14 November 2008)

Larry Laffer schrieb:


> ... hast du mal nachgesehen, was der Befehl mit den Akku's macht ...?


ähm, bist Du im Urlaub? Du sitzt doch bestimmt nicht weiter weg von der F1-Taste, wie ich  oder?


----------



## Perfektionist (14 November 2008)

... oder benutzt Du ACCON-PG?

hier die Siemens-Hilfe zu ITD:


> ITD (Umwandlung einer Ganzzahl, 16 Bit, in eine Ganzzahl, 32 Bit) wertet den Inhalt von AKKU1-L als Ganzzahl (16 Bit) aus und wandelt diese in eine Ganzzahl (32 Bit) um. Das Ergebnis wird in AKKU 1 gespeichert. AKKU 2 wird nicht verändert.


----------



## Larry Laffer (14 November 2008)

... ihr hattet Recht ...
War Quatsch, was ich da geschrieben hatte ...

Gruß
LL


----------

