Neues Modul für Geräte mit Modbus Schnittstelle über RS232 bzw. RS485

Begonnen von StefanStrobel, 12 Juli 2014, 14:50:22

Vorheriges Thema - Nächstes Thema

Ppunk

Hallo

kann mir keiner helfen um das Problem zu lösen?

Ich wies einfach nicht wie ich das richtige Register in der Adresse Auslesen muss um die korrekten werte zu erhalten.

Roger

Hallo Stefan,
Wiki Seite ist ein guter Vorschlag. Bin allerdings nächste Woche nicht verfügbar. Weißt Du wie man zu einem Account kommt?
Eventuell macht es ja auch Sinn, wenn ich mein Modul selbst hochlade. Wie ist hier das Verfahren?
Roger
Zotac & RPIs mit 10*FHEM
2*HM-LAN, 2*JeeLink, 2*RS485, SignalESP
HomeMatic, PCA301 Komponenten, ModBus: Stromzähler, Fronius WR, Shelly, Victron

Marie

Zitat von: Ppunk am 04 Juni 2015, 11:26:52
Hallo

kann mir keiner helfen um das Problem zu lösen?

Ich wies einfach nicht wie ich das richtige Register in der Adresse Auslesen muss um die korrekten werte zu erhalten.

Hallo,

Du musst zwei aufeinanderfolgende Register auslesen, das erste quasi Zwischenspeichern und dann beim zweiten in der Berechnung mit benutzen....wie das allerdings in Perl funktioniert, weiß ich noch nicht, dazu habe ich mich bisher zu wenig damit beschäftigt.... Die Sprache ist mir, gelinde gesagt ein wenig suspekt. Aber das liegt wohl nur daran das ich mich noch nicht so sehr mit der Notation auseinandergesetzt habe, aber ich seh schon das ich das wohl mal tun muss....

Aber es gibt hier reichlich fähige Leute, die dir bestimmt helfen können....
Banana Pi & FHEM2FHEM Raspberry,RS485 Modbus Stromzähler UMG96, diverse Schaltsteckdosen 433 MHz, 868 MHz, MYSENSORS Temperatursensoren , Smartvisu, Homekit & Siri, Geofency, Zwave Rauchmelder & Steckdosen & Garagensteuerung, TabletUi mit BananaPi M2Ultra im Wohnmobil, Homebridge usw.usw.

StefanStrobel

Hallo Ppunk,

Wenn der Wert, den Du lesen möchtest als normaler Float-Wert in zwei Registern (also 4 Bytes) gespeichert ist, geht es recht einfach. Das Modul macht dann alles für Dich. Du musst nur als Länge 2 angeben und als unpack Code f>. Also so ungefähr:

define MyRS485 Modbus /dev/device@baudrate
define MyDev ModbusAttr 1 30
attr MyDev dev-h-defPoll 1
attr MyDev obj-h4303-reading Frequenz
attr MyDev obj-h4303-len 2
attr MyDev obj-h4303-unpack f>


Details zu den Attributen findest Du im Wiki:
http://www.fhemwiki.de/wiki/ModbusAttr
Und eine vernünftige Beschreibung zum Modbus-Protokoll hier:
http://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf
Die Codes für die Perl-Befehle pack und unpack, die vom Modul verwendet werden findest Du hier:
http://perldoc.perl.org/functions/pack.html

Wenn falsche Werte herauskommen, kann es noch zwei Ursachen haben: Die Nummerierung der Register bei Modbus beginnt im Protokoll bei 0, bei Geräten aber bei 1. Eventuell musst Du also einfach eine Adresse vor oder zurück.
Die Float Kodierung kann im big endian oder small endian Format sein. Statt f> kannst Du daher auch f< probieren.
   
Gruß
    Stefan



StefanStrobel

Ergänzung:

Wenn der Wert dann noch durch 10000 dividiert werden muss (wie es Marie in einer Anleitung gefunden hat), dann kannst Du einfach noch ein

attr MyDev obj-h4303-expr $val / 10000

hinzufügen.

Gruss
    Stefan

Marie

