Jump to content

Recommended Posts

Geschrieben (bearbeitet)

Hallo,

Will mir gerne eine PV-Überschussladen Funktion in Python schreiben - scheitere aber daran das der warpcharger meine inputs nicht übernimmt bzw nicht anzeigt.

Zuständig für den Ladestrom müsste ja der Holding Register "1002" sein.
Ich kann den Wert auch erfolgreich ändern:
 

>>> client.write_register(1002, 15000)
<pymodbus.register_write_message.WriteSingleRegisterResponse object at 0x7fc3f78b5710>
>>> read = client.read_holding_registers(1002, 1)
>>> read.registers
[15000]



-> jedoch, in der Übersicht (/#status) oder im Charger Status (/#evse) seh ich den gesetzten Wert nirgends?
Der "allowed charging current" steht dort zum Beispiel auf  0.000A.

Mangels Fahrzeug am Charger kann ich aber nicht testen ob er den Value übernimmt oder anpassen würde wenn der Ladevorgang aktiv läuft.
Hab den charger auch mal neugestartet ob es vl eine Besserung in der Anzeige bringt -> aber leider nein.

 

Hat einer eine Idee?

 

lg,
Franz
 

bearbeitet von Frankstar
typos
Geschrieben (bearbeitet)

Du solltest den gesetzten Wert auf der Seite Charger Status (/#evse) unter Charging current limits bei Modbus TCP current sehen.

„allowed charging current“ ist das Minimum aller Werte aus der Liste mit Limits. Wenn irgendein Limit 0 ist, ist der „allowed charging current“ auch 0, selbst wenn dein per Modbus TCP gesetztes Limit höher ist.

bearbeitet von MatzeTF
Geschrieben

Dein Problem ist, dass wir alle Werte als uint32 oder float hinterlegen. Beides ist vier Bytes (also zwei Modbus-Register) lang. Mit Pymodbus kannst du 4 Byte lange Werte z.B. so schreiben und lesen:

from pymodbus.client import ModbusTcpClient
from pymodbus.payload import BinaryPayloadBuilder, BinaryPayloadDecoder
from pymodbus.constants import Endian

def uint32_to_regs(value):
    builder = BinaryPayloadBuilder(wordorder=Endian.Big, byteorder=Endian.Big)
    builder.add_32bit_uint(value)
    return builder.to_registers()

def float_to_regs(value):
    builder = BinaryPayloadBuilder(wordorder=Endian.Big, byteorder=Endian.Big)
    builder.add_32bit_float(value)
    return builder.to_registers()

def regs_to_uint32(response):
    decoder = BinaryPayloadDecoder.fromRegisters(response.registers, wordorder=Endian.Big, byteorder=Endian.Big)
    return decoder.decode_32bit_uint()

def regs_to_float(response):
    decoder = BinaryPayloadDecoder.fromRegisters(response.registers, wordorder=Endian.Big, byteorder=Endian.Big)
    return decoder.decode_32bit_float()

client = ModbusTcpClient('warp2-22oH')
client.connect()

# Setze 12,345 A als Modbus-Ladestrom
client.write_registers(1002, uint32_to_regs(12345))
# Lies den Modbus-Ladestrom zurück
print(regs_to_uint32(client.read_holding_registers(1002, 2)))

# Lies den insgesamt erlaubten Ladestrom (allowed_charging_current)
print(regs_to_uint32(client.read_input_registers(1010, 2)))

EDIT: int -> uint

Geschrieben

das wars danke!
Hab zwar mit dem payloader rumgespielt aber immer die Fehlermeldung 
 

struct.error: required argument is not an integer

bekommen.
Durch deine Erklärung
 

Quote

 Beides ist vier Bytes (also zwei Modbus-Register) 

wurde mir aber bewusst das ich write_registers und nicht write_register nutzen muss!!
THNX!

----

PS: müssten ganz offizell deine Funktionen nicht "builder.add_32bit_uint(value)" nutzen? anstatt nur int?
Es is klar warum trotzdem funktioniert - weil wir keine minus Zahl haben.

 

lg,
Franz

Geschrieben
On 3/16/2023 at 4:51 PM, Frankstar said:

PS: müssten ganz offizell deine Funktionen nicht "builder.add_32bit_uint(value)" nutzen? anstatt nur int?

Da hast du recht. Hatte ich übersehen, sorry :D Habe das mal editiert, falls jemand den Thread findet und das raus kopiert.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...