<?
/********************************************************************************************/
/* Umrechnung von IEEE754 nach FLOAT siehe Wikipedia http://de.wikipedia.org/wiki/IEEE_754 */
/* */
/* Beispiel von Wikipedia mit IEE754 01000001100100110011001100110011 welche der Float Zahl */
/* 18,4 entpricht gerundet. */
/* IEEE754 Rechner : http://www.h-schmidt.net/FloatConverter/IEEE754.html */
/* BIN -> DEC DEC -> BIN http://acc6.its.brooklyn.cuny.edu/~gurwitz/core5/nav2tool.html */
/* */ */
/********************************************************************************************/
// Beginn Beispiel
//$input = "01000001100100110011001100110011"; // IEEE754 Zahl = 18,4
// 17972 -> 100011000110100
// 7096 -> 1101110111000
//echo "Erster Wert : " . bindec("100011000110100") . "<br>"; // Bit 0-15 Dezimal Zahl = 16787
//echo "Zweiter Wert: " . bindec("001101110111000") . "<br>"; // Bit 16-31 Dezimal Zahl = 13107
//ieee754ToFloat(17972 /*[Objekt #17972 existiert nicht]*/,7096) . "<br>";
// Ende Beispiel
SetValue(21829 /*[Steuerung Haus\Energie\Strom\Strom\Stromzähler]*/,ieee754ToFloat(GetValue(37365 /*[Steuerung Haus\Modbus\ModBus Adresse 1\Value]*/),GetValue(11651 /*[Steuerung Haus\Modbus\ModBus Adresse 0\Value]*/))/500);
SetValue(16749 /*[Steuerung Haus\Energie\Gas\Gas\Gaszähler]*/,ieee754ToFloat(GetValue(55831 /*[Steuerung Haus\Modbus\ModBus Adresse 5\Value]*/),GetValue(38100 /*[Steuerung Haus\Modbus\ModBus Adresse 4\Gaszähler]*/))/100);
SetValue(47637 /*[Steuerung Haus\Energie\Wasser\Wasser\Wasserzähler]*/,ieee754ToFloat(GetValue(30433 /*[Steuerung Haus\Modbus\ModBus Adresse 9\Value]*/),GetValue(54533 /*[Steuerung Haus\Modbus\ModBus Adresse 8\Wasserzähler]*/))/1000);
function ieee754ToFloat($Wert1,$Wert2) {
//echo "Wert 1 : " . $Wert1 . " Wert 2 : " . $Wert2 . "\n";
$_32BIT_CONSTANT_BIAS_B = 127;
// Workaround START
// PHP lässt bei der Umwandlung von dec nach bin führende Nullen weg.
// Da aber alle 32 Bits für das korrekte funktionieren des Algorithmus IEEE754 nach DEC wichtig sind
// werden durch diese 2 Schleifen die fehlenden Nullen wieder hinzugefügt.
$Wert1 = decbin($Wert1);
if(strlen($Wert1) < 16) {
while(strlen($Wert1) < 16) {
$Wert1 = "0" . $Wert1;
}
}
$BIT_0_15 = $Wert1;
$Wert2 = decbin($Wert2);
if(strlen($Wert2) < 16) {
while(strlen($Wert2) < 16) {
$Wert2 = "0" . $Wert2;
}
}
$BIT_16_31 = $Wert2;
// Workaround ENDE
//echo "Wert 1 : " . $BIT_0_15 . " Wert 2 : " . $BIT_16_31 . "\n";
$input = $BIT_0_15 . $BIT_16_31;
$mantisse = "1" . substr($BIT_0_15 . $BIT_16_31,9,31);
//echo "Mantisse : " . $mantisse . "\n";
$vorzeichen = substr($input,0,1);
$bias = substr($input,1,8);
$exponent = bindec($bias) - $_32BIT_CONSTANT_BIAS_B;
$vorkommaStellen = substr($mantisse,0,$exponent + 1);
$nachKommastellen = "0" . substr($mantisse,$exponent + 1,strlen($mantisse));
// Durchlaufe schrittweise den String $nachKommastellen im BINÄR-FORMAT
// Hier werden Bitweise die 2er Potenzen addiert
$sum = 0;
for ($i = 0;$i < strlen($nachKommastellen);$i++) {
// Lese Bit für Bit aus dem String $nachKommastellen
$BIT = substr($nachKommastellen,$i,1);
// Rechne bei jedem Durchlauf das aktuelle Bit mal 2 hoch -i // Siehe Wikipedia
// und rechne den Wert zur aktuellen Summe dazu
$sum = $sum + $BIT * pow(2,-$i);
}
$floatWert = bindec($vorkommaStellen) . "," . substr($sum,2,strlen($sum));
$vorzeichen = substr($BIT_0_15,0,1);
if($vorzeichen == 1) {
$floatWert = (-1) * $floatWert;
}
//Debugausgabe START
/*
echo "BIT 0 - 15: " . $BIT_0_15 . "\n";
echo "BIT 16 - 31: " .$BIT_16_31 . "\n";
echo "Vorzeichen: " . $vorzeichen . "\n";
echo "Bias: BIN: " . $bias . " DEC: " . bindec($bias) . "\n";
echo "Exponent:" . $exponent . "\n";
echo "Vorkommastellen: BIN: " . $vorkommaStellen . " DEC: " . bindec($vorkommaStellen) . "\n";
echo "Nachkommastellen: BIN: " . $nachKommastellen . " DEC: " . bindec($nachKommastellen) . "\n";
echo "Nachkommastellen : " . $sum . "\n";
echo "Ergebnis: " . $floatWert;
*/
//Debugausgabe ENDE
return $floatWert;
}
?>