ich habe Mantisse (als REAL x.xxxx) und Exponent (als INT +/- y). Wie kann man daraus am einfachsten in Step7 (AWL oder SCL) eine Gleitpunktzahl machen?
Ich nehme mal an es ist ein Exponent zur Basis 10 wie in 4.56*10^3?
L 10.0
LN //sollte den natürlichen Logarithmus von 10 liefern
L "Exponent"
ITD
DTR
*R
EXP //sollte e hoch Exponent mal Logrithmus(10) berechnen. Das ist gleich 10 hoch
// Exponent
L "Mantisse"
* R
Wenn ich mir das S7-Gleitpunktformat z.B. in der VAT anschaue, dann sehe ich z.B.: 1.23 e -3
Ich habe jetzt als Mantisse einen Real-Wert: 1.23 und ale Exponeten einen Integer-Wert: -3. Daraus soll der neue Gleitpunktwert gemacht werden.
Ich glaube, das leider nicht Basis 10, sondern 2. Da müßte man doch vielleicht mit SLD oder SRD arbeiten, oder? Aber denen müßte man dann als "Schiebeanzahl" den Exponenten übergeben. Aber wie geht das?
Die INTERNE Darstellung einer Gleitkommazahl arbeitet mit Exponenten zur Basis 2. Wenn du eine Mantisse inder Form 1.23 und einen Exponenten -3 hast, kannst du mit Schieben gar nichts machen. Das liegt daran, daß ln10/ln2 keine ganze Zahl ist (oder, vielleicht einfacher verständlich, das 10 keine Zweierpotenz ist).
Ferner beinhalten die 32 Bits einer Gleitkommazahl 23 Bits der Mantisse(als Binärzahl!) , den Exponenten und die Vorzeichen von Mantisse und Exponent. Wenn du die mit SRD(SLD verschiebst, schiebst du Bits der Mantisse in den Exponenten oder umgekehrt. Das gibt Chaos.
Es gibt da einen FC39 aus der IEC-Library. Der macht eigentlich genau das, was ich habe möchte. Nur erwartet der am Eingang einen genau definierten String und ich habe statt dessen eben 2 Zahlen.
mit der fc39 geht das sicher auch. aber zottels lösung klappt einwandfrei.
hab ich eben mal kurz getestet.
Code:
L 1.000000e+001
LN //sollte den natürlichen Logarithmus von 10 liefern
L MW 30 //Exponent (INT) z.b. 3
ITD
DTR
*R
EXP //sollte e hoch Exponent mal Logrithmus(10) berechnen. Das ist gleich 10 hoch Exponent
L MD 34 //Mantisse (real) z.b. 2.34
*R
T MD 40 //ist dann als real 2340 bzw 2.34+e03
So, ich habe das EXP wieder eingefügt.
Gut, daß du es getestet hast! Ich habe keine S7 oder Simulator auf dem Schreibtisch und da man Logarithmen so selten braucht, war ich nicht ganz sicher, ob es LOG oder LN heißt, und, falls es nur LOG gäbe, zu welcher Basis es rechnet
Vielen Dank an alle. Ich war schon am Verzweifeln. Ich fummel nämlich nun schon seit Mittag an dieser Sache.
Und leider hatte eben auch Zottels Code nicht funktioniert (Es fehlte das EXP). Naja, so ist das, wenn man etwas ohne Nachzudenken einfach übernimmt...
In meiner ersten Antwort war das EXP aber von Anfang an drin. Bei deinem übernächsten Posting hatte ich dann den Eindruck, daß du es garnicht als Programm wahrgenommen hast. Da habe ich es nochmal gepostet, in Code tags verpackt und wollte den langen Kommentar rausscheißen. Dabei ist das EXP verlorengegangen.