Wago /SPS über Modbus(TCP/IP) in FHEM steuern

Begonnen von lechez, 05 Mai 2013, 10:50:13

Vorheriges Thema - Nächstes Thema

golem

Hallo,

Modbus TCP scheint zu funktionieren, habe aber noch das Problem, das im den PAC3200 von Siemens die Werte als BigEndian übertragen werden sind.

Wenn ich über RTU versuche ein Register zu lesen mit Folgender Config:

define MB_RTU ModbusRTU com6@9600
attr MB_RTU charformat 8N1
attr MB_RTU pollIntervall 5
attr MB_RTU verbose 5

define MB_RTU_L1_Volt ModbusRegister 1 30026
attr MB_RTU_L1_Volt IODev MB_RTU
attr MB_RTU_L1_Volt plcDataType REAL
attr MB_RTU_L1_Volt verbose 5


erhalte ich an der Kommandozeile die Ausgabe:
perl fhem.pl fhem.cfg
Use of uninitialized value $found[0] in string eq at fhem.pl line 2955.
Use of uninitialized value $dump[5] in concatenation (.) or string at ./FHEM/36_
ModbusRTU.pm line 587.
Use of uninitialized value within @dump in join or string at ./FHEM/36_ModbusRTU
.pm line 589.
Use of uninitialized value within @dump in join or string at ./FHEM/36_ModbusRTU
.pm line 589.
Use of uninitialized value within @dump in join or string at ./FHEM/36_ModbusRTU
.pm line 589.
Use of uninitialized value $found[0] in string eq at fhem.pl line 2955.
Use of uninitialized value $dump[5] in concatenation (.) or string at ./FHEM/36_
ModbusRTU.pm line 587.
Use of uninitialized value within @dump in join or string at ./FHEM/36_ModbusRTU
.pm line 589.
Use of uninitialized value within @dump in join or string at ./FHEM/36_ModbusRTU
.pm line 589.
Use of uninitialized value within @dump in join or string at ./FHEM/36_ModbusRTU
.pm line 589.
Use of uninitialized value within @dump in join or string at ./FHEM/36_ModbusRTU
.pm line 589.
Use of uninitialized value $found[0] in string eq at fhem.pl line 2955.
Use of uninitialized value $found[0] in string eq at fhem.pl line 2955.
Use of uninitialized value $found[0] in string eq at fhem.pl line 2955.
Use of uninitialized value $found[0] in string eq at fhem.pl line 2955.
Use of uninitialized value $found[0] in string eq at fhem.pl line 2955.
Use of uninitialized value $found[0] in string eq at fhem.pl line 2955.
Use of uninitialized value $found[0] in string eq at fhem.pl line 2955.


und im Log folgendes:
2014.05.05 10:29:57 1: starting in console mode
2014.05.05 10:29:57 1: Including fhem.cfg
2014.05.05 10:29:57 3: telnetPort: port 7072 opened
2014.05.05 10:29:58 3: WEB: port 8083 opened
2014.05.05 10:29:58 3: WEBphone: port 8084 opened
2014.05.05 10:29:58 3: WEBtablet: port 8085 opened
2014.05.05 10:29:58 2: eventTypes: loaded 0 events from ./log/eventTypes.txt
2014.05.05 10:29:58 3: MB_RTU_L1_Volt: I/O device is MB_RTU
2014.05.05 10:29:58 1: Including ./log/fhem.save
2014.05.05 10:29:58 1: statefile: Please define MB_TCP first
Please define MB_TCP_L1_Volt first
Please define MB_TCP_L1_Volt first
2014.05.05 10:29:58 3: Opening MB_RTU device com6
2014.05.05 10:29:58 3: Setting MB_RTU baudrate to 9600
2014.05.05 10:29:58 3: MB_RTU device opened
2014.05.05 10:29:58 2: SecurityCheck:  WEB,WEBphone,WEBtablet has no basicAuth attribute. telnetPort has no password/globalpassword attribute.  Restart fhem for a new check if the problem is fixed, or set the global attribute motd to none to supress this message.
2014.05.05 10:29:58 0: Server started with 10 defined entities (version $Id: fhem.pl 5238 2014-03-16 16:23:31Z rudolfkoenig $, os MSWin32, user denis.goletz, pid 5528)
2014.05.05 10:29:58 5: AddRQueue [01 04 00 19 00 02] A0 0C
2014.05.05 10:29:58 5: SimpleWrite [01 04 00 19 00 02] A0 0C
2014.05.05 10:29:58 5: Read [01 04 04 00 00 00] 00 FB 84
2014.05.05 10:29:58 5: Received [01 04 04 00 00 00] 00 FB 84
2014.05.05 10:29:58 5: MB_RTU dispatch ModbusRegister:1:25:4:2:0:0
2014.05.05 10:29:58 5: ModbusRegister_Parse: 1 25
2014.05.05 10:29:58 2: ModbusRegister_Parse: invalid address 1 25
2014.05.05 10:30:03 5: AddRQueue [01 04 00 19 00 02] A0 0C
2014.05.05 10:30:03 5: SimpleWrite [01 04 00 19 00 02] A0 0C
2014.05.05 10:30:03 5: Read [01 04 04 00 00 00] 00
2014.05.05 10:30:03 5: Read [FB 84    ]
2014.05.05 10:30:08 5: AddRQueue [01 04 00 19 00 02] A0 0C
2014.05.05 10:30:08 5: SimpleWrite [01 04 00 19 00 02] A0 0C
2014.05.05 10:30:08 5: Read [01 04 04 00 00 00] 00 FB 84
2014.05.05 10:30:08 5: Received [01 04 04 00 00 00] 00 FB 84
2014.05.05 10:30:08 5: MB_RTU dispatch ModbusRegister:1:25:4:2:0:0
2014.05.05 10:30:08 5: ModbusRegister_Parse: 1 25
2014.05.05 10:30:08 2: ModbusRegister_Parse: invalid address 1 25
2014.05.05 10:30:13 5: AddRQueue [01 04 00 19 00 02] A0 0C
2014.05.05 10:30:13 5: SimpleWrite [01 04 00 19 00 02] A0 0C
2014.05.05 10:30:13 5: Read [01 04 04 00 00 00] 00 FB
2014.05.05 10:30:13 5: Read [84     ]
2014.05.05 10:30:18 5: AddRQueue [01 04 00 19 00 02] A0 0C
2014.05.05 10:30:18 5: SimpleWrite [01 04 00 19 00 02] A0 0C
2014.05.05 10:30:18 5: Read [01 04 04 00 00 00] 00 FB 84
2014.05.05 10:30:18 5: Received [01 04 04 00 00 00] 00 FB 84
2014.05.05 10:30:18 5: MB_RTU dispatch ModbusRegister:1:25:4:2:0:0
2014.05.05 10:30:18 5: ModbusRegister_Parse: 1 25
2014.05.05 10:30:18 2: ModbusRegister_Parse: invalid address 1 25
2014.05.05 10:30:23 5: AddRQueue [01 04 00 19 00 02] A0 0C
2014.05.05 10:30:23 5: SimpleWrite [01 04 00 19 00 02] A0 0C
2014.05.05 10:30:23 5: Read [01 04 04 00 00 00] 00 FB 84
2014.05.05 10:30:23 5: Received [01 04 04 00 00 00] 00 FB 84
2014.05.05 10:30:23 5: MB_RTU dispatch ModbusRegister:1:25:4:2:0:0
2014.05.05 10:30:23 5: ModbusRegister_Parse: 1 25
2014.05.05 10:30:23 2: ModbusRegister_Parse: invalid address 1 25
2014.05.05 10:30:28 5: AddRQueue [01 04 00 19 00 02] A0 0C
2014.05.05 10:30:28 5: SimpleWrite [01 04 00 19 00 02] A0 0C
2014.05.05 10:30:28 5: Read [01 04 04 00 00 00] 00 FB 84
2014.05.05 10:30:28 5: Received [01 04 04 00 00 00] 00 FB 84
2014.05.05 10:30:28 5: MB_RTU dispatch ModbusRegister:1:25:4:2:0:0
2014.05.05 10:30:28 5: ModbusRegister_Parse: 1 25
2014.05.05 10:30:28 2: ModbusRegister_Parse: invalid address 1 25
2014.05.05 10:30:33 5: AddRQueue [01 04 00 19 00 02] A0 0C
2014.05.05 10:30:33 5: SimpleWrite [01 04 00 19 00 02] A0 0C
2014.05.05 10:30:33 5: Read [01 04 04 00 00 00] 00 FB 84
2014.05.05 10:30:33 5: Received [01 04 04 00 00 00] 00 FB 84
2014.05.05 10:30:33 5: MB_RTU dispatch ModbusRegister:1:25:4:2:0:0
2014.05.05 10:30:33 5: ModbusRegister_Parse: 1 25
2014.05.05 10:30:33 2: ModbusRegister_Parse: invalid address 1 25
2014.05.05 10:30:38 5: AddRQueue [01 04 00 19 00 02] A0 0C
2014.05.05 10:30:38 5: SimpleWrite [01 04 00 19 00 02] A0 0C
2014.05.05 10:30:38 5: Read [01 04 04 00 00 00] 00 FB 84
2014.05.05 10:30:38 5: Received [01 04 04 00 00 00] 00 FB 84
2014.05.05 10:30:38 5: MB_RTU dispatch ModbusRegister:1:25:4:2:0:0
2014.05.05 10:30:38 5: ModbusRegister_Parse: 1 25
2014.05.05 10:30:38 2: ModbusRegister_Parse: invalid address 1 25
2014.05.05 10:30:43 5: AddRQueue [01 04 00 19 00 02] A0 0C
2014.05.05 10:30:43 5: SimpleWrite [01 04 00 19 00 02] A0 0C
2014.05.05 10:30:43 5: Read [01 04 04 00 00 00] 00 FB 84
2014.05.05 10:30:43 5: Received [01 04 04 00 00 00] 00 FB 84
2014.05.05 10:30:43 5: MB_RTU dispatch ModbusRegister:1:25:4:2:0:0
2014.05.05 10:30:43 5: ModbusRegister_Parse: 1 25
2014.05.05 10:30:43 2: ModbusRegister_Parse: invalid address 1 25
2014.05.05 10:30:48 5: AddRQueue [01 04 00 19 00 02] A0 0C
2014.05.05 10:30:48 5: SimpleWrite [01 04 00 19 00 02] A0 0C
2014.05.05 10:30:48 5: Read [01 04 04 00 00 00] 00 FB 84
2014.05.05 10:30:48 5: Received [01 04 04 00 00 00] 00 FB 84
2014.05.05 10:30:48 5: MB_RTU dispatch ModbusRegister:1:25:4:2:0:0
2014.05.05 10:30:48 5: ModbusRegister_Parse: 1 25
2014.05.05 10:30:48 2: ModbusRegister_Parse: invalid address 1 25


Gruß Denis
Pi - Max-Lan - 8x max Ht -3x Max WT - Max Fk -modbus umg103- 2x Arduino mit Firmata Ethernet- ws300 - 433Mhz Sender Empfänger - 7x 1wire ds1820

ChrisD

#136
Hallo,

@Denis

Danke für deine Tests.

Ich hatte die neue Version leider nur mit Modbus TCP getestet so dass mir nicht aufgefallen war dass meine Änderungen mit Modbus RTU zu Fehlern führen. Ich habe jetzt die 3 Module aneinander angepasst so dass wieder alles funktionieren sollte. Kannst du sie bitte ausprobieren?

Was das Problem mit Little/BigEndian betrifft bräuchte ich weitere Informationen:
Tritt das Problem auch bei einzelnen Worten (plcDataType nicht definiert oder WORD) auf ?
Falls dem nicht so ist kann ich FLOAT, DWORD und DINT erweiteren so dass Lo-Word und Hi-Word getauscht werden. Ich habe ein zusätzliches Reading 'RAW' hinzugefügt, kannst du mir dieses bei 'verdrehten' Zahlen mit angeben ?

Der plcDataType FLOAT ist im Moment nur mit CoDeSys-Steuerungen getestet und setzt voraus dass die Zahl SPS-intern im IEEE754-Single-Format vorliegt.

@Alle

Ich habe die alten Versionen aus den vorherigen Posts entfernt da sie u.U. nicht korrekt funktionieren.

Grüße,

ChrisD

Edit: Die aktuellen Versionen der Module sind unter https://github.com/ChrisD70/FHEM-Modules zu finden.

fischle

#137
Hallo,
ich hab das Modul mal weiter getestet.

Ich habe immer die Fehlermeldung erhalten, "Undefined subroutine &bytes::length called at ./FHEM/36_ModbusRTU.pm line 618." Ein "use bytes;" vor dem Aufruf hat das Problem behoben.


sub _ModbusRTU_crc($) {
  use bytes;
  my ($frame) =@_;
  my $crc = 0xFFFF;
  my ($chr, $lsb);
  for my $i (0..bytes::length($frame)-1) {
    $chr = ord(bytes::substr($frame, $i, 1));
    $crc ^= $chr;
    for (1..8) {
      $lsb = $crc & 1;
      $crc >>= 1;
      $crc ^= 0xA001 if $lsb;
      }
    }
  return $crc;
}



Bei der Umrechnung habe ich high und low vertauschen müssen.Ich lese die Netzspannung von meinem Stromzähler aus. Die werte werden lt. beschreibung als 32 Bit Float ausgegeben. Vorher haben die Werte so ausgesehen:


2014.05.05 23:31:53 5: AddRQueue 01 04 00 00 00 02 71 CB
2014.05.05 23:31:53 5: SimpleWrite 01 04 00 00 00 02 71 CB
2014.05.05 23:31:53 5: Read 01 04 04 43 6E 0A EE 09 31
2014.05.05 23:31:53 5: Received 01 04 04 43 6E 0A EE 09 31
2014.05.05 23:31:53 5: MB_RTU dispatch ModbusRegister:1:0:4:2:17262:2798
2014.05.05 23:31:53 5: ModbusRegister_Parse: 4 1 0
2014.05.05 23:31:53 5: Triggering Reg0 (2 changes)
2014.05.05 23:31:53 5: Notify loop for Reg0 2.2943930567563e-032
2014.05.05 23:31:53 4: eventTypes: ModbusRegister Reg0 2.2943930567563e-032 -> .*.2943930567563e.*
2014.05.05 23:31:53 4: eventTypes: ModbusRegister Reg0 RAW: 0000436e -> RAW: 0000436e


jetzt habe ich die Umrechnung geändert auf


        if($plcDataType eq "REAL"){
          $v=unpack "f", pack "L", ($vals[0]<<16)+$vals[1];


und nun stimmt die Umrechnung:


2014.05.05 23:40:59 5: AddRQueue 01 04 00 00 00 02 71 CB
2014.05.05 23:40:59 5: SimpleWrite 01 04 00 00 00 02 71 CB
2014.05.05 23:40:59 5: Read 01 04 04 43 6E 2F 9D 52 44
2014.05.05 23:40:59 5: Received 01 04 04 43 6E 2F 9D 52 44
2014.05.05 23:40:59 5: MB_RTU dispatch ModbusRegister:1:0:4:2:17262:12189
2014.05.05 23:40:59 5: ModbusRegister_Parse: 4 1 0
2014.05.05 23:40:59 5: Triggering Reg0 (2 changes)
2014.05.05 23:40:59 5: Notify loop for Reg0 238.185989379883
2014.05.05 23:40:59 4: eventTypes: ModbusRegister Reg0 238.185989379883 -> .*
2014.05.05 23:40:59 4: eventTypes: ModbusRegister Reg0 RAW: 0000436e -> RAW: 0000436e


Vielen Dank noch mal für die Erstellung des Moduls, ich werde nun mal fleissig die Register meines Stromzählers definieren.

[Edit]
Was mir gerade aufgefallen ist: Ich brauche immer einen neustart von FHEM um geänderte Register usw. wirksam werden zu lassen. Ist das so gewünscht?
RPi,
- USB RS485 Adapter für Stromzähler DRS155M und SDM630M-DC (B+G E-Tech)
- Viesmann KO2B Heizung mit selbstbau Optolink Adapter
- Mi-Light WiFi-Bridge V4, WW/CW LED-Birne

golem

#138
Hallo,

:) Super jetzt funktionierts. Mit der Änderung von fischle werden jetzt auch die richtigen Werte angezeigt.
Mach mich jetzt mal an einen Test mit mehreren Werten.

@ChrisD kannst du das tauschen noch mit in die Attribute aufnehmen?

