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

StefanStrobel

Hallo Allgaeuer,

Holding Register 0 solltest Du als h0 und nicht h000 definieren, sonst wird die Definition beim Parsen nicht gefunden.
Der Fehler mit der Endlosschleife resultiert daraus, ist aber auch in den neueren Versionen, die ich hier gepostet habe, schon abgefangen.

Gruss
    Stefan

Allgaeuer

Hallo Stefan,

wieder mal herzlichen Dank für Deine schnelle Hilfe.

Gruß Allgäuer

StefanStrobel

Hallo,

anbei noch eine letzte neue Version vor Weihnachten zum Testen.
Sie beseitigt weitere kleine Fehler und falls die Version auch bei Euch fehlerfrei läuft, werde ich sie im Januar einchecken.

Gruss
    Stefan

wthiess

Eingespielt: Thermostate, Lüftung und Zähler laufen.

lg
Wolfgang
Raspberry Pi 3; 8xRelais; Aptodec Nano V3.0 Pro; FS1000a; RF-5V; Hama TS33C; 3x Brennerstuhl FunkSteckdosen; 9x Dooya funk Rollo; KWL Systemair VR400; Thermokon Modbusthermostat; diverse China Modbus Thermostate; 1-wire Bus; Telegram; QuickFhem; FhemNative; Firmata; Alexa ......

Allgaeuer

Hallo Stefan,

ich bekomme vermehrt Fehlermeldungen:

2016.12.25 14:29:50.057 3: ModbusLine1: timeout waiting for fc 3 from id 30, (h1108), Request was 1e03045400028684, RawBuffer:
2016.12.25 14:57:33.859 3: ModbusLine1: timeout waiting for fc 3 from id 10, (h19026), Request was 0a034a52000272b9, RawBuffer:
2016.12.25 15:03:11.957 3: ModbusLine1: timeout waiting for fc 3 from id 10, (h19042), Request was 0a034a62000272b6, RawBuffer:
2016.12.25 15:14:55.088 1: PERL WARNING: Use of uninitialized value $val in multiplication (*) at (eval 223983) line 1.
2016.12.25 15:51:22.459 3: ModbusLine1: timeout waiting for fc 3 from id 10, (h19026), Request was 0a034a52000272b9, RawBuffer:
2016.12.25 16:04:01.756 1: PERL WARNING: Use of uninitialized value $val in multiplication (*) at (eval 297504) line 1.
2016.12.25 16:47:45.520 3: ModbusLine1: timeout waiting for fc 3 from id 10, (h10873), Request was 0a032a7900049cb3, RawBuffer:
2016.12.25 16:57:44.647 3: ModbusLine1: timeout waiting for fc 3 from id 10, (h10873), Request was 0a032a7900049cb3, RawBuffer:
2016.12.25 17:09:01.727 3: ModbusLine1: timeout waiting for fc 3 from id 10, (h10873), Request was 0a032a7900049cb3, RawBuffer:
2016.12.25 18:55:26.071 1: PERL WARNING: Use of uninitialized value $val in multiplication (*) at (eval 549654) line 1.
2016.12.25 19:06:05.114 3: ModbusLine1: timeout waiting for fc 3 from id 30, (h1108), Request was 1e03045400028684, RawBuffer:
2016.12.25 20:04:36.689 1: PERL WARNING: Use of uninitialized value $val in multiplication (*) at (eval 649972) line 1.
2016.12.25 20:06:41.286 1: PERL WARNING: Use of uninitialized value $val in multiplication (*) at (eval 653103) line 1.
2016.12.25 20:13:37.546 1: PERL WARNING: Use of uninitialized value $val in multiplication (*) at (eval 663462) line 1.
2016.12.25 20:22:08.731 1: PERL WARNING: Use of uninitialized value $val in multiplication (*) at (eval 676100) line 1.
2016.12.25 20:28:57.585 3: ModbusLine1: timeout waiting for fc 3 from id 10, (h19026), Request was 0a034a52000272b9, RawBuffer:
2016.12.25 20:34:22.421 1: PERL WARNING: Use of uninitialized value $val in multiplication (*) at (eval 693962) line 1.


Bei der Version 2016-11-20 habe ich die Warnings nicht.
Bei der Version 2016-12-04 tauchen die Warnmeldungen jedoch auch schon auf.
Hinweis: Ich mache mehrmals pro Sekunde Modbus-Calls.

Falls Du noch mehr Angaben / Log-Auszüge brauchst, helfe ich natürlich gerne.

Gruß Allgäuer

StefanStrobel

Hallo Allgaeuer,

Timeouts wurden in der früheren Version auf Loglevel 4 protokolliert. Im normalen Betrieb ohne Verbose=4 oder 5 ist das deshalb nicht aufgefallen.
In der neuen Version ist das Loglevel für solche Timeouts einstellbar, der Default-Wert steht aber jetzt auf 3. (Vielleicht sollte ich das wieder auf 4 setzen). Zum Ändern gibt es das Attribut timeoutLogLevel.

Die Warnungen wegen $val kommen vermutlich von der Auswertung einer Perl-Expression eines -Expr Attributs für ein Modbus-Objekt.
Wenn Du eine Weile Verbose auf 5 setzt, sollte sich aus dem Kontext erkennen lassen, welches Objekt / Attribut dahinter steckt.

Gruss
    Stefan

Herjemine

#441
Hallo Stefan,

kann es sein das scanModbusId mit ModbusTCP nicht geht?
Edit: sorry, hatte nicht die richtige Version, es geht  :)

Gruß Hermann

Allgaeuer

Hallo Stefan,

ich suche immer noch die Ursache für mein altes Problem.
Diese Warnings
2016.12.30 14:31:13.046 1: PERL WARNING: Use of uninitialized value $val in multiplication (*) at (eval 3160463) line 1.
2016.12.30 15:43:08.922 1: PERL WARNING: Use of uninitialized value $val in multiplication (*) at (eval 3250101) line 1.
2016.12.30 16:18:59.324 1: PERL WARNING: Use of uninitialized value $val in multiplication (*) at (eval 3294573) line 1.

kommen von diesem Ausdruck
attr Electric_Meter_1 obj-h10875-expr ($val*18750 - 75)
attr Electric_Meter_1 obj-h10875-poll 1
attr Electric_Meter_1 obj-h10875-reading I_diff_B_mA


Ich kann mir keinen Reim daraus machen. Ich frage jede Sekunde diesen Wert ab, jedoch kommt der Fehler nur alle 1 bis 2 Stunden. Hast Du noch einen Tipp auf Lager?

Auf jeden Fall wünsche ich Dir und allen FHEM-Nutzern ein glückliches, erfolgreiches und vor allem ein gesundes Jahr 2017.

Viele Grüße,

Allgäuer

StefanStrobel

Hallo Allgäuer,

Das finden wir auch noch.
Hast Du zufällig einen Log-Ausschnitt mit Verbose 5, in dem man den Request vor der Meldung und die Antwort des Geräts sieht?

Gruß
   Stefan

Allgaeuer

Hallo Stefan,

Deine Reaktionszeit ist rekordverdächtig.

Einen Log-Auszug möchte ich heute im Laufe des Tages erstellen. Ich melde mich dann.
Gestern Abend habe ich testweise das Attribut "dropQueueDoubles" gesetzt mit "1" und seit dem taucht das Warning wesentlich häufiger auf (ca. jede halbe Stunde).

Viele Grüße,

Allgäuer

Allgaeuer

Hallo Stefan,

hier Log-Auszug. Ich vermute, dass das Problem in der Zeile 3 ist. Die unpack-Funktion liefert keinen Wert.

2016.12.31 11:37:34.743 5: Electric_Meter_1: ParseObj moves to next object, skip 2 to h10875
2016.12.31 11:37:34.747 5: Electric_Meter_1: ParseObj ObjInfo for h10875: reading=I_diff_B_mA, unpack=f>, expr=($val*18750 - 75), format=%.1f, map=
2016.12.31 11:37:34.748 5: Electric_Meter_1: ParseObj unpacked 3b9b18 with f> to
2016.12.31 11:37:34.749 5: Electric_Meter_1: ParseObj for I_diff_B_mA evaluates  with expr ($val*18750 - 75)
2016.12.31 11:37:34.751 1: PERL WARNING: Use of uninitialized value $val in multiplication (*) at (eval 4693245) line 1.
2016.12.31 11:37:34.753 5: Electric_Meter_1: ParseObj converted value to -75 using expr ($val*18750 - 75)
2016.12.31 11:37:34.754 5: Electric_Meter_1: ParseObj for I_diff_B_mA does sprintf with format %.1f value is -75
2016.12.31 11:37:34.755 5: Electric_Meter_1: ParseObj for I_diff_B_mA sprintf result is -75.0
2016.12.31 11:37:34.756 4: Electric_Meter_1: ParseObj for I_diff_B_mA assigns -75.0
2016.12.31 11:37:35.600 4: Electric_Meter_1: update timer modified: will call GetUpdate in 1.0 seconds at 2016-12-31 11:37:36 - Interval 1
2016.12.31 11:37:35.601 5: Electric_Meter_1: GetUpdate called


