Modbus RTU Variablen in TwinCat nutzen

Sev

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich versuche gerade über Modbus RTU eine CX7080 mit einer Heizungssteuerung zu verknüpfen. Da wollte ich erstmal zum Testen nur die InputRegister der Steuerung auslesen. Also habe ich die Pc_Com schnittstelle der Beckhoff eingestellt und die 64 E/A Bytes mit denen des Fbs verknüpft. Ich nutze in einem Eigenen FB den ModbusRtuMasterV2_PcCOM von Beckhoff und rufe meinen FB den dann im MAIN(Prg) auf.
Die Verbindung funktioniert auch. (Nur die Werte kommen mir auch etwas komisch vor, Input Register 4096 ist z.B. die Isttemperatur und wird auf der Steuerung mit 16°C angezeigt und im Baustein unter D[0] schwankt der Wert zwischen 134(13,4°C) und 164(16,4°C) hin und her.)

Ich will die Werte in einen ARRAY schreiben, so dass ich sie dann im SPS Programm sauber verwenden kann.
Das Problem ist aber ich sehe die Werte nur im InData und OutData Array des fbModbusConfig und die werden aber nicht in meinen definierten Array geschrieben, den ich ja als speicherplatz als ADR(arrReadRegs) angegeben habe.

Ich habe mit ST und Beckhoff Programmierung noch keine weitere Erfahrung, also wäre es Interessant, ob ihr das auch so machen würdet oder oder wie man das professionell sauber und schön machen würde.
Danke :D
 

Anhänge

  • Screenshot 2026-04-11 101950.png
    Screenshot 2026-04-11 101950.png
    22 KB · Aufrufe: 20
  • Screenshot 2026-04-11 102022.png
    Screenshot 2026-04-11 102022.png
    5,7 KB · Aufrufe: 16
die Isttemperatur und wird auf der Steuerung mit 16°C angezeigt und im Baustein unter D[0] schwankt der Wert zwischen 134(13,4°C) und 164(16,4°C) hin und her.)
Die Steuerung wird vermutlich zur Anzeige einen stark gefilterten Wert verwenden, aber den aktuellen Wert ungefiltert im Register weitergeben.
 
Hier ist die Registerbeschreibung, und so sieht das im Onlinemodus aus.
 

Anhänge

  • 20220314_18_Register.Modbus_Rev_0.90-3 (1).pdf
    20220314_18_Register.Modbus_Rev_0.90-3 (1).pdf
    135,1 KB · Aufrufe: 7
  • Screenshot 2026-04-13 084035.png
    Screenshot 2026-04-13 084035.png
    50,2 KB · Aufrufe: 13
  • Screenshot 2026-04-13 084659.png
    Screenshot 2026-04-13 084659.png
    18,5 KB · Aufrufe: 13
  • Screenshot 2026-04-13 085124.png
    Screenshot 2026-04-13 085124.png
    27,5 KB · Aufrufe: 13
Schaust du hier: https://infosys.beckhoff.com/englis...ent/1033/tcplclibmodbusrtu/455283723.html&id=
Fehler 150 = ModbusError_CRC. Modbus Berechnet in einem Frame einen CRC und da passt was nicht.

Meine Vermutung: Physik.
RS232 oder RS485? Endwiderstände=...


Und programmiertechnisch: Wenn du mehrere Werte abholst würde ich dir empfehlen eine Struktur zu basteln mit einem Alignment von 1 und dann dieses direkt im Baustein zu nutzen oder aber per memcpy umzukopieren.

Alternativ auch eine Union....
 
sag doch mal was im Fehlerfall für den Aufruf des Bausteins in den folgenden Variablen steht (das ist was über dann physikalische gesendet bzw. empfangen wird/wurde).
Aufruf also nur 1x.
<FB_MbMaster>.com.SendMode.data
<FB_MBMaster>.com.RecMode.data

Im Interface werden Werte überschrieben somit sagt mir dein Array D nicht viel.
Vielleicht sieht man dann was ankommt/falsch ankommt und kann daraus dann Rückschlüsse ziehen wo der Fehler kommt.
Wie lange sind denn die Kabellängen? Wenn es kurze Wege sind könnte man auch mal den Wiederstand weglassen.
Und ich hatte auch schonmal den Fall das die zwei Leitungen gedreht werden mussten damit die Daten sauber kamen...
 
Achso ok
 

Anhänge

  • Screenshot 2026-04-14 070049.png
    Screenshot 2026-04-14 070049.png
    38,6 KB · Aufrufe: 5
  • Screenshot 2026-04-14 070114.png
    Screenshot 2026-04-14 070114.png
    35,4 KB · Aufrufe: 5
  • Screenshot 2026-04-14 070353.png
    Screenshot 2026-04-14 070353.png
    38,4 KB · Aufrufe: 4
  • Screenshot 2026-04-14 070409.png
    Screenshot 2026-04-14 070409.png
    38,2 KB · Aufrufe: 4
  • Screenshot 2026-04-14 070422.png
    Screenshot 2026-04-14 070422.png
    39,3 KB · Aufrufe: 4
  • Screenshot 2026-04-14 070441.png
    Screenshot 2026-04-14 070441.png
    24,5 KB · Aufrufe: 5
Der SendeStream ist 0A 04 01 00 00 01 34 71 (Adresse 10, Functioncode 4. Adresse 4096 und 1 Register zu lesen. Die letzten zwei Byte sind ein CRC. Das passt.

Empfangen müsstest du so ein Telegramm das wie folgt aufgebaut ist. 12 34 ist dabei der Wert des Registers.
0A 04 02 12 34 CRC CRC

Empfangen wird aber sowas : 44 24 08 C8 D6 96 FD 00 50. Da besteht überhaupt keine Ähnlichkeit, noch nicht mal die Länge stimmt (7 versus 9 Byte).
Du hast das Anfrage mehrmals abgeschickt und mehrmals die identische Antwort bekommen, d.h. die Bits fallen nicht willkürlich.

Was da schiefgeht kann ich mir nicht erklären, da wirst du einen try&error Ansatz nuten müssen. A/B schon getauscht? Kurze Leitung nutzen?
Parameter und Baudrate nochmal prüfen.
 
Hallo, Danke auf jeden Fall für eure Antworten. Die haben mir auf jeden Fall weiter geholfen und ich habe was gelernt!
Es lag tatsächlich an den Busabschlusswiderständen. Die habe ich jetzt mal raus gemacht und siehe da es funktioniert. :D
 
Mysteriös... Hattest du vielleicht (unwissentlich?) mehr als 2 Abschlusswiderstände dran/aktiv oder waren die viel kleiner als 100 Ohm (defekt?)?

Wie lang ist das RS485-Kabel? Baudrate?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Rs485 mit Abschlusswiderstand *ohne* Vorspannungswiderstände nach +/- kann die Differenzspannung zwischen A und B unzulässig weit runterziehen. Im günstigsten Fall geht nix mehr, im ungünstigen hat man massig Übertragungsfehler.

Ich sammel immer gern die kleinen Platinen von Siemens Umrichtern ein, die achtlos weggeworfen werden (rs485 Abschluss Vierpol).
 
Zurück
Oben