Hilfe: Modbus Floatingpoint-Umrechnung bringt falsche Werte

Hallo,

ich versuche gerade ein Power Quality Meter an IPS per Modbus anzuschließen. Leider scheitert es an der Modbus-Umrechnung. Kann mir jemand sagen, wie IPS die Bytereihenfolge der Floatingpoint-Werte interpretiert?

Im Anhang habe ich die Reihenfolge angeführt, wie es in meiner Gerätedoku steht.

Mit einer Modbus-Testsoftware kann ich das Gerät auslesen. Dort kann man zwischen verschiedenen Reihenfolgen wählen und bei einer kommen die Werte absolut plausibel. Ich denke daher, die IPS-Reihenfolge ist nicht mit meinem Gerät kompatibel. Kann man das irgendwo ändern? Hat jemand solche Probleme schon gelöst?

Gruß
Rubberduck

Modbus-Floatingpoint.png

Sieht so aus, als ob Du auch ein Opfer des Word-Swaps geworden bist, das ich hier unter 1) mal angesprochen habe.
Schaut man auf das Bildchen deiner Gerätedoku, liefert dein Meßgerät die Daten offensichtlich in der Reihenfolge MSW gefolgt vom LSW. Dagegen scheint IPS die empfangenen Daten immer in der Reihenfolge LSW (Least Significant Word 16bit) gefolgt vom MSW (Most Significant Word 16bit) auszuwerten.

Schau mal, ob Dir das hier weiterhilft:

<?php

$ips_data = GetValueInteger(33270 /*[Modbus-test\IPS-ModBUS_32b-data]*/);
$ips_data_WordSwapped = (($ips_data>>16)&0xFFFF) | (($ips_data&0xFFFF)<<16);
$float_value = u32ToFloat($ips_data_WordSwapped);
SetValueFloat(24177 /*[Modbus-test\IPS-ModBUS_corrected-Float]*/, $float_value);

function u32ToFloat($u32)
{
  $sign = ($u32&0x80000000)? -1:1;
  $exponent = (($u32&0x7F800000)>>23) - 127;
  $base = (float)(($u32 & 0x007FFFFF)|0x00800000)/0x00800000 ;
  return ((float) $sign * pow(2, $exponent) * $base);
}
?>

Dazu sollten die Daten vom ModBus zunächst in einer Variablen vom Typ Dword (32-bit unsinged) landen.

Gruss,

Andreas

Jaaaaaaaaa, das hilft super weiter :slight_smile:

Jetzt stimmen die Werte und ich kann die Daten im IPS weiterverarbeiten.

Danke Dir
Rubberduck

Bitte Testen: http://www.ip-symcon.de/forum/f18/ip-symcon-beta-1805-a-11991/#post102050

paresy

Das Swapping scheint soweit zu funktionieren. Real(32Bit–Signed) konnte ich nur simuliert testen, da ich derzeit kein Gerät hier habe, das Float-Variablen ausspuckt; scheint aber auch OK zu sein.

Gruß,

Andreas

Das Swapping funktioniert auch bei Real-Variablen einwandfrei.
Danke für die rasche Lösung :loveips:

Gruß
Rubberduck