ModBus TCP Interface
Moderator: Co-Administratoren
Re: ModBus TCP Interface
Hallo miteinander, ich versuche schon länger einzelne Bit von meiner Logo8 zu lesen...
Mit der App funktioniert es soweit 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...
Mit der App funktioniert es soweit 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
Grund: Thema verschoben
-
- 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
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. Wie kann ich im Script die Zahl in binär umrechnen und dann die SysVar WB1-WB12 mit dem jeweiligen Bit befüllen?
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. 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
Martin
RaspberryMatic auf ESXi 7 mit RPI-RF-MOD/HB-RF-ETH. Div. HM und HMIP Funkkomponenten im Holzständerhaus
Re: ModBus TCP Interface
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:
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
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
Re: ModBus TCP Interface
Ok, mehr Lesen hilft.. Function code war falsch
Das ModBus-Endgerät beschreiben geht so:
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");
Re: ModBus TCP Interface
Danke für die perfekte Lösung!!!
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).
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).
Re: ModBus TCP Interface
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?
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?
Re: ModBus TCP Interface
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.
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.
Re: ModBus TCP Interface
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
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
-
- Beiträge: 21
- Registriert: 12.05.2016, 11:47
Re: ModBus TCP Interface
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
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
-
- Beiträge: 93
- Registriert: 17.04.2013, 16:40
Re: ModBus TCP Interface
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
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