Gruß Denis

Pi - Max-Lan - 8x max Ht -3x Max WT - Max Fk -modbus umg103- 2x Arduino mit Firmata Ethernet- ws300 - 433Mhz Sender Empfänger - 7x 1wire ds1820

ChrisD

Hallo,

Danke für die Tests. Ich werde das 'use bytes;' in 36_ModbusRTU hinzufügen.

Die Änderung in der Umrechnung führt dazu dass es jetzt mit BigEndian-Zahlen funktioniert, allerdings nicht mehr mit LittleEndian. Solange alle Slaves/Server das gleiche Format verwenden ist dies kein Problem, ein Mischbetrieb ist aber so nicht mehr möglich.

Ich sehe folgende Möglichkeiten das Ganze parametrierbar zu machen:
- Festlegung in 36_Modbus*, Attribut wordOrder, Werte LE oder BE (pro Slave/UnitID), Vorteil: nur eine Definition pro Slave/Unit, Nachteil: Programmieraufwand, die 36er Module haben keine Ahnung von Datentypen
- Festlegung in 37_ModbusRegister über Attribut wordOrder, Vorteil: flexibel, Nachteil: Attribut muss ggfs. für jedes Register gesetzt werden
- Festlegung in 37_ModbusRegister über plcDataType, FLOAT_BE, DINT_BE, DWORD_BE

Welche würdet ihr bevorzugen ?

Grüße,

ChrisD




golem

Zitat von: ChrisD am 06 Mai 2014, 08:51:43
- Festlegung in 37_ModbusRegister über plcDataType, FLOAT_BE, DINT_BE, DWORD_BE

Würde ich bevorzugen.

ist es richtig, das das State reading wird nicht automatisch aktualisiert?
Pi - Max-Lan - 8x max Ht -3x Max WT - Max Fk -modbus umg103- 2x Arduino mit Firmata Ethernet- ws300 - 433Mhz Sender Empfänger - 7x 1wire ds1820

ChrisD

Hallo,

@Denis:
Zitatist es richtig, das das State reading wird nicht automatisch aktualisiert?
state und RAW werden in 2 aufeinanderfolgenden Zeilen aktualisiert. Ich weiß nicht wieso nur die Aktualisierung von RAW angezeigt wird. Was passiert wenn du die Seite neu lädst ? Steht dann noch immer der alte Wert und Zeitstempel bei state ?

@fischle:
ZitatWas mir gerade aufgefallen ist: Ich brauche immer einen neustart von FHEM um geänderte Register usw. wirksam werden zu lassen. Ist das so gewünscht?
Das ist nicht so gewünscht und auch nicht richtig. Kannst du kurz beschreiben bei welcher Änderung es passiert ist ?

Grüße,

ChrisD

golem

beim neuladen werden die aktuellen Werte angezeigt.
Pi - Max-Lan - 8x max Ht -3x Max WT - Max Fk -modbus umg103- 2x Arduino mit Firmata Ethernet- ws300 - 433Mhz Sender Empfänger - 7x 1wire ds1820

ChrisD

#143
Hallo,

Anbei eine neue Version von 37_ModbusRegister zum Testen. Ich habe 3 Datentypen für Big Endian hinzugefügt, das Update der Readings geändert (bulkUpdate statt SingleUpdate) und die Darstellung des RAW-Readings korrigiert.

@Denis: Kannst du bitte testen ob sich die Anzeige der Aktualisierung der Readings damit ändert ?

Grüße,

ChrisD

Edit 07.05.2014, Anhang gelöscht, aktuelle Version in folgenden Beiträgen

golem

Hallo Chris,

Ich werde erst morgen zum testen kommen, da ich heute den ganzen Tag unterwegs bin. Melde mich morgen do schnell wie möglich.
Gruß Denis
Pi - Max-Lan - 8x max Ht -3x Max WT - Max Fk -modbus umg103- 2x Arduino mit Firmata Ethernet- ws300 - 433Mhz Sender Empfänger - 7x 1wire ds1820

fischle

Hallo Chris,
danke für den supper Support mit den Modulen. Habe heute das Modul mal getestet.  Die sache mit den nicht übernommenen Werten konnte ich nicht ganz nachstellen, vielleicht habe ich auch nicht lange genug gewartet. Eine Sache ist mir noch aufgefallen:

