Jump to content
View in the app

A better way to browse. Learn more.

Tinkerunity

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Geschrieben

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

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
  • Autor

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...

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.