Neue Versionen und Support zum Modbus-Modul

Begonnen von StefanStrobel, 20 August 2017, 12:11:08

Vorheriges Thema - Nächstes Thema

predi-ger-many

#165
Hi,

meine Config sieht aktuell so aus.


define MB_SLAVE_51 ModbusAttr 51 slave 192.168.1.52:1551 TCP
attr MB_SLAVE_51 room Heizanlage Modbus Neu
attr MB_SLAVE_51 obj-h0-reading MY_51_00
attr MB_SLAVE_51 obj-h1-reading MY_51_01
attr MB_SLAVE_51 obj-h2-reading MY_51_02
attr MB_SLAVE_51 obj-h3-reading MY_51_03
attr MB_SLAVE_51 obj-h4-reading MY_51_04
attr MB_SLAVE_51 obj-h5-reading MY_51_05
attr MB_SLAVE_51 obj-h6-reading MY_51_06
attr MB_SLAVE_51 obj-h7-reading MY_51_07
attr MB_SLAVE_51 obj-h8-reading MY_51_08
attr MB_SLAVE_51 obj-h9-reading MY_51_09
attr MB_SLAVE_51 obj-h10-reading MY_51_10
attr MB_SLAVE_51 obj-h11-reading MY_51_11


Der Connect vom Master aus funktioniert. Nun würde ich ich innerhalb FHEM Werte lesen und schreiben.

set MB_SLAVE_51 MY_51_00 100 liefert "only possible as Modbus master"
get MB_SLAVE_51 MY_51_00 liefert "only possible as Modbus master"

Wie lese und schreibe ich denn intern auf den Slave?

Kann vielleicht jemand eine lauffähige Sample-Config für Slave posten? Die Doku ist etwas arg dünn und 99% dessen was ich finde geht immer um Master und nicht Slave

lechez

Zitat von: predi-ger-many am 05 November 2018, 23:21:43
Hi,

meine Config sieht aktuell so aus.

define MB_SLAVE_51 ModbusAttr 51 slave 192.168.1.52:1551 TCP
attr MB_SLAVE_51 room Heizanlage Modbus Neu
attr MB_SLAVE_51 obj-h0-reading MY_51_00

versuch mal mit setreading MB_SLAVE_51 MY_51_00 1200

Setzt den wert auf 1200. Bei mir hat er es sofort übertragen.
"set" und "get" geht nur bei Master.



StefanStrobel

Hallo,

Infos zur Slave-Funktionalität des Modbus-Moduls gibt es im Forum noch wenig, da die Funktion ja noch sehr neu ist. Deshalb hier noch ein paar Erläuterungen:

Die Idee beim Slave ist ja, dass er Werte, die bereits in Fhem vorliegen einem Master zur Verfügung stellt oder dass ein Master von Außen Werte in Fhem schreiben kann.
Jetzt kann man beispielsweise mit Readings im definierten Modbus-Slave selbst arbeiten.
Um diese intern mit einem Wert zu belegen, nimmt man am besten setreading. Ein eigener set-Befehl im Modul wäre dafür meiner Meinung nach überflüssig.

Man muss Werte aber auch gar nicht als Reading im Modbus-Slave-Gerät setzen um sie einem externen Master zur Verfügung zu stellen.
Ich gehe davon aus, dass die Werte schon irgendwo im Fhem vorliegen, z.B. als Readings eines anderen Geräts oder Sensors.
Dann kann man bei der Konfiguration des Maodbus-Slaves in Fhem auch gleich auf die existierenden Readings verweisen:

attr MB_SLAVE_51 obj-h100-reading SensorGarten:temperature

würde das Reading temperature eines existierenden Geräts mit dem Namen SensorGarten als holding register 100 bereitstellen.

Wenn man dem externen Master erlauben möchte, Werte in Fhem hineinzuschreiben, dann kann man auch das direkt auf Readings anderer Geräte erlauben, z.B.:

attr MB_SLAVE_51 obj-h101-reading Heizung:TempSoll
attr MB_SLAVE_51 obj-h101-allowWrite 1


allerdings muss man hier explizit erlauben, dass die Readings geschrieben werden, damit nicht versehentlich Sensor-Werte von Außen überschrieben werden, die eigentlich nur zum Lesen da sind.

Wenn Euch sonst noch sinnvolle Funktionen fehlen, kann ich die aber auch noch einbauen. Die Slave-Funktionalität oder auch die Relay-Funktion sind ja noch neu und ich freue mich über Tester und Feedback.

Gruss
   Stefan


predi-ger-many

Hi,

also langsam wird es etwas.

Aktuell habe ich folgende Konfig:


attr MB_SLAVE_51 room Heizanlage Modbus Neu
attr MB_SLAVE_51 obj-h0-reading MY_51_00
attr MB_SLAVE_51 obj-h1-reading MY_51_01
attr MB_SLAVE_51 obj-h2-reading MY_51_02
attr MB_SLAVE_51 obj-h3-reading MY_51_03
attr MB_SLAVE_51 obj-h4-reading MY_51_04
attr MB_SLAVE_51 obj-h5-reading HM_Bad_WT:2.SET_TEMPERATURE
attr MB_SLAVE_51 obj-h6-reading MY_51_06
attr MB_SLAVE_51 obj-h7-reading MY_51_07
attr MB_SLAVE_51 obj-h7-allowWrite 1
attr MB_SLAVE_51 obj-h8-reading MY_51_08
attr MB_SLAVE_51 obj-h9-reading MY_51_09
attr MB_SLAVE_51 obj-h10-reading MY_51_10
attr MB_SLAVE_51 obj-h11-reading MY_51_11


MY_51_06 habe ich mittels "setreading MB_SLAVE_51 MY_51_06 106" gesetzt.

Im Modbus Master Simulator wird angezeigt:

Holding Adresse 5 - 23 wird angezeigt ... das Reading kommt als 23.0. Ich würde aber gern mit Nachkommastelle übergeben ... also 230. Wie bekomme ich denn das hin.
Holding Adresse 6 - 0 wird angezeigt im Simulator... fehlt da noch etwas?

Ich würde gern den Weg über "setreadings" gehen. Da muss ich weniger migrieren... komme ja von ModbusTCP_CC.

Sorry, wenn meine Fragen total dämlich sind. Aber ich blicke ehrlich gesagt die Doku nicht wirklich.


StefanStrobel

Hallo,

die Zahlenformate kannst Du flexibel über den unpack-code beeinflussen. Wenn Du einen Wert mit Nachkommastellen als Float bereitstellen möchtest, brauchst Du allerdings zwei Register - also Länge 2. Du kannst aber auch einfach den Wert mit 10 multipliziert darstellen. Dazu gibt es die Expressions. Das ist alles relativ analog zu der Konfiguration für einen Master.
Also beispielsweise:

attr MB_SLAVE_51 obj-h5-reading HM_Bad_WT:temperature
attr MB_SLAVE_51 obj-h5-unpack f>
attr MB_SLAVE_51 obj-h5-len 2

oder

attr MB_SLAVE_51 obj-h5-reading HM_Bad_WT:temperature
attr MB_SLAVE_51 obj-h5-setExpr $val*10


oder Du definierst einen eigenen Datentyp (siehe https://wiki.fhem.de/wiki/ModbusAttr#Handling_Data_Types)

Zum Unterscheid zwischen -expr und -setExpr:
-setExpr ist immer dazu da, einen Wert in das Format für Register zu übersetzen, also wenn ein Slave Daten liefern soll oder wenn ein Master per Set-Befehl Daten an einen Slave sendet.

-expr ist immer dafür da, Werte aus Registern für den Anwender oder für Readings aufzubereiten. Also bei einem Slave beim Schreiben von Readings als Reaktion auf einen Schreib-Befehl per Modbus oder bei einem Master um von einem Slave gelesene Werte in Readings zu packen.

Gruss
   Stefan

StefanStrobel

Hallo Marco,

anbei eine neue Version, die vermutlich unter Windows besser funktionieren sollte.
Könntest Du das nochmal testen?

Gruss / Thanx
   Stefan

predi-ger-many

Hallo Stefan,

"attr MB_SLAVE_51 obj-h5-setExpr $val*10" liefert folgenden Fehler:

MB_SLAVE_51: unknown attribute obj-h113-setExpr. Type 'attr MB_SLAVE_51 ?' for a detailed list.

setexpr anstatt setExpr funktioniert zumindest von der Syntax.


HM_Bad_WT:2.SET_TEMPERATURE hat Wert 23.0.
Habe testweise folgende Definition gemacht:


attr MB_SLAVE_51 obj-h104-reading HM_Bad_WT:2.SET_TEMPERATURE
attr MB_SLAVE_51 obj-h104-setexpr $val*10
attr MB_SLAVE_51 obj-h104-expr $val*10


Im Simulator kommt nicht 230 an, sondern 23. Entweder bin ich zu blöd... oder BUG?

StefanStrobel

Hallo,

im code stand setExpr, in der Liste der erlaubten Attribute so wie bisher und in der doku setexpr, also Bug.
setexpr ist natürlich richtig.
Anbei ein Update.

Gruss und Danke fürs Testen
   Stefan

predi-ger-many


attr MB_SLAVE_51 obj-h104-reading HM_Bad_WT:2.SET_TEMPERATURE
attr MB_SLAVE_51 obj-h104-setexpr $val*10


... funktioniert


attr MB_SLAVE_51 obj-h100-reading Wohnzimmer_Temp_Soll
attr MB_SLAVE_51 obj-h100-setexpr $val*10


... funktioniert plötzlich auch


Vielen Dank!

predi-ger-many

Hallo Stefan,

ich komme ja von ModbusTCP_CC.

Bisher hatte ich definiert:


define ModbusTCP_Server ModbusTCP_CC 1502

###############################################################################
# ModbusTCP - Device 10 - Coils
###############################################################################
define ModbusTCP_10_00001 dummy
attr ModbusTCP_10_00001 comment MBC:10,1,C
...
...
...

###############################################################################
# ModbusTCP - Device 20 - Holding Registers
###############################################################################
define ModbusTCP_20_40001 dummy
attr ModbusTCP_20_40001 comment MBR:20,1,H
...
...
...


Bei ModbusTCP_CC war die DeviceID auf dem Wert hinterlegt. Man konnte also X-Devices auf einem Port laufen lassen.

Bei ModbusAttr habe ich nun versucht:


define ModbusTCP_10 ModbusAttr 10 slave 192.168.1.52:1502 TCP
define ModbusTCP_20 ModbusAttr 20 slave 192.168.1.52:1502 TCP


Device 10 startet. Device 20 bleibt Initialized. Naja, zwei Prozesse, welche auf den gleichen Port wollen...

Böse Frage: Kannst du umbauen, so dass X-Devices auf einer IP und Port gehen würden. Mir ist klar, dass das richtig Aufwand ist. Wäre aber sehr praktisch




mba

Hallo Stefan,

ich habe 4.0.17 unter Windows getestet. Die Fehler mit Zugriff verweigert auf COM3 sind weg.
Ich sehe auf einem Slave RX aktivität, aber kein TX, somit auch keine Antwort vom Slave.
Bin mir aber nicht sicher ob es am Slave liegt. Ich werde nochmal mit einem Testen wo ich weis das er funktioniert, aber momentan sind alle anderen in Benutzung.

Guß
Marco
Tinkerboard für FHEM, Modbus RTU via RS485 mit Arduino Slaves, ZWAVE mit Razberry Modul

predi-ger-many

#176
Hallo Stefan,

ich komme von ModbusTCP_CC. Die Umstellung auf ModbusAttr war steinig. Aber eigentlich nur wegen diesem einen dusseligen Bug.
Nach dem Bugfix muss ich sagen, dass der Rest jetzt ein Kinderspiel ist.

Werte werden an Heizung gesendet. Werte werden von Heizung empfangen. Sogar negative Werte werden Out-of-the-box korrekt behandelt.
Die Performance sieht auch gut aus.

Holding Register laufen jetzt. Mal schauen, ob der Rest auch so problemlos wird

Eigentlich war die Umstellung auf ModbussAttr nur als Zwischenlösung gedacht und ich wollte auf auf KNX umstellen. Wenn alles weiter
so top läuft, kann ich mir das wohl ersparen.

Von daher super vielen Dank für deinen tollen Support.

Viele Grüße
Predi

Turnschuh

Hallo Stefan,

ich bin mir nicht sicher ob die Frage hier hin passt.
Ich habe ein Problem mit einem SDM630M Modubus Zaehler.

Initial habe ich eine Modbus Verbindung hinbekommen aber seit einigen Tagen funktioniert diese nicht mehr.
Ob es passt weis ich deshalb nicht, da ich ein modifiziertes Modbus Modul "98_ModbusSDM630M.pm" nutze.

Aber vielleicht hast Du einen Tip wie ich pruefen kann ob ueberhaupt noch eine Verbindung mit dem Zaehler aufgebaut wird.

Danke schonmal vorab,
Andy

StefanStrobel

Hallo Andy,

ich vermute, 98_ModbusSDM630M.pm ist das Modul von Roger. Das basiert auf 98_Modbus.pm und kann damit genauso verwendet und konfiguriert werden wie ModbuAttr, allerdings sind die ganzen Attribute zur Konfiguration der Register für den SDM630 im Modul schon enthalten.

Bei der Fehlersuche sollte man das Attribut verbose für das Gerät und für das rs485-Interface auf 5 setzen und dann schauen was beim Starten / Öffnen im Log steht.

Gruss
   Stefan

Turnschuh

Hallo Stefan,

danke fuer Deine Antwort.

Ich habe das Loglevel auf 5 gestellt und sehe jetzt den Verbindungsaufbau:

2018.11.15 22:37:55 3: SDM_630_Meter: defined as /dev/ttyUSB0@9600
2018.11.15 22:38:03 4: SDM_630_Meter: Notify / Init: opening connection
2018.11.15 22:38:03 5: SDM_630_Meter: open called from Notify
2018.11.15 22:38:03 4: SDM_630_Meter: open trying to open connection to /dev/ttyUSB0@9600
2018.11.15 22:38:03 3: Opening SDM_630_Meter device /dev/ttyUSB0
2018.11.15 22:38:03 3: Setting SDM_630_Meter serial parameters to 9600,8,N,1
2018.11.15 22:38:03 3: SDM_630_Meter device opened

Das sieht fuer mich so aus als ob das so erfolgreich war.

Spaeter habe ich aber dann Timeouts, wie folgt:

2018.11.15 22:38:06 5: SDM_630_Meter: ProcessRequestQueue called from HandleTimeout as queue:SDM_630_Meter
2018.11.15 22:38:06 5: SDM_630_Meter: ProcessRequestQueue called from HandleTimeout returns, Fhem is still waiting for response, qlen 10, try again in 1 seconds
2018.11.15 22:38:06 5: SDM_630_Meter: StartQueueTimer called form ProcessRequestQueue sets internal timer to call Modbus_ProcessRequestQueue in 1.000 seconds
2018.11.15 22:38:06 3: SDM_630_Meter: ResponseTimeout called, devhash=HASH(0x24c87f0), name of devhash=SDM630M
2018.11.15 22:38:06 3: SDM_630_Meter: Timeout waiting for a modbus response, request: id 1, fCode 4, type i, adr 40, len 40 for device SDM630M reading CosPhi_L3__grd, read buffer empty
2018.11.15 22:38:06 5: SDM_630_Meter: DropFrame - drop

Irgendeine Idee warum das sein koennte?

Ich hatte den Zaehler ja bereits mal am laufen und auch Werte bekommen.

Cheers,
Andy