Modbus TCP - write multiple registers

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Manuel99
    Azubi
    • 20.03.2024
    • 9

    #1

    Modbus TCP - write multiple registers

    Hallo,
    ich bin gerade dabei ein Notstromaggregat bzw. dessen Controller (DSE 4520 MKII) zu integrieren.

    Jedoch scheitere ich beim Senden der Befehle zum Umschalten des Betriebsmodus.
    Laut Beschreibung müssen der System Control Key und das Compliment dazu gleichzeitig auf das gleiche Register geschrieben werden, damit der Betriebsmodus umgeschaltet wird. (siehe Beschreibung anbei)
    Jetzt habe ich es so vorbereitet, dass mittels Button zwei Multiplexxer die Werte auf zwei Analogaktuatoren schreiben. Leider funktioniert es nicht so.
    Mache ich da was falsch? Oder müssen die beiden Werte auf einen Analogaktuator geschrieben werden?

    Zur Erklärung, die Registeradresse ist immer oben die Pagenummer * 256 + Registeroffset. Somit für den System control key 16*256+8=4104 und für das Compliment 4105.


    Vielen Dank für eure Unterstützung!
    Manuel

    Angehängte Dateien
    Zuletzt geändert von Manuel99; 20.03.2024, 16:20.
  • Jan W.
    Lox Guru
    • 30.08.2015
    • 1369

    #2
    Du musst beide Werte in der selben Schreiboperation senden. Aus den Infos habe ich herausgelesen, dass Du Werte mit 16-Bit schreibst.

    Das geht nur, wenn Du beide Werte kombinierst (I1+I2*65536) und dann als 32-Bit Zahl in die kleiner Registersdresse schreibst.
    Miniserver v14.5.12.7, 2x Ext., 2x Relay Ext., 2x Dimmer Ext., DMX Ext., 1-Wire Ext., Gira KNX Tastsensor 3 Komfort, Gira KNX Präsenzmelder, Fenster- und Türkontakte, Loxone Regen- und Windsensor, Gira Dual Q Rauchmelder vernetzt, 1x Relais-Modul
    Loxberry: SmartMeter, MS Backup, CamConnect, Weather4Lox
    Lüftung: Helios KWL EC 370W ET mit Modbus TCP - via Pico-C
    Heizung: Stiebel Eltron WPF 5 cool (Sole-Wasser WP) mit ISG, FB-Heizung mit 18 Kreisen, Erdsonde - via modbus/TCP
    Node-RED: IKEA Tradfri

    Kommentar

    • Labmaster
      Lox Guru
      • 20.01.2017
      • 2574

      #3
      ergänzend zum vorherigen Beitrag, i2 könnte man man ja auch gleich mitberechnen.

      Formel:
      i1 + (65535 - i1) * 65536

      also i1 direkt auf die unteren 16 Bit des 32 Bit (Modbus Wertes) dann das Komplement aus i1 (also 65535 - i1) um 16 Bit hochschieben (mit * 65536) und zum den niedrigen 16 Bit hinzuaddieren.

      Kommentar

      • Manuel99
        Azubi
        • 20.03.2024
        • 9

        #4
        Hallo, vielen Dank für eure Antworten!
        Ich habs jetzt mit der Formel i1 + (65535 - i1) * 65536 gelöst, funktioniert zwar noch nicht aber ich glaube jetzt liegts am Controller.
        Das werd ich noch mit dem Kundensupport des Controllers abklären und melde mich wieder wenn es final funktioniert.

        Der AQ Wert muss jedenfalls als 32-bit UInt auf die Registeradresse 4104 geschrieben werden. Der 16-bit UInt war falsch.
        Klicke auf die Grafik für eine vergrößerte Ansicht  Name: image.png Ansichten: 0 Größe: 50,9 KB ID: 427676
        Zuletzt geändert von Manuel99; 25.03.2024, 19:56.

        Kommentar

        • Labmaster
          Lox Guru
          • 20.01.2017
          • 2574

          #5
          je nachdem wie die Register im Controller belegt sind solltest du auch mal testen ob die Änderunger der jeweiligen Reihenfolgen etwas bringt.
          (Loxone Checkbox "16-bit regitster" und "Order of Registers")
          Ich würde da auch mal die anderen drei Kombinationen durchprobieren falls noch nicht geschehen.

          Kommentar

          • Jan W.
            Lox Guru
            • 30.08.2015
            • 1369

            #6
            Manuel99: Welche Werte musst Du schreiben? Statt 3x die gleiche Formel und eine "UND" Verknüpfung mit Auswahl für Analogwert könntest Du z.B. im Baustein "Radiotasten" statt O1-O3 den Ausgang "N" (Nummer des aktiven Ausgangs) als Eingang für ein einen Statusbaustein nehmen, der dann als Statuswert den gewünschten Wert ausgibt und der als Input für EINEN Formelbaustein dient. Ggf. noch "Remanenz" einschalten. Wenn es nur die 35700+"N" ist, dann könntest Du Dir sogar den Status sparen und das direkt in die Formel einarbeiten. Hinweis: "0" ist auch eine Auswahl bei den Radiotasten - passt ja mit "Aus".
            Miniserver v14.5.12.7, 2x Ext., 2x Relay Ext., 2x Dimmer Ext., DMX Ext., 1-Wire Ext., Gira KNX Tastsensor 3 Komfort, Gira KNX Präsenzmelder, Fenster- und Türkontakte, Loxone Regen- und Windsensor, Gira Dual Q Rauchmelder vernetzt, 1x Relais-Modul
            Loxberry: SmartMeter, MS Backup, CamConnect, Weather4Lox
            Lüftung: Helios KWL EC 370W ET mit Modbus TCP - via Pico-C
            Heizung: Stiebel Eltron WPF 5 cool (Sole-Wasser WP) mit ISG, FB-Heizung mit 18 Kreisen, Erdsonde - via modbus/TCP
            Node-RED: IKEA Tradfri

            Kommentar

            • Manuel99
              Azubi
              • 20.03.2024
              • 9

              #7
              Hallo, vielen Dank für eure Antworten!

              Ich habe jetzt alle möglichen Kombinationen probiert, jedoch ohne Erfolg.
              Vom Controllerhersteller habe ich ein Beispiel bekommen, die nutzen die Software ModScan64 um Sachen zum/vom Aggregat zu schreiben/lesen.
              Dabei nutzt er Registeradresse 4105, und schreibt die beiden Werte, für z.B. Betriebsmodus Aus (35700 & 29835) per 32-Bit USInteger.
              Siehe Bild anbei.

              Leider weiß ich jetz aber nicht wie ModScan64 die Bits zusammensetzt.
              Ich hab auch schon versucht 35700 und 29835, getrennt als 16-Bit USInteger in die Register 4105 & 4106, mittels 16-preset multiple registers zu schreiben. Jedoch hat das auch nicht funktioniert.
              Angehängte Dateien

              Kommentar

              • Tico
                Lox Guru
                • 31.08.2016
                • 1035

                #8
                Wenn Sie 35700 in binäre Werte umwandeln, ist es -

                1000101101110100

                Bei der Umrechnung von 29835 in Binärzahlen ergibt sich -

                0111010010001011

                Setzt man diese binären Werte zusammen, erhält man -

                01110100100010111000101101110100

                Dieser Binärwert in Dezimalzahlen ist 1955302260.

                Sie müssen also den dezimalen Wert 1955302260 als 32-Bit-Ganzzahl ohne Vorzeichen an die Registeradresse 4105 senden.

                Dann sieht die Registeradresse 4105 das binäre Äquivalent von 35700 und die Registeradresse 4106 sieht das binäre Äquivalent von 29835.

                Ich würde zuerst versuchen -
                Befehl 16 - Mehrere Register voreinstellen
                Datentyp - 32bit Ganzzahl ohne Vorzeichen
                16-Bit-Register - geprüft
                Reihenfolge der Register - geprüft​
                Ich spreche kein Deutsch. Gib Google Translate die Schuld, wenn ich unverständlich bin.

                Kommentar

                • Manuel99
                  Azubi
                  • 20.03.2024
                  • 9

                  #9
                  Hallo Tico,
                  genau das habe ich gemacht. Funktioniert aber nicht.
                  Siehe Bild anbei.

                  Edit, jetzt funktionierts.
                  Registeradresse 4104 und 16-bit Register aktiv.
                  Angehängte Dateien
                  Zuletzt geändert von Manuel99; 30.03.2024, 15:17.

                  Kommentar

                  Lädt...