Optokoppler-Eingänge lassen sich über ModbusAttr-Modul nicht einlesen

Begonnen von Xaneu, 08 September 2022, 15:56:14

Vorheriges Thema - Nächstes Thema

Xaneu

Hallo,

ich betreibe seit eine paar Tagen eine preiswerte Modbus (RTU)-Relaiskarte ,,LC-Modbus-8R-D7" des Herstellers LCTech.
Die Ansteuerung der 8 Relais und das Rücklesen der Schaltstati funktioniert auch gut über den Function-Code ,,05" (setzen einer diskrete Ausgangsspule).
Die Karte hat zusätzlich auch 8 Optoeingänge, die über den Function-Code ,,02" (lesen diskreter Eingangskontakte) eingelesen werden.

Im Manual der Karte steht dafür folgende Befehlssequenz:

Read optocoupler input status

send:   FF 02 00 00 00 08 6C 12
return :   FF 02 01 01 51 A0

remarks: The 4th byte of the Return frame, the Bit0-Bit7 of 0x01 represent input signal of
optocoupler1- optocoupler 8, 0 represent low level ,1 represent high level


Das stimmt meines Erachtens auch soweit mit der Modbus-Spezifikation über ein.
Ich habe das ModbusAttr-Modul für die Relaisausgänge und Optokoppler folgendemaßen konfiguriert:


define Modbus_Relaiskarte ModbusAttr 255 60 192.168.63.12:502 TCP
attr Modbus_Relaiskarte verbose 5
# Relaisausgang
attr Modbus_Relaiskarte obj-c0-map 1:on, 0:off
attr Modbus_Relaiskarte obj-c0-reading Relay.1
attr Modbus_Relaiskarte obj-c0-set 1
attr Modbus_Relaiskarte obj-c0-showGet 1
...
attr Modbus_Relaiskarte obj-c7-map 1:on, 0:off
attr Modbus_Relaiskarte obj-c7-reading Relay.1
attr Modbus_Relaiskarte obj-c7-set 1
attr Modbus_Relaiskarte obj-c7-showGet 1
# Optoeingang
attr Modbus_Relaiskarte obj-d0-reading OptoInputs
attr Modbus_Relaiskarte obj-d0-len 8
attr Modbus_Relaiskarte obj-d0-showGet 1


Wenn ich nun versuche die Optoeingänge über ein get-Befehl zu lesen, sehe ich in der fhem.log, dass die Sendesequenz korrekt gesendet wird und dass die Empangsequenz korrekt zurück gesendet wird.

Sendesequenz:    FF 02 00 00 00 08  *
Empfangssequenz:  FF 02 01 08 *

*Anmerkung:
Die beiden Checksum-Bytes hinten d'ran werden in der fhem.log nicht angezeigt.
Auch habe ich hier ein Optokopplereingang beschaltet, so dass das empfangene Byte (oben rot dargestellt) mit 08 von 00 abweicht um einen funktionierender Zugriff zu erkennen.

Mein Problem:  Bei jedem get-Befehl wird für das Reading ,,OptoInputs" immer nur der Wert ,,0" eingelesen/angezeigt.

Allerdings gibt es in der fhem log mit "Verbose 5" eine Menge Einträge, die darauf deuten, dass 8 Daten-Bytes als Antwort erwartet werden und FHEM ein Zuordnungsproblem hat (siehe "SplitDataString-Einträge"):


