Mrt001 hat geschrieben: ↑12.06.2021, 16:49Hallo mschneider
super Skript das du geschrieben hast. Das hat auf anhieb bei mir funktioniert. Nur habe ich zwei kleine Probleme und eine Frage:
- 1. Ich lese das Register "30535 - Am laufenden Tag eingespeiste Energie auf allen Au enleitern (Tagesertrag), in Wh" aus. Das funktioniert soweit sehr gut. Jedoch wenn der ungefähr der Wert 32.000 erreicht wird springt die Zahl auf -32.000 Weißt du zufällig wo da das Problem im Skript liegt?
- 2. Das Register "30529 - Total eingespeiste AC-Energie auf allen Aussenleitern (Gesamtertrag), in Wh" kann ich zwar auslesen, aber der Wert stimmt nicht mit dem aus meinem SMA überein. Der Wert ist ungefähr um 500 höher als die "aktuelle Leistung" was der SMA WR liefert.
Ich habe ein Sunny Tripower 8.0 im Einsatz.
- 3. Das Register "30513 - Total eingespeiste AC-Energie auf allen Aussenleitern (Gesamtertrag), in Wh" kann ich nicht auslesen. Liegt es daran, dass es ein U64 Wert ist?
Vielen Dank im Voraus für eure Hilfe.
Ich habe meinen Gedankenfehler gefunden. Wie bereits von mschneider erwähnt wird der 32Bit Wert einer Zahl in Form von 2 Integern zurückgegeben. Zusätzlich werden die Werte zwischen -32768 und 32768 (=2^16) ausgegeben. Dies muss bei der Berechnung beachtet werden. Beim Auslesebefehl muss man auf den Index (0 oder 1) aufpassen!mschneider hat geschrieben: ↑16.03.2019, 10:26Hallo rucksman007,
Modbus register können 32 bit lang sein oder auch nur 16 bit. Mein Skript gibt immer 32 bit Werte zurück in Form von 2 Integer zahlen die durch ein Leerzeichen getrennt sind. In deinem Fall: 85 und 11385. Um den 32 bit Wert zu erhalten müsstest du folgendes machen:
32bitwert = 85 * 256 * 256 + 11385.
Gruss, M. SchneiderCode: Alles auswählen
32bitwert = lGetOut.StrValueByIndex(" ", 0) * 256 * 256 + lGetOut.StrValueByIndex(" ", 1)
z.B. wenn man Register 30529 ausliest:
Wert 1 = lGetOut.StrValueByIndex(" ", 0).ToInteger()
Wert 2 = lGetOut.StrValueByIndex(" ", 1).ToInteger()
dann muss es entsprechend umgerechnet werden.
Code: Alles auswählen
32bitwert = lGetOut.StrValueByIndex(" ", 0) * 256 * 256 + lGetOut.StrValueByIndex(" ", 1)
Ich habe meinen Code wie folgt angepasst:
Code: Alles auswählen
string lGetOut = "";
string lGetErr = "";
system.Exec("tclsh /usr/local/addons/modbus/sma.tcl 192.168.178.100 30529 2",&lGetOut,&lGetErr);
var SMAValue=dom.GetObject("SMA_Gesamtertrag");
var y = 0;
var x1 = 0;
var x2 = 0;
x1 = lGetOut.StrValueByIndex(" ", 0).ToInteger();
x2 = lGetOut.StrValueByIndex(" ", 1).ToInteger();
if (x2 < 0) {
y=1;
}
else {
y=0;
}
string s1 = ((x1 * 256 * 256) + x2 + (65536 * y)).ToString();
SMAValue.State(s1.ToFloat()/ 1000);