Forum: Mikrocontroller und Digitale Elektronik Modbus mit Unterregister?


von Ralf P. (rapi)


Lesenswert?

Hi,
ich lese über einen originalen Wlan-Dongle vom Hersteller, auf der eine 
eigene Firmware läuft, einem Wechselrichter die Input-Register aus.
Das stellt kein Problem dar und läuft.

Am Wechselrichter hängen jetzt Speicherblöcke, welche über den 
Wechselrichter per Canbus abgefragt werden.
Der Hersteller kann über den originalen Wlan-Dongle die Speicher 
auslesen.
Also Zellspannungen usw.
Der Weg läuft also über den im Verbauten Arduino ESP07 in den 
Wechselrichter per Modbus, mit weiterer Abfrage der Speicher per Canbus.

Im Wechselrichter steht ein Input-Register = 102 = BMS_ Cell1_Volt, in 
dem nichts steht.
Als Erklärung zu diesen Werten steht dazu ,

"Detail information, refer to document: Growatt xxSxxP ESS Protocol;"

In diesen Protokoll gibt es dann wieder Register zum abfragen.

Gehe ich richtig in der Annahme, das man Register 102 aufruft und danach 
einen weiteren vom Speicher? Oder wie läuft das ab?

Kann jemand dazu Erklärungen abgeben?

Besten Dank im Voraus :-)

von DerEinzigeBernd (Gast)


Lesenswert?

Was jetzt, Modbus oder Canbus?

Modbus kennt keine "Unterregister". Modbus kennt zwei Arten von 
Registern mit 16-Bit-Werten und zwei Arten von Registern mit 
1-Bit-Werten. Die 16-Bit-Werte werden als "input register" und "holding 
register" bezeichnet, letztere können auch beschrieben werden. Die 
1-Bit-Werte werden als "discrete inputs" und "coils" bezeichnet, 
letztere können auch beschrieben werden.

Alle Register werden bei 0 anfangend durchnumeriert, es kann bis zu 
65536 Register jeden Typs geben.

Es gibt davon abweichende Konventionen, bei der die Art des Registers 
nur bei der Darstellung in die Registernummer codiert wird, und dann 
wird bei 1 mit der Zählung begonnen. Eine Konvention beschränkt dadurch 
die Anzahl der verwendbaren Register auf 9999 je Typ:

coils 1 bis 9999
discrete inputs 10001 bis 19999
input register 30001 bis 39999
holding register 40001 bis 49999

Das aber ist nur eine Art der Darstellung, tatsächlich werden bei 
allen Registerarten die Nummern 0 bis 9998 verwendet.

Eine Erweiterung dieser Darstellungskonvention erlaubt die Verwendung 
aller möglichen Register:

coils 1 bis 65536
discrete inputs 100001 bis 165536
input register 300001 bis 365536
holding register 400001 bis 45536

Aber auch hier werden im tatsächlichen Protokoll die Adressen 0 bis 
65535 verwendet; das Protokoll sieht nämlich nur einen einzelnen 
16-Bit-Wert für die Adressierung vor, und das ist nunmal der damit 
darstellbare Wertebereich.

Mehr steckt nicht hinter Modbus.

von STK500-Besitzer (Gast)


Lesenswert?

Ralf P. schrieb:
> Gehe ich richtig in der Annahme, das man Register 102 aufruft und danach
> einen weiteren vom Speicher? Oder wie läuft das ab?

Hä? Was möchtest du wissen?
In diesem Handbuch steht die Cell 1 Voltage im Register 0x0071 (133 
dezimal):
https://watts247.com/manuals/gw/1_1xSxxP_ESS_protocol_rev%20_23_20171128.pdf

Der Controller mit dem du Wechselrichter sprichts, besorgt sich den Wert 
entweder in dem Moment deiner Abfrage per CAN-Bus von den Slaves oder er 
speichert ihn zwischen, weil er die Slaves regelmäßig abfragt.

von Ralf P. (rapi)


Lesenswert?

Naja, der Aufbau von Modbus ist mir schon etwas geläufig.
Trozdem ein danke an @DerEinzigeBernd.

@STK500-Besitzer
der Register 133 zeigt mit aber nur 65535 an.
133 ist wie du schon sagtest der Register aus dem Growatt xxSxxP ESS 
Protocol

102 wäre laut Modbus-Tabelle für meinen Wechselrichter der Wert für BMS_ 
Cell1_Volt

Es gibt halt zwei Protokolle. Das ist mein Problem.
Entweder hat hier Growatt etwas grundsätzliches geändert oder ...

von STK500-Besitzer (Gast)


Lesenswert?

Ralf P. schrieb:
> Es gibt halt zwei Protokolle. Das ist mein Problem.
> Entweder hat hier Growatt etwas grundsätzliches geändert oder ...

Welchen Wechselrichter hast du denn?

DerEinzigeBernd schrieb:
> Modbus kennt keine "Unterregister

Modbus selber "nicht" (siehe Functioncode 0x2B "Encapsulated Interface 
Transport").

Man kann natürlich ein übergeordnetes Protokoll implementieren, bei dem 
Register als Adressregister der Unterregister verwendet wird.
Man schreibt in ein HoldingRegister die Adresse des Unterregisters und 
liest dann auf der selben Holding- oder InputRegister-Adresse den Wert 
verschiedener Unterregister aus.

von Ralf P. (rapi)


Lesenswert?

@STK500-Besitzer

ich betreibe zwei Growatt SPF5000es als Inselnetz.

Gruß

von Ralf P. (rapi)


Angehängte Dateien:

Lesenswert?

Ich gaube ich habe da was gefunden.
In einer gerade gefundenen PDF scheint was im Holdig-Register zu stehen.

Holding Register 75 und 80?

Gruß

von STK500-Besitzer (Gast)


Lesenswert?

Ralf P. schrieb:
> Ich gaube ich habe da was gefunden.
> In einer gerade gefundenen PDF scheint was im Holdig-Register zu stehen.

Und was?
Immer wieder schade, wenn jemand irgendwelche Unterlagen zitiert, aber 
wieder diese noch einen Link darauf mitliefert.
In den Unterlagen, die ich dazu gefunden habe, standen Randbemerkungen 
auf Chinesisch (oder so; zumindest eine Sprache, von der ich keine 
Ahnung habe).

So gesehen, halte ich die Sache für Closed Source, und da mir kein 
(derartiger) Wechselrichter zur Verfügung steht, halte ich mich erstmal 
raus.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.