Seite 1 von 3

Modbusregister schreiben

Verfasst: 19. Nov 2024 23:59
von TomW80
Hallo,

ich möchte bestimmte Modbusregister beschreiben, doch schon beim ersten Register habe ich Probleme.
Der Wert des Items ändert sich wieder auf den alten Wert zurück, d.h. es wird nichts in das Register geschrieben.

So siehts aus:

things

Code: Alles auswählen

ridge modbus:tcp:HovalGWTCP [ host="192.168.x.xx", port=502, id=1 ] {

  
...

    Bridge poller inputRegisters3 [ start=1478, length=5, refresh=1000, type="holding" ] {

        Thing data holding1478 [ readStart="1478", readValueType="float32", writeStart="1478", writeValueType="float32", writeType="holding" ]    
        Thing data input1479 [ readStart="1479", readValueType="int16" ]  
        Thing data input1480 [ readStart="1480", readValueType="int16" ]  
        Thing data holding1481 [ readStart="1481", readValueType="int16", writeStart="1481", writeValueType="int16", writeMultipleEvenWithSingleRegisterOrCoil="false", writeType="holding" ]
        Thing data input1482 [ readStart="1482", readValueType="int16" ]  
    }
...

}

items

Code: Alles auswählen

Number:Temperature input1481Int16 "Heizung Normal Raumtemperatur Istwert [%.2f °C]"    {channel="modbus:data:HovalGWTCP:inputRegisters3:holding1481:number" [ profile="modbus:gainOffset", gain="0.1 °C", pre-gain-offset="0" ], unit="°C", stateDescription=""[pattern="%.1f °C"] }
sitemap

Code: Alles auswählen

Setpoint item=input1481Int16 icon="heating" minValue=10 maxValue=30 step=0.5
Über modpoll.exe kann ich so einen Wert schreiben. (Bei modpoll muss ich die Registeradresse um +1 erhöhen.)

Code: Alles auswählen

modpoll.exe -r 1482 -c 1 192.168.2.53 235
modpoll 3.15 - FieldTalk(tm) Modbus(R) Master Simulator
Copyright (c) 2002-2024 proconX Pty Ltd
Visit https://www.modbusdriver.com for Modbus libraries and tools.

Protocol configuration: MODBUS/TCP, FC6
Slave configuration...: address = 1, start reference = 1482, count = 1
Communication.........: 192.168.x.xx, port 502, t/o 1.00 s, poll rate 1000 ms
Data type.............: 16-bit register, holding register table

Written 1 reference.
Wo liegt nun mein Problem?

Re: Modbusregister schreiben

Verfasst: 20. Nov 2024 09:19
von Tokamak
An deiner Konfiguration kann ich nichts falsches erkennen.

Daher ein paar dumme Fragen: Du schickst ein Command und machst nicht nur ein Update?
Und: Ist das Register überhaupt schreibbar? Vielleicht ist dein Beispiel unglücklich gewählt, aber die Raum-Ist-Temperatur zu schreiben ergibt keinen Sinn.

Re: Modbusregister schreiben

Verfasst: 20. Nov 2024 09:28
von TomW80
Tokamak hat geschrieben: 20. Nov 2024 09:19 Daher ein paar dumme Fragen: Du schickst ein Command und machst nicht nur ein Update?
Die Frage versteh ich leider nicht.
Tokamak hat geschrieben: 20. Nov 2024 09:19 Und: Ist das Register überhaupt schreibbar? Vielleicht ist dein Beispiel unglücklich gewählt, aber die Raum-Ist-Temperatur zu schreiben ergibt keinen Sinn.
Ja.
Screenshot 2024-11-20 092727.jpg
Gruß Tom

Re: Modbusregister schreiben

Verfasst: 20. Nov 2024 13:01
von Tokamak
Das mit dem Command und dem Update hat sich erledigt. Du willst den Wert über Setpoint ändern, das sendet Commands.

Das Item ist eigentlich die normale Soll-Raumtemperatur. Ein Ist-Wert, wie das von dir gewählte Label suggeriert, wird hingegen gemessen. Das hatte mich verwirrt.

Der Rest sieht in Ordnung aus.

Ich habe "gain" beim Modbus-Binding bisher nicht zum Schreiben genutzt. Lt. Doku soll es auch beim Schreiben funktionieren.
Im Logging siehst du keine Meldungen, wenn du Werte schreiben willst?

Zunächst würde ich es ohne gain testweise mit

Code: Alles auswählen

Number:Temperature input1481Int16_dezi "Heizung Normal Raumtemperatur [%d °dC]"   { channel="modbus:data:HovalGWTCP:inputRegisters3:holding1481:number" }
und

Code: Alles auswählen

Setpoint item=input1481Int16_dezi icon="heating" minValue=100 maxValue=300 step=5
probieren, ob das Setzen grundsätzlich funktioniert.

Wenn ja, könntest du das Item mal mit UoM-Boardmitteln so definieren:

Code: Alles auswählen

Number:Temperature input1481Int16 "Heizung Normal Raumtemperatur [%.1f °C]"   { unit="°dC", channel="modbus:data:HovalGWTCP:inputRegisters3:holding1481:number" }
da es Dezi-Celsius sind. Das mit dem d funktioniert im Prinzip. Ggf. muss es aber auch davor, also unit="d°C".

Re: Modbusregister schreiben

Verfasst: 20. Nov 2024 13:09
von udo1toni
Ich selbst nutze kein Modbus, deshalb frage ich mich, ob das Profile auch zur Verfügung steht. Da Du per Text konfiguriert hast, ist das nicht sicher der Fall.
Schau bitte mal, ob beim Verlinken über die Main UI das Profile zur Auswahl steht (suche in der Main UI in den Things den betreffenden Channel aus, klicke auf link Item, dann auf Create new Item, setze die Dimension auf temperature, dann sollte weiter unten in den Profiles auch modbus:gainOffset gelistet werden. Ist das nicht der Fall, müsste das Profile erst noch installiert werden.

Re: Modbusregister schreiben

Verfasst: 20. Nov 2024 15:07
von Tokamak
Wenn aus den 235 (aus dem modpoll-Beispiel) 23.5°C im Item wurden, wovon ich ausgehe, funktioniert das Profile.

Wie gesagt, ich nutze es auch, ohne es installiert zu haben, allerdings nur lesend

Re: Modbusregister schreiben

Verfasst: 20. Nov 2024 21:05
von udo1toni
Gut, dann wird es vermutlich integraler Bestandteil des Modbus Addons sein.

Re: Modbusregister schreiben

Verfasst: 20. Nov 2024 23:50
von TomW80
Tokamak hat geschrieben: 20. Nov 2024 13:01 Ich habe "gain" beim Modbus-Binding bisher nicht zum Schreiben genutzt. Lt. Doku soll es auch beim Schreiben funktionieren.
Im Logging siehst du keine Meldungen, wenn du Werte schreiben willst?

Zunächst würde ich es ohne gain testweise mit
ohne das Profile funktioniert das schreiben, allerdings muss die unit und stateDescription mit angegeben sein.

Code: Alles auswählen

Number:Temperature input1481Int16_dezi "Heizung Normal Raumtemperatur [%.1f °C]"   { channel="modbus:data:HovalGWTCP:inputRegisters3:holding1481:number" , unit="d°C", stateDescription=""[pattern="%.1f °C"]}
ABER, wenn ich den Setpoint so verwende:

Code: Alles auswählen

Setpoint item=input1481Int16_dezi icon="heating" minValue=100 maxValue=300 step=5
wird statt +0.5 °C der Wert auf 10,0°C gesetzt.
2024-11-20 23:41:34.074 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'input1481Int16_dezi' received command 100 °C
2024-11-20 23:41:34.076 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'input1481Int16_dezi' predicted to become 100 °C
2024-11-20 23:41:34.077 [INFO ] [openhab.event.ItemStateUpdatedEvent ] - Item 'input1481Int16_dezi' updated to 1000 d℃
2024-11-20 23:41:34.079 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'input1481Int16_dezi' changed from 230 d℃ to 1000 d℃
2024-11-20 23:41:36.336 [INFO ] [openhab.event.ItemStateUpdatedEvent ] - Item 'input1481Int16_dezi' updated to 230 d℃
2024-11-20 23:41:36.337 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'input1481Int16_dezi' changed from 1000 d℃ to 230 d℃
2024-11-20 23:41:40.787 [INFO ] [openhab.event.ItemStateUpdatedEvent ] - Item 'input1481Int16_dezi' updated to 100 d℃
2024-11-20 23:41:40.788 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'input1481Int16_dezi' changed from 230 d℃ to 100 d℃
2024-11-20 23:41:44.390 [INFO ] [openhab.event.ItemStateUpdatedEvent ] - Item 'input1481Int16_dezi' updated to 100 d℃
2024-11-20 23:41:47.824 [INFO ] [openhab.event.ItemStateUpdatedEvent ] - Item 'input1481Int16_dezi' updated to 100 d℃
2024-11-20 23:41:51.408 [INFO ] [openhab.event.ItemStateUpdatedEvent ] - Item 'input1481Int16_dezi' updated to 100 d℃
wenn ich den Setpoint so verwende:

Code: Alles auswählen

Setpoint item=input1481Int16_dezi icon="heating" minValue=10 maxValue=30 step=0.5
wird statt +0.5 °C der Wert auf 2,3°C gesetzt.
2024-11-20 23:24:57.892 [INFO ] [openhab.event.ItemStateUpdatedEvent ] - Item 'input1481Int16_dezi' updated to 230 d℃
2024-11-20 23:25:01.406 [INFO ] [openhab.event.ItemStateUpdatedEvent ] - Item 'input1481Int16_dezi' updated to 230 d℃
2024-11-20 23:25:05.001 [INFO ] [openhab.event.ItemStateUpdatedEvent ] - Item 'input1481Int16_dezi' updated to 230 d℃
2024-11-20 23:25:08.266 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'input1481Int16_dezi' received command 23.5 °C
2024-11-20 23:25:08.268 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'input1481Int16_dezi' predicted to become 23.5 °C
2024-11-20 23:25:08.271 [INFO ] [openhab.event.ItemStateUpdatedEvent ] - Item 'input1481Int16_dezi' updated to 235 d℃
2024-11-20 23:25:08.271 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'input1481Int16_dezi' changed from 230 d℃ to 235 d℃
2024-11-20 23:25:08.454 [INFO ] [openhab.event.ItemStateUpdatedEvent ] - Item 'input1481Int16_dezi' updated to 230 d℃
2024-11-20 23:25:08.455 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'input1481Int16_dezi' changed from 235 d℃ to 230 d℃
2024-11-20 23:25:12.988 [INFO ] [openhab.event.ItemStateUpdatedEvent ] - Item 'input1481Int16_dezi' updated to 23 d℃
2024-11-20 23:25:12.989 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'input1481Int16_dezi' changed from 230 d℃ to 23 d℃
2024-11-20 23:25:16.522 [INFO ] [openhab.event.ItemStateUpdatedEvent ] - Item 'input1481Int16_dezi' updated to 23 d℃
2024-11-20 23:25:20.027 [INFO ] [openhab.event.ItemStateUpdatedEvent ] - Item 'input1481Int16_dezi' updated to 23 d℃
Noch eine andere Idee?
udo1toni hat geschrieben: 20. Nov 2024 13:09 Ich selbst nutze kein Modbus, deshalb frage ich mich, ob das Profile auch zur Verfügung steht. Da Du per Text konfiguriert hast, ist das nicht sicher der Fall.
Schau bitte mal, ob beim Verlinken über die Main UI das Profile zur Auswahl steht (suche in der Main UI in den Things den betreffenden Channel aus, klicke auf link Item, dann auf Create new Item, setze die Dimension auf temperature, dann sollte weiter unten in den Profiles auch modbus:gainOffset gelistet werden. Ist das nicht der Fall, müsste das Profile erst noch installiert werden.
Das Profil steht in der MainUI zur Verfügung. Ich hab das so aus der Modbus-Doku

Dort steht eigentlich auch, dass es in die umgekehrte Richtung, also das schreiben auch funktionieren soll.
The profile also works the other way round, scaling the commands sent to the item to bare-numbers suitable for Modbus.
Ist das evtl ein Fehler vom Modbus-Binding?

Re: Modbusregister schreiben

Verfasst: 21. Nov 2024 00:12
von TomW80
Wie ich gerade gelesen habe funktioniert das seit einer Änderung am openhab core nicht mehr. :(

https://community.openhab.org/t/modbus- ... /110814/41

https://community.openhab.org/t/modbus- ... /149836/23

Wenn man es ohne QuantityType und ohne °C bei gain schreibt funktioniert es in beide Richtungen.

Code: Alles auswählen

Number input1481Int16 "Heizung Normal Raumtemperatur Istwert [%.2f °C]"    {channel="modbus:data:HovalGWTCP:inputRegisters3:holding1481:number" [ profile="modbus:gainOffset", gain="0.1", pre-gain-offset="0" ], unit="°C", stateDescription=""[pattern="%.1f °C"] }

Re: Modbusregister schreiben

Verfasst: 21. Nov 2024 08:10
von Tokamak
Gut, dass du es gefunden hast.

Verstehe ich es richtig, dass man mit gainOffset QuantityTypes doch nicht schreiben kann? Das Lesen von QuantityTypes funktioniert bei mir ganz prächtig.