Bug in meinem Modul oder evtl. in EVSE DIN?

keil
Beiträge: 49
Registriert: Di Dez 18, 2018 5:40 am

Bug in meinem Modul oder evtl. in EVSE DIN?

Beitrag von keil »

Hallo zusammen (besonders snaptec und aiole),

ich schreibe gerade an einem Modul für das Abfragen eines Fronius Smart Meters per Modbus RTU (ID = 3).
Das Smart Meter hängt am gleichen Bus wie die EVSE DIN (ID = 1), die gesamte Buslänge sind ca. 30 cm und der Bus ist korrekt terminiert.

Wie in diesem Thread http://openwb.de/forum/viewtopic.php?f= ... 90605#p191 beschrieben, habe ich mir die EVSE DIN durch die Lese-Abfragen des Smart Meters "zerschossen" und konnte sie nur durch ein erneutes Flashen der Firmware wieder zum Leben erwecken.

Nachdem wieder alles so funktioniert hatte wie es sollte, habe ich das Modul für das Smart Meter wieder reaktiviert und siehe da: der Fehler tritt erneut auf.

Je nachdem, welche Register des Smart Meters ich abfrage, geht die EVSE DIN in einen anderen Zustand und ist nicht mehr nutzbar:
- Register 4096/4097 und 4098/4099 (Spannung L1 und L2, die ersten beiden Einträge im Tuple "values") -> kein Problem, alles funktioniert über einen längeren Zeitraum.
- Sobald das Register 4100/4101 (Spannung L3, dritter Eintrag im Tuple "values") hinzukommt -> EVSE DIN blinkt noch normal (grüne LED) aber reagiert nicht mehr, auch der neue EVSE Modbus Test auf der Statusseite schlägt fehl.
- Wenn ich die Register für die Ströme, Leistung und Energie hinzunehme (4102 - 4109, 4116/4117, 4124/4125, die restlichen Einträge im Tuple "values"), dann hört das Blinken der grünen LED auf und die EVSE DIN schaltet das Relais ein.

Besonders der letzte Punkt (also das Freigeben des Schützes durch lesende Abfragen per Modbus) macht mir etwas Bauchschmerzen.

Vom Gefühl her würde ich sagen, dass ich durch lesende Abfragen in bestimmten Registern (hier 4100 und aufwärts) ungewollt im Speicher des PICs herumschreibe. Selbst bei einem unbeabsichtigten Mapping von Registeradressen in bestimmte Bereiche des Speichers kann ich mir das aber nicht wirklich erklären, da ich ja lese, und das auch von einem Gerät mit einer anderen ID.

Kann dazu jemand von Euch etwas sagen?

@aiole: Du hast Doch Kontakt zu dem Entwickler... kannst Du ihn vielleicht dazu mal befragen?

Ich füge die "main.sh" und die eigentliche "readfsm63a3.py" meines Moduls mal unten ein (ein Dateianhang von einfachen *.py, *.sh, *.txt-Dateien funktioniert nicht), in der Hoffnung, dass jemand mal urüberschaut und evtl. noch einen Fehler findet.
Problematisch ist, dass sich das ganze ohne das angeschlossene Smart Meter nicht nachstellen lässt... wenn ich das nämlich vom Bus abziehe (und die Anfragen des Moduls an das Smart Meter somit ins Leere laufen), dann funktioniert EVSE DIN weiterhin (zum Nachstellen des Fehlers werden also die Antworten vom Smart Meter benötigt).


Viele Grüße,
Michael

main.sh

Code: Alles auswählen

#!/bin/bash
. /var/www/html/openWB/openwb.conf

### The following variables need to be added to "openwb.conf":
# fsm63a3modbusllsource=/dev/ttyUSB0
# fsm63a3modbusllid=3
### Furthermore the follwoing value in "openwb.conf" has to be set manually: 
# ladeleistungmodul=fsm63a3modbusll

ramdiskpath="/var/www/html/openWB/ramdisk"

sudo python /var/www/html/openWB/modules/fsm63a3modbusll/readfsm63a3.py $fsm63a3modbusllsource $fsm63a3modbusllid $ramdiskpath
readfsm63a3.py

Code: Alles auswählen

#!/usr/bin/python
import sys
from pymodbus.client.sync import ModbusSerialClient
from pymodbus.payload import BinaryPayloadDecoder
from pymodbus.constants import Endian

# Set debug to "1" to enable debugging messages
debug = 0

# Check the given arguments
if debug == 1:
    print(str(sys.argv))

# Modbus RTU port and id of the Fronius Smart Meter 63A-3
mb_port = str(sys.argv[1])
mb_id = int(sys.argv[2])
# Path to the ramdisk
ramdiskpath = str(sys.argv[3])

