Moraty
Schaut sehr gut aus, danke dir ;=)
Kannst du das Register 40109 "Fehler" entschlüsseln?
Ich bekomme hier entweder den Wert "2" oder "4"
Die tatsächliche Fehleranzahl beträgt aber 3, das kann es also nicht sein.
Kannst du hier in der Modbuskommunikation etwas schnüffeln?
Ich denke aber dass die ausgegebenen Werte analog zu Register 40108 sind, muss ich aber bei Umschaltung auf Nachtustand mal beobachten.
Aktuell ist dieser Wert zumindest "4" was Produktion bedeuten würde, und welche aktuell auch stattfindet.
"2" wäre auf Register 40108 "Nachtmodus".
Wenn sich dies so bewahrheitet könntest du diese Zeilen wieder auskommentieren, falls sich irgend jemand anders diesen Quellcode kopieren will, ansonsten ist es quasi zweimal der selbe Ausgang.
Liebe Grüße und Danke
Jürgen
Ankündigung
Einklappen
Keine Ankündigung bisher.
Solaredge WR-Modbus LBS 19001370 weitere Register / Datum aufbereiten
Einklappen
X
-
Hallo Jürgen,
deine Beschreibung funktioniert soweit. Lediglich in der ersten Zeile muss der Teiler durch 1000 entfernt werden sofern das bei dem Wert nicht gewünscht ist. Ich habe mich durch die Anregung hier mal mit dem Code beschäftigt und die Register eingefügt (Alle Änderungen in gelb markiert).
Die weiteren Daten sind praktisch nur eine Fleißarbeit.
Beim Testen ist mir aufgefallen, dass einige Werte wie zum Beispiel die Temperatur oder einige Spannungen im Nachtmodus auf null gesetzt werden.
VG Johannes
Code:[COLOR=#000000]###[DEF]### [name=SunSpec Wechselrichter ModbusTCP ] [e#1=Trigger] [e#2=IP] [e#3=Port #init=502] [e#4=Adresse #init=1] [e#5=Energymeter #init=0] [e#6=Log Level #init=0 ] [a#1=Modus] [a#2=Momentanleistung Erzeugung] [a#3=Gesamtenergieerzeugung] [a#4=Momentanleistung Erzeugung/Bezug] [a#5=Einspeisezähler] [a#6=Bezugszähler] [MARKIEREN][a#7=Temperatur] [a#8=Leistung DC] [a#9=Spannung DC] [a#10=Strom DC] [a#11=Fehlercode][/MARKIEREN] [v#1 = ] [v#100 = 0.1] //Version [v#101 = 19001370] //LBS ID [v#102 = SunSpec Wechselrichter ModbusTCP] //LBS Name [v#103 = 0 ] // Log level [v#104 = 0 ] // Log per instance [v#105 = 0 ] // log ID in each line ###[/DEF]### ###[HELP]### Der Baustein dient zum Auslesen eines Sunspec kompatiblen Wechselrichters über eine Modbus TCP Verbindung. Bisher ist der Baustein nur mit einem Solaredge S7k mit Energymeter getestet. Die Datei ModbusMaster.php muss in das Verzeichnis: /usr/local/edomi/main/include/php/ kopiert werden. E1: Trigger, über diesen Eingang kann der Baustein getriggert werden. E2: IP Wechselrichter E3: Port (normalerweise 502) E4: Adresse (bei Solaredge normalerweise 1) E5: Energymeter (Solaredge Energymeter verfügbar 0=nein, 1=ja) E6: Log-Level (0=none, 1=emergency, 2=alert, 3=critical, 4=error, 5=warning, 6=notice, 7=info, 8=debug) A1: Modus (1=aus / 2=Nachtmodus / 4=an/Produktion) A2: Momentanleistung (kW Erzeugung) A3: Gesamtenergieerzeugung (kWh) A4: Momentanleistung (kW / + Einspeise, -Bezug) A5: Einspeisezähler (kWh) A6: Bezugszähler (kWh) [MARKIEREN] A7: Temperatur (°C) A8: Leistung DC (kW) A9: Spannung DC (V) A10: Strom DC (A) A11: Fehlercode[/MARKIEREN] changelog =============================== v0.1 06.12.2017 Initial Version ###[/HELP]### ###[LBS]### <? function LB_LBSID_logging($id, $msg, $var = NULL, $priority = 8) { $E = getLogicEingangDataAll($id); $logLevel = getLogicElementVar($id, 103); if (is_int($priority) && $priority <= $logLevel && $priority > 0) { $logLevelNames = array( 'none', 'emerg', 'alert', 'crit', 'err', 'warning', 'notice', 'info', 'debug' ); $version = getLogicElementVar($id, 100); $lbsNo = getLogicElementVar($id, 101); $logName = getLogicElementVar($id, 102) . "-LBS$lbsNo"; $logName = preg_replace('/ /', '_', $logName); if (logic_getVar($id, 104) == 1) $logName .= "-$id"; if (logic_getVar($id, 105) == 1) $msg .= " ($id)"; strpos($_SERVER['SCRIPT_NAME'], $lbsNo) ? $scriptname = 'EXE' . $lbsNo : $scriptname = 'LBS' . $lbsNo; writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . $msg); if (isset($var)) { writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT START ================"); writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . json_encode($var)); writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT END ================"); } } } function LB_LBSID($id) { if ($E=logic_getInputs($id)) { setLogicElementVar($id, 103, $E[6]['value']); // set loglevel to #VAR 103 if ($E[1]['value']==1 && $E[1]['refresh']==1) { LB_LBSID_logging($id, 'LBS started'); logic_setVar($id,1,1); if (logic_getVar($id,1)==1) { //setzt V1=1, um einen mehrfachen Start des EXEC-Scripts zu verhindern logic_callExec(LBSID,$id); //EXEC-Script starten } LB_LBSID_logging($id, 'LBS ended'); } } } ?> ###[/LBS]### ###[EXEC]### <? require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php"); require(dirname(__FILE__). "/../../../../main/include/php/ModbusMaster.php"); set_time_limit(25); sql_connect(); //------------------------------------------------------------------------------------- function logging($id, $msg, $var = NULL, $priority = 8) { $E = getLogicEingangDataAll($id); $logLevel = getLogicElementVar($id, 103); if (is_int($priority) && $priority <= $logLevel && $priority > 0) { $logLevelNames = array( 'none', 'emerg', 'alert', 'crit', 'err', 'warning', 'notice', 'info', 'debug' ); $version = getLogicElementVar($id, 100); $lbsNo = getLogicElementVar($id, 101); $logName = getLogicElementVar($id, 102) . "-LBS$lbsNo"; $logName = preg_replace('/ /', '_', $logName); if (logic_getVar($id, 104) == 1) $logName .= "-$id"; if (logic_getVar($id, 105) == 1) $msg .= " ($id)"; strpos($_SERVER['SCRIPT_NAME'], $lbsNo) ? $scriptname = 'EXE' . $lbsNo : $scriptname = 'LBS' . $lbsNo; writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . $msg); if (isset($var)) { writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT START ================"); writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . json_encode($var)); writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT END ================"); } } } $E = getLogicEingangDataAll($id); $V=logic_getVars($id); $ip = $E[2]['value']; $modbus = new ModbusMaster($ip, "TCP"); $modbus->port = $E[3]['value']; try { // read inverter data $recData = $modbus->readMultipleRegisters($E[4]['value'], 40069, 50); for($i=0; $i < Count($recData); $i++) { logging($id, strval($i) ." ".strval($recData[$i]),8); } $Dummy = PhpType::bytes2unsignedInt(array_slice($recData , (108-70)*2, 2)); logging($id, "Modus = " .strval($Dummy)); setLogicLinkAusgang($id,1,$Dummy); $Value= PhpType::bytes2signedInt(array_slice($recData , (84-70)*2, 2))/1000; logging($id, "value = " .strval($Value)); $Factor= PhpType::bytes2signedInt(array_slice($recData , (85-70)*2, 2)); logging($id, "Factor = " .strval($Factor)); $Dummy = round($Value*pow(10,$Factor), 3); logging($id, "Momentanleistung = " .strval($Dummy) ." kW"); setLogicLinkAusgang($id,2, $Dummy); $Value= ((PhpType::bytes2unsignedInt(array_slice($recData , (94-70)*2, 2)) << 16 ) + PhpType::bytes2unsignedInt(array_slice($recData , (95-70)*2, 2)))/1000; // logging($id, "value = " .strval($Value)); $Factor= PhpType::bytes2signedInt(array_slice($recData , (96-70)*2, 2)); // logging($id, "Factor = " .strval($Factor)); $Dummy = round($Value*pow(10,$Factor), 3); logging($id, "Gesamtenergieerzeugung = " .strval($Dummy)." kWh"); setLogicLinkAusgang($id,3, $Dummy); [MARKIEREN] $Value= PhpType::bytes2signedInt(array_slice($recData , (104-70)*2, 2)); // logging($id, "value = " .strval($Value)); $Factor= PhpType::bytes2signedInt(array_slice($recData , (107-70)*2, 2)); // logging($id, "Factor = " .strval($Factor)); $Dummy = round($Value*pow(10,($Factor)), 3); logging($id, "Temperatur = " .strval($Dummy) ." °C"); setLogicLinkAusgang($id,7, $Dummy); $Value= PhpType::bytes2signedInt(array_slice($recData , (101-70)*2, 2))/1000; // logging($id, "value = " .strval($Value)); $Factor= PhpType::bytes2signedInt(array_slice($recData , (102-70)*2, 2)); // logging($id, "Factor = " .strval($Factor)); $Dummy = round($Value*pow(10,($Factor)), 3); logging($id, "Leistung DC = " .strval($Dummy) ." kW"); setLogicLinkAusgang($id,8, $Dummy); $Value= PhpType::bytes2unsignedInt(array_slice($recData , (99-70)*2, 2)); // logging($id, "value = " .strval($Value)); $Factor= PhpType::bytes2signedInt(array_slice($recData , (100-70)*2, 2)); // logging($id, "Factor = " .strval($Factor)); $Dummy = round($Value*pow(10,($Factor)), 3); logging($id, "Spannung DC = " .strval($Dummy) ." V"); setLogicLinkAusgang($id,9, $Dummy); $Value= PhpType::bytes2unsignedInt(array_slice($recData , (97-70)*2, 2)); // logging($id, "value = " .strval($Value)); $Factor= PhpType::bytes2signedInt(array_slice($recData , (98-70)*2, 2)); // logging($id, "Factor = " .strval($Factor)); $Dummy = round($Value*pow(10,($Factor)), 3); logging($id, "Strom DC = " .strval($Dummy) ." A"); setLogicLinkAusgang($id,10, $Dummy); $Dummy = PhpType::bytes2unsignedInt(array_slice($recData , (108-70)*2, 2)); logging($id, "Fehlercode = " .strval($Dummy)); setLogicLinkAusgang($id,11,$Dummy);[/MARKIEREN] if ($E[5]['value']==1) { sleep(2); // usleep(1000*10); // read meter data $recData = $modbus->readMultipleRegisters($E[4]['value'], 40188, 55); //107 // for($i=0; $i < Count($recData); $i++) // { // logging($id, strval($i) ." ".strval($recData[$i]),8); // } $Value= PhpType::bytes2signedInt(array_slice($recData , (18)*2, 2))/1000; //logging($id, "value = " .strval($Value)); $Factor= PhpType::bytes2signedInt(array_slice($recData , (22)*2, 2)); //logging($id, "Factor = " .strval($Factor)); $Dummy = round($Value*pow(10,$Factor), 3); logging($id, "Momentanleistung Bezug-Ertrag= " .strval($Dummy)); setLogicLinkAusgang($id,4, $Dummy); $Value= ((PhpType::bytes2unsignedInt(array_slice($recData , 38*2, 2)) << 16 ) + PhpType::bytes2unsignedInt(array_slice($recData , 39*2, 2)))/1000; //logging($id, "value = " .strval($Value)); $Factor= PhpType::bytes2signedInt(array_slice($recData , (54)*2, 2)); //logging($id, "Factor = " .strval($Factor)); $Dummy = round($Value*pow(10,$Factor), 3); logging($id, "Einspeisezähler = " .strval($Dummy)); setLogicLinkAusgang($id,5, $Dummy); $Value= ((PhpType::bytes2unsignedInt(array_slice($recData , 46*2, 2)) << 16 ) + PhpType::bytes2unsignedInt(array_slice($recData , 47*2, 2)))/1000; //logging($id, "value = " .strval($Value)); $Factor= PhpType::bytes2signedInt(array_slice($recData , (54)*2, 2)); //logging($id, "Factor = " .strval($Factor)); $Dummy = round($Value*pow(10,$Factor), 3); logging($id, "Bezugszähler = " .strval($Dummy)); setLogicLinkAusgang($id,6, $Dummy); } logging($id, $modbus); } catch (Exception $e) { logging($id, "Fehler:" ); logging($id, $modbus); logging($id, $e); exit; } unset($modbus); //logic_setVar($id,1,0); //setzt V1=0, um einen erneuten Start des EXEC-Scripts zu ermoeglichen logging($id, "EXEC End"); //------------------------------------------------------------------------------------- sql_disconnect(); ?> ###[/EXEC]###[/COLOR]
Einen Kommentar schreiben:
-
Stressen tuts bei mir gar nicht, die wichtigsten Werte bekomme ich jetzt ja schon
Am liebsten würd ich selbst verstehen um den Baustein umbauen zu können.
Gegebenfalls könntest du deine Erkenntnisse hier kund tun.
Aktuell wären mir folgende Register wichtig:
40097+40098 "DC Strom"
40099+40100 "DC Spannung"
40101+40102 "DC Leistung"
40104+40107 "Kühlkörpertemperatur"
40109 "Fehler"
Liebe Grüße
Jürgen
Einen Kommentar schreiben:
-
Genau. Deshalb hast Du es nicht gefunden. Ich hab gedacht Du kommst noch selbst drauf weil Dir die letzten Ziffern ins Auge springen 🤗. Ich schaue es mir morgen Mal an. Ich weiß noch nicht genau wie ich es bei mir machen will.
Entweder lasse ich die Solaranzeige weiter laufen (da stimmen aber die Daten noch nicht richtig) und hohle mir alles per MQTT aus der Solaranzeige.
Oder ich lass das mit der Solaranzeige und zieh mir alles direkt per Modbus in Edomi. Dann würde ich auf jeden Fall den LBS um alle Werte erweitern die der WR bringt. Oder halt mehrere LBS für Solaredge damit er nicht zu groß wird.
Kann aber ein paar Tage|Wochen? dauern bis ich Zeit habe. Mal sehen.
Welche Werte wären Dir denn wichtig zu haben?Zuletzt geändert von gibsonrocker; 16.02.2021, 20:59.
Einen Kommentar schreiben:
-
Servus Bernd
Ich habe Rückmeldung von Martin bekommen.
Er hat kein Problem damit und wir können den Baustein gerne editieren.
108,84,94 sind die Register die bereits ausgelesen werden, hier fehlt nur die 40 davor desweg habe ich sie nicht gefunden.Code:Mit der folgenden Zeile lese ich 50 Byte/Word ab Adresse 40069 aus. (Beim Auslesen einzelner Adressen direkt hintereinander gab es Probleme.) $recData = $modbus->readMultipleRegisters($E[4]['value'], 40069, 50); Die nächste Zeile extrahiert dann ein bestimmtes Datenwort. Du solltest die 108 in der SunSpec finden. Die 70 resultieren aus meinem Offset (40069). Ich habe damals den Offset gewählt, da ich keine Daten von vorherigen Adressen auslesen wollte. $Dummy = PhpType::bytes2unsignedInt(array_slice($recData , (108-70)*2, 2));
Soviel ich verstanden habe liest er alle Register >40069 aus, es sollte also hoffentlich nicht allzu kompliziert (also für dich
) werden die weiteren Register auszulesen.
Was ich halt überhaupt nicht verstehe sind Berechnungen die dazwischen noch stattfinden. Ich habe nur meine Ergänzungen fett markiert habe, getestet habe ich noch nicht, da der LBS produktiv am WR hängt und ich nicht weiß wie es sich verhält wenn ein zweiter LBS auf den Modbus zugreift und Fehler produziert.
Hier ein Beispiel zur Ermittlung der Kühlkörpertemperatur Register 40104 + 40105 Skalierungsfaktor Kühlkörpertemperatur an Ausgang 4
Könnte das so funktionieren?
Code:$Value= PhpType::bytes2signedInt(array_slice($recData , ([B]104[/B]-70)*2, 2))/1000; //logging($id, "value = " .strval($Value)); $Factor= PhpType::bytes2signedInt(array_slice($recData , ([B]105[/B]-70)*2, 2)); //logging($id, "Factor = " .strval($Factor)); $Dummy = round($Value*pow(10,$Factor), 3); logging($id, "[B]Kühlkörpertemperatur[/B] = " .strval($Dummy) ." [B]°C[/B]"); setLogicLinkAusgang($id,[B]4[/B], $Dummy);
Liebe Grüße
Jürgen
Einen Kommentar schreiben:
-
OK. Schreib ihm mal und dann sehen wir weiter. Melde Dich hier was dabei rausgekommen ist.
Vg Bernd
Einen Kommentar schreiben:
-
Servus Bernd
Bezüglich der Unübersichtlichkeit hast natürlich Recht, habs jetzt angepasst.
Das "Copyright" Thema hatte ich absolut nicht am Schirm und dachte auch nicht hier gegen irgendetwas zu verstoßen.
Ich hatte auch nach einem Beitrag zum LBS 19001370 im Edomi Unterforum gesucht, aber nur einen im KNX-Einsteiger gefunden, wo es auch nur beiläuftig um den besagten LBS ging. Ansonsten hätte ich natürlich dort weiterdiskutiert und die Unterhaltung gerne mit dem Ersteller geführt.
Die Erweiterung durch den Ersteller wird wahrscheinlich schwierig, da sich jeder andere Register wünschen wird und die Anpassung eher individuell ist.
Wie gesagt für mich ist die Art des Auslesens nicht nachvollziehbar, da besagte Register für mich nicht ersichtlich angesprochen werden.
Und da bin ich mangels PHP-Kenntnissen einfach überfordert. Ohne Frage liest der Baustein die besagten Register des ersten Bausteins korrekt aus, nur für mich eben nicht nachvollziehbar.
Ich werde den Ersteller mal per PN anschreiben, mal schauen ob was kommt denn zum letzten Mal war er 2019 aktiv.
Liebe Grüße
Jürgen
Zuletzt geändert von fudi6489; 14.02.2021, 05:23.
Einen Kommentar schreiben:
-
Hi Jürgen,
in dem LBS ist alles gut. Das auslesen der Register ist nachvollziehbar. Evtl. aber echt schwierig ohne PHP-Kenntnisse (keine Ahnung ob Du die hast). Am besten wäre es, Du schreibst dem Entwickler an ob er den LBS erweitern will oder ob er was gegen die "Besprechung" hier hat.
Siehe: https://knx-user-forum.de/forum/proj...64#post1597764
In dem Thread wurde zwar ein veränderter LBS ins Forum gestellt, aber das mit dem geistigen Eigentum finde ich zählt trotzdem. Immerhin hat sich der Ersteller des LBS da ja auch irgendwann mal "reinfuchsen" müssen. Ich hoffe, Du verstehst was ich meine.
vg, BerndZuletzt geändert von gibsonrocker; 14.02.2021, 03:49.
Einen Kommentar schreiben:
-
Hi Jürgen,
es kostet nicht extra wenn Du zwei Threads aufmachst. Bitte editiere den Thread und schmeiß Dein zweites Thema aus dem ersten raus. Wie soll denn da eine übersichtliche nachvollziehbare Antwort rauskommen wenn Du zwei Themen mischt? Also ich hätte keine Lust darauf zu antworten. Dein Thema interessiert mich übrigens auch. Ich bin nur selbst noch nicht dazu gekommen mir mal den LBS anzuschauen und die Register dazu. Bin selbst Besitzer von einem Solaredge WR.
vg, BerndZuletzt geändert von gibsonrocker; 14.02.2021, 03:49.
- Likes 1
Einen Kommentar schreiben:
-
fudi6489 hat ein Thema erstellt Solaredge WR-Modbus LBS 19001370 weitere Register / Datum aufbereiten.Solaredge WR-Modbus LBS 19001370 weitere Register / Datum aufbereiten
Hallo Leute
Zwei "Baustellen" habe ich in meinen Logiken die ich mir für die nächsten Tag vorgenommen habe.
Ich nutze den LBS 19001370 damit ich die Daten vom Wechselrichter zu Edomi bringe.
Aktuell sind dies "Modus / Momentanleistung Erzeugung / Gesamterzeugung". Dies funktioniert auch seit 2 Monaten sehr zuverlässig.
Da der Wechselrichter noch viele weitere Werte ausspuckt, würde ich manche davon auch gerne auslesen.
Im Anhang befindet sich die Dokumentation von Solaredge.
Ich bin absolut nicht fit bei Erstellen bzw Abändern von LBS. Das einzige das ich bis jetzt geschafft bzw probiert habe waren Ein bzw Ausgänge zu erweitern, für den Rest fehlen mir auch logische Zusammenhänge.
Wenn ich mir hier den Quellcode des LBS ansehe, sollten doch lt Solaredge Doku Register 40108 für Modus, 40084 für die Momentanleistung und 40094 für die Gesamterzeugung genutzt werden. Somit dachte ich irgendwo im Quellcode diese Register zu finden.
Weiß jemand wie der LBS arbeitet und wie ich weitere Register hinzufügen kann, wenn diese nicht explizit angefragt werden?
Als Anhang die Doku von Solaredge mit den entsprechenden Registern
Liebe GrüßeCode:###[DEF]### [name=SunSpec Wechselrichter ModbusTCP ] [e#1=Trigger] [e#2=IP] [e#3=Port #init=502] [e#4=Adresse #init=1] [e#5=Energymeter #init=0] [e#6=Log Level #init=0 ] [a#1=Modus] [a#2=Momentanleistung Erzeugung] [a#3=Gesamtenergieerzeugung] [a#4=Momentanleistung Erzeugung/Bezug] [a#5=Einspeisezähler] [a#6=Bezugszähler] [v#1 = ] [v#100 = 0.1] //Version [v#101 = 19001370] //LBS ID [v#102 = SunSpec Wechselrichter ModbusTCP] //LBS Name [v#103 = 0 ] // Log level [v#104 = 0 ] // Log per instance [v#105 = 0 ] // log ID in each line ###[/DEF]### ###[HELP]### Der Baustein dient zum Auslesen eines Sunspec kompatiblen Wechselrichters über eine Modbus TCP Verbindung. Bisher ist der Baustein nur mit einem Solaredge S7k mit Energymeter getestet. Die Datei ModbusMaster.php muss in das Verzeichnis: /usr/local/edomi/main/include/php/ kopiert werden. E1: Trigger, über diesen Eingang kann der Baustein getriggert werden. E2: IP Wechselrichter E3: Port (normalerweise 502) E4: Adresse (bei Solaredge normalerweise 1) E5: Energymeter (Solaredge Energymeter verfügbar 0=nein, 1=ja) E6: Log-Level (0=none, 1=emergency, 2=alert, 3=critical, 4=error, 5=warning, 6=notice, 7=info, 8=debug) A1: Modus (1=aus / 2=Nachtmodus / 4=an/Produktion) A2: Momentanleistung (kW Erzeugung) A3: Gesamtenergieerzeugung (kWh) A4: Momentanleistung (kW / + Einspeise, -Bezug) A5: Einspeisezähler (kWh) A6: Bezugszähler (kWh) changelog =============================== v0.1 06.12.2017 Initial Version ###[/HELP]### ###[LBS]### <? function LB_LBSID_logging($id, $msg, $var = NULL, $priority = 8) { $E = getLogicEingangDataAll($id); $logLevel = getLogicElementVar($id, 103); if (is_int($priority) && $priority <= $logLevel && $priority > 0) { $logLevelNames = array( 'none', 'emerg', 'alert', 'crit', 'err', 'warning', 'notice', 'info', 'debug' ); $version = getLogicElementVar($id, 100); $lbsNo = getLogicElementVar($id, 101); $logName = getLogicElementVar($id, 102) . "-LBS$lbsNo"; $logName = preg_replace('/ /', '_', $logName); if (logic_getVar($id, 104) == 1) $logName .= "-$id"; if (logic_getVar($id, 105) == 1) $msg .= " ($id)"; strpos($_SERVER['SCRIPT_NAME'], $lbsNo) ? $scriptname = 'EXE' . $lbsNo : $scriptname = 'LBS' . $lbsNo; writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . $msg); if (isset($var)) { writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT START ================"); writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . json_encode($var)); writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT END ================"); } } } function LB_LBSID($id) { if ($E=logic_getInputs($id)) { setLogicElementVar($id, 103, $E[6]['value']); // set loglevel to #VAR 103 if ($E[1]['value']==1 && $E[1]['refresh']==1) { LB_LBSID_logging($id, 'LBS started'); logic_setVar($id,1,1); if (logic_getVar($id,1)==1) { //setzt V1=1, um einen mehrfachen Start des EXEC-Scripts zu verhindern logic_callExec(LBSID,$id); //EXEC-Script starten } LB_LBSID_logging($id, 'LBS ended'); } } } ?> ###[/LBS]### ###[EXEC]### <? require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php"); require(dirname(__FILE__). "/../../../../main/include/php/ModbusMaster.php"); set_time_limit(25); sql_connect(); //------------------------------------------------------------------------------------- function logging($id, $msg, $var = NULL, $priority = 8) { $E = getLogicEingangDataAll($id); $logLevel = getLogicElementVar($id, 103); if (is_int($priority) && $priority <= $logLevel && $priority > 0) { $logLevelNames = array( 'none', 'emerg', 'alert', 'crit', 'err', 'warning', 'notice', 'info', 'debug' ); $version = getLogicElementVar($id, 100); $lbsNo = getLogicElementVar($id, 101); $logName = getLogicElementVar($id, 102) . "-LBS$lbsNo"; $logName = preg_replace('/ /', '_', $logName); if (logic_getVar($id, 104) == 1) $logName .= "-$id"; if (logic_getVar($id, 105) == 1) $msg .= " ($id)"; strpos($_SERVER['SCRIPT_NAME'], $lbsNo) ? $scriptname = 'EXE' . $lbsNo : $scriptname = 'LBS' . $lbsNo; writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . $msg); if (isset($var)) { writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT START ================"); writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . json_encode($var)); writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT END ================"); } } } $E = getLogicEingangDataAll($id); $V=logic_getVars($id); $ip = $E[2]['value']; $modbus = new ModbusMaster($ip, "TCP"); $modbus->port = $E[3]['value']; try { // read inverter data $recData = $modbus->readMultipleRegisters($E[4]['value'], 40069, 50); //for($i=0; $i < Count($recData); $i++) { // logging($id, strval($i) ." ".strval($recData[$i]),8); //} $Dummy = PhpType::bytes2unsignedInt(array_slice($recData , (108-70)*2, 2)); logging($id, "Modus = " .strval($Dummy)); setLogicLinkAusgang($id,1,$Dummy); $Value= PhpType::bytes2signedInt(array_slice($recData , (84-70)*2, 2))/1000; //logging($id, "value = " .strval($Value)); $Factor= PhpType::bytes2signedInt(array_slice($recData , (85-70)*2, 2)); //logging($id, "Factor = " .strval($Factor)); $Dummy = round($Value*pow(10,$Factor), 3); logging($id, "Momentanleistung = " .strval($Dummy) ." kW"); setLogicLinkAusgang($id,2, $Dummy); $Value= ((PhpType::bytes2unsignedInt(array_slice($recData , (94-70)*2, 2)) << 16 ) + PhpType::bytes2unsignedInt(array_slice($recData , (95-70)*2, 2)))/1000; //logging($id, "value = " .strval($Value)); $Factor= PhpType::bytes2signedInt(array_slice($recData , (96-70)*2, 2)); //logging($id, "Factor = " .strval($Factor)); $Dummy = round($Value*pow(10,$Factor), 3); logging($id, "Gesamtenergieerzeugung = " .strval($Dummy)." kWh"); setLogicLinkAusgang($id,3, $Dummy); if ($E[5]['value']==1) { sleep(2); //usleep(1000*10); // read meter data $recData = $modbus->readMultipleRegisters($E[4]['value'], 40188, 55); //107 //for($i=0; $i < Count($recData); $i++) { // logging($id, strval($i) ." ".strval($recData[$i]),8); //} $Value= PhpType::bytes2signedInt(array_slice($recData , (18)*2, 2))/1000; //logging($id, "value = " .strval($Value)); $Factor= PhpType::bytes2signedInt(array_slice($recData , (22)*2, 2)); //logging($id, "Factor = " .strval($Factor)); $Dummy = round($Value*pow(10,$Factor), 3); logging($id, "Momentanleistung Bezug-Ertrag= " .strval($Dummy)); setLogicLinkAusgang($id,4, $Dummy); $Value= ((PhpType::bytes2unsignedInt(array_slice($recData , 38*2, 2)) << 16 ) + PhpType::bytes2unsignedInt(array_slice($recData , 39*2, 2)))/1000; //logging($id, "value = " .strval($Value)); $Factor= PhpType::bytes2signedInt(array_slice($recData , (54)*2, 2)); //logging($id, "Factor = " .strval($Factor)); $Dummy = round($Value*pow(10,$Factor), 3); logging($id, "Einspeisezähler = " .strval($Dummy)); setLogicLinkAusgang($id,5, $Dummy); $Value= ((PhpType::bytes2unsignedInt(array_slice($recData , 46*2, 2)) << 16 ) + PhpType::bytes2unsignedInt(array_slice($recData , 47*2, 2)))/1000; //logging($id, "value = " .strval($Value)); $Factor= PhpType::bytes2signedInt(array_slice($recData , (54)*2, 2)); //logging($id, "Factor = " .strval($Factor)); $Dummy = round($Value*pow(10,$Factor), 3); logging($id, "Bezugszähler = " .strval($Dummy)); setLogicLinkAusgang($id,6, $Dummy); } logging($id, $modbus); } catch (Exception $e) { logging($id, "Fehler:" ); logging($id, $modbus); logging($id, $e); exit; } unset($modbus); //logic_setVar($id,1,0); //setzt V1=0, um einen erneuten Start des EXEC-Scripts zu erm?glichen logging($id, "EXEC End"); //------------------------------------------------------------------------------------- sql_disconnect(); ?> ###[/EXEC]###
JürgenZuletzt geändert von fudi6489; 14.02.2021, 05:00.Stichworte: -


Einen Kommentar schreiben: