# Real nach Integer wandeln



## paula23 (14 Juni 2005)

Ich hab schon viel gelesen, aber irgendwie war nicht das dabei was ich brauche. Meine CPU 315 bekommt über Bus Reale Werte, super musste ich nichts mehr tun, aber nun will das übergeordnete Leitsystem die Werte als Integer ( +32..... - -32......)

Wäre super wenn mir jemand helfen könnte.

Danke, Alex


----------



## RMA (14 Juni 2005)

Mit dem Befehl ROUND in STL (aber auch unter KOP und FUP zu finden) kannst Du Dein Real in ein DINT umrunden. Mit TRUNC kriegst Du den Ganzzahl Teil als DINT, meistens wird ROUND wahrscheinlich die bessere Wahl sein. Es gibt auch die CEIL und FLOOR Befehle, die die nächst höhere liegende bzw. nächst niedrigere Ganzzahl liefert.


----------



## paula23 (14 Juni 2005)

Sorry ich habs noch nicht ganz, von Real nach DINT das ist verständlich aber dann weiter nach INT. Ich muss mich ja auch irgendwie auf min und max Werte beziehen um ein gescheites Verhältnis zu bekommen.

Danke, Alex


----------



## old_willi (14 Juni 2005)

Hallo Alex,

in MD 10 ist der Real- Wert, in MW 20 der Int- Wert.
Zu beachten ist, dass der Real- Wert nicht den Max- Wert von 32767 überschreitet.

 L     MD    10
 RND   
 T     MW    20


----------



## Anonymous (14 Juni 2005)

*real to int*

Hi RMA war schneller 8) 

*Beispiel um den REAL-Wert auf den Double-Integer zu runden*

Beispiel in AWL:

L MD 10
RND
T MD 14

Beispiel in SCL:

X1: REAL
X2: DINT
X2:=REAL_TO_DINT(X1)

*Beispiel um den REAL-Wert auf den Double-Integer zu wandeln*
Die Operation *TRUNC* wandelt eine Gleitpunkzahl in eine Ganzpunktzahl (32 Bit) um.

Beispiel in AWL: 

L MD 34
TRUNC
T MD 38


Beispiel in SCL:  --> gibt es nicht !

Gruß speakingstick


----------



## paula23 (14 Juni 2005)

Ich probier es gerade mal aus. Also Ihr sagt den Wert runden und dann halt nur 16-bet auslesen anstatt 32-bit und dann kann ich den Wert 1 zu 1übernehmen ? Ich glaub ich könnte damit leben.
Aber die Jungs von der Leitwarte wollen Ihn doch bestimmt noch Scalen und das funktioniert doch dann nicht bzw. ist nicht nötig.

Danke, Gruss Alex


----------



## Anonymous (14 Juni 2005)

und wie sieht es aus?
Erfolg gehabt ?

Gruß speakingstick


----------



## Zottel (14 Juni 2005)

paula23 schrieb:
			
		

> Ich probier es gerade mal aus. Also Ihr sagt den Wert runden und dann halt nur 16-bet auslesen anstatt 32-bit und dann kann ich den Wert 1 zu 1übernehmen ? Ich glaub ich könnte damit leben.


Nur wenn du weißt, daß dein real zwischen -32768.0 und 32767 liegt.


			
				paula23 schrieb:
			
		

> Aber die Jungs von der Leitwarte wollen Ihn doch bestimmt noch Scalen und das funktioniert doch dann nicht bzw. ist nicht nötig.
> [/quote="paula23"]
> Funktionieren tut es immer noch, aber es ist ziemlich idiotisch. Noch idiotischer wird es, wenn du Genauigkeit verlierst. Beispiel: Du kriegst Werte, von, sagen wir einem Amperemet, 0.0 bis 100.0 A mit einer Kommastelle. Die 1. Bedingung ist erfüllt. Aber aus 55.6 A werden dann halt 55 A (trunc) oder 56 A (round). In so einem Fall solltest du mit den "Jungs" vereinbaren, daß du mit 10.0 multiplizierst (vor dem trunc) und sie durch 10 teilen.


----------



## paula23 (14 Juni 2005)

Prinzipiell funktioniert es, sogar besser und einfacher als ich dachte.
Aber wie schon richtig erwähnt, ich unterschlage die Kommastellen und ich habe ein paar Mengen wo ich Durchfluss kumuliere und reichen keine 32...

Ich glaub ich muss den Theoretikern die das angestiftet haben mal auf den Fuß treten.

Alex


----------



## meiky2 (14 Juni 2005)

Wenn man von einem DINT nur 16 bit nutzt und negative Zahlen hat fehlt das Vorzeichenbit welches bei einem DINT das 32te Bit und bei einem INT das 16te Bit ist. Darum musst Du wenn du negative Zahlen hast noch den wert wandeln bzw. das Vorzeichenbit umkopieren.


----------

