Frankstar Geschrieben March 16, 2023 at 12:22 Geschrieben March 16, 2023 at 12:22 (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 March 16, 2023 at 12:23 von Frankstar typos Zitieren
MatzeTF Geschrieben March 16, 2023 at 13:48 Geschrieben March 16, 2023 at 13:48 (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 March 16, 2023 at 14:01 von MatzeTF Zitieren
rtrbt Geschrieben March 16, 2023 at 14:01 Geschrieben March 16, 2023 at 14:01 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 1 Zitieren
Frankstar Geschrieben March 16, 2023 at 15:51 Autor Geschrieben March 16, 2023 at 15:51 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 Zitieren
rtrbt Geschrieben March 17, 2023 at 07:43 Geschrieben March 17, 2023 at 07:43 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. Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.