ModBus TCP Interface

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Mathias
Beiträge: 1767
Registriert: 03.11.2010, 10:25
System: CCU
Wohnort: Aachen
Hat sich bedankt: 58 Mal
Danksagung erhalten: 253 Mal
Kontaktdaten:

Re: ModBus TCP Interface

Beitrag von Mathias » 30.10.2022, 11:00

WolfHenk hat geschrieben:
29.10.2022, 23:01
Ich kriege das aber mit dem Cuxd nicht gebacken.
Wenn Du nur ein virtuelles Gerät benötigst, damit die Modbus-Datenpunkte besser in der CCU integriert sind, kannst auch den CCU-Jack verwenden. Dieser hat für diesen Zweck statische/funktionslose virtuelle Geräte.

Die Vorgehensweise ist dann folgendermaßen:
  • CCU-Jack installieren.
  • Virtuelle Geräte aktivieren. CCU neu starten.
  • Ein virtuelles Geräte anlegen mit 4 statischen Schaltaktoren und 4 statischen Tür-/Fensterkontakten. Gerät im Posteingang der CCU in Empfang nehmen.
  • Ein Programm anlegen, das bei einer Änderung der 4 Schaltaktoren angestoßen wird. Das HM-Skript liest den Zustand der Schaltaktoren und schreibt sie über Modbus.
  • Ein weiteres Skript anlegen, das zyklisch angestoßen wird und die 4 Werte über Modbus liest und dann in die Datenpunkte der Tür-/Fensterkontakte schreibt.
  • Danach kann das virtuelle Gerät ganz normal in CCU Programmen verwendet werden.
Im Handbuch im Abschnitt Virtuelle Geräte findest weitere Informationen.

WolfHenk
Beiträge: 14
Registriert: 29.07.2019, 09:44
Hat sich bedankt: 1 Mal

Re: ModBus TCP Interface

Beitrag von WolfHenk » 31.10.2022, 20:21

so ausprobiert:

Skript:

Code: Alles auswählen

! **************** Lesen und Schreiben mit system.Exec ****************
string lGetOut;
string lGetErr;
var out;

! Lesen des Wertes
system.Exec("tclsh /usr/local/addons/modbus/modbus_interface.tcl 192.168.3.219 502 1 2 0 1",&lGetOut,&lGetErr);
dom.GetObject('ModBusHeizung:1').State(0 + lGetOut);
system.Exec("tclsh /usr/local/addons/modbus/modbus_interface.tcl 192.168.3.219 502 1 2 1 1",&lGetOut,&lGetErr);
dom.GetObject('ModBusHeizung:2').State(0 + lGetOut);
system.Exec("tclsh /usr/local/addons/modbus/modbus_interface.tcl 192.168.3.219 502 1 2 2 1",&lGetOut,&lGetErr);
dom.GetObject('ModBusHeizung:3').State(0 + lGetOut);
system.Exec("tclsh /usr/local/addons/modbus/modbus_interface.tcl 192.168.3.219 502 1 2 3 1",&lGetOut,&lGetErr);
dom.GetObject('ModBusHeizung:4').State(0 + lGetOut);
WriteLine("gelesen");

! Coils schreiben
out = dom.GetObject("ModBusHeizung:5").State();
Write("ModBusHeizung:5.State() = ");WriteLine(out);
if (out=="true") {
system.Exec("tclsh /usr/local/addons/modbus/modbus_interface.tcl 192.168.3.219 502 1 5 0 1",&lGetOut,&lGetErr);
WriteLine("ModbusOUT1: AN");
          }
else
{
system.Exec("tclsh /usr/local/addons/modbus/modbus_interface.tcl 192.168.3.219 502 1 5 0 0",&lGetOut,&lGetErr);
WriteLine("ModbusOUT1: AUS");
          };

out = dom.GetObject("ModBusHeizung:6").State();
Write("ModBusHeizung:6.State() = ");WriteLine(out);
if (out=="true") {
system.Exec("tclsh /usr/local/addons/modbus/modbus_interface.tcl 192.168.3.219 502 1 5 1 1",&lGetOut,&lGetErr);
}
else
{
system.Exec("tclsh /usr/local/addons/modbus/modbus_interface.tcl 192.168.3.219 502 1 5 1 0",&lGetOut,&lGetErr);
          };

out = dom.GetObject("ModBusHeizung:7").State();
Write("ModBusHeizung:7.State() = ");WriteLine(out);
if (out=="true") {
system.Exec("tclsh /usr/local/addons/modbus/modbus_interface.tcl 192.168.3.219 502 1 5 2 1",&lGetOut,&lGetErr);
          }
else
{
system.Exec("tclsh /usr/local/addons/modbus/modbus_interface.tcl 192.168.3.219 502 1 5 2 0",&lGetOut,&lGetErr);

          };

