Modbus-Verbindung zu Codesys Soft SPS

Hallo zusammen,

vielleicht können mir ja hier die Profis weiterhelfen.

Ich habe eine Codesys Soft-SPS (Codesys Contorl for Linux SL, 4.16.0) auf einem Ubuntu.Programmiert wird diese mit Codesys V3.5 SP21 Patch 2 +.

Auf der anderen Seite habe ich Homeassistant OS 2025.8.3.

Die Configuration in Codesys sieht so aus:

Ich möchte Probeweise 2 Holding und 2 Input registers sowie 1 Coils und 1 Discrete Input übertragen und starten sollen die Adressen bei 0.

Ich konnte schon mit einer 2. Applikation auf der SPS als Client Daten austauschen.

Ich kann auch Daten von einem Windows-PC über das Programm “ModbusTCP” ( ModbusTCPTool – Kostenloser Download und Installation unter Windows | Microsoft Store ) austauschen:

Bei Homeassistant scheitere ich aber leider.

Ich habe die Modbus Integration aus dem Store.

Und meine Configuration.yaml sieht so aus:

modbus: !include modbus.yaml

die modbus.yaml so:

- name: demo_hub
  type: tcp
  host: 192.168.1.88 # codesys sps
  port: 502
  sensors:
    - name: holding4
      unit_of_measurement: "W"
      slave: 0
      address: 0
      data_type: uint16
      scan_interval: 5
      device_class: power
    - name: input
      unit_of_measurement: "W"
      slave: 0
      address: 0
      data_type: uint16
      scan_interval: 5
      device_class: power

Jetzt habe ich schon verschiedene Werte für “Slave” und “Address” versucht, aber ich bekomme keine Werte von der SPS in den Homeassistant-Entitäten, die korrekt angelegt werden angezeigt.

Kennt jemand die korrekten Adressen, mit denen Codesys die Werte schickt? “0” ist es nicht”, “300000” ode rähnliches was ModbusTcpTool anzeigt auch nicht.

Ohne das ich jetzt das Codesys kenne.

Aber ich würde denken das folgendes nicht funktionieren kann.

identischer host
identischer slave
identischer port
identische address

name ist erstmal schall und rauch das ändert ja nix am modbus Befehl sondern vergibt den Namen der Entität die du in Home Assistant bekommst

slave würde ich mal auf 1 stellen es sei denn dieses codesys gibt was vor bwz. du kannst die Nummer dort einstellen.
Aber für die modbus typen also Coils, Discrete Inputs, Hoilding Registers, Input Registers würde ich schon unterschiedliche Startadressen in der Codesys Config verwenden, 0, 100, 200, 300 oder so was in der Art.

Ich würde dir PowerHud Modbus Tester (www.powerhud.com) empfehlen denn für den Fall das du mehere Register auf einmal einlesen muss wirft der dir nicht nur stumpf einen Wert zurück sondern auch die Varianten was das Ergebnis denn wohl wäre wenn es sich um BigEndian, LittleEndian und ebenfalls beide ByteSwapped handelt.

Mal vereinfacht erklärt eine 1 in 2 Registern kann ja bedeuten

  1. register 0 + 2. register 1
    es ist aber ebenfalls möchlich das es wie folgt gelöst ist
  2. register 1 + 2. register 0

zum YAML. So falsch ist das nicht. Mich wundert etwas da du schreibst du hast modbus vom store. Ich hoffe du meinst damit die interne modbus Integration und nicht irgendwelche lustigen HACS Nachahmerprodukte.

Und hier

hast du bestimmt alle Passagen auch zu RTUoverTCP gelesen. Hab ich selbst aber noch nie benötigt, denn sowas macht eigentlich das Gerät das sozusagen als rtu<->tpc gateway funktioniert, also dein codesys.

Hallo justone,

danke für die schnelle Antwort.

Ja, ich nutze die interne Modbus Integration.

Irgendwie komme ich auch noch mit den Bezeichnungen Master, Slave sowie Client und Server durcheinander. Die Codesys-SPS kann beides sein, sowohl Master/Client oder Slave/Server. Ist HomeAssistant da irgendwie festgelegt? So falsch hat sich das nicht angefühlt die SPS Slave/Modbus-Server sein zu lassen.

Vielleicht muss ich meinen Aufbau noch ein bissel erklären:
HomeAssistant firmiert unter der IP 192.168.1.32. Das Homeassistant OS ist nicht direkt auf dem Rechner installiert, sondern in einer ProxMox-VM.
Die SPS ist unter 192.168.1.88 erreichbar. Das zugrundeliegende OS ist ubuntu. Auch diese läuft in einer eigenen Proxmox-VM auf dem selben Rechner wie das homeassistantOS.
Der Windows-PC hat die IP 192.168.1.25. Auf dem läuft die ModbusTCP-SW. Von dort kann ich Daten zur SPS senden bzw. Daten von dort empfangen.
Daraus leite ich mal ab, dass die SPS durchaus aus dem Proxmox raus auf das LAN mit dem MODBUS-Paketen kommt und die Pakete, die der Windows-PC schickt auch in der SPS ankommt. Da kann der Fehler nicht liegen.
Der Funktionsbaustein in der SPS hat einen Verbindungszähler. Läuft Homeassistant ist dieser Zähler bei 1, ist Homeassistant aus, ist der Verbindungszähler bei 0. Die beiden (SPS und Homeassistant), scheinen sich also zu finden.
Die Logs die homeassistant schreibt (Einstellungen → System→Protokolle) liefern leider auch keinen sinnvollen Hinweis. Wenn die SPS nicht verfügbar ist, steht im Log dass die Verbindung fehlschlägt (Errno 111). Wählt man eine “Address” größe 65535 kommt ein Fehler, dass die Adresse falsch ist. Soweit alles einleuchtend und kein weiterer Erkenntnisgewinn.