# Definition of the values that will be requested
#            +-------------------------------- Internal variable name (also used as ramdisk file name)
#            |           +-------------------- Modbus Address
#            |           |      +------------- Multiplier to calculate the correct unit for openWB
#            |           |      |     +------- Precision (digits after the decimal separator)
#            |           |      |     |    +-- Description
#            |           |      |     |    |
values = (('llv1',      4096,  0.001, 2, 'Voltage AC Phase 1 [0.001 * V]'),
          ('llv2',      4098,  0.001, 2, 'Voltage AC Phase 2 [0.001 * V]'),
          ('llv3',      4100,  0.001, 2, 'Voltage AC Phase 3 [0.001 * V]'),
          ('lla1',      4102,  0.001, 2, 'Current AC Phase 1 [0.001 * A]'),
          ('lla2',      4104,  0.001, 2, 'Current AC Phase 2 [0.001 * A]'),
          ('lla3',      4106,  0.001, 2, 'Current AC Phase 3 [0.001 * A]'),
          ('llaktuell', 4116, 10.0,   0, 'Power Real P Sum [0.01 * kW]'),
          ('llkwh',     4124,  0.01,  2, 'Energy Real WAC Sum Produced [0.01 * kWh]'))
### The following value addresses have to be verified:
#          ('wl1',       4140,  0.001, 2, 'Power Real P Phase 1'),
#          ('wl2',       4142,  0.001, 2, 'Power Real P Phase 2'),
#          ('wl3',       4144,  0.001, 2, 'Power Real P Phase 3'),
#          ('llpf1',     ????,  0.001, 2, 'Power Factor Phase 1'),
#          ('llpf2',     ????,  0.001, 2, 'Power Factor Phase 2'),
#          ('llpf3',     ????,  0.001, 2, 'Power Factor Phase 3'),


client = ModbusSerialClient(method = "rtu", port=mb_port, baudrate=9600,
        stopbits=1, bytesize=8, timeout=1)
#client.connect()

for value in values:
    result = client.read_holding_registers(value[1], 2, unit=mb_id)

    if result.isError():
        if debug == 1:
            print('Could not read register {} ({})'.format(value[1], value[4]))
        decoded_value_str = '0'
    else:    
        decoder = BinaryPayloadDecoder.fromRegisters(result.registers,
                                                     byteorder=Endian.Big,
                                                     wordorder=Endian.Big)
        decoded_value_raw = decoder.decode_32bit_uint()
        decoded_value = decoded_value_raw*value[2]
        decoded_value_str = '{:.{prec}f}'.format(decoded_value, prec=value[3])
        if debug == 1:
            print('{}: {} ({})'.format(value[0], decoded_value_str, value[4]))

    f = open(ramdiskpath + '/' + value[0], 'w')
    f.write(decoded_value_str)
    f.close()

#client.close()
openWB
Site Admin
Beiträge: 7905
Registriert: So Okt 07, 2018 1:50 pm

Re: Bug in meinem Modul oder evtl. in EVSE DIN?

Beitrag von openWB »

Ouch,
ich leite das mal an den Hersteller weiter.

Grundsätzlich empfehle ich Geräte auf mehrere Modbusse zu verteilen. Das erhöht die Zuverlässigkeit extrem und spart einen Haufen Fehler.
Bewährt hat sich je EVSE und Ladeleistungszähler ein Bus.

Den Fronius kannst du auch an deinen Fronius WR anschliessen und darüber auslesen.

Modbus ist theoretisch für multiple Hersteller gemacht.
Das funktioniert aber nicht immer (nicht nur mit der EVSE).
Supportanfragen bitte NICHT per PN stellen.
Hardwareprobleme bitte über die Funktion Debug Daten senden mitteilen oder per Mail an support@openwb.de
keil
Beiträge: 49
Registriert: Di Dez 18, 2018 5:40 am

Re: Bug in meinem Modul oder evtl. in EVSE DIN?

Beitrag von keil »

Danke für die schnelle Rückmeldung!

Ich habe jetzt das Smart Meter an einen zweiten USB<->RS485 Wandler angeschlossen und die Probleme sind wie zu erwarten verschwunden. Klar kostet so ein zweiter Adapter nicht viel, aber es wäre halt schon schön wenn zumindest in der Wallbox alles an einem Bus hängen würde.

Bezüglich Anschluss an einen PV-Wechselrichter: Meine Anlage ist noch nicht installiert, daher habe ich noch keinen Wechselrichter (kommt aber noch), sondern erst mal nur das Smart Meter.


