Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. 16 bit signed Float einlesen über den Node-red Modbus

    NEWS

    • 15. 05. Wartungsarbeiten am ioBroker Forum

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    16 bit signed Float einlesen über den Node-red Modbus

    This topic has been deleted. Only users with topic management privileges can see it.
    • A
      atelmblcd last edited by

      Hallo,

      ich hatte folgendes Problem:

      Mit dem Node-red Modbus ein 16 bit signed Float IEEE754 einzulesen, um an einem Messinstrument anzeigen.

      Hier die Lösung

      es muss der Buffer ausgelesen werden

      es muss eine Funktion eingefügt werden

      msg.payload=msg.payload.buffer.readInt16BE(0,1)/10;

      return msg;

      /10 weil der Wert durch 10 geteilt werden muss.

      readInt16BE für Big-endian

      readInt16LE für Little-endian

      es wird nur 8 Bit weise eingelesen darum (0,1) oder (0,2) usw

      für 32bit

      readInt32BE für Big-endian

      readInt32LE für Little-endian

      es wird nur 8 Bit weise eingelesen darum (0,1,2,3) oder (4,5,6,7) usw

      Hier der Node

      [{"id":"3cca457.5d0b93a","type":"modbus-read","z":"f85a6165.69fbd8","name":"","topic":"123","showStatusActivities":false,"showErrors":false,"unitid":"","dataType":"HoldingRegister","adr":"1","quantity":"5","rate":"1","rateUnit":"m","delayOnStart":false,"startDelayTime":"","server":"c40455ee.d2e0c8","useIOFile":false,"ioFile":"","useIOForPayload":false,"x":441.33331298828125,"y":363.3333435058594,"wires":[[],["b486508d.b99c2","f00c42e9.7173e8","faeedf2e.a6b2c8"]]},{"id":"5f904d3c.3994fc","type":"ui_gauge","z":"f85a6165.69fbd8","name":"Aussentemperatur","group":"1ce0820f.3aa9c6","order":0,"width":0,"height":0,"gtype":"gage","title":"Aussentemperatur","label":"°C","format":"{{value | number:1}}","min":"-10","max":"35","colors":["#0121fe","#18c8e7","#ca3838"],"seg1":"","seg2":"","x":1195.3334350585938,"y":179.66670989990234,"wires":[]},{"id":"731dc653.c15a28","type":"ui_gauge","z":"f85a6165.69fbd8","name":"Rücklauf","group":"907c1bce.61335","order":2,"width":0,"height":0,"gtype":"gage","title":"Rücklauf","label":"°C","format":"{{value}}","min":"15","max":"35","colors":["#00ffff","#00ff40","#ca3838"],"seg1":"","seg2":"","x":1167.1666259765625,"y":224.3333969116211,"wires":[]},{"id":"73b59d59.9f9304","type":"ui_gauge","z":"f85a6165.69fbd8","name":"Vorlauf","group":"907c1bce.61335","order":1,"width":0,"height":0,"gtype":"gage","title":"Vorlauf","label":"°C","format":"{{value}}","min":"15","max":"35","colors":["#00ffff","#00ff40","#ca3838"],"seg1":"","seg2":"","x":1165.1666259765625,"y":272.3334045410156,"wires":[]},{"id":"b486508d.b99c2","type":"function","z":"f85a6165.69fbd8","name":"signed16bit","func":"msg.payload=msg.payload.buffer.readInt16BE(0,1)/10;\nreturn msg;","outputs":1,"noerr":0,"x":754.3333129882812,"y":391.00006103515625,"wires":[["5f904d3c.3994fc"]]},{"id":"f00c42e9.7173e8","type":"function","z":"f85a6165.69fbd8","name":"signed16bit","func":"msg.payload=msg.payload.buffer.readInt16BE(2,3)/10;\nreturn msg;","outputs":1,"noerr":0,"x":753.16650390625,"y":443.00006103515625,"wires":[["731dc653.c15a28"]]},{"id":"faeedf2e.a6b2c8","type":"function","z":"f85a6165.69fbd8","name":"signed16bit","func":"msg.payload=msg.payload.buffer.readInt16BE(8,9)/10;\nreturn msg;","outputs":1,"noerr":0,"x":766.1666259765625,"y":497.3334045410156,"wires":[["73b59d59.9f9304"]]},{"id":"c40455ee.d2e0c8","type":"modbus-client","z":"","name":"Dimplex Wärmepumpe","clienttype":"tcp","bufferCommands":true,"stateLogEnabled":false,"tcpHost":"192.168.1.17","tcpPort":"502","tcpType":"DEFAULT","serialPort":"/dev/ttyUSB","serialType":"RTU-BUFFERD","serialBaudrate":"9600","serialDatabits":"8","serialStopbits":"1","serialParity":"none","serialConnectionDelay":"100","unit_id":"1","commandDelay":"1","clientTimeout":"1000","reconnectTimeout":"2000"},{"id":"1ce0820f.3aa9c6","type":"ui_group","z":"","name":"Aussentemperatur","tab":"57cf4a86.b1929c","order":2,"disp":true,"width":"6","collapse":false},{"id":"907c1bce.61335","type":"ui_group","z":"","name":"Temperaturen Heizkreis","tab":"57cf4a86.b1929c","order":1,"disp":true,"width":"6","collapse":false},{"id":"57cf4a86.b1929c","type":"ui_tab","z":"","name":"Dimplex","icon":"dashboard","order":3}]

      1 Reply Last reply Reply Quote 0
      • G
        Garf last edited by

        Hi,

        ja, dies sieht nach der gesuchten Problemlösung aus. Da muss man erst einmal drauf kommen.

        Ich habe da auch mal den ersten Versuch gewagt. Bekomme da aber nur eine Fehlermeldung zurück, "TypeError: Cannot read property 'readInt32BE' of undefined". Na ja es hätte mich ja auch gewundert, wenn es so einfach wäre.

        Ich lese genau wie Du die Modbusregister allerdings im 32bit Float IEEE754 Format aus.

        Als Beispiel für den Außentemperaturmesswert von 0,1°C:

        Modbusregister 1 = 15820 (ersten 16bit) 0011110111001100

        Modbusregister 2 = 52428 (zweiten 16bit) 1100110011001100

        Gesamtes 32 bit IEEE754 Format für den Messwert 0,1°C: 00111101110011001100110011001100

        Wie kann ich den Wert über die buffer.readInt32 Funktion einlesen?

        Folgende Modbusregister werden über das Modbus-Read-Node ausglesen:

        3639_read.jpg

        Garf

        1 Reply Last reply Reply Quote 0
        • A
          atelmblcd last edited by

          Es ist so dass man in deutschsprachigen Foren nichts dazu findet.

          Ich habe 2 Tage lang gesucht, und mindestens 16 Stunden damit verbracht, und dabei habe ich immer was übersehen.

          Geht man auf diese Webseite steht eigentlich alles da, und auch nichts.

          Klaus Lansdorf der Author von node-red-contrib-modbus, hat einem Teilnehmer in englisch sprachigen Forum https://github.com/biancode/node-red-co … /issues/42 geantwortet dass man den Buffer nehmen muss..

          biancode commented on 19 Oct 2017 •

          see Wiki and you need to know how to work with buffers ...

          Have fun!

          Unten steht auch wie man 2 16 bit zu einem 32 bit addiert.

          Das ist der einzige Hinweis den ich gefunden habe

          In diesem Forum https://groups.google.com/forum/#!topic ... t_Y7egwuio und in diesem Forum https://groups.google.com/forum/#!topic ... xl1ZrsSTVQ habe ich zuerst Hinweise gefunden.

          Geht man auf die Github Seite von Klaus findet man die Beispiele, jedoch keins mit einem signed Float.

          https://github.com/biancode/node-red-contrib-modbus

          Das SDM630 enthält jedoch die Antwort. Man muss sich nur den code ansehen.

          Iregendwo habe ich dann wieder den entscheidenden Link auf diese Seite gefunden

          https://nodejs.org/api/buffer.html#buff ... t_noassert

          Kombiniert man alles funktioniert es auf Anhieb, man muss nur drauf kommen und das ist nicht einfach.

          Ich habe aber noch einiges installiert ob man das braucht weis ich nicht

          npm install node-red-contrib-binary

          bei npm install kam ein Fehler, in einem anderen Forum habe ich dann gefunden dass man initialiesieren muss weis aber nicht mehr wo.

          MfG

          Jean

          1 Reply Last reply Reply Quote 0
          • G
            Garf last edited by

            Hallo Jean,

            ich freue mich sehr darüber, dass Du hier dein Wissen gepostest hast und so fleißig antwortest.

            Also ich habe deutlich mehr als 2 Tage und 16 Stunden bis zu meiner Lösung gebraucht. Wohlwissend, dass es irgendwo doch schon etwas fertiges geben muss, habe ich mich irgendwann dann nach erfolglosem Suchen an die Programmierung gemacht. Viel einfacher ist da natürliche deine Lösung.

            @atelmblcd:

            Ich habe aber noch einiges installiert ob man das braucht weis ich nicht

            npm install node-red-contrib-binary

            bei npm install kam ein Fehler, in einem anderen Forum habe ich dann gefunden dass man initialiesieren muss weis aber nicht mehr wo. `
            Ich denke dies braucht man eher nicht. Solche Dinge installiere ich direkt in Node-Red über den Menüpunkt "Manage palette". Es handelt sich hierbei um die Installation eines Nodes und wird wie folgt beschrieben: A Node-RED node to parse and serialize binary data. https://flows.nodered.org/node/node-red-contrib-binary

            Ich habe mir gestern deinen Flow mal angesehen und für meine Zwecke angepasst. Aber leider kommt da nur die beschriebene Fehlermeldung.

            Es ist nicht so ganz unproblematisch fremde Flows zu importieren. Dein geposteter Flow hat meine gesamten Modbus-Lese-Nodes zum erliegen und in Störung gebracht. Ursache hierfür war das Modbus-Read-Node mit seinen Eintragungen. Nach endgültigen entfernen des Nodes lief dann alles wieder.

            Jetzt werde ich mich mal weiter in die von dir geposteten Informationsquellen einlesen.

            Was steht denn in deinen Modbusregistern? Stehen in den Registern Float oder Integerwerte?

            Meine Floatwerte in den Registern habe ich ja im letzten Post schon gezeigt.

            Hier noch die Inhalte der Nodes von meinem Testflow.

            ! Read-Node:
            3639_pic3.jpg
            ! Function-Node:
            3639_pic2.jpg
            ! Modbus Response Node:
            3639_pic1.jpg
            ! Gesamt:
            3639_pic4.jpg

            Garf

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

              Würde das nicht mit dem Modbus Adapter gehen und eventuell einfacher sein?

              1 Reply Last reply Reply Quote 0
              • A
                atelmblcd last edited by

                Ich habe Node-red nicht auf einem Raspberry laufen sondern auf einer virtuellen debian Linux auf meinem Synology NAS.dort musste ich zuerst Node JS installieren dann erst Node-red weil dieser auf Node-JS aufbaut.

                Es sind mir zuviele SD Karten im Dauerbetrieb auf dem Raspberry abgeraucht insbesondere wenn man alle Messwerte in Datenbanken schreibt

                Dein Posting sieht ja gar nicht schlecht aus.

                du musst nur die Funktionen verbinden.

                Habe leider bei mir keinen Modbus mit einem signed 32 bit.

                notfalls könnte man 2 mal 16 bit auslesen und diese einem 32bit addieren.

                wie das gemacht wird steht in den Links oben.

                Habe 2 pdf eingehängt.

                Die eine Seite sind spezielle Instrumente, wenn du die benötigst poste ich wie ich es gemacht habe.

                MfG

                Jean
                5726_instrument.pdf
                5726_signed-16-bit-float.pdf

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

                  Die Instrumente sehen gut aus.

                  Kannst du die Widgets als Export einstellen?

                  Gesendet von iPhone mit Tapatalk Pro

                  1 Reply Last reply Reply Quote 0
                  • G
                    Garf last edited by

                    Hallo wendy2702,

                    deine Frage ist durchaus nachvollziehbar, wenn man ioBroker verwendet.

                    Mache ich aber nicht. Ich bin in diesem Forum was ioBroker betrifft nur lesend unterwegs.

                    Angemledet habe ich mich hier dann letztendlich um mich mit anderen Usern in Bezug auf die Node-Red Programmierung auszutauschen.

                    Wie User Jean bereits schon geschrieben hat im deutschsprachigen Raum findet man nicht nur zur Modbus-Node Anwendung nicht allzuviel. Auch zu Node-Red im Allgemeinen ist leider kaum etwas zu finden.

                    @Jean

                    Ich habe meinen Fehler gefunden. Ich hatte einfach das Function-Node am falschen Knoten angebunden. Auf dem Bild mit dem Response Node kann man dies gut erkennen. Am oberen Knoten werden keine Buffer Werte zur Verfügung gestellt werden. Den unteren Knoten mit dem Funktion-Node verbunden und schon werden die Messwerte angezeigt und können weiterverarbeitet werden. Einen weiteren Teiler musste ich jetzt nicht einsetzen. Aber vielleicht liegt es auch daran, dass ich keinen Integerwert, sondern einen Floatwert einlesen. Dies hat jedoch zur Folge, dass mir zuviele Nachkommastellen angezeigt werden. Die habe ich dann mit einer Aufrundenfunktion, auf eine Stelle hinter dem Komma, korrigiert.

                    Dies sieht dann jetzt so aus:

                    msg.payload = Originalwert ; msg.payload2 = aufgeundeter Wert
                    3639_pic5.jpg

                    Tausend Dank für den Supertipp und so einfach kann es manchmal sein. Waaaahnsinn. :lol:

                    Ich hoffe, wir lesen wieder voneinander.

                    Gruß

                    Garf

                    Edit:

                    Da haben wir wohl alle parallel geschrieben. :mrgreen:

                    Super Anleitung von dir, damit hätte ich meinen Fehler sicher deutlich schneller gefunden.

                    Die Instrumente sehen absolut spitzenmäßig aus, so etwas hätte ich wohl auch sehr gerne. 😮

                    Deshalb frage ich mal ganz schüchtern, wie macht man denn so etwas in Node-Red. Bisher habe ich so etwas nur im Scargill's Tech Blog gesehen.

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

                      Ok.

                      Dann weiterhin viel Erfolg!

                      Gesendet von iPhone mit Tapatalk Pro

                      1 Reply Last reply Reply Quote 0
                      • A
                        atelmblcd last edited by

                        Hier einmal wie ich die Instrumente gemacht habe.

                        habe alles in einen Rar ordner gepackt.

                        es müssen Java scripte in den Node-Red ordner kopiert werden.

                        um einen einfachen Zugriff zu haben habe ich einen share angelegt.

                        MfG

                        Jean

                        1 Reply Last reply Reply Quote 0
                        • G
                          Garf last edited by

                          @atelmblcd:

                          Hier einmal wie ich die Instrumente gemacht habe. `

                          Tausend Dank dafür, irgendwie fällt heute wohl für mich Weihnachten und Ostern auf einen Tag.

                          Du scheinst dich ja sehr sehr gut mit Node-Red auszukennen.

                          Garf

                          1 Reply Last reply Reply Quote 0
                          • A
                            atelmblcd last edited by

                            Sorry falsches Rar angehängt dies ist das richtige

                            1 Reply Last reply Reply Quote 0
                            • A
                              atelmblcd last edited by

                              Geht leider nicht durch weil zu gross

                              sende mir per PN deine Mailadresse, sende dir dann einen Downloadlink.

                              MfG

                              Jean

                              1 Reply Last reply Reply Quote 0
                              • A
                                atelmblcd last edited by

                                wenn du apache laufen hast dann findest du wenn alles installiert ist unter myjs Steeelseries-Canvas-Master html demos

                                Unter Rgraph sind auch demos.

                                Viel Spaas

                                du must eine Template zur Visualisierung nehmen und keine gauge.

                                die 2 ersten Zeilen geben dem Weg zu Messinstrument an.

                                Siehe mein smarty flow.

                                Deine Lösung würde mich interessieren, es ich sicher Code dabei den ich gebrauchen kann, alleine kann man nicht alles wissen.

                                MfG

                                Jean

                                1 Reply Last reply Reply Quote 0
                                • G
                                  Garf last edited by

                                  Ist angekommen. Vielen Dank dafür.

                                  Sieht aber jetzt nicht danach aus, als dass ich damit in 10 Minuten durch wäre. Ich vermute mal, da werde ich wohl noch einige Fragen zu haben.

                                  Ich bringe jetzt erst einmal das Thema mit dem Aulesen der Messwerte zu Ende, visulisiere diese dann mit den Standard-Dashboard-Nodes und wage mich dann an die Profidarstellung.

                                  Ich hoffe, Du stehst mir da dann wieder ein wenig mit Rat und Tat zur Seite.

                                  Meinst Du die Lösung für das Aufrunden? So etwas bringt Javascript ja leider von Haus aus nicht mit.

                                  Sieht so aus:

                                  ! // Funktion Runden auf drei Nachkommastellen 10=1, 100=2, 1000=3,…
                                  ! function extround(zahl,n_stelle) {
                                  ! zahl = (Math.round(zahl * n_stelle) / n_stelle);
                                  ! return zahl;
                                  ! }
                                  ! msg.payload = msg.payload.buffer.readFloatBE(0,1,2,3);
                                  ! msg.payload2 = extround(msg.payload, 1000);
                                  ! return msg;

                                  Gruß

                                  Garf

                                  1 Reply Last reply Reply Quote 0
                                  • A
                                    atelmblcd last edited by

                                    nein nicht für aufrunden sondern wie du versucht hast den signed float in Dezimal umzurechnen.

                                    Runden geht viel einfacher

                                    Einfach in der Gauge {{value | number:1}} eingeben 1 steht für 1 Nachkommastelle 2 für 2 Nachkommastellen usw.

                                    Die Instrumente sind in 5 minuten reinkopiert dann kannst du damit loslegen.

                                    einfach im Terminal die Befehle eingeben copy paste.

                                    MfG

                                    Jean

                                    1 Reply Last reply Reply Quote 0
                                    • A
                                      atelmblcd last edited by

                                      @wendy2702:

                                      Die Instrumente sehen gut aus.

                                      Kannst du die Widgets als Export einstellen?

                                      Gesendet von iPhone mit Tapatalk Pro `

                                      ich nehme an daas die Instrumente auch bei dem ioBroker funktionieren würden.

                                      Es sind nur Java scripte. Und man kann sie auch in html Seiten anzeigen

                                      Node-red verwendet Node JS als Basis.

                                      Sende mir per PN deinen Mailadresse.

                                      Ich sende die scripte dann zu.

                                      MfG

                                      Jean

                                      1 Reply Last reply Reply Quote 0
                                      • J
                                        JXA last edited by

                                        Vielen Dank für die hilfreiche Info!

                                        Ich habe ein ganz ähnliches Problem einen Sensor über Modbus TCP auszulesen.

                                        Der Wert wird als 32-bit float ausgegeben. Ich habe den Sketch angepasst,

                                        komme aber nicht zum gewünschten Ergebnis.

                                        Wie zu sehen ist, hat Sensor-1 einen Wert von 21,7 °C

                                        Über einen Hinweis würde ich mich sehr freuen!

                                        Beschreibung und Screenshoot habe ich beigefügt.
                                        5860_modbus_info.png
                                        5860_true_readout.png
                                        5860_modbus_setting.png
                                        5860_main.png

                                        1 Reply Last reply Reply Quote 0
                                        • A
                                          atelmblcd last edited by

                                          Mich würde interessieren was in der Funktion steht.

                                          füge mal ein Modbus response ein damit man die Werte sieht.

                                          am besten den Node expotieren und hier einstellen so kann ich ihn importieren und mir ansehen.

                                          Wenn ich Schwierigkeiten habe Modbus auszulesen oder verwirrende daten bekomme nutze ich zur überprüfung die gratis Software modbus doctor

                                          http://www.kscada.com/modbusdoctor

                                          Die Webseite ist auf französich aber Software kann man umstellen.

                                          ist es überhaupt ein signed float und nicht ein normaler float?

                                          ich habe nichts in der Anleitung vom x320 gefunden dass es ein signed float ist.

                                          auf der Seite 38 steht dass man von little auf big Endian umschaltung kann mittels einer Checkbox

                                          https://www.controlbyweb.com/x320/x-320 … manual.pdf

                                          Prüfe das mal mit dem Modbusdoctor

                                          mfG

                                          Jean

                                          1 Reply Last reply Reply Quote 0
                                          • P
                                            pitu61 last edited by

                                            Hallo JXA,

                                            ich habe ein ähnliches Problem und erhalte unerklärliche werte, jedoch bastel ich noch ein bisschen eigenständig rum.

                                            Sollte ich zu einer Lösung kommen, poste ich meinen Funktion code - selbstverständich.

                                            könntest du den Code deiner Funktion mit uns teilen?

                                            dann können wir dir evtl. besser helfen.

                                            Gruß

                                            Pitu61

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            871
                                            Online

                                            31.6k
                                            Users

                                            79.4k
                                            Topics

                                            1.3m
                                            Posts

                                            5
                                            67
                                            10716
                                            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