Uint64 über Modbus auslesen?

Hallo Leute,

ich sehe vermutlich gerade den Wald vor lauter Bäumen nicht und brauch mal einen Tipp. :confused:

Ich lese über Modbus meinen SolarEdge Wechselrichter + LG Chem Resu 10H Speicher aus. Das funktioniert auch alles sehr gut bis auf zwei Werte die als Uint64 vom Speicher gelesen werden müssen.

Wie funktioniert das?

Hier mal die Registerübersicht vom Speicher:

Und die Konfiguration in IPS:

Die Werte müssten eigentlich die bisher in den Speicher geladenen und entladenen Wh anzeigen.
Laut dem Solaredge Monitoring-Portal müssten das für Lifetime Export Energie Counter ca. 0,87 MWh (870000 Wh) sein.

Die Float32 und Uint32 Werte kann ich dank eines Skript hier aus dem Forum ohne Probleme auslesen und entsprechend umwandeln:

<?
$ips_data = GetValueInteger(16577); 
$ips_data_WordSwapped = (($ips_data>>16)&0xFFFF) | (($ips_data&0xFFFF)<<16); 
$float_value = u32ToFloat($ips_data_WordSwapped); 
SetValueFloat(42067, $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); 
} 
?>

Wie bekomme ich das aber für die Uint64 Werte hin?

Vielen Dank
Stephan

Hast du mal im Gateway die Swap LSW/MSW Option aktiviert?

paresy

Hab es testweise mal umgestellt. Dann kommt als Ergebnis 4137 raus. :confused:
Und alle anderen Werte vom Wechselrichter stimmen dann natürlich nicht mehr…

Ist denn meine Konfiguration wie im Screenshot erstmal theoretisch korrekt?

Viele Grüße
Stephan

Je nach slave hat die Registernummer einen Offset. Alle anderen Werte kommen mit der angegebenen Registernummer aus der Tabelle in der konfiguration korrekt an?
Warum brauchst du das Script zum drehen? Wenn du auf Word Swap stellst brauchst du kein Script mehr. Egal welcher datentyp es ist.
Mit script und ohne Word Swap musst du bei 64bit alle 4 Wörter vertauschen aber wie gesagt das sollte nicht nötig sein.

Gruß

Heinz

Sent from my SM-G975F using Tapatalk

Alle andere Werte kommen korrekt an. Problem mit dem drehen ist das alle Werte die direkt vom Wechselrichter kommen nicht gedreht werden müssen. Das betrifft nur die Werte die der wechselrichter vom Speicher durchreicht.
Hat jemand zufällig ein Script mit dem ich alle 4 Wörter tauschen kann. Ich Blick das einfach nicht…

Gruß Stephan

Probier mal

$ips_data_WordSwapped = (($ips_data>>48)&0xFFFF) |
(($ips_data>>16)&0xFFFF0000) |
(($ips_data&0xFFFF0000)<<16) |
(($ips_data&0xFFFF)<<48)
;

Hab’s noch nicht in PHP probiert aber so ähnlich sollte das aussehen.

Sent from my SM-G975F using Tapatalk

konnte es jetzt nur auf die Schnelle remote testen. Ergebnis ist immer 0

Viele Grüße
Stephan

Da stimmt das nicht. Das geht.
1111222233334444 Hex wird zu 4444333322221111.
0 kann nicht sein wenn du $ips_data mit was belegt hast.
Single müssen Double quotes sein dann siehst du schön was dein Maximum ist.

Sent from my SM-G975F using Tapatalk

also wenn ich dein Beispiel aus dem Screenshot 1:1 hier teste kommt als Ergebnis

0
2147483647

raus.

1111222233334444 oder 4444333322221111 = -1

Viele Grüße
Stephan

Dann läuft das auf 32 bit und die 21… ist alles was geht.
Wenn du den Code so abschreibst sollte als Ergebnis der Dec Wert auf dem Rechner raus kommen. Das läuft auf einem Server 2012 R2, 64 Bit.

Das kann irgendwie umschifft werden wenn man mit einem String arbeitet, hab ich aber noch nie machen müssen.

Was für eine Version und Platform hast du denn?

Sent from my SM-G975F using Tapatalk

ich nutze IPS 5.1 auf einem Raspberry Pi.

Ich glaube wir beenden das Thema hier mal. Dann muss ich die Werte halt über die Solaredge API auslesen. Das schein deutlich einfacher zu sein als hier jetzt irgend eine Bastellösung zu entwickeln.

Vielen Dank nochmal für deine Hilfe!

Stephan

Auch seltsam, in der 5.1 Doku steht bei MODBUS_WRITEREGISTERINT64 max 2147483647. Das sind 32 Bit, keine 64. Ich dachte das ging wohl inzwischen mal.

Du kannst versuchen 32 Bit Werte zu lesen statt dem Int64 wenn das der slave zulässt. Dann einfach drehen und multiplizieren.

Schreib doch mal mit was an Rohdaten rein kommt, wäre nicht das erste mal dass da was nicht stimmt.

Komisch dass da sonst keiner was zu sagt.

Interessanter Zustand.

Sent from my SM-G975F using Tapatalk

nachfolgend mal ein paar Debug Ausgaben vom IO und Splitter jeweils mit Swap und ohne:
Es wurde nur die Modbusadresse 62838 ausgelesen. Das Endergebnis müsste ca. 877829 oder 899222 sein. Bin mir gerade bei der API nicht sicher welcher Wert was ist.

Splitter ohne Swap:

Splitter mit Swap:

I/O ohne Swap:

I/O mit Swap:

Beim Modbus Device erhalte ich ohne Swap und Umrechnung durch ein Skript 195062158860484600
mit Swap: 693

Viele Grüße
Stephan

Also die 693 machen sinn, das ist 02 B5. FC=03, 8 bytes (4 wörter). Anders rum macht auch sinn,
Aber egal wie man das dreht da kommt nie im leben 877829 bei raus. Da müsste noch ein halbes byte irgendwo einen wert haben und das ist alles 0. Ein D oder ein E bringt es zwischen 852661 und 918197.
Kommt das über deine Wago SPS rein? Kann das sein dass da vorm Modbus Slave schon was schief läuft? So dass Solaredge den richtigen Wert bekommt aber der Modbus slave bekommt schon mist und schickt den dann weiter.
Das drehen siehst du wahrscheinlich im debug nicht, wenn’s gedreht wäre dann wäre die 02 B5 ganz am ende. Sonst wäre der Wert gigantisch. Fehlt aber auch ein D oder E.
In der Wago wäre das Aufbereiten übrigens einfach. Wenn das richtige geschickt wird, klar.

Gruß

Heinz

Läuft nicht über die WAGO, alles direkt aus dem Wechselrichter.

Viele Grüße
Stephan

Wie wird denn der Speicher vom Wechselrichter gelesen? Kann man da Einfluss drauf nehmen?

Sent from my SM-G975F using Tapatalk

Hallo,
ich klinke mich hier mal ein, da ich auch versuche ein UINT64 über Modbus TCP auszulesen.
Bzw. momentan funktioniert das auch.
Jedoch kann ich in IPS ja nur als Datentyp Int64 64bit - VORZEICHENBEHAFTET auswählen.
Der Wert über Modbus ist jedoch Vorzeichenlos! Somit wird der Wert ab einer bestimmten Größe in’s Negative gehen.
Was kann man tun?

Bisher ist dies nicht möglich.

paresy