Banana Pi & FHEM2FHEM Raspberry,RS485 Modbus Stromzähler UMG96, diverse Schaltsteckdosen 433 MHz, 868 MHz, MYSENSORS Temperatursensoren , Smartvisu, Homekit & Siri, Geofency, Zwave Rauchmelder & Steckdosen & Garagensteuerung, TabletUi mit BananaPi M2Ultra im Wohnmobil, Homebridge usw.usw.

davipet

Hi Leute,

ich versuche grade meinen Janitza UMG 96S anzubinden.

Ich habe den zwar auch per Profibus an meiner S7 3152DP und diese per Libnodave am FHEM - aber dennoch möchte ich den Janitza per RS485 auslesen. Macht es einfach direkter und lässt sich dann auch besser reproduzieren auf weiteren Systemen. (Mein Dad hat auch Bedarf ;) )

Zu meinem Problem...
Ich bekomme schlicht keine Daten.
Das Log bleibt leer bis auf :

2015.06.04 20:00:26 3: Opening ModbusRS485 device /dev/ttyUSB0
2015.06.04 20:00:26 3: Setting ModbusRS485 baudrate to 9600
2015.06.04 20:00:26 3: ModbusRS485 device opened
2015.06.04 20:00:26 3: Power: defined with id 1, interval 5, destination ModbusRS485, protocol RTU


Ich habe im Wesentlichen den Codeschnipsel von Marie aus #93 verwendet.
Gerät ist ja das Selbe. Adresse von 105 auf 1 gesetzt. Und auf 9600Baud da es so im Gerät eingestellt ist.
Das Gerät stet auf RS232 - ist das richtig? Die RS485 Option ist für eine direkte 2-draht verkabelung?

Am USBSERIAL lese ich per lsmod "pl2303"

FHEM läuft auf Raspi und ist frisch...

Wie kann ich nun am Besten vorgehen um den Fehler einzugrenzen?

Danke für eure Hilfe!

David

Marie

Hallo,

Das Gerät mus auf RS485, RS232 ist für Point-to-Point....

Probier mal....

LG

Marie
Banana Pi & FHEM2FHEM Raspberry,RS485 Modbus Stromzähler UMG96, diverse Schaltsteckdosen 433 MHz, 868 MHz, MYSENSORS Temperatursensoren , Smartvisu, Homekit & Siri, Geofency, Zwave Rauchmelder & Steckdosen & Garagensteuerung, TabletUi mit BananaPi M2Ultra im Wohnmobil, Homebridge usw.usw.

Ppunk

Danke Stefan so gehst.

wie geht das kürzen auf zwei Kommastellen ?

davipet

Sorry, dass hier jetzt zwei Probleme Parallel besprochen werden!
@Marie: Danke - da war mein Fehler... Also nicht direkt... Ich habe einen USB -RS232 Adapter erwischt. Bin also erstmal raus aus dem Problem bis ich den richtigen Adapter aus der 4ma habe... ;-)

DANKE!

David

pejonp

Zitat von: StefanStrobel am 04 Juni 2015, 09:19:55

.. angeht, so könnte das Problem die Even Parity sein. Soweit ich mich erinnere stellt devio immer 8n1 ein (dieses Basismodul verwenden die meisten Module, auch Modbus.pm).
....

Hallo Stefan,

ich habe im Modul DevIO.pm in Zeile 309 einmal       

$po->parity('even');  eingetragen.
Leider läst sich der DRT710M zu nichts überreden. Eigenartigerweise empfängt der andere RS485 (SolarEdge)  der auf 'none' lief/läuft immer noch Daten. Der Linux-Rechner wurde auch schon neu gestartet.
Ich versuche noch einmal die Register anzupassen.
Zur Zeit steht im Log für den DRT710 folgendes:

2015.06.04 21:44:02 5: SW: 0103000f0008740f
2015.06.04 21:44:02 5: DRT710M: Send adds fcode 3 for Frequenz_Hz to queue: 0103004d0004d41e pdu 03004d0004
2015.06.04 21:44:04 4: DRT710M: timeout waiting for 3 from 1, Request was 0103000f0008740f, last Buffer:
2015.06.04 21:44:04 4: DRT710M: handle queue sends 0103004d0004d41e (fcode 3 to 1 for Frequenz_Hz, len 4 )
2015.06.04 21:44:04 5: SW: 0103004d0004d41e
2015.06.04 21:44:06 4: DRT710M: timeout waiting for 3 from 1, Request was 0103004d0004d41e, last Buffer:
2015.06.04 21:44:52 5: DRT: GetUpdate called
2015.06.04 21:44:52 5: DRT: GetUpdate objects from attributes: h15 h77
2015.06.04 21:44:52 5: DRT: GetUpdate full object list: h15 h77
2015.06.04 21:44:52 5: DRT: GetUpdate check h15 => VoltageL1, poll = 1, last = 0
2015.06.04 21:44:52 5: DRT: GetUpdate will request VoltageL1
2015.06.04 21:44:52 5: DRT: GetUpdate check h77 => Frequenz_Hz, poll = 1, last = 0
2015.06.04 21:44:52 5: DRT: GetUpdate will request Frequenz_Hz
2015.06.04 21:44:52 5: DRT: GetUpdate tries to combine read commands
2015.06.04 21:44:52 5: DRT: GetUpdate: combine for h is 8
2015.06.04 21:44:52 5: DRT: GetUpdate cannot combine VoltageL1 / h15 with Frequenz_Hz / h77, span would be 66
2015.06.04 21:44:52 5: DRT: GetUpdate: combine for h is 8
2015.06.04 21:44:52 5: DRT710M: Send adds fcode 3 for VoltageL1 to queue: 0103000f0008740f pdu 03000f0008
2015.06.04 21:44:52 4: DRT710M: handle queue sends 0103000f0008740f (fcode 3 to 1 for VoltageL1, len 8 )
2015.06.04 21:44:52 5: SW: 0103000f0008740f
2015.06.04 21:44:52 5: DRT710M: Send adds fcode 3 for Frequenz_Hz to queue: 0103004d0004d41e pdu 03004d0004
2015.06.04 21:44:54 4: DRT710M: timeout waiting for 3 from 1, Request was 0103000f0008740f, last Buffer:
2015.06.04 21:44:54 4: DRT710M: handle queue sends 0103004d0004d41e (fcode 3 to 1 for Frequenz_Hz, len 4 )
2015.06.04 21:44:54 5: SW: 0103004d0004d41e
2015.06.04 21:44:56 4: DRT710M: timeout waiting for 3 from 1, Request was 0103004d0004d41e, last Buffer:
2015.06.04 21:45:42 5: DRT: GetUpdate called
2015.06.04 21:45:42 5: DRT: GetUpdate objects from attributes: h15 h77
2015.06.04 21:45:42 5: DRT: GetUpdate full object list: h15 h77
2015.06.04 21:45:42 5: DRT: GetUpdate check h15 => VoltageL1, poll = 1, last = 0
2015.06.04 21:45:42 5: DRT: GetUpdate will request VoltageL1
2015.06.04 21:45:42 5: DRT: GetUpdate check h77 => Frequenz_Hz, poll = 1, last = 0
2015.06.04 21:45:42 5: DRT: GetUpdate will request Frequenz_Hz
2015.06.04 21:45:42 5: DRT: GetUpdate tries to combine read commands
2015.06.04 21:45:42 5: DRT: GetUpdate: combine for h is 8
2015.06.04 21:45:42 5: DRT: GetUpdate cannot combine VoltageL1 / h15 with Frequenz_Hz / h77, span would be 66
2015.06.04 21:45:42 5: DRT: GetUpdate: combine for h is 8
2015.06.04 21:45:42 5: DRT710M: Send adds fcode 3 for VoltageL1 to queue: 0103000f0008740f pdu 03000f0008
2015.06.04 21:45:42 4: DRT710M: handle queue sends 0103000f0008740f (fcode 3 to 1 for VoltageL1, len 8 )
2015.06.04 21:45:42 5: SW: 0103000f0008740f
2015.06.04 21:45:42 5: DRT710M: Send adds fcode 3 for Frequenz_Hz to queue: 0103004d0004d41e pdu 03004d0004
2015.06.04 21:45:44 4: DRT710M: timeout waiting for 3 from 1, Request was 0103000f0008740f, last Buffer:
2015.06.04 21:45:44 4: DRT710M: handle queue sends 0103004d0004d41e (fcode 3 to 1 for Frequenz_Hz, len 4 )
2015.06.04 21:45:44 5: SW: 0103004d0004d41e
2015.06.04 21:45:46 4: DRT710M: timeout waiting for 3 from 1, Request was 0103004d0004d41e, last Buffer:

Vielleicht kannst du da schon etwas eingrenzen. Oder hast du ein Perlscript mit dem man ganz einfach einen Wert auslesen kann. Ich habe schon diese versucht (siehe Anlage). Der SolarEdge macht alles mit und liefert Daten, ob even oder none.
Können noch andere Zeiten eingestellt werden ?? Vielen Dank.

Tschüss Jörg
LaCrossGW 868MHz:WT470+TFA+TX37-IT+EMT7110+W136+WH25A HP1003+WH2621
SignalD(CC1101):Bresser+WS-0101(868MHz WH1080)+Velux KLF200+MAX!+HM-MOD-UART:Smoke HM-SEC-SD+VITOSOLIC 200 RESOL VBUS-LAN+SolarEdge SE5K(Modbus)+Sonnen!eco8(10kWh)+TD3511+DRT710M(Modbus)+ZigBee+Z-Wave+MQTT+vitoconnect

Ppunk

Danke an Stefan und Marie für die große Hilfe.
Hier der Code für den Janitza Zähler ECSEEM113 bzw.ECSEEM114

define ModbusRS485 Modbus /dev/ttyUSB0@19200
attr ModbusRS485 room System

define MyDev ModbusAttr 1 10
attr MyDev userattr dev-h-defPoll obj-h4279-expr obj-h4279-format obj-h4279-len obj-h4279-reading obj-h4279-unpack obj-h4303-format obj-h4303-len obj-h4303-reading obj-h4303-unpack stateFormat
attr MyDev IODev ModbusRS485
attr MyDev obj-h4131-format %2f
attr MyDev obj-h4131-len 2
attr MyDev obj-h4131-reading Wirkenergie_Gesamt(kWh)
attr MyDev obj-h4131-unpack f>
attr MyDev obj-h4151-format %2f
attr MyDev obj-h4151-len 2
attr MyDev obj-h4151-reading Wirkleistung_L1(kW)
attr MyDev obj-h4151-unpack f>
attr MyDev obj-h4153-format %2f
attr MyDev obj-h4153-len 2
attr MyDev obj-h4153-reading Wirkleistung_L2(kW)
attr MyDev obj-h4153-unpack f>
attr MyDev obj-h4155-format %2f
attr MyDev obj-h4155-len 2
attr MyDev obj-h4155-reading Wirkleistung_L3(kW)
attr MyDev obj-h4155-unpack f>
attr MyDev obj-h4157-format %2f
attr MyDev obj-h4157-len 2
attr MyDev obj-h4157-reading Wirkleistung_Gesamt(kW)
attr MyDev obj-h4157-unpack f>
attr MyDev obj-h4267-format %2f
attr MyDev obj-h4267-len 2
attr MyDev obj-h4267-reading Spannung_L1-N
attr MyDev obj-h4267-unpack f>
attr MyDev obj-h4269-format %2f
attr MyDev obj-h4269-len 2
attr MyDev obj-h4269-reading Spannung_L2-N
attr MyDev obj-h4269-unpack f>
attr MyDev obj-h4271-format %2f
attr MyDev obj-h4271-len 2
attr MyDev obj-h4271-reading Spannung_L3-N
attr MyDev obj-h4271-unpack f>
attr MyDev obj-h4279-format %2f
attr MyDev obj-h4279-len 2
attr MyDev obj-h4279-reading Strom_L1
attr MyDev obj-h4279-unpack f>
attr MyDev obj-h4281-format %2f
attr MyDev obj-h4281-len 2
attr MyDev obj-h4281-reading Strom_L2
attr MyDev obj-h4281-unpack f>
attr MyDev obj-h4283-format %2f
attr MyDev obj-h4283-len 2
attr MyDev obj-h4283-reading Strom_L3
attr MyDev obj-h4283-unpack f>
attr MyDev obj-h4303-format %2f
attr MyDev obj-h4303-len 2
attr MyDev obj-h4303-reading Frequenz
attr MyDev obj-h4303-unpack f>
attr MyDev dev-h-defPoll 1

