Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Node-Red
    5. S7 mit Node Red (node-red-contrib-s7)

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    S7 mit Node Red (node-red-contrib-s7)

    This topic has been deleted. Only users with topic management privileges can see it.
    • fu_zhou
      fu_zhou @Wal last edited by

      @wal Prost Neujahr! Eine Idee habe ich noch: Ich schreibe die Zufallszahl -99 - 99 mit Blockly in ein User-Objekt und das Script schickt den Wert dann direkt über node snap 7 an die S7.
      Kannst du mir helfen, die Zeile

       buf.writeFloatBE(parseInt(Math.floor(Math.random() * 198 - 99), 10), 0, 4);
      

      so anzupassen, dass anstatt der Zufallszahl der Wert vom Objekt

      javascript.0.S7_Komm_Test.real
      

      geschrieben wird?

      Ich will testen, on nicht doch Blockly da was verbockt...

      Wal 1 Reply Last reply Reply Quote 0
      • Wal
        Wal Developer @fu_zhou last edited by

        @fu_zhou ,

        buf.writeFloatBE(getState('javascript.0.S7_Komm_Test.real').val);
        
        fu_zhou 2 Replies Last reply Reply Quote 0
        • fu_zhou
          fu_zhou @Wal last edited by fu_zhou

          @wal Was seit Neujahr passiert ist:

          • Alle Real-Werte, die ich schreibe, sind bei mir im DB22
          • Ich habe die S7.1 Instanz angelegt und den DB22 aus der S7.0 dort hin verschoben
          • Regelmäßig schreibe ich nur 4 Real-Werte in die S7 (DB22)
          • Diese Werte schreibe ich jetzt nicht mehr direkt aus Blockly über den Adapter, sondern lege sie mit Blockly in 4 User-Objekten (javascript.0.PV.Netzleistung, javascript.0.PV.Batterieleistung, javascript.0.Ansteuerung_Thyro.AW128_LIMIT, javascript.0.Ansteuerung_Thyro.AW128_LADE_SOLL) ab, welche ich dann regelmäßig über Javascript über node snap 7 in die S7 schreibe (aktuell 200ms Intervall):
          var snap7 = require('node-snap7');
          let buf;
           
          var s7client = new snap7.S7Client();
          s7client.ConnectTo('1.1.1.1', 0, 2, function(err) {
              if(err)
                  return console.log(' >> Connection failed. Code #' + err + ' - ' + s7client.ErrorText(err));
          });
          
          function anS7senden() {
              buf = Buffer.alloc(4);
              buf.writeFloatBE(getState('javascript.0.PV.Netzleistung').val);
          
              s7client.DBWrite(22, 336, 4, buf, function(err, res) {
              if(err)
                  return console.log(' >> DBWrite failed. Code #' + err + ' - ' + s7client.ErrorText(err));
              });
          
              buf = Buffer.alloc(4);
              buf.writeFloatBE(getState('javascript.0.PV.Batterieleistung').val);
          
              s7client.DBWrite(22, 352, 4, buf, function(err, res) {
              if(err)
                  return console.log(' >> DBWrite failed. Code #' + err + ' - ' + s7client.ErrorText(err));
              });
          
              buf = Buffer.alloc(4);
              buf.writeFloatBE(getState('javascript.0.Ansteuerung_Thyro.AW128_LIMIT').val);
          
              s7client.DBWrite(22, 340, 4, buf, function(err, res) {
              if(err)
                  return console.log(' >> DBWrite failed. Code #' + err + ' - ' + s7client.ErrorText(err));
              });
          
              buf = Buffer.alloc(4);
              buf.writeFloatBE(getState('javascript.0.Ansteuerung_Thyro.AW128_LADE_SOLL').val);
          
              s7client.DBWrite(22, 348, 4, buf, function(err, res) {
              if(err)
                  return console.log(' >> DBWrite failed. Code #' + err + ' - ' + s7client.ErrorText(err));
              });
          
          }
          
          setInterval(anS7senden, 200);
          
          • In dem Blockly, in dem ich die 4 Objekte aktualisiere, überprüfe ich die Werte im DB22 auf Änderung und gebe bei Abweichung eine entsprechend Log-Meldung aus.

          Und jetzt der Knaller: 2 der 4 Werte weichen massiv häufig (beide Werte zusammen 93x in einer Stunde) ab (DB22.DBD352 = Batterieleistung, DB22.DBD340 = AW128_LIMIT), die anderen beiden Werte nicht ein einziges Mal in der gleichen Zeit. Lt. Zeitstempel hat Blockly die Werte nicht verändert, (stehen bei 0), der Zeitstempel der zugeh. Wertes aus dem DB22 steht auf dem Zeitstempel kurz nach dem Überlauf, als 0 wieder geschrieben/gelesen wurde.

          Die Werte, die keine Ausreißer haben (Netzleistung, AW128_Lade_Soll) sind ungleich 0 (Null).

          Hast du eine Idee, wo und wie ich weiter in die Details gehen kann?

          Edit: Habe den Teil im Blockly jetzt mal deaktiviert, wo AW128_LIMIT aktualisiert wird und fest den Wert 1.23 ins Objekt javascript.0.Ansteuerung_Thyro.AW128_LIMIT geschrieben. Ausreißer kommt wieder:

          2024-01-07 20:40:05.197 - debug: javascript.0 (942) script.js._Werte_an_S7.Ansteuerung_Thyro: Abweichung s7.1.DBs.DB22.AW128_LIMIT
          2024-01-07 20:40:05.198 - debug: javascript.0 (942) script.js._Werte_an_S7.Ansteuerung_Thyro: -93510772337884000000
          2024-01-07 20:40:05.198 - debug: javascript.0 (942) script.js._Werte_an_S7.Ansteuerung_Thyro: 1.23
          2024-01-07 20:41:52.834 - debug: javascript.0 (942) script.js._Werte_an_S7.Ansteuerung_Thyro: Abweichung s7.1.DBs.DB22.AW128_LIMIT
          2024-01-07 20:41:52.835 - debug: javascript.0 (942) script.js._Werte_an_S7.Ansteuerung_Thyro: 26160945152
          2024-01-07 20:41:52.835 - debug: javascript.0 (942) script.js._Werte_an_S7.Ansteuerung_Thyro: 1.23
          2024-01-07 20:43:21.150 - debug: javascript.0 (942) script.js._Werte_an_S7.Ansteuerung_Thyro: Abweichung s7.1.DBs.DB22.AW128_LIMIT
          2024-01-07 20:43:21.150 - debug: javascript.0 (942) script.js._Werte_an_S7.Ansteuerung_Thyro: -93510772337884000000
          2024-01-07 20:43:21.151 - debug: javascript.0 (942) script.js._Werte_an_S7.Ansteuerung_Thyro: 1.23
          
          1 Reply Last reply Reply Quote 0
          • fu_zhou
            fu_zhou @Wal last edited by fu_zhou

            @wal Ich glaube, ich habe das Problem gefunden, auf jeden Fall ist seit der Änderung über die letzten 2 Stunden Ruhe mit den Ausreißern - mal sehen, was über die nächsten Stunden so passiert...
            Ich habe jetzt für jeden der (mittlerweile) 5 zu schreibenden Real-Werte einen eigenen Buffer angelegt: buf1 - buf5. Vorher habe ich für jeden Wert buf verwendet (s.o.):

            var snap7 = require('node-snap7');
            let buf1;
            let buf2;
            let buf3;
            let buf4;
            let buf5;
             
            var s7client = new snap7.S7Client();
            s7client.ConnectTo('1.1.1.1', 0, 2, function(err) {
                if(err)
                    return console.log(' >> Connection failed. Code #' + err + ' - ' + s7client.ErrorText(err));
            });
            
            function anS7senden() {
                buf1 = Buffer.alloc(4);
                buf1.writeFloatBE(getState('javascript.0.PV.Netzleistung').val);
            
                s7client.DBWrite(22, 336, 4, buf1, function(err, res) {
                if(err)
                    return console.log(' >> DBWrite failed. Code #' + err + ' - ' + s7client.ErrorText(err));
                });
            
                buf2 = Buffer.alloc(4);
                buf2.writeFloatBE(getState('javascript.0.PV.Batterieleistung').val);
            
                s7client.DBWrite(22, 352, 4, buf2, function(err, res) {
                if(err)
                    return console.log(' >> DBWrite failed. Code #' + err + ' - ' + s7client.ErrorText(err));
                });
            
                buf3 = Buffer.alloc(4);
                buf3.writeFloatBE(getState('javascript.0.Ansteuerung_Thyro.AW128_LIMIT').val);
            
                s7client.DBWrite(22, 340, 4, buf3, function(err, res) {
                if(err)
                    return console.log(' >> DBWrite failed. Code #' + err + ' - ' + s7client.ErrorText(err));
                });
            
                buf4 = Buffer.alloc(4);
                buf4.writeFloatBE(getState('javascript.0.Ansteuerung_Thyro.AW128_LADE_SOLL').val);
            
                s7client.DBWrite(22, 348, 4, buf4, function(err, res) {
                if(err)
                    return console.log(' >> DBWrite failed. Code #' + err + ' - ' + s7client.ErrorText(err));
                });
            
                buf5 = Buffer.alloc(4);
                buf5.writeFloatBE(getState('javascript.0.S7_Komm_Test.Reserve').val);
            
                s7client.DBWrite(22, 92, 4, buf5, function(err, res) {
                if(err)
                    return console.log(' >> DBWrite failed. Code #' + err + ' - ' + s7client.ErrorText(err));
                });
            }
            
            setInterval(anS7senden, 200);
            

            Obwohl buf ja immer mit dem neuen Wert beschrieben wird (getState...), scheint der buf da irgendwie sporadisch durcheinander zu kommen und dann stehen die Fantasiewerte drin.

            Jetzt habe ich überhaupt keine Ahnung, wo und wie dieses Problem abzufangen ist. Im node Snap7 Wrapper? Im S7 Adapter? Hast du eine Idee?

            Edit: auch nach 10 Stunden (über Nacht) keine Ausreißer mehr...

            Wal 2 Replies Last reply Reply Quote 0
            • Wal
              Wal Developer @fu_zhou last edited by

              @fu_zhou ,
              den "buf" gibt es auch im S7 Adapter den ich nach Befüllung mit geloggt hatte und keine Ausreißer hatte, aber zwischen "buf" befüllen und "buf" mit s7client.DBWrite schreiben könnte sich ja evtl. sich was ändern.

              1 Reply Last reply Reply Quote 0
              • Wal
                Wal Developer @fu_zhou last edited by Wal

                @fu_zhou ,
                bin ja auf dem "latest" und auf nodejs20 mit meinem ioBroker.
                Habe am Anfang des Jahres alles geupdatet und kann den Fehler seit Stunden mit verschiedenen Skripten nicht mehr reproduzieren.
                Nach diesem Post wird der Fehler gleich da sein, werde berichten.

                edit: ich habs gewusst, 2 Minuten hat es gedauert. 😉

                fu_zhou 1 Reply Last reply Reply Quote 0
                • fu_zhou
                  fu_zhou @Wal last edited by fu_zhou

                  @wal für mich sieht das mit einem buf so aus: es wird ja nicht gewartet, ob oder bis der Wert aus dem Buffer tatsächlich in der S7 ankommt. Wenn der Schreibvorgang länger als 200ms (mein Intervall) dauert, steht möglicherweise in dem buf schon ein Teil von dem anderen Wert drin und dann ergibt der Inhalt dieser 4 "zusammengewürfelten" Bytes diese Werte, die völlig daneben sind. Das würde auch erklären, dass die Häufigkeit der Abweichung mit steigender Zykluszeit abnimmt. Allerdings kommt bei einem 1 Sek.-Intervall der Fehler noch immer hin und wieder und so lange kann der s7client.DBWrite ja eigentlich nicht dauern - oder hin und wieder eben doch?

                  Wenn wir, außer buf 1 - buf n, eine Lösung finden, immer die korrekten Werte in die S7 zu schreiben, ist das im Adapter leicht behoben, denke ich. Ich habe auch mal in die main.js geschaut und die Zeilen dazu gefunden...

                  In der API-Beschreibung habe ich nichts gefunden, was darauf hinweist, dass auf den Schreibzyklus zu achten wäre. Ich habe das aber mal im issue auf Github gefragt.

                  Wal 1 Reply Last reply Reply Quote 0
                  • Wal
                    Wal Developer @fu_zhou last edited by Wal

                    @fu_zhou ,
                    kannst du mal den Adapter über mein Github installieren und testen ?
                    Bei mir dauert es immer sehr lang bis der Ausreißer kommt, deshalb wären 2 Tester besser.
                    Github Link

                    fu_zhou 1 Reply Last reply Reply Quote 0
                    • fu_zhou
                      fu_zhou @Wal last edited by

                      @wal Ist jetzt installiert und ich beschreibe die S7 mit dem Adapter mit 200ms Poll-Delay mit 3 Real Werten, wobei einer in der S7 umkopiert wird, also lese ich die 3 geschriebenen + den 1 umkopierten Wert.

                      Ich bin soooo gespannt....

                      Wal 1 Reply Last reply Reply Quote 0
                      • Wal
                        Wal Developer @fu_zhou last edited by

                        @fu_zhou ,
                        bis jetzt hatte ich noch kein Ausreißer, aber nach dieser Nachricht ... 😉

                        fu_zhou 1 Reply Last reply Reply Quote 0
                        • fu_zhou
                          fu_zhou @Wal last edited by

                          @wal seit wann läuft's bei dir?

                          Wal 1 Reply Last reply Reply Quote 0
                          • Wal
                            Wal Developer @fu_zhou last edited by

                            @fu_zhou ,
                            10 Stunden.

                            fu_zhou 2 Replies Last reply Reply Quote 0
                            • fu_zhou
                              fu_zhou @Wal last edited by fu_zhou

                              @wal Noch kein Ausreißer die letzten 20 Minuten!!!!! Ich gehe jetzt nochmal auf den S7 Adapter ohne deine Änderung zurück und schaue, wie lange es dauert, bis der erste Wert daneben liegt.
                              Edit: die ersten Ausreißer sind angekommen, ich gehe jetzt wieder auf deine Modifikation...

                              1 Reply Last reply Reply Quote 1
                              • fu_zhou
                                fu_zhou @Wal last edited by

                                @wal kein Ausreißer über Nacht - bei 3 Instanzen in 2 ioBroker Installationen, die alle die selbe S7 traktieren. Das war bisher das Rezept für verlässliche sporadische Ausreißer! Kann es das gewesen sein????? - Sieht danach aus!!!!!

                                Ich würde sagen, dass das eine Version 1.5, wenn nicht sogar 2.0 Wert ist. Kannst du dich darum kümmern, dass das ioBroker Repository angepasst wird, so dass die funktionierende Version über ioBroker installiert wird?

                                Auf jeden Fall vielen Dank für deine Unterstützung bisher!

                                Wal 1 Reply Last reply Reply Quote 0
                                • Wal
                                  Wal Developer @fu_zhou last edited by

                                  @fu_zhou ,
                                  es waren doch noch mehr User denen das aufgefallen ist, wenn die auch noch einmal testen könnten ...
                                  So schnell wage ich noch kein Pull Request, 😉 lass mal noch eine Woche so laufen.

                                  HF_SPSler 1 Reply Last reply Reply Quote 0
                                  • HF_SPSler
                                    HF_SPSler @Wal last edited by

                                    Moin @wal ,

                                    ich gehöre auch zu denen die Probleme mit den Ausreißern in den Werten haben 🙂 Leider habe ich tagsüber nicht die Möglichkeit Tests durchzuführen da ich meine private S7 mit dem iobroker gekoppelt habe und mir auf der Arbeit aktuell keine Möglichkeit besteht eine S7 mit einem iobroker zu koppeln.

                                    Aber ich könnte jetzt heute Abend mal eine Trace aufzeichnen, zumindest für ein paar stunden. Jedoch weiß ich leider noch nicht wie man den Adapter von Github installiert bekommt, da bin ich noch totales Greenhorn.

                                    Wal 1 Reply Last reply Reply Quote 0
                                    • Wal
                                      Wal Developer @HF_SPSler last edited by

                                      @hf_spsler ,
                                      du rufst die Adapter in deinem ioBroker auf und klickst auf die Katze im weißen Kreis.
                                      Danach auf Benutzerdefiniert und kopierst die oben gepostete Github Url hinein, jetzt auf den Button installieren klicken.

                                      HF_SPSler 1 Reply Last reply Reply Quote 0
                                      • HF_SPSler
                                        HF_SPSler @Wal last edited by

                                        @wal Okay 👍 Muss dafür der bereits installierte Adapter erst entfernt werden? Der ist mit über 200 DB Adressen bereits für Iqontrol in Verwendung 😨

                                        Wal 2 Replies Last reply Reply Quote 0
                                        • Wal
                                          Wal Developer @HF_SPSler last edited by

                                          @hf_spsler ,
                                          nein

                                          1 Reply Last reply Reply Quote 0
                                          • Wal
                                            Wal Developer @HF_SPSler last edited by

                                            @hf_spsler ,
                                            hoffe aber dein ioBroker ist einigermaßen aktuell.

                                            HF_SPSler 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            663
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

                                            9
                                            92
                                            6226
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo