Hauptmenü

Probleme mit ModBus RTU

Begonnen von cheak, 15 April 2017, 14:34:42

Vorheriges Thema - Nächstes Thema

cheak

Hallo Zusammen,

ich bin neu bei FHEM, weil ich von der ständigen Instabilität von openHAB die Schnauze voll habe. Das System der Definition von Datenpunkten habe ich glaube ich soweit verstanden. Also habe ich an meinen Raspberry eine FTDI RS485 Schnittstelle eingehangen, die das System nach dmesg als /dev/ttyUSB0 identifiziert hat.

Nun habe ich als ein define für die ModBus Schnittstelle gemacht, die dann vom Modul modbusattr genutzt wird, um einen popeligen Temperatur und Feuchtesensor aus China abzufragen. Mit demselben Modem an meiner Windows Kiste und ModBus Poll bekomme ich mit Funktion 03 unter den Register 00,01 und 03 auch die Daten, die ich erwarte.

Der Log in FHEM sieht eigentlich auch ganz vielversprechend aus:


2017.04.15 14:28:50 4: ModBusModem: HandleSendQueue sends fc 3 to id 1, tid 101 for Temperature (h0), len 4, device ModBus_Sensor01 (RTU), pdu 0300000004, V 3.5.12 - 06.01.2017
2017.04.15 14:28:50 5: SW: 0103000000044409
2017.04.15 14:28:50 4: ModBus_Sensor01: update timer modified: will call GetUpdate in 1.0 seconds at 2017-04-15 14:28:51 - Interval 1
2017.04.15 14:28:50 5: ModBus_Sensor01: GetUpdate called
2017.04.15 14:28:50 5: ModBus_Sensor01: GetUpdate objects from attributes: h3 h1 h0
2017.04.15 14:28:50 5: ModBus_Sensor01: GetUpdate full object list: h0 h1 h3
2017.04.15 14:28:50 5: ModBus_Sensor01: GetUpdate check h0 => Temperature, poll = 1, last = 0
2017.04.15 14:28:50 4: ModBus_Sensor01: GetUpdate will request Temperature
2017.04.15 14:28:50 5: ModBus_Sensor01: GetUpdate check h1 => Humidity, poll = 1, last = 0
2017.04.15 14:28:50 4: ModBus_Sensor01: GetUpdate will request Humidity
2017.04.15 14:28:50 5: ModBus_Sensor01: GetUpdate check h3 => BaudRate, poll = 1, last = 0
2017.04.15 14:28:50 4: ModBus_Sensor01: GetUpdate will request BaudRate
2017.04.15 14:28:50 5: ModBus_Sensor01: GetUpdate tries to combine read commands
2017.04.15 14:28:50 5: ModBus_Sensor01: Combine Temperature (h0) with Humidity (h1), span=2, max=5, drop read for h1
2017.04.15 14:28:50 5: ModBus_Sensor01: Combine Temperature (h0) with BaudRate (h3), span=4, max=5, drop read for h3
2017.04.15 14:28:50 4: ModBus_Sensor01: Send called with h0, len 1 / span 4 to id 1, op read, qlen 0, value hex 30
2017.04.15 14:28:50 4: ModBus_Sensor01: Send queues fc 3 to 1, for h0 (Temperature), len/span 4, value hex 30
2017.04.15 14:28:51 4: ModBus_Sensor01: update timer modified: will call GetUpdate in 1.0 seconds at 2017-04-15 14:28:52 - Interval 1
2017.04.15 14:28:51 5: ModBus_Sensor01: GetUpdate called
2017.04.15 14:28:51 5: ModBus_Sensor01: GetUpdate objects from attributes: h3 h1 h0
2017.04.15 14:28:51 5: ModBus_Sensor01: GetUpdate full object list: h0 h1 h3
2017.04.15 14:28:51 5: ModBus_Sensor01: GetUpdate check h0 => Temperature, poll = 1, last = 0
2017.04.15 14:28:51 4: ModBus_Sensor01: GetUpdate will request Temperature
2017.04.15 14:28:51 5: ModBus_Sensor01: GetUpdate check h1 => Humidity, poll = 1, last = 0
2017.04.15 14:28:51 4: ModBus_Sensor01: GetUpdate will request Humidity
2017.04.15 14:28:51 5: ModBus_Sensor01: GetUpdate check h3 => BaudRate, poll = 1, last = 0
2017.04.15 14:28:51 4: ModBus_Sensor01: GetUpdate will request BaudRate
2017.04.15 14:28:51 5: ModBus_Sensor01: GetUpdate tries to combine read commands
2017.04.15 14:28:51 5: ModBus_Sensor01: Combine Temperature (h0) with Humidity (h1), span=2, max=5, drop read for h1
2017.04.15 14:28:51 5: ModBus_Sensor01: Combine Temperature (h0) with BaudRate (h3), span=4, max=5, drop read for h3
2017.04.15 14:28:51 4: ModBus_Sensor01: Send called with h0, len 1 / span 4 to id 1, op read, qlen 1, value hex 30
2017.04.15 14:28:51 5: ModBus_Sensor01: Send is checking if request is already in queue (1 requests)
2017.04.15 14:28:51 5: ModBus_Sensor01: is it h 0 len 4 to id 1?
2017.04.15 14:28:51 4: ModBus_Sensor01: request already in queue - dropping


