Neue Versionen und Support zum Modbus-Modul

Begonnen von StefanStrobel, 20 August 2017, 12:11:08

Vorheriges Thema - Nächstes Thema

Knallkopp_02

Ich werde mich mal durchtesten und sehen was ichh an Infos bekomme. Schonmal herzlichen Dank, Melde mich, wenn ich Daten bekomme.

Gruß Knallkopp_02
Ich bin kein Programmierer und habe keine Ahnung.

Raspberry PI 3B+ mit HM-MOD-RPI-PCB,     
HM-TC-IT-WM-W-EU, HM-CC-RT-DN, HM-SEC-SCo
Raspberry PI 3B+ mit 7" Touchdisplay

laserrichi

Also duku lesen wird dir nicht erspart bleiben.

Ich habe selbst auch etwas zeit gebraucht bis ich das ganze begriffen habe, vor allem das man hex in dezimal umrechnen musste. Die Readings sind in dezimal, und die dokus der Geräte meistens in hex.
Wenn du da keine Dokumentation hast wird es sowieso extrem schwierig. Du weist ja nicht welche Art von Register (input, hold, coil) und ob es high low register gibt und wie sie zusammengehören.

Es gibt bei modbusattr ja scanModbusId  dann findest du vieleicht deine ganzen Geräte. scanModbusObjects findet vieleicht deine readings. Habe das selber nie probiert.

RaspberryPi 4 Bullseye,Homematic,Z-Wave,Rademacher Duofern,Signalduino,Fritz7590,ESPEasy,Tasmota,Robonect,Kameras,1-Wire,Modbus,Solar,Maranz,VU+,ulanzi tc001 mit awtrix light

Knallkopp_02

Da die Doku praktisch nicht vorhanden ist, habe ich sowieso schon viel gesucht.

Mit der ID ist die ID des Gerätes gemeint? Weil das PC Programm gibt mir IDs aus, dann könnte ich damit schonmal starten. BZW eigendlich ist die 22 01 die Geräteaddresse in der Anfrage.

Das ist aus meinem Script, was zu Windows 7 32Bit Zeiten noch gelaufen ist. Ich hatte den Rückgabewert an den Leerzeichen getrennt und dann als Array generiert. Ich nehme an, das die Register jetzt der Arraynummer entsprechen, oder sehe ich das falsch?

seriennummer = Chr(CLng("&H" & WrdArray(16))) & Chr(CLng("&H" & WrdArray(17))) & Format(WrdArray(18), "00") & Chr(CLng("&H" & WrdArray(19))) & Format(WrdArray(20), "00") & Format(WrdArray(21), "00")
wenn ich die Seriennummer des Gerätes ausgelesen bekomme, dann habe ich es warscheinlich auch verstanden, weil wo was steht habe ich in meinem Script.

Gruß Knallkopp_02
Ich bin kein Programmierer und habe keine Ahnung.

Raspberry PI 3B+ mit HM-MOD-RPI-PCB,     
HM-TC-IT-WM-W-EU, HM-CC-RT-DN, HM-SEC-SCo
Raspberry PI 3B+ mit 7" Touchdisplay

StefanStrobel

Hallo,

Zitat von: Knallkopp_02 am 17 April 2020, 11:24:38
ID WR Befehl Checksumme
22 01 ff ff b4 00 00 00 d5

Wenn ich den oben genannte Frage am PC stelle (das habe ich über VBA getestet), bekomme ich folgende Antwort.

Wobei Modell Firmware Datum sein sollte
22 01 ff ff b4 00 00 00 d5 ff ff 22 01 b4 fe 04 57 36 07 4a 03 06 e4 00 12 00 17 08 e5 00 54 00 29 08 e6 01 00 24 07 4f