StefanStrobel

Hallo Jörg,

Laut Log werden die Requests an das Device gesendet nur das antwortet nicht. Wenn Adressen, Baudrate, Device etc. stimmen, dann fällt mir auch erstmal nicht mehr viel ein.
Hast Du eine Möglichkeit, die Kommunikation von Qmodbus mitzulesen und mit der Fhem-Kommunikation zu vergleichen?
Könnte es sein, dass Qmodbus die Adressen anders zählt (beginnend bei 1 statt bei 0)?
Hast Du mal versucht, die Adressen um 1 zu variieren?

Gruß
    Stefan

StefanStrobel

Hallo Ppunk,

Schön dass es jetzt klappt.
Wenn Du es noch etwas eleganter machen möchtest, könntest Du statt der einzelnen -len, -format und -unpack Attribute einfach je einmal dev-h-defLen, dev-h-defFormat und der-h-defUnpack setzen. Das gilt dann für alle Holding-Register als Default und muss nur noch angegeben werden, wenn es davon abweicht. Dann bleibt für die meisten Werte nur ein -Reading Atrribut übrig :-)

Gruß
    Stefan

pejonp

Hallo Stefan,

hier mal die Ein und Ausgaben über QModBus.
Es werden die Reg 0x0010 - 0x0014 Länge 4 bytes  (Voltage L1 - L3) und das Reg 0X004E Länge 4 bytes (Frequency) ausgelesen.

Gesendet: (Reg: 0x0010 -> Dec: 16, 6 Register)
01  03  00 10  00 06
Empfang:
01 03 0c 00 00 00 e8 00 00 00 e6 00 00 00 e6 b5 28

Reg 16: 0
Reg 17: 232
Reg 18: 0
Reg 19: 230
Reg 20: 0
Reg 21: 230

Im Fhem.log sieht das so aus. Und Fhem sendet das hier : 01030010000445cc pdu 0300100004
bis zum 01 03 00 10 ist alles ok, danach sollte eigentlich ein 06 kommen und dann nichts mehr.  Kann man die Länge festlegen ?


2015.06.05 22:19:36 5: DRT: GetUpdate called
2015.06.05 22:19:36 5: DRT: GetUpdate objects from attributes: h16
2015.06.05 22:19:36 5: DRT: GetUpdate full object list: h16
2015.06.05 22:19:36 5: DRT: GetUpdate check h16 => VoltageL1, poll = 1, last = 0
2015.06.05 22:19:36 5: DRT: GetUpdate will request VoltageL1
2015.06.05 22:19:36 5: DRT: GetUpdate tries to combine read commands
2015.06.05 22:19:36 5: DRT: GetUpdate: combine for h is 6
2015.06.05 22:19:36 5: DRT710M: Send adds fcode 3 for VoltageL1 to queue: 01030010000445cc pdu 0300100004
2015.06.05 22:19:36 4: DRT710M: handle queue sends 01030010000445cc (fcode 3 to 1 for VoltageL1, len 4)
2015.06.05 22:19:36 5: SW: 01030010000445cc
2015.06.05 22:19:38 4: DRT710M: timeout waiting for 3 from 1, Request was 01030010000445cc, last Buffer:
2015.06.05 22:20:26 5: DRT: GetUpdate called
LaCrossGW 868MHz:WT470+TFA+TX37-IT+EMT7110+W136+WH25A HP1003+WH2621
SignalD(CC1101):Bresser+WS-0101(868MHz WH1080)+Velux KLF200+MAX!+HM-MOD-UART:Smoke HM-SEC-SD+VITOSOLIC 200 RESOL VBUS-LAN+SolarEdge SE5K(Modbus)+Sonnen!eco8(10kWh)+TD3511+DRT710M(Modbus)+ZigBee+Z-Wave+MQTT+vitoconnect