2022.09.06 17:25:56 4: Modbus_Relaiskarte: get called with OptoInputs (d0)
2022.09.06 17:25:56 5: Modbus_Relaiskarte: GetSetChecks with force
2022.09.06 17:25:56 5: Modbus_Relaiskarte: GetSetChecks returns success
2022.09.06 17:25:56 4: Modbus_Relaiskarte: DoRequest called from GetLDFn created new request, read buffer empty,
request: id 255, read fc 2 d0, len 8, tid 246, master device Modbus_Relaiskarte, reading OptoInputs (get OptoInputs)
2022.09.06 17:25:56 5: Modbus_Relaiskarte: QueueRequest called from DoRequest with d0, qlen 0 from master Modbus_Relaiskarte through io device Modbus_Relaiskarte
2022.09.06 17:25:56 5: Modbus_Relaiskarte: ProcessRequestQueue called from QueueRequest as direct:Modbus_Relaiskarte, qlen 1, force, request: request: id 255, read fc 2 d0, len 8, tid 246, master device Modbus_Relaiskarte, reading OptoInputs (get OptoInputs), queued 0.00 secs ago
2022.09.06 17:25:56 5: Modbus_Relaiskarte: checkDelays commDelay, last communication with same device was never, required delay is 0.1
2022.09.06 17:25:56 5: Modbus_Relaiskarte: checkDelays clientSwitchDelay is not relevant
2022.09.06 17:25:56 5: Modbus_Relaiskarte: checkDelays busDelayRead, last activity on bus was never, required delay is 0
2022.09.06 17:25:56 5: Modbus_Relaiskarte: checkDelays sendDelay, last send to same device was never, required delay is 0.1
2022.09.06 17:25:56 4: Modbus_Relaiskarte: ProcessRequestQueue (V4.4.04 - 17.7.2021) qlen 1, sending 00f600000006ff0200000008 via 192.168.63.12:502, read buffer empty,
request: id 255, read fc 2 d0, len 8, tid 246, master device Modbus_Relaiskarte, reading OptoInputs (get OptoInputs), queued 0.00 secs ago
2022.09.06 17:25:56 5: Modbus_Relaiskarte: Send called from ProcessRequestQueue
2022.09.06 17:25:56 5: DevIo_SimpleWrite Modbus_Relaiskarte: 00f600000006ff0200000008
2022.09.06 17:25:56 5: Modbus_Relaiskarte: ReadAnswer called from GetLDFn
2022.09.06 17:25:56 5: Modbus_Relaiskarte: ReadAnswer remaining timeout is 1.99694800376892
2022.09.06 17:25:56 5: Modbus_Relaiskarte: ReadAnswer got: 00f600000004ff020108
2022.09.06 17:25:56 5: Modbus_Relaiskarte: ParseFrameStart called from ReadAnswer protocol TCP expecting id 255
2022.09.06 17:25:56 4: Modbus_Relaiskarte: ParseFrameStart (TCP, master) extracted id 255, fCode 2, tid 246, dlen 4 and potential data 0108
2022.09.06 17:25:56 5: Modbus_Relaiskarte: HandleResponse called from ReadAnswer
2022.09.06 17:25:56 5: Modbus_Relaiskarte: ParseResponse called from HandleResponse
2022.09.06 17:25:56 5: Modbus_Relaiskarte: now parsing response data objects, master is Modbus_Relaiskarte relay is undefined
2022.09.06 17:25:56 5: Modbus_Relaiskarte: ParseDataString called from HandleResponse with data hex 08, type d, adr 0, op read
2022.09.06 17:25:56 5: Modbus_Relaiskarte: SplitDataString called from ParseDataString with data hex 08, type d, adr 0, valuesLen 8, op read
2022.09.06 17:25:56 5: Modbus_Relaiskarte: SplitDataString shortened coil / input bit string to 00010000, start adr 0, valuesLen 8
2022.09.06 17:25:56 5: Modbus_Relaiskarte: SplitDataString has no information about handling d1
2022.09.06 17:25:56 5: Modbus_Relaiskarte: SplitDataString has no information about handling d2
2022.09.06 17:25:56 5: Modbus_Relaiskarte: SplitDataString has no information about handling d3
2022.09.06 17:25:56 5: Modbus_Relaiskarte: SplitDataString has no information about handling d4
2022.09.06 17:25:56 5: Modbus_Relaiskarte: SplitDataString has no information about handling d5
2022.09.06 17:25:56 5: Modbus_Relaiskarte: SplitDataString has no information about handling d6
2022.09.06 17:25:56 5: Modbus_Relaiskarte: SplitDataString has no information about handling d7
2022.09.06 17:25:56 5: Modbus_Relaiskarte: CreateDataObjects called from ParseDataString with objList d0
2022.09.06 17:25:56 5: Modbus_Relaiskarte: CreateDataObjects sortedList d0
2022.09.06 17:25:56 5: Modbus_Relaiskarte: CreateParseInfoCache called
2022.09.06 17:25:56 5: Modbus_Relaiskarte: CreateDataObjects unpacked 30 with a to 0
2022.09.06 17:25:56 5: Modbus_Relaiskarte: perl expression eval evaluated package main; my @val = @{$oRef->{'%val'}};$val*120 to 0
2022.09.06 17:25:56 4: Modbus_Relaiskarte: CreateDataObjects assigns value 0 to OptoInputs
2022.09.06 17:25:56 5: Modbus_Relaiskarte: ParseDataString created 1 readings
2022.09.06 17:25:56 4: Modbus_Relaiskarte: HandleResponse done, current frame / read buffer: 00f600000004ff020108, id 255, fCode 2, tid 246,
request: id 255, read fc 2 d0, len 8, tid 246, master device Modbus_Relaiskarte, reading OptoInputs (get OptoInputs), queued 0.28 secs ago, sent 0.28 secs ago,
response: id 255, fc 2, len 8, values 08
2022.09.06 17:25:56 5: Modbus_Relaiskarte: ResetExpect for HandleResponse from response to idle
2022.09.06 17:25:56 5: Modbus_Relaiskarte: DropFrame called from ReadAnswer - drop 00f600000004ff020108



Was mache ich falsch oder wie kann ich ModbusAttr so konfigrieren, dass das eine Datenbyte (jedes Bit steht für einen Eingang) korrekt eingelesen wird?

Gruß
Harald Schmitz
FHEM 6.1 @ RPi4, raspbian (buster) auf USB-SSD, PIUSV+, HM-MOD-RPI-PCB und viele Homematic-Komponenten, OBIS, vclient, VBUS, Modbus, E3DC-Photovoltaikumrichter, 1-wire, Shelly und eigene Module

Machen ist wie wollen, nur krasser!

Xaneu

Hallo

die Modbus-Spezifiktion geht beim Objekt "d" bzw. beim Function Code ,,02" bei einer Anzahl von 8 Registern von 8 1-Bit-Registern aus.
Das Modbus-Modul erwartet aber, wenn ich die Einträge in der log-Datei betrachte offensichtlich 8 Bytes:


now parsing response data objects, master is Modbus_Relaiskarte relay is undefined
2022.09.06 17:25:56 5: Modbus_Relaiskarte: ParseDataString called from HandleResponse with data hex 08, type d, adr 0, op read
2022.09.06 17:25:56 5: Modbus_Relaiskarte: SplitDataString called from ParseDataString with data hex 08, type d, adr 0, valuesLen 8, op read
2022.09.06 17:25:56 5: Modbus_Relaiskarte: SplitDataString shortened coil / input bit string to 00010000, start adr 0, valuesLen 8
2022.09.06 17:25:56 5: Modbus_Relaiskarte: SplitDataString has no information about handling d1
2022.09.06 17:25:56 5: Modbus_Relaiskarte: SplitDataString has no information about handling d2
2022.09.06 17:25:56 5: Modbus_Relaiskarte: SplitDataString has no information about handling d3
2022.09.06 17:25:56 5: Modbus_Relaiskarte: SplitDataString has no information about handling d4
2022.09.06 17:25:56 5: Modbus_Relaiskarte: SplitDataString has no information about handling d5
2022.09.06 17:25:56 5: Modbus_Relaiskarte: SplitDataString has no information about handling d6
2022.09.06 17:25:56 5: Modbus_Relaiskarte: SplitDataString has no information about handling d7
2022.09.06 17:25:56 5: Modbus_Relaiskarte: CreateDataObjects called from ParseDataString with objList d0
2022.09.06 17:25:56 5: Modbus_Relaiskarte: CreateDataObjects sortedList d0
2022.09.06 17:25:56 5: Modbus_Relaiskarte: CreateParseInfoCache called
2022.09.06 17:25:56 5: Modbus_Relaiskarte: CreateDataObjects unpacked 30 with a to 0


Im Modbus-Modul (modbus.pm) wird zwar in der Prozedur "SplitDataString" (Zeile 2527 bis 2601) die 1Bit-Struktur für das "d"-Objekt behandelt. Allerdings wirkt das bei mir irgendwie nicht.
Oder habe ich noch ein paar obj-Definitionen in der Konfiguration vergessen?

Würde mich freuen wenn jemand oder evtl. der Maintainer Stefan Strobel selbst helfen könnte.

Gruß
Harald Schmitz
FHEM 6.1 @ RPi4, raspbian (buster) auf USB-SSD, PIUSV+, HM-MOD-RPI-PCB und viele Homematic-Komponenten, OBIS, vclient, VBUS, Modbus, E3DC-Photovoltaikumrichter, 1-wire, Shelly und eigene Module

Machen ist wie wollen, nur krasser!

StefanStrobel

Hallo Harald,

auch das Modbus-Modul geht bei Coils und Discrete-Inputs von 1-Bit-Werten aus.
Du hast jedoch in Deiner Konfiguration mit
Zitat
attr Modbus_Relaiskarte obj-d0-len 8
ein Objekt definiert, das 8 Inputs zusammenfasst.
Die Konfiguration müsste aber analog zu den Coils für jedes Bit ein eigenes Reading vorsehen.

Falls Dein Gerät damit nicht klar kommt und nur auf Request mit Länge 8 antwortet, dann kannst Du die 8 Einträge beim Request wieder zusammenbauen. Das geht mit Combine bzw. obj-[cdih][0-9]+-group.

Gruss
   Stefan

Xaneu

Hallo Stefan,

danke für die schnelle Hilfe.
Mein Gerät antwortet nur auf ein Request mit Länge 8.
Ich habe mich dann erst einmal durch die Möglichkeiten und Auswirkungen von "-combine" und "-group" durchgearbeitet. Am Ende hat es aber funktioniert.
Für die Nachwelt hier nun die Lösung des Problems:


attr Modbus_Relaiskarte obj-d0-reading OptoInput.1
attr Modbus_Relaiskarte obj-d0-len 8
attr Modbus_Relaiskarte obj-d0-showGet 1
attr Modbus_Relaiskarte obj-d0-group 1-1
attr Modbus_Relaiskarte obj-d1-reading OptoInput.2
attr Modbus_Relaiskarte obj-d1-len 8
attr Modbus_Relaiskarte obj-d1-group 1-2
attr Modbus_Relaiskarte obj-d2-reading OptoInput.3
attr Modbus_Relaiskarte obj-d2-len 8
attr Modbus_Relaiskarte obj-d2-group 1-3
attr Modbus_Relaiskarte obj-d3-reading OptoInput.4
attr Modbus_Relaiskarte obj-d3-len 8
attr Modbus_Relaiskarte obj-d3-group 1-4
attr Modbus_Relaiskarte obj-d4-reading OptoInput.5
attr Modbus_Relaiskarte obj-d4-len 8
attr Modbus_Relaiskarte obj-d4-group 1-5
attr Modbus_Relaiskarte obj-d5-reading OptoInput.6
attr Modbus_Relaiskarte obj-d5-len 8
attr Modbus_Relaiskarte obj-d5-group 1-6
attr Modbus_Relaiskarte obj-d6-reading OptoInput.7
attr Modbus_Relaiskarte obj-d6-len 8
attr Modbus_Relaiskarte obj-d6-group 1-7
attr Modbus_Relaiskarte obj-d7-reading OptoInput.8
attr Modbus_Relaiskarte obj-d7-len 8
attr Modbus_Relaiskarte obj-d7-group 1-8
attr Modbus_Relaiskarte dev-d-combine 8