Das sieht leider nicht nach Modbus aus.
Unter http://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b.pdf findest Du die Spezifikation des Modbus-Protokolls.
Modbus RTU über serielle Leitungen überträgt die Requests in der Form id,fCode,data,crc.
Für mich sieht das nach einem anderen / proprietären Protokoll aus.

Gruss
   Stefan

Knallkopp_02

Könnte es dann eine normale Serielle Verbindung über RS485 sein, weil dieser Begriff ist immer gefallen?

Gruß
Ich bin kein Programmierer und habe keine Ahnung.

Raspberry PI 3B+ mit HM-MOD-RPI-PCB,     
HM-TC-IT-WM-W-EU, HM-CC-RT-DN, HM-SEC-SCo
Raspberry PI 3B+ mit 7" Touchdisplay

StefanStrobel

Klar, RS485 ist nur eine Alternative zu RS232. Einfach eine anderen Verkabelung / Logik, aber ebenso eine serielle Verbindung.

Gruss
   Stefan

Knallkopp_02

Dann werde ich mich wohl mit ECMD von FHEM beschäftigen müssen, dass scheint dann das richtige zu sein.

Gruß und herzlichen Dank
Ich bin kein Programmierer und habe keine Ahnung.

Raspberry PI 3B+ mit HM-MOD-RPI-PCB,     
HM-TC-IT-WM-W-EU, HM-CC-RT-DN, HM-SEC-SCo
Raspberry PI 3B+ mit 7" Touchdisplay

Wzut

@Knallkopp_02 , pejonp hat dir mit https://www.mastervolt.de/produkte/masterbus-interfaces/masterbus-modbus-interface/ schon die goldene Brücke gebaut !
Rübergehen , d.h. runterladen und lesen musst du schon selbst. Die beschreiben dort ganz genau wie via Modbus Register zu lesen oder zu beschreiben sind und vor allem in welchen Registern sich die Werte verstecken.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

laserrichi

da ich leider nicht der perl Spezialist bin und mir das Thema unpack immer noch etwas rätselhaft ist, hier eine Frage an die Experten:

Folgendes Register will ich verarbeiten:
Battery Current Low  331B (hex) The net battery current,charging current minus the discharging one. The positive value representscharging and negative, discharging.
darauf folgt das high register mit Adresse 331C
Das ist der Lade/Entladestrom der Batterie.
Bisher hatte ich nur das low Register ausgelesen und entsprechend umgerechnet.
dev-i-defRevRegs 1
attr Solarlader obj-i13083-expr if ($val > 32767){($val-65536)/100}else{$val=($val/100)}
attr Solarlader obj-i13083-reading BattStrom

aber sauber ist das meiner meinung nach nicht, vor allem möchte ich es "sauber" mit dem High entsprechend abbilden.

hier habe ich versucht:

attr Solarlader obj-i13083-expr $val=($val/100)
attr Solarlader obj-i13083-len 2
attr Solarlader obj-i13083-reading BattStrom
attr Solarlader obj-i13083-unpack N


das liefert mir natürlich utopische werte wie  42949672.95  sobald der Strom ins negative geht, also die Batterie entladen wird.

Da bei meinem Laderegler die High immer in der Adresse danach kommen, habe ich eben defRevRegs 1  generell gesetzt.
Oder muss ich hier das entfernen und unpack N>  als big-endian angeben ?

Seltsamerweise wenn es im Positiven Bereich ist, stimmt der Strom.
Versuche mit unpack l L als signed oder unsigned scheiterten.
Der Wert ist 0,00A deswegen teile ich immer durch 100 bei den expr.

Die doku gibt da leider nicht mehr her als der text der da oben steht.
RaspberryPi 4 Bullseye,Homematic,Z-Wave,Rademacher Duofern,Signalduino,Fritz7590,ESPEasy,Tasmota,Robonect,Kameras,1-Wire,Modbus,Solar,Maranz,VU+,ulanzi tc001 mit awtrix light

pejonp

Hi laserrichi,

