ModBus TCP Interface

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Pfunz
Beiträge: 3
Registriert: 11.09.2020, 09:43
System: CCU

Re: ModBus TCP Interface

Beitrag von Pfunz » 07.11.2020, 22:39

Hallo miteinander, ich versuche schon länger einzelne Bit von meiner Logo8 zu lesen...

Mit der App funktioniert es soweit
Screenshot_20201107-204854_Modbus TCP Client.jpg
Aber in der CCU mach ich glaube ich was falsch...

string lGetOut; string lGetErr; ! Lesen des Wertes system.Exec("tclsh /usr/local/addons/modbus/modbus_interface.tcl 192.168.166.166 502 1 01 8257 1",&lGetOut,&lGetErr); ! Schreiben in Systemvariable formatiert (lGetOut ist ein Sting, die Ausgabe dann ein Zahlenwert) dom.GetObject('E3DC_Haus').State(0 + lGetOut); ! Ausgabe WriteLine("E3DC_Haus: " + (0 + lGetOut));

Aber ich komme nicht drauf...
Zuletzt geändert von Roland M. am 07.11.2020, 22:41, insgesamt 1-mal geändert.
Grund: Thema verschoben

HMNutzer
Beiträge: 708
Registriert: 24.10.2016, 17:18
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 150 Mal
Danksagung erhalten: 22 Mal

Re: ModBus TCP Interface

Beitrag von HMNutzer » 08.11.2020, 18:46

Servus,

erstmal danke an die Beteiligten für die Lösung; klappt selbst bei mir auf Anhieb ;-)
Nun aber ein Frage an die Script-Profis:
Meine Wallbox gibt als Status z.B. die Zahl 4101 (binär 1000000000101) zurück.
Das bedeutet laut folgender Tabelle, dass die Wallbox vorhanden ist, Mischbetrieb eingestellt wurde, das Laden abgebrochen wurde usw.
Wallbox-Status.PNG
Wie kann ich im Script die Zahl in binär umrechnen und dann die SysVar WB1-WB12 mit dem jeweiligen Bit befüllen?
Viele Grüße

Martin

RaspberryMatic auf ESXi 7 mit RPI-RF-MOD/HB-RF-ETH. Div. HM und HMIP Funkkomponenten im Holzständerhaus

VH04
Beiträge: 2
Registriert: 14.01.2021, 17:42
System: CCU

Re: ModBus TCP Interface

Beitrag von VH04 » 14.01.2021, 19:51

Hallo,
in meinem Fall funktioniert das Lesen der ModBus Register meiner Heliotherm Wärmepumpe exakt wie von Indi55 beschrieben.
Grossen Dank für die Implementierung vom ModBus TCP Interface!

Beim Schreiben der Modbus Register habe ich noch Syntax Probleme. Kann mir hierzu jemand weiterhelfen?

Die Syntax der SW des ModBus Moduls wird wie folgt angegeben:
Lesen : modbus_interface.tcl IP-Adresse Port DeviceNummer Funktion Register Länge
Schreiben : modbus_interface.tcl IP-Adresse Port DeviceNummer Funktion Register Wert

Beispiel -lauffähig-:
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("tclsh /usr/local/addons/modbus/modbus_interface.tcl IP-Adresse 502 1 04 11 1");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
! Zuweisen in Variable
var WWTemperatur = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
WriteLine(WWTemperatur);


Wie müsste nun der ModBus Schreibbefehl mit dem CUxD aussehen?
mit
Register: 100,
Function code: 03
Wert: 4 (Format: uint16)

Also irgendwie was mit ("tclsh /usr/local/addons/modbus/modbus_interface.tcl IP-Adresse 502 1 03 100 4") ?

Grüße

VH04
Beiträge: 2
Registriert: 14.01.2021, 17:42
System: CCU

Re: ModBus TCP Interface

Beitrag von VH04 » 15.01.2021, 12:19

Ok, mehr Lesen hilft.. Function code war falsch :-)
Das ModBus-Endgerät beschreiben geht so:
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("tclsh /usr/local/addons/modbus/modbus_interface.tcl IP-Adresse 502 1 06 100 4");

ch.weck
Beiträge: 16
Registriert: 28.04.2015, 18:16

Re: ModBus TCP Interface

Beitrag von ch.weck » 04.05.2021, 10:25

Danke für die perfekte Lösung!!! :D :D

Eine Frage hätte ich doch noch zum Schreiben in ein Register (oder coil?): Ich möchte einen unsigned Integer-Wert übergeben (2Byte). Wie muss dazu das Argument bei der TCL-Routine übergeben werden, damit nicht nur ein Byte oder einen String interpretiert wird? Beim Schreiben kann ich ja keinen Typ angeben. - Kann mir dazu jemand weiterhelfen evtl. mit einem Beispiel für den Integerwert 4 (aus 0-65536).

