Forum: PC-Programmierung Interpretation von Modbus Antwort


von Fox X. (mr-fox)


Lesenswert?

Hallo,

ich lese mehere Register über Modbus TCP an einen Energiezähler aus.
von Adresse 0 bis 84. Dafür Verwende ich pyModbusTCP mit der Funktion 
read_holding_registers(0, 84).
Ich erhalte folgende Antwort:
1
[3, 30433, 0, 0, 0, 0, 3, 31120, 0, 0, 3, 30803, 2, 20641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49990, 0, 2]

Im Datenblatt steht:
1
Dezimale | Adresse Hexadezimale | Adresse Anzahl Register | Beschreibung  | Einheit  | Teiler | Datentyp
2
0 | 0x0000 | 2 | Spannung Leiter gegen N U1       | V | 1000 | UInt32
3
2 | 0x0002 | 2 | Spannung Leiter gegen N U2       | V | 1000 | UInt32
4
4 | 0x0004 | 2 | Spannung Leiter gegen N U3       | V | 1000 | UInt32
5
6 | 0x0006 | 2 | Spannung Leiter gegen Leiter U12 | V | 1000 | UInt32
6
...

Es ist kein Verbraucher angeschlossen, daher die Nullen. Aber ich 
verstehe die Werte nicht.
Die ersten Werte lauten als Hex 03 76 E1 00 00 00...
E1 wären 225 das könnte, die Netzspannung 230V sein. Aber laut 
Datenblatt soll diese 2 Byte groß sein, E1 00 oder 76 E1 passt nicht. 
Und auch das Tauschen der Bytes E1 76 bringt auch nichts.
Ich hatte in einer Beschreibung zu lib gelesen das der rückgabe Wert 
sich zusammen setzt aus Anzahl und Daten...
kann mir jemand bei der Interpretation helfen.

Die 49990 sind die 50Hz...

: Bearbeitet durch User
von (Gast)


Lesenswert?

3 * 2^16 + 30433 ergibt 227041, das durch 1000 sollte die Spannung in 
Volt sein, also 227,041V. So würd ich das interpretieren.

Leider ist bei modbus nicht wirklich definiert wie 32 Bit Werte auf 
Register abgebildet werden, angeblich kommt da auch jede permutation die 
denkbar ist in der freien Wildbahn vor.

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

Fox X. schrieb:
> 03 76 E1...

rµ schrieb:
> 3 * 2^16 + 30433 ergibt 227041, das durch 1000 sollte die Spannung in
> Volt sein, also 227,041V. So würd ich das interpretieren.

Dem würde ich mich anschliesen, aber dann müsste es eher "00 03 76 E1" 
sein. Das der erste Wert 8 Bit ist und der zweite 16 Bit wäre 
merkwürdig.

- 0x76E1 ist ja dez. 30433, dass passt.
- UInt32: 0x000376E1 => 227041 / 1000 = 227.041V

von (Gast)


Lesenswert?

Irgend W. schrieb:
> Fox X. schrieb:
>> 03 76 E1...
>
> rµ schrieb:
>> 3 * 2^16 + 30433 ergibt 227041, das durch 1000 sollte die Spannung in
>> Volt sein, also 227,041V. So würd ich das interpretieren.
>
> Dem würde ich mich anschliesen, aber dann müsste es eher "00 03 76 E1"
> sein. Das der erste Wert 8 Bit ist und der zweite 16 Bit wäre
> merkwürdig.
>
> - 0x76E1 ist ja dez. 30433, dass passt.
> - UInt32: 0x000376E1 => 227041 / 1000 = 227.041V

wenn das pymodbus als ersten wert 3 ausgibt wurde auch 3 übertragen als 
16 bit wert.

von MaWin (Gast)


Lesenswert?

Irgend W. schrieb:
> Das der erste Wert 8 Bit ist und der zweite 16 Bit wäre merkwürdig.

Unsinn, alle Zahlen dort sind 16 bit Werte, es sind ja schliesslich 
Modbus-Registerinhalte.

Die 3 ist also 0x0003.

Fox X. schrieb:
> Die ersten Werte lauten als Hex 03 76 E1 00 00 00...

Da fehlt halt die führende 0x00.

von Pete K. (pete77)


Lesenswert?

Fox X. schrieb:
> ich lese mehere Register über Modbus TCP an einen Energiezähler aus.

Welchen denn? Hat der keine Dokumentation seiner Register?

von Fox X. (mr-fox)


Lesenswert?

super danke, alle Werte sind 16 bit dann kommt da Struktur rein.
Ich dachte jedes Register wären genau ein Byte, hatte mich dann 
gewundert das einige Werte 16 Bit sind und einige nur 8 Bit.
Dies scheint bei Modbus nicht der Fall zu sein.

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.