zum Vergleich, hier der i.o-Log-Auszug für den nächsten Call:

2016.12.31 11:37:35.671 5: Electric_Meter_1: ParseObj moves to next object, skip 2 to h10875
2016.12.31 11:37:35.673 5: Electric_Meter_1: ParseObj ObjInfo for h10875: reading=I_diff_B_mA, unpack=f>, expr=($val*18750 - 75), format=%.1f, map=
2016.12.31 11:37:35.674 5: Electric_Meter_1: ParseObj unpacked 3b9b1d3b with f> to 302e3030343733333730393135323738373932
2016.12.31 11:37:35.675 5: Electric_Meter_1: ParseObj for I_diff_B_mA evaluates 0.00473370915278792 with expr ($val*18750 - 75)
2016.12.31 11:37:35.676 5: Electric_Meter_1: ParseObj converted value to 13.7570466147736 using expr ($val*18750 - 75)
2016.12.31 11:37:35.676 5: Electric_Meter_1: ParseObj for I_diff_B_mA does sprintf with format %.1f value is 13.7570466147736
2016.12.31 11:37:35.677 5: Electric_Meter_1: ParseObj for I_diff_B_mA sprintf result is 13.8
2016.12.31 11:37:35.677 4: Electric_Meter_1: ParseObj for I_diff_B_mA assigns 13.8
2016.12.31 11:37:35.915 5: Electric_Meter_1: ParseObj called with 00000000 and start 19026, op read
2016.12.31 11:37:35.918 5: Electric_Meter_1: ParseObj ObjInfo for h19026: reading=P_sum_kW, unpack=f>, expr=($val/1000 + 0), format=%.1f, map=
2016.12.31 11:37:35.918 5: Electric_Meter_1: ParseObj unpacked 00000000 with f> to 30
2016.12.31 11:37:35.919 5: Electric_Meter_1: ParseObj for P_sum_kW evaluates 0 with expr ($val/1000 + 0)


Kannst Du damit schon was anfangen?
Ich warte gespannt auf Deine Rückmeldung.

Danke und Gruß,

Allgäuer

StefanStrobel

Sieht so aus als ob Perl den Float-Wert nicht versteht ...
Muss ich mir nächstes Jahr genauer ansehen ;-)

Gruss und einen guten Rutsch!
  Stefan

Allgaeuer

Hallo Stefan,

mir ist aufgefallen: im Fehlerfall stehen nur 3 Byte im Logfile als Input für die Unpack-Funktion. Im Normalfall sind es 4.
Ich logge jetzt die komplette Modbus-Sende und -Antwort-Daten mit, der Fehler ist aber noch nicht aufgetreten. Das Datenfile wird richtig groß. Ich hoffe, dass mein Editor dann die Datei noch öffnen kann.

Gruß Allgäuer

Allgaeuer

Hallo Stefan,

