Seite 1 von 2

Modbus auslesen

Verfasst: So Apr 03, 2022 1:29 pm
von bforpc
Hallo Forum,

ich habe unten stehendes Python script, welches mir die Ladeleistung auselsen soll (laut https://openwb.de/main/wp-content/uploa ... openWB.pdf)
Leider bekomme ich dort immer nur 0 zurück, obwohl eine Auto dranhängt, welches auch geladen wird.

Code: Alles auswählen

#!/usr/bin/env python3

from pymodbus.constants import Defaults
from pymodbus.constants import Endian
from pymodbus.client.sync import ModbusTcpClient as ModbusClient
from pymodbus.payload import BinaryPayloadDecoder
from datetime import datetime
import urllib.request, sys, os, time, textwrap, subprocess, time, getopt, struct, json, ast, requests


client = ModbusClient("192.168.1.8", port='502')
val=client.connect()
msg     = client.read_input_registers(10100, unit=1)
decoder = BinaryPayloadDecoder.fromRegisters(msg.registers, byteorder=Endian.Big)
msg     = decoder.decode_16bit_int()

print(msg)

Re: Modbus auslesen

Verfasst: So Apr 03, 2022 4:03 pm
von Gero
Probier mal, ob der eingebaute modbustester Dir den erwarteten Wert zurückliefert:

http://openWB.fritz.box/openWB/web/tool ... dtest.html

Ich probiere bei sowas immer gerne mit Werten, die längere Zeit konstant bleiben. Sowas wie ConfiguredChargepoints.

Re: Modbus auslesen

Verfasst: Mo Apr 04, 2022 5:15 am
von bforpc
Hallo,

mit dem Modbustester teste ich mich quasi selnbst, oder?
Hier die Ausgabe

Code: Alles auswählen

url /openWB/web/tools/trace/modtest.php?ip=192.168.1.8&start=10100&len=20&id=1&fun=3
parmeters parsed ip 192.168.1.8 start 10100 len 20 id 1 fun 3
04/04/2022, 07:13:58 opentrace read input register ip 192.168.1.8 start 10100 len 20 id 1
04/04/2022, 07:13:58 opentrace start 10100 + 0 inhalt 0 0X0
04/04/2022, 07:13:58 opentrace start 10100 + 1 inhalt 0 0X0
04/04/2022, 07:13:58 opentrace start 10100 + 2 inhalt 13 0XD
04/04/2022, 07:13:58 opentrace start 10100 + 3 inhalt 46552 0XB5D8
04/04/2022, 07:13:58 opentrace start 10100 + 4 inhalt 23040 0X5A00
04/04/2022, 07:13:58 opentrace start 10100 + 5 inhalt 23090 0X5A32
04/04/2022, 07:13:58 opentrace start 10100 + 6 inhalt 23060 0X5A14
04/04/2022, 07:13:58 opentrace start 10100 + 7 inhalt 0 0X0
04/04/2022, 07:13:58 opentrace start 10100 + 8 inhalt 0 0X0
04/04/2022, 07:13:58 opentrace start 10100 + 9 inhalt 0 0X0
04/04/2022, 07:13:58 opentrace start 10100 + 10 inhalt 1 0X1
04/04/2022, 07:13:58 opentrace start 10100 + 11 inhalt 1 0X1
04/04/2022, 07:13:58 opentrace start 10100 + 12 inhalt 0 0X0
04/04/2022, 07:13:58 opentrace start 10100 + 13 inhalt 0 0X0
04/04/2022, 07:13:58 opentrace start 10100 + 14 inhalt 1 0X1
04/04/2022, 07:13:58 opentrace start 10100 + 15 inhalt 0 0X0
04/04/2022, 07:13:58 opentrace start 10100 + 16 inhalt 0 0X0
04/04/2022, 07:13:58 opentrace start 10100 + 17 inhalt 0 0X0
04/04/2022, 07:13:58 opentrace start 10100 + 18 inhalt 0 0X0
04/04/2022, 07:13:58 opentrace start 10100 + 19 inhalt 0 0X0
Bfo

Re: Modbus auslesen

Verfasst: Mo Apr 04, 2022 6:27 am
von Becker
Ladeleistung ist Int32be:
32.jpg

Re: Modbus auslesen

Verfasst: Mo Apr 04, 2022 1:54 pm
von bforpc
Moin,

was mich zu meiner ursprünglichen Frage bringt, warum das python Script bei

Code: Alles auswählen

msg     = decoder.decode_16bit_int()
eine 0 ausgibt. Ein

Code: Alles auswählen

msg     = decoder.decode_32bit_int()
zeigt mir den Fehler

struct.error: unpack requires a buffer of 4 bytes

Scheint also nur ein 8/16Bit Feld zu sein, oder habe ich das falsch verstanden?

Bfo

Re: Modbus auslesen

Verfasst: Mo Apr 04, 2022 2:26 pm
von Becker
Ja du brauchst 10100 + 10101 für das 32bit Register.
Manchmal hilft ein Bild mehr als Worte:
1323.png
(ist zwar von SMA aber gleiches Prinzip)

oder du nimmst MQTT :lol:

Re: Modbus auslesen

Verfasst: Di Apr 05, 2022 9:23 am
von bforpc
Hallo Becker,
danke für deine Antwort. Leider stehe ich jetzt völlig auf dem Schlauch.

Das Register 10100 ist laut openweb

Code: Alles auswählen

10100 sint32 Read LP 1 Actual Power Watt
Wofür ist 10101 (steht nicht in der Liste) und in wiefern brauche ich diesen zweiten?
Ich bin absoluter Neuling mit der openWB und mit python sowieso.

Mein Wunsch ist, mit dem python script aus dem 1. Post die aktuelle Ladeleistung vom LP1 und LP2 zu bekommen. Sonst nichts.
Kannst du mir bitte dahingehend einen Tip für das Script geben?

Bfo

Re: Modbus auslesen

Verfasst: Di Apr 05, 2022 9:47 am
von LutzB
Modbus ist leider nicht so trivial. Da müssen Werte in Registern richtig kombiniert werden, um nachher den richtigen Wert zu bekommen. Versuch es doch besser mit Mqtt. Da muss nicht interpretiert werden, sondern bekommt direkt den Wert. In Python ist das auch schnell umgesetzt.

Re: Modbus auslesen

Verfasst: Di Apr 05, 2022 10:10 am
von bforpc
Das sagst so in deinem jugendlichen Leichtsinn :-)