Abgerufen wird hier dann nur das Reading "OptoInput.1" mit get oder über das poll-Attribut.

Gruß
Harald
FHEM 6.1 @ RPi4, raspbian (buster) auf USB-SSD, PIUSV+, HM-MOD-RPI-PCB und viele Homematic-Komponenten, OBIS, vclient, VBUS, Modbus, E3DC-Photovoltaikumrichter, 1-wire, Shelly und eigene Module

Machen ist wie wollen, nur krasser!

Xaneu

Hallo Stefan,

das Einlesen der Eingänge funktioniert jetzt.
Allerdings kommt es, wenn ich im define ein Intervall festlege, in der log-Datei zyklisch zu folgenden Fehlermeldungen:


2022.09.09 21:51:13 3: Modbus_Relaiskarte: CreateUpdateHash found group 1 span 9 is longer than defined maximum 8
2022.09.09 21:51:13 3: Modbus_Relaiskarte: CreateUpdateHash found group 1 span 10 is longer than defined maximum 8
2022.09.09 21:51:13 3: Modbus_Relaiskarte: CreateUpdateHash found group 1 span 11 is longer than defined maximum 8
2022.09.09 21:51:13 3: Modbus_Relaiskarte: CreateUpdateHash found group 1 span 12 is longer than defined maximum 8
2022.09.09 21:51:13 3: Modbus_Relaiskarte: CreateUpdateHash found group 1 span 13 is longer than defined maximum 8
2022.09.09 21:51:13 3: Modbus_Relaiskarte: CreateUpdateHash found group 1 span 14 is longer than defined maximum 8
2022.09.09 21:51:13 3: Modbus_Relaiskarte: CreateUpdateHash found group 1 span 15 is longer than defined maximum 8


Gruß
Harald
FHEM 6.1 @ RPi4, raspbian (buster) auf USB-SSD, PIUSV+, HM-MOD-RPI-PCB und viele Homematic-Komponenten, OBIS, vclient, VBUS, Modbus, E3DC-Photovoltaikumrichter, 1-wire, Shelly und eigene Module

Machen ist wie wollen, nur krasser!

StefanStrobel

Hallo Harald,

könntest Du mal Deine vollständige Konfiguration posten?
Dann kann ich das bei mir versuchen nachzustellen.

Gruss
    Stefan

Xaneu

Hallo Stefan,

sorry, dass ich mich jetzt erst melde.
Hier die gewünschte Konfiguration:



#*****************************************************************************
#
#   Ansteuerung Relaiskarte LC-Modbus-8R-D7 Definitionen
#
#*****************************************************************************