out = dom.GetObject("ModBusHeizung:8").State();
Write("ModBusHeizung:8.State() = ");WriteLine(out);
if (out=="true") {
system.Exec("tclsh /usr/local/addons/modbus/modbus_interface.tcl 192.168.3.219 502 1 5 3 1",&lGetOut,&lGetErr);
WriteLine("ModbusOUT4: AN");
          }
else
{
system.Exec("tclsh /usr/local/addons/modbus/modbus_interface.tcl 192.168.3.219 502 1 5 3 0",&lGetOut,&lGetErr);
WriteLine("ModbusOUT4: AUS");
          };          
Das Script läuft skrupellos alle Sekunde stur durch...

Und es funktioniert. Ich bedanke mich herzlich für die Hilfe.

WolfHenk
Beiträge: 14
Registriert: 29.07.2019, 09:44
Hat sich bedankt: 1 Mal

Re: ModBus TCP Interface

Beitrag von WolfHenk » 03.11.2022, 20:47

... aber der Mensch ist ja nie zufrieden...
Aus der Automatisierung stammend hat für mich die SPS immer den Master (hier bei Modbus-TCP heißt es "Client").

Sprich ich suche nach dem einfachen Modbus-Server Script.
Sprich sowas wie auf der ersten Seite dieses Threads, bloß soll halt der Raspi auf die SPS antworten und nicht sie abfragen.

*grins* Ja, ich weiß. Es geht doch. Aber das ist halt ne Glaubensfrage. ...

...Oder eigentlich nicht.
25 Jahre in der SPS und Roboterwelt prägen nachhaltig.
Und das, was am wenigsten ausfällt ist halt die SPS. Deswegen ist sie immer Master.

Freue mich auf... Nein. Nicht auf Node Red, denn ohne Lehrgang krieg ich so'n klickibunti net gebacken.
war schon schwierig genug die logo in fup zu programmieren und kein awl zu haben.
...wie vermiss ich das alte awl doch. aber das kann ja kaum noch einer der jungen burschen...

/wehleid beiseite. Freue mich auf Hinweise

Grüße
WolfHenk

Luzzzmann
Beiträge: 14
Registriert: 04.03.2018, 18:39
Hat sich bedankt: 5 Mal

Re: ModBus TCP Interface

Beitrag von Luzzzmann » 14.11.2022, 11:18

Guten Morgen zusammen,
ich bin nun auch mal dabei mich in die Materie einzulesen.
Ziel ist es, alle interessanten Werte, Erzeugung, Einspeisung, mom.Verbrauch etc. in die CCU zubekommen und anzeigen zu lassen.

Mit dem https://en.radzio.dxp.pl/modbus-master-simulator/ bekomme ich aber schon keine Verbindung. Kann es sein, dass ich im Smartmeter noch der TCP Port aktivieren muss? Scheinbar ist mein Plenticore 8,5 mit RS458 angebunden.
Oder sehe ich das falsch? Siehe Anhang.

Danke euch... Aller Anfang ist schwer...

Gruss
Dateianhänge
2.JPG
1.JPG

Benutzeravatar
Cupra85
Beiträge: 30
Registriert: 18.11.2022, 20:13
System: CCU
Hat sich bedankt: 3 Mal

Re: ModBus TCP Interface

Beitrag von Cupra85 » 19.11.2022, 19:21

Hi, ich brauche auch mal Hilfe bei der Modbus Anbindung.

Ich möchte von meiner Pool Messanlage 3 Messwerte auf der CCU angezeigt bekommen. (Modbus Infos im Anhang ab Seite 30)
benötigte Register 400100, 400115, 400130

Skript ist auf die CCU3 kopiert.
Wie geht es jetzt weiter?

Gruß Daniel
Dateianhänge
700 P_W3T321511_WT.050.810.010.DD.IM.book.pdf
(4.29 MiB) 47-mal heruntergeladen

guidoLev
Beiträge: 4
Registriert: 08.12.2021, 00:18
System: Alternative CCU (auf Basis OCCU)

Re: ModBus TCP Interface

Beitrag von guidoLev » 08.01.2023, 01:46

Hallo Cupra85,

leider ist hier noch nicht viel Doku zu gewachsen aus der wir abschreiben können ;-)

Alles wichtige steht im ersten Beitrag und dann ggf. in den nächsten 3 Beiträgen:

Syntax:
Lesen : modbus_interface.tcl IP-Adresse Port DeviceNummer Funktion Register Länge
Schreiben : modbus_interface.tcl IP-Adresse Port DeviceNummer Funktion Register Wert

Port : normalerweise 502
DeviceNummer : Beispiel Wallbe 255 , Solaredge 1
Funktion :
01 read coils
02 read discrete inputs
03 read holding registers
04 read input registers
05 write single coils
06 write single register
15 write multible coils
16 write multible registers
Register, Länge und Wert : siehe Dokumentation des ModBus-Geräts