Viele Grüße,
Michael
aiole
Beiträge: 6779
Registriert: Mo Okt 08, 2018 4:51 pm

Re: Bug in meinem Modul oder evtl. in EVSE DIN?

Beitrag von aiole »

Hallo Michael,

wie Du es beschreibst, kenne ich das auch und ich konnte es nur sauber mit snaptecs Empfehlung ( 2x RS485-Adapter) lösen.
Da die FW closed source ist, hat man darauf keinen direkten Einfluss - leider.

Welche FW nutzt Du? Bist Du schon bei der FW11 mit dem R-Mod (ADAC)?
Der Entwickler feilt immer mal mit am Modbus herum.

VG aiole
keil
Beiträge: 49
Registriert: Di Dez 18, 2018 5:40 am

Re: Bug in meinem Modul oder evtl. in EVSE DIN?

Beitrag von keil »

Hallo aiole,
wie Du es beschreibst, kenne ich das auch und ich konnte es nur sauber mit snaptecs Empfehlung (2x RS485-Adapter) lösen.
Heißt das, dass Du ebenfalls Probleme mit der EVSE DIN beobachtet hast, nachdem Du Modbus-Anfragen an andere Geräte gesendet hast?
Welche FW nutzt Du? Bist Du schon bei der FW11 mit dem R-Mod (ADAC)?
Ja, ich nutzte jetzt FW11 und der Widerstand ist eingelötet. Gestern habe ich (nach dem Einbinden des Smart Meters an einen anderen RS485<->USB Wandler) somit das erste Mal laden können. :-)
Dem vorangegangen sind aber etliche Tests mit beiden Geräten am gleichen Bus, und das hieß: immer wieder EVSE DIN aus der WB ausbauen, Firmware wieder draufflashen und erneut einbauen. Das ganze ging solange, bis ich das ganze auf die im ersten Beitrag beschriebenen Register eingrenzen konnte und mir somit relativ sicher bin, dass es an der EVSE DIN liegt, und nicht an meinem Modul (das Abfragen der ersten beiden Spannungen L1 und L2 mit beiden Geräten an einem Bus hatte ja zuverlässig funktioniert).


Viele Grüße,
Michael
aiole
Beiträge: 6779
Registriert: Mo Okt 08, 2018 4:51 pm

Re: Bug in meinem Modul oder evtl. in EVSE DIN?

Beitrag von aiole »

Geräte unterschiedlicher Hersteller auf EINEM RS485 läuft leider öfters nicht.
Ja auch ich hatte FW-Überschreibungen auf den DIN's als 2x EVSE DIN mit 3x SDM630 an EINEM Bus hingen. Das war aber nur manchmal.
Dagegen hat es den Bus meist nach weniger als 60s komplett lahm gelegt. Ich tippe auf timing-Probleme, die aus Hard- und Firmware kommen können.

Man muss dazu sagen, dass Modbus erst 2018 richtig zum Thema wurde. Davor war das nette Spielerei nebenher. Mit openWB wurden die Anforderungen "schärfer".

VG aiole
openWB
Site Admin
Beiträge: 7905
Registriert: So Okt 07, 2018 1:50 pm

Re: Bug in meinem Modul oder evtl. in EVSE DIN?

Beitrag von openWB »

Ich würde dir gerne die Tage eine Testfirmware zusenden, mit der probierst du es dann bitte nochmal ob das Verhalten bestehen bleibt.
Ist das ok?

Grüße
Supportanfragen bitte NICHT per PN stellen.
Hardwareprobleme bitte über die Funktion Debug Daten senden mitteilen oder per Mail an support@openwb.de
keil
Beiträge: 49
Registriert: Di Dez 18, 2018 5:40 am

Re: Bug in meinem Modul oder evtl. in EVSE DIN?

Beitrag von keil »

Hallo snaptec,

meinst Du mich oder aiole?
Falls Du mich meinst: klar, testen tu ich immer gerne...
aiole
Beiträge: 6779
Registriert: Mo Okt 08, 2018 4:51 pm

Re: Bug in meinem Modul oder evtl. in EVSE DIN?

Beitrag von aiole »

Ich denke, dass Du (keil) gemeint warst.
VG aiole
openWB
Site Admin
Beiträge: 7905
Registriert: So Okt 07, 2018 1:50 pm

Re: Bug in meinem Modul oder evtl. in EVSE DIN?

Beitrag von openWB »

Update
Keil hat nun von mir eine FW zum Testen bekommen.

Nun heißt es gespannt warten

Grüße
Supportanfragen bitte NICHT per PN stellen.
Hardwareprobleme bitte über die Funktion Debug Daten senden mitteilen oder per Mail an support@openwb.de
Antworten