Hallo,
ich versuche gerade per Modbus meinen PV Speicher zu steuern.
Einige Register sind UINT16. die kann ich ohne Probleme lesen und schreiben.
Andere Register sind aber FLOAT32. Die kann ich lesen und mit folgendem Script erhalte ich auch scheinbar brauchbare Ergebnisse.
<?
$ips_data = GetValueInteger(16170);
$ips_data_WordSwapped = (($ips_data>>16)&0xFFFF) | (($ips_data&0xFFFF)<<16);
$float_value = u32ToFloat($ips_data_WordSwapped);
SetValueFloat(35810, $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);
}
?>
Die Instanz ist wie folgt konfiguriert:
Einheit: DWord (32Bit - vorzeichenlos)
Funktion Lesen: Holding Register auslesen (03)
Funktion schreiben: Schreibe Multiple Registers (16)
Infos aus der Speicherdokumentation:
Adresse: E00E (F70E)
Size: 2
R/W: R/W
Name: Remote Control Charge Limit
Type: Float32
Range: 0- Battery Max Power
Units: W
Das Register liefert den Wert für die maximale Ladeleistung.
Vor dem Umrechnen ist das Ergebnis 1073759694
Nach dem Umrechnen mit dem Script 6060 Watt. Was momentan wohl der maximale Wert ist.
Soweit so gut, aber wie schreibe ich jetzt einen Wert? Der müsste ja auch irgendwie umgerechnet werden???
Swap LSW/MSW muss leider aus bleiben weil viele andere Register der Anlage ohne diese Einstellung ausgelesen werden müssen.
Viele Grüße
Stephan