Dann müsste ich das halt kombinieren. Andererseits wäre es mit den richtigen Werten doch kein Problem die openWB abzugragen. Sei's drum.
Leider habe ich noch weniger Erfahrung mit Mqtt, genauer gesagt: gar keine.

Gibt es da irgend etwas fertiges, oder ein "snippet", um die 2 von mir gewünschten Werte zu bekommen?
Ich wundere mich, dass sonst noch keiner nach so einer "trivialen" Auswertung gefragt hat (also 2 Werte auslesen).

Bfo

Re: Modbus auslesen

Verfasst: Di Apr 05, 2022 10:24 am
von rleidner
es sollte so gehen

Code: Alles auswählen

#!/usr/bin/env python3

from pymodbus.constants import Defaults
from pymodbus.constants import Endian
from pymodbus.client.sync import ModbusTcpClient as ModbusClient
from pymodbus.payload import BinaryPayloadDecoder
from datetime import datetime
import urllib.request, sys, os, time, textwrap, subprocess, time, getopt, struct, json, ast, requests


client = ModbusClient("192.168.1.171", port='502')
val=client.connect()
msg     = client.read_input_registers(10100, count=2, unit=1)
decoder = BinaryPayloadDecoder.fromRegisters(msg.registers, byteorder=Endian.Big)
msg     = decoder.decode_32bit_int()

print(msg)
Wichtig sind "count=2" und "decode_32bit", ...

IMHO ist mqtt deutlich einfacher und klarer als das Gefummel in den Modbus Registern