Ankündigung

Einklappen
Keine Ankündigung bisher.

Solaredge WR-Modbus LBS 19001370 weitere Register / Datum aufbereiten

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    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


    Code:
    ###[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]###
    Liebe Grüße
    Jürgen
    Angehängte Dateien
    Zuletzt geändert von fudi6489; 14.02.2021, 05:00.

    #2
    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, Bernd
    Zuletzt geändert von gibsonrocker; 14.02.2021, 03:49.

    Kommentar


      #3
      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, Bernd
      Zuletzt geändert von gibsonrocker; 14.02.2021, 03:49.

      Kommentar


        #4
        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.

        Kommentar


          #5
          OK. Schreib ihm mal und dann sehen wir weiter. Melde Dich hier was dabei rausgekommen ist.

          Vg Bernd

          Kommentar


            #6
            Servus Bernd

            Ich habe Rückmeldung von Martin bekommen.
            Er hat kein Problem damit und wir können den Baustein gerne editieren.



            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));
            108,84,94 sind die Register die bereits ausgelesen werden, hier fehlt nur die 40 davor desweg habe ich sie nicht gefunden.
            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

            Kommentar


              #7
              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.

              Kommentar


                #8
                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

                Kommentar


                  #9
                  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]

                  Kommentar


                    #10
                    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
                    Zuletzt geändert von fudi6489; 20.02.2021, 07:45.

                    Kommentar


                      #11
                      Wenn ich es richtig verstehe wird im Register 109 sowohl die Betriebsmeldung als auch eventuelle Fehler angezeigt.
                      Das Verhalten mit Wert 4 und 2 kann ich bei meiner Anlage auch feststellen. In welcher Form die Fehlercodes übertragen werden kann ich bisher noch nicht sagen. Laut Anleitung müssten sie mit 3x oder 8x beginnen und danach noch ein Fehlerspezifisches Byte enthalten.

                      In der englischen Beschreibung habe ich auf Seite 16 noch einige weitere Statusmeldungen gefunden. Hier muss ich heute Abend mal beobachten, ob diese ebenfalls ausgegeben werden.
                      https://www.solaredge.com/sites/defa...nical-note.pdf

                      Weiterhin habe ich die restlichen Meldungen eingepflegt. Die Daten schauen bis auf die Blindleistung und den cos Phi soweit plausibel aus. Das könnte allerdings auch daran liegen, dass der cos Phi fest auf 1 eingestellt ist und somit die Blindleistung 0 sein muss.
                      Sofern an den Messwerten Interesse besteht könnte ich diese natürlich auch zur Verfügung stellen.

                      fudi6489
                      Hat sich Martin dir gegenüber geäußert, ob er die Erweiterungen in den im Downloadportal verfügbaren LBS übernehmen würde? Dann wäre alles wieder auf einem Stand und die Zwischenstände hier könnten gelöscht werden.
                      Angehängte Dateien
                      Zuletzt geändert von Moraty; 20.02.2021, 11:35. Grund: Link eingefügt

                      Kommentar


                        #12
                        Zitat von Moraty Beitrag anzeigen
                        Sofern an den Messwerten Interesse besteht könnte ich diese natürlich auch zur Verfügung stellen.
                        Ja, gerne! Ich hab einfach keine Zeit. Danke für Deine Mühe. Hab nebenbei versucht noch rauszufinden wie ich die reine PV-Leistung rauskriege wie sie im Monitoring angezeigt wird.

                        Kommentar


                          #13
                          Hier meine derzeitigen Anpassungen im Code.

                          Soweit ich das auf die schnelle überblicken kann, verwendet die Solaranzeige ebenfalls die Modbus Schnittstelle und muss deshalb zumindest die selben Eingangsdaten verwenden.


                          Code:
                          ###[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]
                          [a#7=Temperatur]
                          [a#8=Leistung DC]
                          [a#9=Spannung DC]
                          [a#10=Strom DC]
                          [a#11=Strom AC Gesamt]
                          [a#12=Strom L1]
                          [a#13=Strom L2]
                          [a#14=Strom L3]
                          [a#15=Spannung L1-L2]
                          [a#16=Spannung L2-L3]
                          [a#17=Spannung L3-L1]
                          [a#18=Spannung L1-N]
                          [a#19=Spannung L2-N]
                          [a#20=Spannung L3-N]
                          [a#21=Frequenz]
                          [a#22=Scheinleistung]
                          [a#23=Blindleistung]
                          [a#24=Leistungsfaktor]
                          [a#25=Fehlercode]
                          [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)
                          A7: Temperatur (°C)
                          A8: Leistung DC (kW)
                          A9: Spannung DC (V)
                          A10: Strom DC (A)
                          A11: Strom AC Gesamt (A)
                          A12: Strom L1 (A)
                          A13: Strom L2 (A)
                          A14: Strom L3 (A)
                          A15: Spannung L1-L2 (V)
                          A16: Spannung L2-L3 (V)
                          A17: Spannung L3-L1 (V)
                          A18: Spannung L1-N (V)
                          A19: Spannung L2-N (V)
                          A20: Spannung L3-N (V)
                          A21: Frequenz (Hz)
                          A22: Scheinleistung (VA)
                          A23: Blindleistung (Var)
                          A24: Leistungsfaktor (%)
                          A25: Fehlercode
                          
                          
                          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);
                          
                              $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);
                          
                             $Value= PhpType::bytes2unsignedInt(array_slice($recData , (72-70)*2, 2));
                             // logging($id, "value = " .strval($Value));
                             $Factor= PhpType::bytes2signedInt(array_slice($recData , (76-70)*2, 2));
                             // logging($id, "Factor = " .strval($Factor));
                             $Dummy = round($Value*pow(10,($Factor)), 3);
                             logging($id, "Strom AC = " .strval($Dummy) ." A");
                             setLogicLinkAusgang($id,11, $Dummy);
                          
                             $Value= PhpType::bytes2unsignedInt(array_slice($recData , (73-70)*2, 2));
                             // logging($id, "value = " .strval($Value));
                             $Dummy = round($Value*pow(10,($Factor)), 3);
                             logging($id, "Strom L1 = " .strval($Dummy) ." A");
                             setLogicLinkAusgang($id,12, $Dummy);
                          
                             $Value= PhpType::bytes2unsignedInt(array_slice($recData , (74-70)*2, 2));
                             // logging($id, "value = " .strval($Value));
                             $Dummy = round($Value*pow(10,($Factor)), 3);
                             logging($id, "Strom L2 = " .strval($Dummy) ." A");
                             setLogicLinkAusgang($id,13, $Dummy);
                          
                             $Value= PhpType::bytes2unsignedInt(array_slice($recData , (75-70)*2, 2));
                             // logging($id, "value = " .strval($Value));
                             $Dummy = round($Value*pow(10,($Factor)), 3);
                             logging($id, "Strom L3 = " .strval($Dummy) ." A");
                             setLogicLinkAusgang($id,14, $Dummy);
                          
                             $Value= PhpType::bytes2unsignedInt(array_slice($recData , (77-70)*2, 2));
                             // logging($id, "value = " .strval($Value));
                             $Factor= PhpType::bytes2signedInt(array_slice($recData , (83-70)*2, 2));
                             // logging($id, "Factor = " .strval($Factor));
                             $Dummy = round($Value*pow(10,($Factor)), 3);
                             logging($id, "Spannung L1-L2 = " .strval($Dummy) ." V");
                             setLogicLinkAusgang($id,15, $Dummy);
                          
                             $Value= PhpType::bytes2unsignedInt(array_slice($recData , (78-70)*2, 2));
                             // logging($id, "value = " .strval($Value));
                             $Dummy = round($Value*pow(10,($Factor)), 3);
                             logging($id, "Spannung L2-L3 = " .strval($Dummy) ." V");
                             setLogicLinkAusgang($id,16, $Dummy);
                          
                             $Value= PhpType::bytes2unsignedInt(array_slice($recData , (79-70)*2, 2));
                             // logging($id, "value = " .strval($Value));
                             $Dummy = round($Value*pow(10,($Factor)), 3);
                             logging($id, "Spannung L3-L1 = " .strval($Dummy) ." V");
                             setLogicLinkAusgang($id,17, $Dummy);
                          
                             $Value= PhpType::bytes2unsignedInt(array_slice($recData , (80-70)*2, 2));
                             // logging($id, "value = " .strval($Value));
                             $Dummy = round($Value*pow(10,($Factor)), 3);
                             logging($id, "Spannung L1-N = " .strval($Dummy) ." V");
                             setLogicLinkAusgang($id,18, $Dummy);
                             
                             $Value= PhpType::bytes2unsignedInt(array_slice($recData , (81-70)*2, 2));
                             // logging($id, "value = " .strval($Value));
                             $Dummy = round($Value*pow(10,($Factor)), 3);
                             logging($id, "Spannung L2-N = " .strval($Dummy) ." V");
                             setLogicLinkAusgang($id,19, $Dummy);
                          
                             $Value= PhpType::bytes2unsignedInt(array_slice($recData , (82-70)*2, 2));
                             // logging($id, "value = " .strval($Value));
                             $Dummy = round($Value*pow(10,($Factor)), 3);
                             logging($id, "Spannung L1-N = " .strval($Dummy) ." V");
                             setLogicLinkAusgang($id,20, $Dummy);
                          
                             $Value= PhpType::bytes2unsignedInt(array_slice($recData , (86-70)*2, 2));
                             // logging($id, "value = " .strval($Value));
                             $Factor= PhpType::bytes2signedInt(array_slice($recData , (87-70)*2, 2));
                             // logging($id, "Factor = " .strval($Factor));
                             $Dummy = round($Value*pow(10,($Factor)), 3);
                             logging($id, "Frequenz = " .strval($Dummy) ." Hz");
                             setLogicLinkAusgang($id,21, $Dummy);
                          
                             $Value= PhpType::bytes2unsignedInt(array_slice($recData , (88-70)*2, 2));
                             // logging($id, "value = " .strval($Value));
                             $Factor= PhpType::bytes2signedInt(array_slice($recData , (89-70)*2, 2));
                             // logging($id, "Factor = " .strval($Factor));
                             $Dummy = round($Value*pow(10,($Factor)), 3);
                             logging($id, "Scheinleistung = " .strval($Dummy) ." VA");
                             setLogicLinkAusgang($id,22, $Dummy);
                          
                             $Value= PhpType::bytes2unsignedInt(array_slice($recData , (90-70)*2, 2));
                             // logging($id, "value = " .strval($Value));
                             $Factor= PhpType::bytes2signedInt(array_slice($recData , (91-70)*2, 2));
                             // logging($id, "Factor = " .strval($Factor));
                             $Dummy = round($Value*pow(10,($Factor)), 3);
                             logging($id, "Blindleistung = " .strval($Dummy) ." Var");
                             setLogicLinkAusgang($id,23, $Dummy);
                          
                             $Value= PhpType::bytes2unsignedInt(array_slice($recData , (92-70)*2, 2));
                             // logging($id, "value = " .strval($Value));
                             $Factor= PhpType::bytes2signedInt(array_slice($recData , (93-70)*2, 2));
                             // logging($id, "Factor = " .strval($Factor));
                             $Dummy = round($Value*pow(10,($Factor)), 3);
                             logging($id, "Leistungsfaktor = " .strval($Dummy) ." %");
                             setLogicLinkAusgang($id,24, $Dummy);
                          
                              $Dummy = PhpType::bytes2unsignedInt(array_slice($recData , (108-70)*2, 2));
                              logging($id, "Fehlercode = " .strval($Dummy));
                              setLogicLinkAusgang($id,25,$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 ermoeglichen
                          logging($id, "EXEC End");
                          //-------------------------------------------------------------------------------------
                          
                          sql_disconnect();
                          ?>
                          ###[/EXEC]###
                          Code:
                          
                          

                          Kommentar


                            #14
                            Danke Dir. Habs gleich mal reingeschmissen bei mir. Sieht soweit gut aus. Nur die Leistung die vom Dach kommt fehlt mir noch und die Momentanleistung sind komisch. Hast Du einen Speicher bei Dir?

                            Kommentar


                              #15
                              Nein, kein Speicher.

                              Welche Leistung meinst du genau? Sowohl die DC-Leistung an A8 als auch AC-Leistung an A2 und Scheinleistung an A22 schauen gut aus.
                              Was bei mir spinnt sind Blindleistung und der Leistungsfaktor.

                              Kommentar

                              Lädt...
                              X