Frankstar Posted March 16, 2023 at 12:22 PM Share Posted March 16, 2023 at 12:22 PM (edited) 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 March 16, 2023 at 12:23 PM by Frankstar typos Quote Link to comment Share on other sites More sharing options...
MatzeTF Posted March 16, 2023 at 01:48 PM Share Posted March 16, 2023 at 01:48 PM (edited) 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 March 16, 2023 at 02:01 PM by MatzeTF Quote Link to comment Share on other sites More sharing options...
rtrbt Posted March 16, 2023 at 02:01 PM Share Posted March 16, 2023 at 02:01 PM 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 Quote Link to comment Share on other sites More sharing options...
Frankstar Posted March 16, 2023 at 03:51 PM Author Share Posted March 16, 2023 at 03:51 PM 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 Quote Link to comment Share on other sites More sharing options...
rtrbt Posted March 17, 2023 at 07:43 AM Share Posted March 17, 2023 at 07:43 AM 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. Quote Link to comment Share on other sites More sharing options...
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.