Leider bekomme ich, wenn ich ein GET ModBus_Sensor01 Temperature ausführen als Antwort "No FD". Selbiges passiert, wenn ich das Ganze aus der Web Oberfläche aurufe.

Hier die zugehörige cfg:


define initialUsbCheck notify global:INITIALIZED usb create
define ModBusModem Modbus /dev/ttyUSB0@9600,8,N,1
attr ModBusModem dropQueueDoubles 1
attr ModBusModem group MyDevices
attr ModBusModem verbose 5
define ModBus_Sensor01 ModbusAttr 1 1
attr ModBus_Sensor01 userattr IODev dev-h-combine dev-h-defPoll dev-h-defShowGet dev-h-read obj-h0-expr obj-h0-poll obj-h0-reading obj-h0-unpack obj-h1-expr obj-h1-reading obj-h1-unpack obj-h2-expr obj-h3-map obj-h3-reading obj-h3-unpack stateFormat verbose
attr ModBus_Sensor01 IODev ModBusModem
attr ModBus_Sensor01 dev-h-combine 5
attr ModBus_Sensor01 dev-h-defPoll 1
attr ModBus_Sensor01 dev-h-defShowGet 1
attr ModBus_Sensor01 dev-h-read 3
attr ModBus_Sensor01 obj-h0-expr $val / 10
attr ModBus_Sensor01 obj-h0-reading Temperature
attr ModBus_Sensor01 obj-h0-unpack n
attr ModBus_Sensor01 obj-h1-reading Humidity
attr ModBus_Sensor01 obj-h1-unpack n
attr ModBus_Sensor01 obj-h2-expr $val / 10
attr ModBus_Sensor01 obj-h3-map 0:1200 1:2400 2:4800 3:9600 4:19200
attr ModBus_Sensor01 obj-h3-reading BaudRate
attr ModBus_Sensor01 obj-h3-unpack n
attr ModBus_Sensor01 stateFormat {sprintf("Temperatur: %.1f Grad Celsius", ReadingsVal($name,"Temperature",0))}
attr ModBus_Sensor01 verbose 5


Ich habe echt keinen Schimmer, was ich falsch mache und ich habe auch nichts passendes im Forum gefunden.

Kann mir hier vielleicht einer der alten Hasen auf's Pferd helfen?


Vielen Dank und viele Grüße

Christian

Thorsten Pferdekaemper

Hi,
ich muss sagen, ich habe von Modbus keinen Plan, aber vielleicht könntest Du mal folgendes liefern, damit diejenigen, die davon einen Plan haben, besser helfen können:

  • Die Ausgabe von "list ModBusModem"
  • Die Ausgabe von "list ModBus_Sensor01"
  • Was steht im Log, wenn Du die Meldung "No LD" bekommen hast, also ein paar Sekunden vorher und ein paar Sekunden nachher?
Gruß,
   Thorsten
FUIP

cheak

Hallo Zusammen,

es scheint so zu sein, dass ich zwar Daten an die FTDI RS485 Schnittstelle schicken kann, das ModBus Protokoll aber irgendwie auf dem RPI nicht richtig funktioniert. Ich habe mal versucht mit mbpoll vom RPI an die Daten zu kommen und erhalte nur Timeouts. Auf einem Windows Rechner geht es.

In jedem Fall scheint es eher kein FHEM Problem zu sein. Ich melde mich, sollte ich das Problem lösen können.

Viele Grüße

Christian