Kannst du mal einen link oder die Doku hier anhänge. Vielleicht gibt es ein extra Register mit der Angabe der Richtung. Beim SolarEdge gibt es ein Register für die kommastelle. Nur so ein Schuss ins blaue.

Pejonp
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

laserrichi

Ok, hier sind 2 PDFs über die Protokolle die ich im Netz gefunden habe. Nicht alle Regler haben alle Register. Aber diese ganzen EPEVER haben wohl alle den gleichen Aufbau egal welche Serie, und gibt es auch unter verschiedene Namen. In dem einen sind auch Beispiele drin aber eben nicht zu dem Register mit möglichen Negativen Wert.

Kann ich meine readings so setzen und bearbeiten das ich diese in binär form in ein Log bekomme ?
Dann erkennt man vieleicht etwas wie das gesetzt wird. Wenn ich z.b. 1A habe postiv, dann steht das Word auch entsprechend. Habe ich -1A dann muss ich vom Word 32767 dezimal abziehen. Zumindest hatten so meine Werte einigermaßen gestimmt.
RaspberryPi 4 Bullseye,Homematic,Z-Wave,Rademacher Duofern,Signalduino,Fritz7590,ESPEasy,Tasmota,Robonect,Kameras,1-Wire,Modbus,Solar,Maranz,VU+,ulanzi tc001 mit awtrix light

pejonp

#446
@laserrichi

schau mal hier --> https://www.perl-community.de/bat/poard/thread/19451 vielleicht hilft das.

Du kannst doch aber auch das Modbus-Device definieren.


defmod PWP ModbusAttr 3 60 192.168.4.7:20108 RTU


und dann mit


set PWP scanModbusObjects


das erkennen loslaufen lassen. Es werden dann mehrere Decodierungen versucht.

pejonp
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

laserrichi

Ok Danke,  das werd ich mal probieren.
Ich habe gerade mit Verbose 5 das ganze angesehen.
die 2Bytes  und der umgerechnete dezimalwert /100:
0007    0.07
und bei negativem Strom wird wohl von ffff  runtergerechnet:
ff6f   -1.45
ff45   -1.87
ffed   -0.19

Wenn ich jetzt die 2 readings nehme habe ich bei postiven werten
00000007
bei negativen
zählt wohl auch das highbyte von ffff runterwärts
fffffff1

RaspberryPi 4 Bullseye,Homematic,Z-Wave,Rademacher Duofern,Signalduino,Fritz7590,ESPEasy,Tasmota,Robonect,Kameras,1-Wire,Modbus,Solar,Maranz,VU+,ulanzi tc001 mit awtrix light

pejonp

#448
@laserrichi

vielleicht kannst du es dir auch einfach machen:

bin: 0111111111111111
dec: 32767
hex: 7FFF

alles was grösser als 32767 ist, ist negativ. So wie du es in deinem Beispiel schon beschrieben hast. Die linke Stelle ist das Vorzeichen.

pejonp
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

laserrichi

 ;) so hab ich es ja schon immer am laufen, aber eben nur mit dem Low register. Sicher kann ich das high nie nutzen, soviele Ampere geht ja nicht. Aber es geht einfach um die vollständikeit und richtigkeit des ganzen.

Es zählt ja von  FFFFFF rückwärts runter wenn es negativ ist. Von daher dachte ich das es eine einfachere variante gibt als dezimal 65536 abzuziehen.
Idealerweise ein invertiren der Bits (Byte).
Mal wieder was gelernt und fühle mich wie in den 80er zurück, wo ich am Z80 mit Schaltern Register gesetzt und geschoben habe :-)
RaspberryPi 4 Bullseye,Homematic,Z-Wave,Rademacher Duofern,Signalduino,Fritz7590,ESPEasy,Tasmota,Robonect,Kameras,1-Wire,Modbus,Solar,Maranz,VU+,ulanzi tc001 mit awtrix light