define Modbus_Relaiskarte ModbusAttr 255 0 192.168.63.12:502 TCP
setuuid Modbus_Relaiskarte 63111bcc-f33f-59f2-07ba-179f2ea8e6fad6bc
attr Modbus_Relaiskarte verbose 5
# Definition der Relaisausgänge
attr Modbus_Relaiskarte dev-c-combine 8
attr Modbus_Relaiskarte obj-c0-group 1-1
attr Modbus_Relaiskarte obj-c0-len 8
attr Modbus_Relaiskarte obj-c0-map 1:on, 0:off
attr Modbus_Relaiskarte obj-c0-reading Relayoutput.1
attr Modbus_Relaiskarte obj-c0-set 1
attr Modbus_Relaiskarte obj-c0-showGet 1
attr Modbus_Relaiskarte obj-c1-group 1-2
attr Modbus_Relaiskarte obj-c1-len 8
attr Modbus_Relaiskarte obj-c1-map 1:on, 0:off
attr Modbus_Relaiskarte obj-c1-reading Relayoutput.2
attr Modbus_Relaiskarte obj-c1-set 1
attr Modbus_Relaiskarte obj-c2-group 1-3
attr Modbus_Relaiskarte obj-c2-len 8
attr Modbus_Relaiskarte obj-c2-map 1:on, 0:off
attr Modbus_Relaiskarte obj-c2-reading Relayoutput.3
attr Modbus_Relaiskarte obj-c2-set 1
attr Modbus_Relaiskarte obj-c3-group 1-4
attr Modbus_Relaiskarte obj-c3-len 8
attr Modbus_Relaiskarte obj-c3-map 1:on, 0:off
attr Modbus_Relaiskarte obj-c3-reading Relayoutput.4
attr Modbus_Relaiskarte obj-c3-set 1
attr Modbus_Relaiskarte obj-c4-group 1-5
attr Modbus_Relaiskarte obj-c4-len 8
attr Modbus_Relaiskarte obj-c4-map 1:on, 0:off
attr Modbus_Relaiskarte obj-c4-reading Relayoutput.5
attr Modbus_Relaiskarte obj-c4-set 1
attr Modbus_Relaiskarte obj-c5-group 1-6
attr Modbus_Relaiskarte obj-c5-len 8
attr Modbus_Relaiskarte obj-c5-map 1:on, 0:off
attr Modbus_Relaiskarte obj-c5-reading Relayoutput.6
attr Modbus_Relaiskarte obj-c5-set 1
attr Modbus_Relaiskarte obj-c6-group 1-7
attr Modbus_Relaiskarte obj-c6-len 8
attr Modbus_Relaiskarte obj-c6-map 1:on, 0:off
attr Modbus_Relaiskarte obj-c6-reading Relayoutput.7
attr Modbus_Relaiskarte obj-c6-set 1
attr Modbus_Relaiskarte obj-c7-group 1-8
attr Modbus_Relaiskarte obj-c7-len 8
attr Modbus_Relaiskarte obj-c7-map 1:on, 0:off
attr Modbus_Relaiskarte obj-c7-reading Relayoutput.8
attr Modbus_Relaiskarte obj-c7-set 1
# Definition der Relaisausgänge Monoflopbetrieb
# RelaisFalsh-Registerwert in 0,1 Sek. + 262144
attr Modbus_Relaiskarte dev-h-write 16
attr Modbus_Relaiskarte obj-h3-len 2
attr Modbus_Relaiskarte obj-h3-set 1
attr Modbus_Relaiskarte obj-h3-reading RelaisFlash.1
attr Modbus_Relaiskarte obj-h3-unpack N
attr Modbus_Relaiskarte obj-h8-len 2
attr Modbus_Relaiskarte obj-h8-set 1
attr Modbus_Relaiskarte obj-h8-reading RelaisFlash.2
attr Modbus_Relaiskarte obj-h8-unpack N
attr Modbus_Relaiskarte obj-h13-len 2
attr Modbus_Relaiskarte obj-h13-set 1
attr Modbus_Relaiskarte obj-h13-reading RelaisFlash.3
attr Modbus_Relaiskarte obj-h13-unpack N
attr Modbus_Relaiskarte obj-h18-len 2
attr Modbus_Relaiskarte obj-h18-set 1
attr Modbus_Relaiskarte obj-h18-reading RelaisFlash.4
attr Modbus_Relaiskarte obj-h18-unpack N
attr Modbus_Relaiskarte obj-h23-len 2
attr Modbus_Relaiskarte obj-h23-set 1
attr Modbus_Relaiskarte obj-h23-reading RelaisFlash.5
attr Modbus_Relaiskarte obj-h23-unpack N
attr Modbus_Relaiskarte obj-h28-len 2
attr Modbus_Relaiskarte obj-h28-set 1
attr Modbus_Relaiskarte obj-h28-reading RelaisFlash.6
attr Modbus_Relaiskarte obj-h28-unpack N
attr Modbus_Relaiskarte obj-h33-len 2
attr Modbus_Relaiskarte obj-h33-set 1
attr Modbus_Relaiskarte obj-h33-reading RelaisFlash.7
attr Modbus_Relaiskarte obj-h33-unpack N
attr Modbus_Relaiskarte obj-h38-len 2
attr Modbus_Relaiskarte obj-h38-set 1
attr Modbus_Relaiskarte obj-h38-reading RelaisFlash.8
attr Modbus_Relaiskarte obj-h38-unpack N
# Definition der Optokopplereingänge
attr Modbus_Relaiskarte dev-d-combine 8
attr Modbus_Relaiskarte obj-d0-group 1-1
attr Modbus_Relaiskarte obj-d0-len 8
attr Modbus_Relaiskarte obj-d0-poll 1
attr Modbus_Relaiskarte obj-d0-reading OptoInput.1
attr Modbus_Relaiskarte obj-d0-showGet 1
attr Modbus_Relaiskarte obj-d1-group 1-2
attr Modbus_Relaiskarte obj-d1-len 8
attr Modbus_Relaiskarte obj-d1-poll 0
attr Modbus_Relaiskarte obj-d1-reading OptoInput.2
attr Modbus_Relaiskarte obj-d2-group 1-3
attr Modbus_Relaiskarte obj-d2-len 8
attr Modbus_Relaiskarte obj-d2-poll 0
attr Modbus_Relaiskarte obj-d2-reading OptoInput.3
attr Modbus_Relaiskarte obj-d3-group 1-4
attr Modbus_Relaiskarte obj-d3-len 8
attr Modbus_Relaiskarte obj-d3-poll 0
attr Modbus_Relaiskarte obj-d3-reading OptoInput.4
attr Modbus_Relaiskarte obj-d4-group 1-5
attr Modbus_Relaiskarte obj-d4-len 8
attr Modbus_Relaiskarte obj-d4-poll 0
attr Modbus_Relaiskarte obj-d4-reading OptoInput.5
attr Modbus_Relaiskarte obj-d5-group 1-6
attr Modbus_Relaiskarte obj-d5-len 8
attr Modbus_Relaiskarte obj-d5-poll 0
attr Modbus_Relaiskarte obj-d5-reading OptoInput.6
attr Modbus_Relaiskarte obj-d6-group 1-7
attr Modbus_Relaiskarte obj-d6-len 8
attr Modbus_Relaiskarte obj-d6-poll 0
attr Modbus_Relaiskarte obj-d6-reading OptoInput.7
attr Modbus_Relaiskarte obj-d7-group 1-8
attr Modbus_Relaiskarte obj-d7-len 8
attr Modbus_Relaiskarte obj-d7-poll 0
attr Modbus_Relaiskarte obj-d7-reading OptoInput.8


In der Konfiguration habe ich das Poll-Intervall in der define-Zeile auf 0 gesetzt, damit die Fehler nicht in der LOG-Datei auftauchen.

Gruß
Harald
FHEM 6.1 @ RPi4, raspbian (buster) auf USB-SSD, PIUSV+, HM-MOD-RPI-PCB und viele Homematic-Komponenten, OBIS, vclient, VBUS, Modbus, E3DC-Photovoltaikumrichter, 1-wire, Shelly und eigene Module

Machen ist wie wollen, nur krasser!

StefanStrobel

Vielen Dank.
Schau ich mir demnächst mal an.

Gruß
    Stefan

StefanStrobel

Hallo Harald,

So wie Du es gerade konfiguriert hast passt es nicht.
Du möchtest ja 8 Eingänge gemeinsam in einem Request mit der Länge 8 lesen.
Jeder Eingang ist dann ein Reading, das einem einzelnen Coil entspricht.
Dafür muss aber die Länge jedes Objekts 1 sein und nicht 8
Durch die group-Anweisungen werden die 8 einzelnen Requests dann zusammen als 1 Request abgerufen und Fhem macht daraus wieder 8 einzelne Readings mit Länge 1

Die Fehlermeldung kommt daher dass 8 überlappende Objekte mit jeweils Länge 8 eine Gesamtlänge von 15 ergeben. Durch die die Konfiguration combine 8 ist das aber zu viel.
Übrigens musst Du nicht beides gleichzeitig angeben. Combine gruppiert die einzelnen Requests (die dann aber poll 1 haben sollten) beim zyklischen Abfragen automatisch.
Mit den group-Anweisungen machst Du das manuell. Beides muss nicht sein.

Gruss
   Stefan

Xaneu

Hallo Stefan,

danke für die Antwort.
Wenn ich Dich richtig verstanden habe, müsste die Konfiguration dann so aussehen:


define Modbus_Relaiskarte ModbusAttr 255 0 192.168.63.12:502 TCP
attr Modbus_Relaiskarte dev-c-combine 8
attr Modbus_Relaiskarte dev-d-combine 8
attr Modbus_Relaiskarte dev-h-write 16
attr Modbus_Relaiskarte obj-c0-group 1-1
attr Modbus_Relaiskarte obj-c0-len 8
attr Modbus_Relaiskarte obj-c0-map 1:on, 0:off
attr Modbus_Relaiskarte obj-c0-reading Relayoutput.1
attr Modbus_Relaiskarte obj-c0-set 1
attr Modbus_Relaiskarte obj-c0-showGet 1
attr Modbus_Relaiskarte obj-c1-group 1-2
attr Modbus_Relaiskarte obj-c1-len 8
attr Modbus_Relaiskarte obj-c1-map 1:on, 0:off
attr Modbus_Relaiskarte obj-c1-reading Relayoutput.2
attr Modbus_Relaiskarte obj-c1-set 1
attr Modbus_Relaiskarte obj-c2-group 1-3
attr Modbus_Relaiskarte obj-c2-len 8
attr Modbus_Relaiskarte obj-c2-map 1:on, 0:off
attr Modbus_Relaiskarte obj-c2-reading Relayoutput.3
attr Modbus_Relaiskarte obj-c2-set 1
attr Modbus_Relaiskarte obj-c3-group 1-4
attr Modbus_Relaiskarte obj-c3-len 8
attr Modbus_Relaiskarte obj-c3-map 1:on, 0:off
attr Modbus_Relaiskarte obj-c3-reading Relayoutput.4
attr Modbus_Relaiskarte obj-c3-set 1
attr Modbus_Relaiskarte obj-c4-group 1-5
attr Modbus_Relaiskarte obj-c4-len 8
attr Modbus_Relaiskarte obj-c4-map 1:on, 0:off
attr Modbus_Relaiskarte obj-c4-reading Relayoutput.5
attr Modbus_Relaiskarte obj-c4-set 1
attr Modbus_Relaiskarte obj-c5-group 1-6
attr Modbus_Relaiskarte obj-c5-len 8
attr Modbus_Relaiskarte obj-c5-map 1:on, 0:off
attr Modbus_Relaiskarte obj-c5-reading Relayoutput.6
attr Modbus_Relaiskarte obj-c5-set 1
attr Modbus_Relaiskarte obj-c6-group 1-7
attr Modbus_Relaiskarte obj-c6-len 8
attr Modbus_Relaiskarte obj-c6-map 1:on, 0:off
attr Modbus_Relaiskarte obj-c6-reading Relayoutput.7
attr Modbus_Relaiskarte obj-c6-set 1
attr Modbus_Relaiskarte obj-c7-group 1-8
attr Modbus_Relaiskarte obj-c7-len 8
attr Modbus_Relaiskarte obj-c7-map 1:on, 0:off
attr Modbus_Relaiskarte obj-c7-reading Relayoutput.8
attr Modbus_Relaiskarte obj-c7-set 1
attr Modbus_Relaiskarte obj-d0-group 1-1
attr Modbus_Relaiskarte obj-d0-len 1
attr Modbus_Relaiskarte obj-d0-poll 1
attr Modbus_Relaiskarte obj-d0-reading OptoInput.1
attr Modbus_Relaiskarte obj-d0-showGet 1
attr Modbus_Relaiskarte obj-d1-group 1-2
attr Modbus_Relaiskarte obj-d1-len 1
attr Modbus_Relaiskarte obj-d1-poll 1
attr Modbus_Relaiskarte obj-d1-reading OptoInput.2
attr Modbus_Relaiskarte obj-d2-group 1-3
attr Modbus_Relaiskarte obj-d2-len 1
attr Modbus_Relaiskarte obj-d2-poll 1
attr Modbus_Relaiskarte obj-d2-reading OptoInput.3
attr Modbus_Relaiskarte obj-d3-group 1-4
attr Modbus_Relaiskarte obj-d3-len 1
attr Modbus_Relaiskarte obj-d3-poll 1
attr Modbus_Relaiskarte obj-d3-reading OptoInput.4
attr Modbus_Relaiskarte obj-d4-group 1-5
attr Modbus_Relaiskarte obj-d4-len 1
attr Modbus_Relaiskarte obj-d4-poll 1
attr Modbus_Relaiskarte obj-d4-reading OptoInput.5
attr Modbus_Relaiskarte obj-d5-group 1-6
attr Modbus_Relaiskarte obj-d5-len 1
attr Modbus_Relaiskarte obj-d5-poll 1
attr Modbus_Relaiskarte obj-d5-reading OptoInput.6
attr Modbus_Relaiskarte obj-d6-group 1-7
attr Modbus_Relaiskarte obj-d6-len 1
attr Modbus_Relaiskarte obj-d6-poll 1
attr Modbus_Relaiskarte obj-d6-reading OptoInput.7
attr Modbus_Relaiskarte obj-d7-group 1-8
attr Modbus_Relaiskarte obj-d7-len 1
attr Modbus_Relaiskarte obj-d7-poll 1
attr Modbus_Relaiskarte obj-d7-reading OptoInput.8
attr Modbus_Relaiskarte obj-h13-len 2
attr Modbus_Relaiskarte obj-h13-reading RelaisFlash.3
attr Modbus_Relaiskarte obj-h13-set 1
attr Modbus_Relaiskarte obj-h13-unpack N
attr Modbus_Relaiskarte obj-h18-len 2
attr Modbus_Relaiskarte obj-h18-reading RelaisFlash.4
attr Modbus_Relaiskarte obj-h18-set 1
attr Modbus_Relaiskarte obj-h18-unpack N
attr Modbus_Relaiskarte obj-h23-len 2
attr Modbus_Relaiskarte obj-h23-reading RelaisFlash.5
attr Modbus_Relaiskarte obj-h23-set 1
attr Modbus_Relaiskarte obj-h23-unpack N
attr Modbus_Relaiskarte obj-h28-len 2
attr Modbus_Relaiskarte obj-h28-reading RelaisFlash.6
attr Modbus_Relaiskarte obj-h28-set 1
attr Modbus_Relaiskarte obj-h28-unpack N
attr Modbus_Relaiskarte obj-h3-len 2
attr Modbus_Relaiskarte obj-h3-reading RelaisFlash.1
attr Modbus_Relaiskarte obj-h3-set 1
attr Modbus_Relaiskarte obj-h3-unpack N
attr Modbus_Relaiskarte obj-h33-len 2
attr Modbus_Relaiskarte obj-h33-reading RelaisFlash.7
attr Modbus_Relaiskarte obj-h33-set 1
attr Modbus_Relaiskarte obj-h33-unpack N
attr Modbus_Relaiskarte obj-h38-len 2
attr Modbus_Relaiskarte obj-h38-reading RelaisFlash.8
attr Modbus_Relaiskarte obj-h38-set 1
attr Modbus_Relaiskarte obj-h38-unpack N
attr Modbus_Relaiskarte obj-h8-len 2
attr Modbus_Relaiskarte obj-h8-reading RelaisFlash.2
attr Modbus_Relaiskarte obj-h8-set 1
attr Modbus_Relaiskarte obj-h8-unpack N
attr Modbus_Relaiskarte verbose 5


Wenn ich mit dieser Konfiguration dann die Optoeingänge manuell über Befehl "get Modbus_Relelaiskarte OptoInput.1" einlese, gibt es einen Timeout bzw. funktioniert die Modbus-Anfrage nicht. In der FEHM-Log ist dann zu sehen, dass die Modbus-Anfrage "FF0200000001"  lautet (siehe Anhang).
Laut mitgelieferter Dokumention müsste diese Modbus-Anfrage aber "FF0200000008" lauten (siehe ebenfalls Anhang).

Mit der in meiner vorherigen Post dargestelten Konfiguration funktioniert die Anfrage korrekt, allerdings erscheinen dann die Fehlermeldungen


"Modbus_Relaiskarte: CreateUpdateHash found group 1 span 9 is longer than defined maximum 8 .... "


in der FHEM-Log, allerdings nur beim automatischen Abfragen über die Intervall Festlegung per define.

Gruß
Harald
FHEM 6.1 @ RPi4, raspbian (buster) auf USB-SSD, PIUSV+, HM-MOD-RPI-PCB und viele Homematic-Komponenten, OBIS, vclient, VBUS, Modbus, E3DC-Photovoltaikumrichter, 1-wire, Shelly und eigene Module

Machen ist wie wollen, nur krasser!

StefanStrobel

Hallo Harald,

ich versuche das ganze nochmal etwas ausführlicher zu erklären:
Mit dem Modbus-Modul kann man einzelne Datenobjekte des Geräts per Attribut so definieren, dass Werte aus einem bestimmten Register, Coil oder Digital Input in ein Reading geschrieben werden.
Dazu definiert man die Adresse, unter der der Wert im Gerät gespeichert ist, die Anzahl (=Länge) der Register / Coils / Inputs, die für dieses Objekt verwendet werden (Float-Werte mit 32 Bit stehen zum Beispiel meist in zwei Registern), einen Unpack-Code, Maps etc.

Wenn man ein einzelnes Objekt per "get Gerät readingname" lesen möchte, dann würde das Modul aus jedem get-Befehl einen einzelnen Request mit der Adresse und Länge des gefragten Readings/Objekts erzeugen.

Wenn man zyklisch mehrerer Objekte lesen möchte, dann kann man das Intervall beim Define angeben oder mit "set Gerät reread" den Lesevorgang für alle zyklisch abzufragenden Readings manuell starten. Bei diesem gemeinsamen Lesen gibt es die Möglichkeit, mehrere einzelne Requests zusammenzufassen. Dafür gibt es das "combine"-Attribut. Damit teilt man dem Modul die maximale Anzahl aufeinanderfolgender Register / Coils / Inputs mit, die das Gerät in einem Request verkraftet. Das Modul versucht dann möglichst viele einzelne Requests zusammen zu fassen.
Noch mehr Kontrolle über dieses Zusammenfassen beim zyklischen Abfragen mehrerer Objekte hat man mit den "group"-Attributen. Dabei kann man explizit sagen, wie die Objekte bei der zyklischen Abfrage zusammengefasst werden sollen und in welcher Reihenfolge sie danach ausgewertet werden. Das braucht man wenn z.B. an Adresse 100 ein Wert steht und an 101 eine Größenfaktor für diesen Wert...

Deinen Fall hatte ich so verstanden, dass das Gerät keine Requests für einen einzelnen Digital Input erlaubt, sondern nur einen Requests, mit dem gleich alle 8 Inputs gleichzeitig gelesen werden (Adresse 0 und Länge 8 ).
Für die zyklische Abfrage kann man das einfach umsetzen, indem man alle 8 Objekte mit Länge 1 abfragen lässt und combine auf 8 setzt. Dann kombiniert das Modul die 8 einzelnen Abfragen zu einem einzigen neuen Request mit Länge 8 und zerlegt die Antwort dann so dass 8 Readings daraus erzeugt werden.
Mit group muss man dafür gar nicht arbeiten.

Für das Abfragen eines einzelnen Digital Input geht das so nicht. Weder combine noch group-Attribute beeinflussen die Abfrage mit get.
Zudem hatte ich es so verstanden dass man bei Deinem Gerät nur alle 8 Inputs gemeinsam abfragen kann und dass eine Abfrage für Input 3 alleine gar nicht beantwortet würde.

Jetzt hast Du geschrieben
Zitat
Mit der in meiner vorherigen Post dargestelten Konfiguration funktioniert die Anfrage korrekt, allerdings erscheinen dann die Fehlermeldungen ...
Wenn Du damit meinst, dass auch Input 2 oder Input 3 mit get einzeln abgefragt werden können, dann verhält sich Dein Gerät wohl so, dass man durchaus einzelne Inputs abfragen kann, dass aber die Länge des Requests immer 8 sein muss. Wenn Du also Eingang 8 auf diese Weise abfragst, fordert der Request die Werte von 8 Inputs ab der Adresse 8 (also auch 9,10,11...) an.
Wenn Das funktioniert (obwohl es die Inputs 9, 10 etc. gar nicht gibt) ist es auch gut.

Wenn Du nur jede Minute den Status aller Eingänge gemeinsam abfragen möchtest ist alles einfach und ein combine 8 sollte es tun. Die Länge wäre überall 1, group-Attribute sind sowieso nicht nötig.

Die Fehlermeldung kommt nur dann wenn Du mit den group-Attributen einen Request forderst, der länger ist als das combine-Attribut es erlaubt. Ich würde also einfach auf die group-Attribute verzichten. Die brauchst Du nicht. Oder Du setzt combine auf 16 hoch. Wenn Dein Gerät das verkraftet, ist alles ok.
Zudem reicht es wenn Du mit den poll-Attributen zur Steuerung der zyklischen Abfragen nur den ersten Input abfragst. Da der ja die Länge 8 hat, werden alle anderen ebenfalls abgefragt.

Ich hoffe das macht die Sache etwas klarer.

Gruss
   Stefan