Weißt du die Modbus-Adressen für die Register vergeben werden? Müssen die für alle Register eindeutig sein, oder müssen sie für jeden Typen (Holding, ininput, coils,discrete) eindeutig sein?
So wie ich das sehe, kann die Modbus-app von mir ähnliches wie powerhud.com.

Wie werden die Modbus-Adressen im HomeAssistant eingegeben? dezimal oder hexadezimal? Was ist eine Einheit (Bits, Bytes, 2 Bytes)? und ändert die Einheit zwischen den Registers und den binaryInputs/Coils?

Mein nächster Versuch wird sein, in der SPS unterschiedliche Start-Adressen anzugeben.

Dann würde ich versuchen ob ich die Modbus-Pakete auch auf dem HomeassistantOS empfange. Dafür müßte ich mir doch “einfach” nur mit der pymodbus-Bibliothek ein Skiprt auf dem homeassistant OS bauen, was die MODBus Vebrindung aufbaut und dort die Inhalte empfängt, so ganz ohne Homeassistant. Dem HomeAssistant würde ich für den Versuch wieder die ModBus-Integration löschen/deinstallieren. Nicht dass der da noch mitspielen will. Wenn das schon nicht geht, habe ich ein Problem entweder mit der Netzwerk-Geschichte in dem Proxmox oder direkt beim Empfang vom HomeAssistant OS. Dann ist aber die Ursache schonmal nicht homeAssistant und dessen Einstellungen oder Integration.

Modbus schreiben kannst du in Home Assistant sehr einfach testen und dann ergeben sich auch Antworten auf Denkfehler ob ein slave nun 0 oder 1 ist wie von selbst, sprich du lernst direkt warum das niemals 0 sein kann.

Der Computernerd baut immer ne schleife von 0-4 für 5 Elemente, also ist das erste 0
Der Handwerker der dir 5 Steckdosen einbaut wird dir allerdings niemals ne Dose 0 verbauen sondern nur die Dosen 1 bis 5

Fazit: modbus ist kein geeky Spielkram für nerds, das ist ne professionelle Lösung. Erkennt man das wenig Nullen im Spiel sind

Also Lehrstunde für die Slave-Nummerierung :slight_smile:

Entwicklerwerkzeuge>Aktionen

dort dann bei Aktion modbus.write_register auswählen

Du wirst jezt nach 4 Dingen gefragt.
Adresse (das ist sehr logisch)
Server (was hier wohl der server sein soll)
Es git n slider .. der kleinstmögliche Wert ist 1. Hmmmmm mal überlegen.
Nein nicht überlegen, es gibt einen blauen link … “Zum YAML-Modus”
Und siehe da der Server ist gar nicht der Server sondern der Slave ist gemeint.
Dann noch addresse, sollte klar sein was das ist.
Und Hub … zum Glück steht da “Name des Modbus-Hubs” sonst wäre man wieder überfordert.

Am Ende auf “Aktion ausführen” und dann solltest du eigentlich mit der Software an deinem PC sehen können das sich der Registerwert geändert hat.

Ändert sich der Wert nicht … dann bist du wieder auf der SPS Seite gefordert denn dann müsstest du mal schauen ob die Adresse des modbus registers auf read-only steht, es sich also um ein Register handelt das du nur lesen kannst.

1 „Gefällt mir“

Hallo justone,

danke für die Antwort, komme erst heute dazu mir das anzusehen.

Modbus schreiben funktioniert wie du es beschrieben hast, also kommt der HomeAssistant tatsächlich raus bis zur SPS oder auch bei zum WindowsPC. Wertänderungen die ich im Homeassistant vornehme kommen sowohl bei den Input-Registern als auch bei den Coils auf der SPS oder dem WindowsPC an.

Ich habe auch erfolgreich Modbus Register von einem anderen Gerät ausgelesen und geschrieben. Ich habe meine alte Modbus-Konfiguration einer älteren HA Supervised-Installation von einem Victron cerbo GX auf die neue Installation kopiert und siehe da: Ich kann Werte lesen, die der cerbo GX zur Verfügung stellt.

Jetzt weiß ich nicht wie ich weitermachen kann:
Mit der neuen Homeassistant OS-Installation kann ich Werte zur SPS schreiben.
Mit der neuen Homeassistant OS-Installation kann ich Werte von einem anderen Modbus-Gerät lesen..
Mit einem Windows PC kann ich Werte zur SPS schreiben.
Mit einem Windows PC kann ich Werte von der SPS lesen.
Von einer Applikation der SPS auf eine andere Applikation Werte schreiben.
Von einer Applikation der SPS auf eine andere Applikation Werte lesen.

Was leider irgendwie nicht geht, was aber für mein Vorhaben essentiell ist:
Mit der Homeassistant OS-Installation Werte von der SPS lesen.

Irgendwie kann ich das Problem nicht weiter einkreisen. Irgendwie kann jeder Partner senden und empfangen, aber irgendwie mag Homeassistant von manchen Partnern nicht empfangen.

Mal schauen, wann ich wieder Zeit finde und entweder den obigen Versuch teste ( direkt im Homeassistant os mit der python bibliothek modbus senden /empfangen), oder einfach mal neumodisches Zeug ausprobiere und der SPS MQTT beibringe. Das kann ja der Homeassistant mit dem Mosquitto broker Add-On.