Ich habe mich für die Variante system.exec() entschieden. Siehe Beitrag 4 von haengematte.

Ich starte gerade aktuell damit meine Paradigma Heizungs- und Solaranlage auszulesen. Paradigma hat hierzu ebenfalls eine Anleitung herausgegeben (siehe auf der Seite unten): https://www.paradigma.de/produkte/regel ... comfortll/

Mein Vorgehen:
  • die beiden .tcl aus Beitrag 1 so wie beschrieben auf der Raspberrymatic abgelegt
  • neue Systemvariable angelegt: Paradigma_WW-Wärmemenge vom Typ Zahl
  • neues Programm angelegt: Bedingung Zeitsteuerung alle 5 Min.
  • mit Script:

    Code: Alles auswählen

    string wwwmGetOut;
    string wwwmGetErr;
    integer wwwaermemenge;
    system.Exec("tclsh /usr/local/addons/modbus/modbus_interface.tcl 192.168.178.82 502 1 03 24 1",&wwwmGetOut, &wwwmlGetErr);
    var wwwaermemenge = (0.00 + wwwmGetOut) /10;
    dom.GetObject('Paradigma_WW-Wärmemenge').State(wwwaermemenge);
    
Das erste Auslesen hat geklappt, jetzt geht es bei mir nach und nach weiter mit anderen Werten. Und mal schauen ob das mit dem Ableseintervall so auch sinnvoll ist. Hier gerne auch Tipps und Ideen im Forum.

DeviceNummer = Modbus Unit No o.ä..
Dürfte bei dir evtl. auch 1 sein, sofern in deiner Gerätedoku nichts anderes angegeben ist. Bei mir "1", steht auch so in der Doku.

Funktion: Ausgelesen habe ich 03, die Holding Registers und dort die Adresse 24. Siehe auch meine Anleitung S. 17 + 18.

Hinweis: statt immer gleich den Wert in die Systemvariable zu schreiben und dann die Sytemvariable abzufragen um zu sehen ob alles geklappt hat, statt dom.GetObject() lieber erstmal mit WriteLine() arbeiten und in der Homematic den Script testen Knopf nutzen. Und erst wenn die Ausgabe mit WriteLine() funktioniert den Wert in die Systemvariable schreiben lassen. Spart Klickarbeit und reduziert mögliche Fehler. Btw. WriteLine() kann man auch immer mal zwischendrinn platzieren, um Zwischenschritte auf ihre richtige Funktionsweise zu prüfen.

@Indi55: Top Job. Danke. Funktioniert bei mir.

mario12345
Beiträge: 93
Registriert: 17.04.2013, 16:40

Re: ModBus TCP Interface

Beitrag von mario12345 » 24.03.2023, 12:00

Hallo zusammen,
wäre es auch Möglich statt einer Zahl (bzw. einen Wert) eine zuvor gelesene Variable zu schreiben?
Ich benutze u.a. Euer Script
write Coil.JPG
erfolgreich und würde am liebsten den zu schreibenden Wert aus einer Variblen lesen und diesen Wert dann auf den Bus schicken.
Vielleicht hat jemand eine Idee
Danke Mario

umberto
Beiträge: 131
Registriert: 31.08.2010, 12:56
Wohnort: "Oberland"

Re: ModBus TCP Interface

Beitrag von umberto » 30.03.2023, 14:27

Hallo Zusammen,
klingt alles super.
Hat jemand ein Script-Anleitung, um einen Energiezähler SDM230 Modbus (Eastron) einzubinden???
Bin über alle Tipps dankbar
.
Viele Grüße
Umberto
zu viele Homematic Module ;-)

Benutzeravatar
Baxxy
Beiträge: 10648
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 597 Mal
Danksagung erhalten: 2180 Mal

Re: ModBus TCP Interface

Beitrag von Baxxy » 30.03.2023, 19:56

umberto hat geschrieben:
30.03.2023, 14:27
SDM230 Modbus (Eastron)
Der hat doch ein Modbus RTU Interface, lässt sich also nicht per TCP abfragen.
Es gibt aber wohl Converter/Gateways.

umberto
Beiträge: 131
Registriert: 31.08.2010, 12:56
Wohnort: "Oberland"

Re: ModBus TCP Interface

Beitrag von umberto » 30.03.2023, 20:07

Hallo Baxxy,
Ich hab mir den...

Waveshare RS485 to Ethernet Converter M0 Series 32-bit ARM Processor Supports DNS Domain Name Resolution Customized Registration Packets Heartbeat Packets Configurable via Webpage GET and Post.

(bei Amazon) besorgt und habe gehofft, dass ich mit dem Addon und dem obigen Converter die aktuelle Leistung und die kWh auslesen kann.
Ist das so möglich?
Viele Grüße
Umberto
zu viele Homematic Module ;-)

Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“