Jump to content

Modbus PV-Überschuss laden / Allowed charging current


Frankstar

Recommended Posts

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
 

Edited by Frankstar
typos
Link to comment
Share on other sites

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.

Edited by MatzeTF
Link to comment
Share on other sites

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

  • Thanks 1
Link to comment
Share on other sites

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

Link to comment
Share on other sites

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...