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.
    • Wal
      Wal Developer @fu_zhou last edited by

      @fu_zhou sagte in S7 mit Node Red (node-red-contrib-s7):

      Schreibzugriffe pro Sekunde: Wie kriegt man die raus?

      Du weist doch wie oft deine Skripte das Objekt beschreiben, oder ?

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

        @wal ja, das ist bei manchen Scripten aber auch abhängig von der Wertänderung. Im Adapter kann nirgendwo eingestellt werden "nur bei Änderung schreiben", daher gehe ich davon aus, dass Werte, die unter DBS auf "RW" gesetzt sind, alle 200ms (=mein Poll delay) zyklisch geschrieben werden, oder? Und zyklisch (Poll delay) gelesen werden alle Werte, die auf "Abfrage" stehen, denke ich. Wobei der Zeitstempel vom Objekt sich nicht alle 200ms ändert, sondern nur bei Änderung...

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

          @fu_zhou ,
          ich habe das Script gestern Morgen nochmal gestartet und bis heute Abend keinen Fehler mehr bekommen.
          Edit: Ok, eben war er nach 1min da. 😉

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

            @wal Also an node snap7 scheint es nicht zu liegen. Ich lasse aktuell folgende 4 Szenarien parallel laufen, wobei dabei immer die selbe S7 beschrieben wird.
            1. Instanz S7.0: Poll delay eingestellt: 200 ms, gemessene s7.0.info.poll_time: zwischen 100 und 190 ms (ca. 750 Objekte), ich möchte aber nicht ausschließen, dass da hin und wieder mal > 200 ms auftaucht

            Ich schreibe mit Blockly eine Zufallszahl von -99 bis +99 1x pro Sekunde als real in den DB23.DBD488. Hier kommt es zu den sporadischen Ausreißern:

            2023-12-29 19:32:41.319  - S7_Komm_Test: Abweichung S7.0 488
            2023-12-29 19:32:41.320  - S7_Komm_Test: -16127454208 (zurueckgelesener Wert)
            2023-12-29 19:32:41.320  - S7_Komm_Test: 180 (poll_time)
            

            2. Instanz S7.1: Poll delay eingestellt: 500 ms, gemessene s7.1.info.poll_time: zwischen 5 und 25 ms (nur der eine Wert zum Testen), beim Ausreißer wurde aber eine deutlich höhere poll_time geloggt, als "normal".

            Ich schreibe mit Blockly eine Zufallszahl von -99 bis +99 1x pro Sekunde als real in den DB22.DBD92. Hier kommt es zu den sporadischen Ausreißern:

            2023-12-29 19:50:19.460  - S7_Komm_Test: Abweichung S7.1 92
            2023-12-29 19:50:19.461  - S7_Komm_Test: 228089394688736360000
            2023-12-29 19:50:19.461  - S7_Komm_Test: 128
            

            3. Instanz S7.0 in einer separaten VM mit einer neuen iobroker-Installation, in der so gut wie nichts läuft, außer dem Kommunikationstest. Poll delay eingestellt: 200 ms, gemessene s7.0.info.poll_time: zwischen 5 und 40 ms (nur die zwei Test-Objekte), beim Ausreißer wurde eine "normale" poll_time geloggt.

            Ich schreibe mit Blockly eine Zufallszahl von -99 bis +99 1x pro Sekunde als real in den DB23.DBD612. Hier kommt es zu den sporadischen Ausreißern:

            2023-12-29 22:11:12.237 - info: Test.S7_Komm_Test: Abweichung Dev 612
            2023-12-29 22:11:12.239 - info: Test.S7_Komm_Test: -137543207092224
            2023-12-29 22:11:12.239 - info: Test.S7_Komm_Test: 17
            

            4. Umgehung des S7 Adapters: in der VM mit der neuen iobroker-Installation lasse ich in der iobroker-Umgebung dein Javascript laufen und schreibe alle 500ms einen real Wert in den DB23.DBD620:

            var sleep = require('system-sleep');
            var snap7 = require('node-snap7');
            
            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));
                let ende=true;
            
                do {
                  sleep(500); 
                  let buf;
                  buf = Buffer.alloc(4);
                  buf.writeFloatBE(parseInt(Math.floor(Math.random() * 198 - 99), 10), 0, 4);
                          
                  s7client.DBWrite(23, 620, 4, buf, function(err, res) {
                    if(err)
                        return console.log(' >> DBWrite failed. Code #' + err + ' - ' + s7client.ErrorText(err));
            
                    //console.log(buf)
                  });
            
                  s7client.DBRead(23, 620, 4, function(err, res) {
                    if(err)
                        return console.log(' >> DBRead failed. Code #' + err + ' - ' + s7client.ErrorText(err));
                  });
                } while (ende);
            });
            

            DB23.DBD620 lese ich im Blockly ein und übeprüfe auf Ausreißer (>99, < -99). Hier gibt es die Ausreißer nicht und ich frage mich, wie node snap7 die Zyklus-/ Poll-Zeit festlegt, die ist im Script ja nicht angegeben.

            Kann also die im S7 Adapter angegebene Poll-Delay etwas mit den Ausreißern zu tun haben?

            Noch ein interessanter Effekt: Wenn ich das Javascript in iobroker stoppe, wird es als "läuft nicht angezeigt", der Wert in DB23.DBD620 verändert sich aber munter weiter, also muss das Skript noch irgendwie laufen. Der Wert bleibt erst stehen, wenn ich die Javascript-Instanz stoppe...

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

              @fu_zhou ,
              zu 4.
              Das Script habe ich direkt im Terminal laufen ohne iobroker und das bringt wie bei dir keine Fehler.
              Der Pollwert macht nur der s7-Adapter, beim Script ist es der Sleep-Wert.
              In Snap7 gibt es kein Poll-Wert.
              Interessant das im iobroker im Javascript-Adapter laufen zu lassen, muss ich mal testen, 😉
              Fazit ist es liegt doch am s7-Adapter , leider reichen da meine nodejs Kenntnisse nicht mehr aus.

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

                @fu_zhou sagte in S7 mit Node Red (node-red-contrib-s7):

                Noch ein interessanter Effekt: Wenn ich das Javascript in iobroker stoppe, wird es als "läuft nicht angezeigt", der Wert in DB23.DBD620 verändert sich aber munter weiter, also muss das Skript noch irgendwie laufen. Der Wert bleibt erst stehen, wenn ich die Javascript-Instanz stoppe...

                Das Script ist in deiner Endlosschleife gefangen solange der Fehler nicht kommt und in deinem Script immer.

                let ende=true;
                do {
                } while (ende);
                

                ende wird bei dir nie false.
                In meinem Script aber auch, da der Fehler nicht kommt. 😉
                Mein Script:

                var snap7 = require('node-snap7');
                var sleep = require('system-sleep');
                
                var s7client = new snap7.S7Client();
                s7client.ConnectTo('192.168.12.222', 0, 2, function(err) {
                    if(err)
                        return console.log(' >> Connection failed. Code #' + err + ' - ' + s7client.ErrorText(err));
                    let ende=true;
                    do {
                      sleep(500); 
                      let buf;
                      buf = Buffer.alloc(4);
                      buf.writeInt32BE(parseInt(Math.floor(Math.random() * 198 - 99), 10), 0, 4);
                
                      s7client.DBWrite(2, 12, 4, buf, function(err, res) {
                        if(err)
                            return console.log(' >> DBWrite failed. Code #' + err + ' - ' + s7client.ErrorText(err));
                
                        //console.log(buf)
                      });
                
                      s7client.DBRead(2, 16, 4, function(err, res) {
                        if(err)
                            return console.log(' >> DBRead failed. Code #' + err + ' - ' + s7client.ErrorText(err));
                
                        //console.log(res);
                        if (res.readInt32BE() != buf.readInt32BE()) {
                          console.log('falsch');
                          ende=false;
                        }
                      });   
                    } while (ende);
                });
                

                edit:
                hier noch ein Script das sich beenden lässt.

                var snap7 = require('node-snap7');
                
                var s7client = new snap7.S7Client();
                s7client.ConnectTo('192.168.12.222', 0, 2, function(err) {
                    if(err)
                        return console.log(' >> Connection failed. Code #' + err + ' - ' + s7client.ErrorText(err));
                });
                
                schedule("* * * * * *", async () => {
                    let buf;
                    buf = Buffer.alloc(4);
                    buf.writeInt32BE(parseInt(Math.floor(Math.random() * 198 - 99), 10), 0, 4);
                
                    s7client.DBWrite(2, 12, 4, buf, function(err, res) {
                    if(err)
                        return console.log(' >> DBWrite failed. Code #' + err + ' - ' + s7client.ErrorText(err));
                    });
                
                    s7client.DBRead(2, 16, 4, function(err, res) {
                        if(err)
                            return console.log(' >> DBRead failed. Code #' + err + ' - ' + s7client.ErrorText(err));
                            if (res.readInt32BE() != buf.readInt32BE()) console.log('falsch');
                    });  
                });
                
                1 Reply Last reply Reply Quote 0
                • Wal
                  Wal Developer @fu_zhou last edited by

                  @fu_zhou ,
                  habe das Testscript so umgeschrieben das der Schreibbefehl direkt an snap7 und der Lesebefehl über den s7-Adapter getätigt wird. Es kommen keine falschen Werte mehr.
                  Kannst du die Schreibbefehle in deinen Scripten auch so umschreiben und testen ?

                  var snap7 = require('node-snap7');
                  let buf;
                  
                  var s7client = new snap7.S7Client();
                  s7client.ConnectTo('192.168.12.222', 0, 2, function(err) {
                      if(err)
                          return console.log(' >> Connection failed. Code #' + err + ' - ' + s7client.ErrorText(err));
                  });
                  
                  schedule("* * * * * *", async () => {
                      buf = Buffer.alloc(4);
                      buf.writeInt32BE(parseInt(Math.floor(Math.random() * 198 - 99), 10), 0, 4);
                  
                      s7client.DBWrite(2, 12, 4, buf, function(err, res) {
                      if(err)
                          return console.log(' >> DBWrite failed. Code #' + err + ' - ' + s7client.ErrorText(err));
                      });
                  });
                  
                  on({ id: 's7.0.DBs.DB2.test2', change: 'ne' }, async (obj) => {
                    let value = obj.state.val;
                    const valbuf = buf.readInt32BE();
                    if (value != valbuf) {
                      setState('javascript.0.scriptEnabled.Test.Zufall1', false);
                      console.log('ungleich');
                      console.log(getState('s7.0.DBs.DB2.test1').val);
                      console.log(value);
                      console.log(valbuf);
                    }
                  });
                  
                  fu_zhou 1 Reply Last reply Reply Quote 0
                  • fu_zhou
                    fu_zhou @Wal last edited by

                    @wal So, habe das Script auf mein System angepasst (IP-Adresse S7, Adresse DB+Doppelwort, write/ read Float) und ich lasse es weiterlaufen, wenn eine Abweichung erkannt wird, so dass die nächste auch wieder geloggt wird. Ich bin gespannt, traue mich aber, vorherzusagen, dass es keine Ausreisser geben wird...

                    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));
                    });
                     
                    schedule("* * * * * *", async () => {
                        buf = Buffer.alloc(4);
                        buf.writeFloatBE(parseInt(Math.floor(Math.random() * 198 - 99), 10), 0, 4);
                     
                        s7client.DBWrite(22, 92, 4, buf, function(err, res) {
                        if(err)
                            return console.log(' >> DBWrite failed. Code #' + err + ' - ' + s7client.ErrorText(err));
                        });
                    });
                     
                    on({ id: 's7.0.DBs.DB22.Reserve92', change: 'ne' }, async (obj) => {
                      let value = obj.state.val;
                      const valbuf = buf.readFloatBE();
                      if (value != valbuf) {
                        //setState('javascript.0.scriptEnabled.Test.Zufall1', false);
                        console.log('Abweichung S7.0 DB22.Reserve92');
                        //console.log(getState('s7.0.DBs.DB2.test1').val);
                        console.log(value);
                        console.log(valbuf);
                      }
                    });
                    

                    Ich habe echt irgendwie "Poll-Delay" in Verdacht, ist aber nur ein Gefühl...

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

                      @wal in der S7 Konfigration von Node Red muss man eine Zyklsuzeit angeben:
                      5b809a21-f6a0-4c94-8975-631c1b1e392d-image.png

                      Warum kommt Snap7 da ohne aus? Wie werden dann Lese-/ Schreibzyklen organisiert, um den Bus und die CPU nicht zu überlasten?

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

                        @fu_zhou ,
                        wenn du dir die api von node snap7 anschaust gibt es das nicht.
                        Die Zykluszeit ist nur die Zeit in was für einen Abstand die Daten von der PLC geholt werden und das macht das Programm das node snap7 nutzt, in node red wird das nicht anders sein.

                        edit: habe mir nodes7 angeschaut was node-red-contrib-s7 nutzt, da ist es genauso das es kein poll gibt.
                        editedit: Der S7-Adapter und node-red-contrib-s7 machen und nutzen den Poll, nicht node-snap7 und nodes7.

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

                          @wal Ah okay. Was passiert, wenn man aus dem S7-Adapter Poll-Delay einfach mal rauschmeißt? Wird dann eben so schnell kommuniziert, wie es die S7 gerade schafft? Steht in der snap7 API, dass man sich um den Kommunikationszyklus kümmern muss? Ich habe da nichts explizites gefunden in der API Beschreibung...

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

                            @fu_zhou sagte in S7 mit Node Red (node-red-contrib-s7):

                            @wal Ah okay. Was passiert, wenn man aus dem S7-Adapter Poll-Delay einfach mal rauschmeißt?

                            Schau dir den S7 Adapter an wo/wie der Poll genutzt wird, da möchte ich mich nicht befassen wollen.

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

                              @wal Update:
                              Ich habe sporadisch Abweichungen, aber die Werte bleiben im Bereich zwischen -99 und 99:

                              2023-12-31 08:21:57.712  - javascript.0 (35683) script.js.zz_Test_WIP.S7_Komm_Test_JS: Abweichung S7.0 DB22.Reserve92
                              2023-12-31 08:21:57.712  - javascript.0 (35683) script.js.zz_Test_WIP.S7_Komm_Test_JS: 65
                              2023-12-31 08:21:57.713  - javascript.0 (35683) script.js.zz_Test_WIP.S7_Komm_Test_JS: 74
                              2023-12-31 08:22:02.458  - javascript.0 (35683) script.js.zz_Test_WIP.S7_Komm_Test_JS: Abweichung S7.0 DB22.Reserve92
                              2023-12-31 08:22:02.461  - javascript.0 (35683) script.js.zz_Test_WIP.S7_Komm_Test_JS: 74
                              2023-12-31 08:22:02.461  - javascript.0 (35683) script.js.zz_Test_WIP.S7_Komm_Test_JS: -99
                              2023-12-31 08:22:02.881  - javascript.0 (35683) script.js.zz_Test_WIP.S7_Komm_Test_JS: Abweichung S7.0 DB22.Reserve92
                              2023-12-31 08:22:02.884  - javascript.0 (35683) script.js.zz_Test_WIP.S7_Komm_Test_JS: -91
                              2023-12-31 08:22:02.884  - javascript.0 (35683) script.js.zz_Test_WIP.S7_Komm_Test_JS: 33
                              2023-12-31 08:22:02.973  - javascript.0 (35683) script.js.zz_Test_WIP.S7_Komm_Test_JS: Abweichung S7.0 DB22.Reserve92
                              2023-12-31 08:22:02.974  - javascript.0 (35683) script.js.zz_Test_WIP.S7_Komm_Test_JS: -12
                              2023-12-31 08:22:02.974  - javascript.0 (35683) script.js.zz_Test_WIP.S7_Komm_Test_JS: 33
                              2023-12-31 08:22:03.085  - javascript.0 (35683) script.js.zz_Test_WIP.S7_Komm_Test_JS: Abweichung S7.0 DB22.Reserve92
                              2023-12-31 08:22:03.088  - javascript.0 (35683) script.js.zz_Test_WIP.S7_Komm_Test_JS: 71
                              2023-12-31 08:22:03.089  - javascript.0 (35683) script.js.zz_Test_WIP.S7_Komm_Test_JS: -87
                              2023-12-31 08:22:04.409  - javascript.0 (35683) script.js.zz_Test_WIP.S7_Komm_Test_JS: Abweichung S7.0 DB22.Reserve92
                              2023-12-31 08:22:04.409  - javascript.0 (35683) script.js.zz_Test_WIP.S7_Komm_Test_JS: 33
                              2023-12-31 08:22:04.411  - javascript.0 (35683) script.js.zz_Test_WIP.S7_Komm_Test_JS: 78
                              2023-12-31 08:22:04.483  - javascript.0 (35683) script.js.zz_Test_WIP.S7_Komm_Test_JS: Abweichung S7.0 DB22.Reserve92
                              2023-12-31 08:22:04.483  - javascript.0 (35683) script.js.zz_Test_WIP.S7_Komm_Test_JS: -87
                              2023-12-31 08:22:04.484  - javascript.0 (35683) script.js.zz_Test_WIP.S7_Komm_Test_JS: 78
                              

                              Für mich sieht das so aus, als würde node snap7 zyklisch im 1 Sekunden-Takt schreiben, der S7-Adapter braucht aber ab und zu länger, den Wert zu lesen und dann wird die Abweichung erkannt. Wie würdest du das interpretieren? Ich mache mal ne neue Instanz mit nur einem Wert und lass das Script damit arbeiten.

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

                                @fu_zhou ,
                                diese Abweichungen sind unwichtig da wie du schon feststellen konntest nur Zeit Überschneidungen sind.
                                Diese Überschneidungen habe ich nur bei zu hoher Pollzeit oder ich hatte vergessen bei dem Wert den ich schreibe den Haken bei Abfrage in der Adapter Config zu entfernen.
                                abfrage.jpg

                                fu_zhou 1 Reply Last reply Reply Quote 0
                                • 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
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            1.1k
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

                                            9
                                            92
                                            6229
                                            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