Modbus Float32 lesen und schreiben?

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

Schau dir mal die Funktionen pack und unpack an. Damit kannst du den Block oben bestimmt auf einen Einzeiler reduzieren. Insbesondere wird dir da die endianess wichtig sein. Probier mal rum, wo unpack das selbe Ergebnis liefert wir deine Funktion oben. Dann hast du den Parameter den du wiederum mit pack befüttern willst.

paresy

ok, dann fällt das Steuern des Speichers wohl ins Wasser.
Wollte eigentlich vorher nicht erst noch Informatik studieren :wink:

Viele Grüße
Stephan