Wenn beim Lesen der seriellen Schnittstelle nicht alle Daten im Puffer sind, kommt das Modul damit noch nicht ganz zurecht. Hier mal ein Auszug aus meinem Log. Man sieht, das Werte z.T. komplett gelesen werden, dann werden sie geparst. Werden die Werte nicht komplett gelesen, dann werden sie auch nicht geparst.


2014.05.07 21:23:54 5: SimpleWrite 01 04 00 0C 00 02 B1 C8
2014.05.07 21:23:54 5: Read 01 04 04 00 00 00 00 FB 84
2014.05.07 21:23:54 5: Received 01 04 04 00 00 00 00 FB 84
2014.05.07 21:23:54 5: MB_RTU dispatch ModbusRegister:1:12:4:2:0:0
2014.05.07 21:23:54 5: ModbusRegister_Parse: 4 1 12
2014.05.07 21:23:54 5: Triggering P_L1 (2 changes)
2014.05.07 21:23:54 5: Notify loop for P_L1 0
2014.05.07 21:23:54 4: eventTypes: ModbusRegister P_L1 0 -> .*
2014.05.07 21:23:54 4: eventTypes: ModbusRegister P_L1 RAW: 00000000 -> RAW: .*
2014.05.07 21:23:54 4: RQUEUE: 5
2014.05.07 21:23:54 5: SimpleWrite 01 04 00 0E 00 02 10 08
2014.05.07 21:23:54 5: Read 01 04 04 00 00
2014.05.07 21:23:54 5: Read 00 00 FB 84
2014.05.07 21:24:02 4: RQUEUE: 4
2014.05.07 21:24:02 5: SimpleWrite 01 04 00 10 00 02 70 0E
2014.05.07 21:24:02 5: Read 01
2014.05.07 21:24:02 5: Read 04 04 00 00 00 00 FB 84
2014.05.07 21:24:10 4: RQUEUE: 3
2014.05.07 21:24:10 5: SimpleWrite 01 04 00 00 00 02 71 CB
2014.05.07 21:24:10 5: Read 01 04 04
2014.05.07 21:24:10 5: Read 43 6D D4 AB 61 62
2014.05.07 21:24:18 4: RQUEUE: 2
2014.05.07 21:24:18 5: SimpleWrite 01 04 00 02 00 02 D0 0B
2014.05.07 21:24:18 5: Read 01 04 04 00 00 00 00 FB 84
2014.05.07 21:24:18 5: Received 01 04 04 00 00 00 00 FB 84
2014.05.07 21:24:18 5: MB_RTU dispatch ModbusRegister:1:2:4:2:0:0
2014.05.07 21:24:18 5: ModbusRegister_Parse: 4 1 2
2014.05.07 21:24:18 5: Triggering U_L2 (2 changes)
2014.05.07 21:24:18 5: Notify loop for U_L2 0
2014.05.07 21:24:18 4: eventTypes: ModbusRegister U_L2 0 -> .*
2014.05.07 21:24:18 4: eventTypes: ModbusRegister U_L2 RAW: 00000000 -> RAW: .*
2014.05.07 21:24:18 4: RQUEUE: 1


Im Viessmann-Thread gab es mal ein ähnliches Problem (http://forum.fhem.de/index.php/topic,20280.270.html), vielleicht kannst du dir dort abschauen, wie es gelöst wurde.

Weiterhin würde mich noch interessieren, was es zu bedeuten hat, wenn im modul "timeout" steht? Was genau bedeutet das, bzw. ab wann wird ein Timeout gezählt? Falls es hilft, hier noch meine Config:


define MB_RTU ModbusRTU COM9@9600
attr MB_RTU charformat 8N1
attr MB_RTU pollIntervall 5
attr MB_RTU timeout 8

define U_L1 ModbusRegister 1 30001
attr U_L1 group Stromzaehler
attr U_L1 plcDataType REAL_BE
define U_L2 ModbusRegister 1 30001
attr U_L2 group Stromzaehler
attr U_L2 plcDataType REAL_BE
define U_L3 ModbusRegister 1 30005
attr U_L3 group Stromzaehler
attr U_L3 plcDataType REAL_BE

define I_L1 ModbusRegister 1 30007
attr I_L1 group Stromzaehler
attr I_L1 plcDataType REAL_BE
define I_L2 ModbusRegister 1 30009
attr I_L2 group Stromzaehler
attr I_L2 plcDataType REAL_BE
define I_L3 ModbusRegister 1 30011
attr I_L3 group Stromzaehler
attr I_L3 plcDataType REAL_BE

define P_L1 ModbusRegister 1 30013
attr P_L1 group Stromzaehler
attr P_L1 plcDataType REAL_BE
define P_L2 ModbusRegister 1 30015
attr P_L2 group Stromzaehler
attr P_L2 plcDataType REAL_BE
define P_L3 ModbusRegister 1 30017
attr P_L3 group Stromzaehler
attr P_L3 plcDataType REAL_BE

RPi,
- USB RS485 Adapter für Stromzähler DRS155M und SDM630M-DC (B+G E-Tech)
- Viesmann KO2B Heizung mit selbstbau Optolink Adapter
- Mi-Light WiFi-Bridge V4, WW/CW LED-Birne

ChrisD

#146
Hallo,

Das Handling des Puffers der seriellen Schnittstelle habe ich zum Teil aus einem anderen Modul (Jeelink) übernommen. Leider habe ich dabei eine Zeile vergessen. Anbei eine neue Version von 36_ModbusRTU (0003) die den Fehler beheben sollte.

Die Meldung Timeout erscheint wenn nach dem Absenden der Anfrage (SimpleWrite) innerhalb der eingestellten Zeit (bei dir 8 s) keine korrekte Antwort kommt. Dies ist in deinem Log z.B. der Fall bei 21:23:54/21:24:02. Durch den Fehler in 36_ModbusRTU wurde das Antwortpaket nicht korrekt zusammengebaut und verworfen. Danach wird das nächste Paket abgeschickt und der Timer wird neu gestartet.

Anbei ebenfalls eine neue Version von 37_ModbusRegister (0005) welche einen Fehler im Define bei den plcDataTypes WORD und INT korrigiert.

Ich bin mir nicht sicher ob in deiner Config das Register für die Spannung von L2 stimmt. Müsste es nicht 30003 statt 30001 sein ?

Grüße,

ChrisD

fischle

#147
Hallo Chris,
danke für die schnelle Antwort, werde ich gleich mal testen.

Du hast recht, das Config ist noch falsch, da wollte ich noch die Probleme beim Umstellen der Regsiter nachstellen. Jetzt habe ich ein anderes Phänomen gefunden. Ich habe FHEM mit der geposteten config gestartet und dann die Adresse von U_L2 von 30001 auf 30003 geändert. Jetzt parst er mir das Ergebniss von U_L1 aber dennoch auch bei U_L2 rein:


014.05.07 22:25:21 5: SimpleWrite 01 04 00 00 00 02 71 CB
2014.05.07 22:25:21 5: Read 01 04 04 43 6F B1 9B EB E6
2014.05.07 22:25:21 5: Received 01 04 04 43 6F B1 9B EB E6
2014.05.07 22:25:21 5: MB_RTU dispatch ModbusRegister:1:0:4:2:17263:45467
2014.05.07 22:25:21 5: ModbusRegister_Parse: 4 1 0
2014.05.07 22:25:21 5: Triggering U_L2 (2 changes)
2014.05.07 22:25:21 5: Notify loop for U_L2 239.693771362305
2014.05.07 22:25:21 4: eventTypes: ModbusRegister U_L2 239.693771362305 -> .*
2014.05.07 22:25:21 4: eventTypes: ModbusRegister U_L2 RAW: 436fb19b -> RAW: 436fb19b
2014.05.07 22:25:21 5: Triggering U_L1 (2 changes)
2014.05.07 22:25:21 5: Notify loop for U_L1 239.693771362305
2014.05.07 22:25:21 4: eventTypes: ModbusRegister U_L1 239.693771362305 -> .*
2014.05.07 22:25:21 4: eventTypes: ModbusRegister U_L1 RAW: 436fb19b -> RAW: 436fb19b


Ich spiel jetzt mal das neue Modul ein, dann schau ich, ob sich der fehler immer noch nachstellen lässt.

[Edit]
Habe das Modul nun mal getestet, das mit dem zusammensetzen funktioniert wohl noch nicht ganz: Er setzt die Message unter "Read" dann voll korrekt zusammen, unter "Received" steht aber nur der 2. Teil und es kommt kein Parsing-Ergebniss.

2014.05.07 22:41:55 5: SimpleWrite 01 04 00 10 00 02 70 0E
2014.05.07 22:41:55 5: Read 01 04 04
2014.05.07 22:41:55 5: Read 01 04 04 00 00 00 00 FB 84
2014.05.07 22:41:55 5: Received 00 00 00 00 FB 84
2014.05.07 22:41:55 4: RQUEUE: 3
2014.05.07 22:41:55 5: SimpleWrite 01 04 00 00 00 02 71 CB
2014.05.07 22:41:55 5: Read 01 04 04 43 70 33 D4 FB 74
2014.05.07 22:41:55 5: Received 01 04 04 43 70 33 D4 FB 74
2014.05.07 22:41:55 5: MB_RTU dispatch ModbusRegister:1:0:4:2:17264:13268
2014.05.07 22:41:55 5: ModbusRegister_Parse: 4 1 0
2014.05.07 22:41:55 5: Triggering U_L1 (2 changes)
2014.05.07 22:41:55 5: Notify loop for U_L1 240.202453613281
2014.05.07 22:41:55 4: eventTypes: ModbusRegister U_L1 240.202453613281 -> .*
2014.05.07 22:41:55 4: eventTypes: ModbusRegister U_L1 RAW: 437033d4 -> RAW: 437033d4


Weiterhin konnte ich den Fehler mit dem Zurücklesen nachstellen: In der Konfig 2x das gleiche Register für unterschiedliche Variablen eintragen. Dann FHEM neu starten. Dann Register über Frontend anpssen und "Save Config". Ist für mich aber kein echtes Problem, ich weiß ja, das ein Neustart hilft..
RPi,
- USB RS485 Adapter für Stromzähler DRS155M und SDM630M-DC (B+G E-Tech)
- Viesmann KO2B Heizung mit selbstbau Optolink Adapter
- Mi-Light WiFi-Bridge V4, WW/CW LED-Birne

ChrisD

#148
Hallo,

Noch ein Versuch für heute Abend:

- 36_ModbusRTU (0004) sollte das zusammengesetzte Paket jetzt korrekt an Parse übergeben
- in 37_ModbusRegister (0006) habe ich die Define-Funktion geändert und Log-Aufrufe hinzugefügt um dem Problem beim ändern auf die Spur zu kommen

Grüße,

ChrisD

Edit: Die aktuellen Versionen der Module sind unter https://github.com/ChrisD70/FHEM-Modules zu finden.

fischle

Hallo Chris,
ich habe weiter mit dem Modul gespielt und folgendes festgestellt:

- Ich habe weitere Readings über "edit files" hinzugefügt - dannach hat er gar nichts mehr über modbus ausgelesen. im Logfile sind keine Einträge von dem Modul mehr zu sehen.

- Ich starte FHEM über Kommandozeile, folgende Meldungen erscheinen da noch regelmäßig:


Use of uninitialized value $exp_code in concatenation (.) or string at ./FHEM/36
_ModbusRTU.pm line 327.
Use of uninitialized value $found[0] in string eq at fhem.pl line 2788.
Argument "" isn't numeric in numeric gt (>) at ./FHEM/36_ModbusRTU.pm line 322.
Use of uninitialized value $found[0] in string eq at fhem.pl line 2788.
Argument "" isn't numeric in numeric gt (>) at ./FHEM/36_ModbusRTU.pm line 322.


Sind jetzt beides keine Sachen, die ein echtes Problem darstellen, wollte dir nur das Feedback geben.

Grüße

Fabian

[EDIT]
Gerade deinen Post gelesen, gibt gleich noch mal ein Feedback.
RPi,
- USB RS485 Adapter für Stromzähler DRS155M und SDM630M-DC (B+G E-Tech)
- Viesmann KO2B Heizung mit selbstbau Optolink Adapter
- Mi-Light WiFi-Bridge V4, WW/CW LED-Birne