jetzt habe ich den Fehler im Logfile. In der ersten Zeile "vermisst" FHEM ein Byte, macht aber weiter, weil die Checksumme passt. In Zeile 16+17 hat FHEM plötzlich ein Byte mit dem Wert "00" zu viel. Kann es sein, dass diese 00 noch zu dem Frame von Zeile 1 gehört?
2016.12.31 17:43:46.925 5: ModbusLine1: ParseFrames: frame seems incomplete (7 / 8) but checksum is fine ...
2016.12.31 17:43:46.925 4: ModbusLine1: ParseFrames got fcode 3 from 10, tid 0, values 3ac8c7eb3b9b3bHeaderLen 8, ActualLen 7, request was for h10873 (I_diff_A_mA), len 4 for module Electric_Meter_1
2016.12.31 17:43:46.936 1: PERL WARNING: Use of uninitialized value $val in multiplication (*) at (eval 442128) line 1.
2016.12.31 17:43:47.139 5: ModbusLine1: ParseFrames got 2 readings from ParseObj
2016.12.31 17:43:47.140 5: ModbusLine1: Profiling: Idle, before Fhem, now is 1483202627.14044, Idle started at 1483202626.90491, Fhem started at 1483202626.92356
2016.12.31 17:43:47.141 5: ModbusLine1: Profiling: add 0.216876983642578 to sum for Fhem (now is 1483202627.14044, start for Fhem was 1483202626.92356)
2016.12.31 17:43:47.143 5: ModbusLine1: Profiling: Send, before Idle, now is 1483202627.14368, Send started at 1483202626.90808, Idle started at 1483202627.14044
2016.12.31 17:43:47.144 5: ModbusLine1: Profiling: add 0.00323987007141113 to sum for Idle (now is 1483202627.14368, start for Idle was 1483202627.14044)
2016.12.31 17:43:47.145 4: ModbusLine1: HandleSendQueue sends fc 3 to id 10, tid 184 for Q_sum_kvar (h19042), len 2, device Electric_Meter_1 (RTU), pdu 034a620002, V 3.5.9 - 21.12.2016
2016.12.31 17:43:47.146 5: SW: 0a034a62000272b6
2016.12.31 17:43:47.149 5: ModbusLine1: Profiling: Wait, before Send, now is 1483202627.14964, Wait started at 1483202626.91338, Send started at 1483202627.14368
2016.12.31 17:43:47.150 5: ModbusLine1: Profiling: add 0.00595998764038086 to sum for Send (now is 1483202627.14964, start for Send was 1483202627.14368)
2016.12.31 17:43:47.154 5: ModbusLine1: Profiling: Read, before Wait, now is 1483202627.15437, Read started at 1483202626.91996, Wait started at 1483202627.14964
2016.12.31 17:43:47.155 5: ModbusLine1: Profiling: add 0.00473213195800781 to sum for Wait (now is 1483202627.15437, start for Wait was 1483202627.14964)
2016.12.31 17:43:47.156 5: ModbusLine1: raw read: 000a0304c39f5cbc7428
2016.12.31 17:43:47.156 5: ModbusLine1: ParseFrames got: 000a0304c39f5cbc7428
2016.12.31 17:43:47.158 5: ModbusLine1: ParseFrames returned error: recieved frame from unexpected Modbus Id 0, expecting fc 3 from 10 for device Electric_Meter_1
2016.12.31 17:43:47.158 5: ModbusLine1: Profiling: Idle, before Read, now is 1483202627.15871, Idle started at 1483202627.14044, Read started at 1483202627.15437
2016.12.31 17:43:47.159 5: ModbusLine1: Profiling: add 0.00434088706970215 to sum for Read (now is 1483202627.15871, start for Read was 1483202627.15437)


Im Logfile habe ich noch mehr Warnings, immer mit dem selben Muster, dass zuerst ein Byte fehlt, und danach "unbekannte" Daten gemeldet werden.

2016.12.31 13:35:38.065 5: ModbusLine1: ParseFrames: frame seems incomplete (3 / 4) but checksum is fine ...
2016.12.31 13:35:38.066 4: ModbusLine1: ParseFrames got fcode 3 from 10, tid 0, values 43d8e2HeaderLen 4, ActualLen 3, request was for h19026 (P_sum_kW), len 2 for module Electric_Meter_1
2016.12.31 13:35:38.068 1: PERL WARNING: Use of uninitialized value $val in division (/) at (eval 133212) line 1.
2016.12.31 13:35:38.221 5: ModbusLine1: ParseFrames got 1 readings from ParseObj
2016.12.31 13:35:38.222 5: ModbusLine1: Profiling: Idle, before Fhem, now is 1483187738.22262, Idle started at 1483187738.0504, Fhem started at 1483187738.06446
2016.12.31 13:35:38.223 5: ModbusLine1: Profiling: add 0.158160924911499 to sum for Fhem (now is 1483187738.22262, start for Fhem was 1483187738.06446)
2016.12.31 13:35:38.225 5: ModbusLine1: Profiling: Read, before Idle, now is 1483187738.22517, Read started at 1483187738.06155, Idle started at 1483187738.22262
2016.12.31 13:35:38.226 5: ModbusLine1: Profiling: add 0.00255393981933594 to sum for Idle (now is 1483187738.22517, start for Idle was 1483187738.22262)
2016.12.31 13:35:38.226 5: ModbusLine1: raw read: 00
2016.12.31 13:35:38.226 5: ModbusLine1: ParseFrames returned error: got data but did not send a request - ignoring


Danke für Deinen hervorragenden Support und bis zum nächsten Jahr,

Gruß Allgäuer

StefanStrobel

Hallo Allgäuer,

probier doch mal die angehängte neue Version.
Ich habe das Verhalten jetzt konfigurierbar gemacht.
Per Default wird jetzt auf vollständige Pakete gewartet, selbst wenn die CRC schon stimmt.
Wer das alte Verhalten benötigt (leider gibt es viele kaputte Modbus-Implementationen), kann per

attr myDevice dev-[cdih]-allowShortResponses 1

für einzelne Objektarten bzw. function codes auch kürzere Responses akzeptieren. In den allermeisten Fällen sollte das neue Verhalten jedoch gewünscht sein.

Gruss
    Stefan