ch.weck
Beiträge: 16
Registriert: 28.04.2015, 18:16

Re: ModBus TCP Interface

Beitrag von ch.weck » 06.05.2021, 22:42

Meine Frage nochmal konkret:
Wird beim Schreiben eines Registers (Mode 6) ein Wert z.B. 4 in dem TCL-Befehl für den Modbus in ein Byte Hex 0x04 umgewandelt oder in zwei Byte also 0x00 0x04 ? Ist ein Register per Default 2 Byte, obwohl beim Modbus Bytes und nicht Doppelbytes im Datenfeld gezählt werden? oder vielleicht nur ein Byte bei dem Schreibbefehl über die Modbus TCL-Scripte?

ch.weck
Beiträge: 16
Registriert: 28.04.2015, 18:16

Re: ModBus TCP Interface

Beitrag von ch.weck » 07.05.2021, 21:54

o.K. dann gebe ich mir selbst die Antwort, nachdem ich das TCL-Script studiert habe:
Der beim Schreiben in ein Register (fun=06) übertragene Wert wird immer in "16-bit integers in big-endian byte order" übertragen also eine "4" mit \x00\x04.

daf0815
Beiträge: 1
Registriert: 03.06.2021, 14:54
System: CCU

Re: ModBus TCP Interface

Beitrag von daf0815 » 03.06.2021, 15:22

Hi,
versuche verzweifelt :( seit 2 Wochen einige Daten meines Modbus LAN Gateways in die Homematic zu übertragen (Stromzaehler SDM230 demnächst auch SDM120 liefern die Werte).

Daten werden grundsätzlich bereitgestellt und ich kann Sie auch per APP Modbus Viewer anzeigen lassen. Leider ist das Datenformat im Register laut dem Viewer und der Zaehler/Gateway Doku ein Float32ABCD.

Das Homematic TCL Script mit Aufruf der modbus tcl liefert mir z.B. anstelle des richtigen Wertes "0.353" z.B. dann "16052". Ist auch der gleiche Wert wenn ich im Modbus Viewer von Float32ABCD auf Int16AB stelle.

Was muss am Code geändert werden?

dom.GetObject("CUxD.CUX2801001:10.CMD_SETS").State("tclsh /usr/local/addons/modbus/modbus_interface.tcl 192.168.0.25 502 2 04 20 1");
dom.GetObject("CUxD.CUX2801001:10.CMD_QUERY_RET").State(1);
var wert2 = dom.GetObject("CUxD.CUX2801001:10.CMD_RETS").State();
WriteLine("Test: " + wert2);

VG

Damian

richard.mayer
Beiträge: 21
Registriert: 12.05.2016, 11:47

Re: ModBus TCP Interface

Beitrag von richard.mayer » 28.04.2022, 14:57

Hallo,

sorry, falls das Thema hier weiter oben schon behandelt wurde, ich checke es aber noch nicht ganz.
Ich lese meine SMA-Komponenten mit dem oben genannten Script aus (vielen Dank hierfür!).

Das funktioniert auch sehr gut, nur mit dem Tagesertrag habe ich das Problem, dass der ausgelesene Wert ab einer bestimmten Wh-Zahl umspringt und wieder runterzählt mit negativem Wert:

Bis 32kWh ist alles gut:
root@ccu:~# tclsh /usr/local/addons/modbus/modbus_interface.tcl wr1.mayer 502 3 03 30535 10 | /usr/bin/awk '{print $2}'
7824

Und dann ab 32kWh geht es wieder abwärts:
root@ccu:~# tclsh /usr/local/addons/modbus/modbus_interface.tcl wr1.mayer 502 3 03 30535 10 | /usr/bin/awk '{print $2}'
-23091

Hat irgendjemand einen Tipp, wie ich das Datenformat anpassen könnte, damir ich valide Werte bekommen?
Es gäbe auch noch ein Register, das den Wert in kWh ausgibt, dann würde ich aber etwas an Genauigkeit verlieren...
Mit dem Client "ModBus Probe" wird der Wert korrekt ausgegeben.

Besten Dank!

Richard
Screenshot 2022-04-28 at 14.56.13.png

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

Re: ModBus TCP Interface

Beitrag von mario12345 » 11.07.2022, 11:07

Guten Morgen zusammen,

gibt es zu dem Thema von Richard (mit den negativen Werten) schon eine Lösung?
Ich habe das gleiche Problem mit einem EM24 Leistungsmesser.

Mario

Antworten

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