go-eCharger - S7 1500 Anbindung/Pingen/Protokoll

JoGi65

Level-2
Beiträge
338
Reaktionspunkte
63
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

go-e Charger ist angekommen und soll ins Energiemanagement des Hauses eingebunden werden.

CPU 1515-2PN - FW 2.9.2, derzeit 3 serielle Modbus TCP Abfragen (MB_CLIENT 5.2) auf eine IP (Wechselrichter/Smartmeter) und TMAIL_C (eigene IP) auf Mailrelais.
go-eCharger - neueste Version (CM-03... sollte Phasenzuschaltung können)
Verfügbare Schnittstellen vom Charger - HTTP API Schnittstelle (MQTT / REST) und Modbus TCP

Fragen:
Kann ich, wenn der Charger mit Modbus TCP angebunden wird, den Client unabhängig zu den anderen 3 Modbus TCP Abfragen laufen lassen, da eigene IP, oder muß der auch in die Reihe mit den anderen 3? Ich werde aus der Doku zur Hilfe vom Baustein und der CPU Doku nicht schlau. Der Durchlauf der 3 Abfragen dauert jetzt schon durchschnittlich knapp eine Sekunde und sollte wenn möglich nicht länger werden.

Gibt es eine Möglichkeit den Charger mit der CPU zu pingen oder so was ähnliches, da das Ding ja nicht immer dran hängt? Wenn ja, was ist die einfachste Möglichkeit, bzw. wie heißt der Baustein? Ich brauche nur die Info ob die IP im Netzwerk vorhanden ist oder nicht. Das kann man ja zwar indirekt mit dem Modbus Baustein auswerten obs eine Antwort gibt, aber vielleicht gibts was unabhängiges oder einfacheres für die Information vorhanden oder nicht?

Den Modbus Baustein kenne ich jetzt schon ein bisschen, muß aber das erste mal auch auf das Gerät schreiben. Ist hier der in der neue Modbus Baustein MB_RED_Client sinnvoller?

Oder ist es überhaupt besser die HTTP API zu verwenden (davon hab ich noch 0 Ahnung). Der Charger kann ja nach einiger Zeit gewechselt werden, aber die Anbindung sollte relativ einfach überarbeitbar sein.

Danke für Euren Input!
 
Am einfachsten dürfte Modbus-TCP sein, gerade bei der 1500er ist das doch ziemlich einfach zu programmieren. Jede Modbus-TCP Verbindung ist dabei unabhängig von anderen, d.h. jede hat eine andere Verbindungsressource. Zumindest würde ich es so programmieren, an Verbindungen mangelt es der CPU ja nicht.

Ich würde auch die Fehlerauswertung direkt in die Modbus-Kommunikation integrieren und da nichts weiteres mehr anhängen. Ping wird mit den normalen FBs auch nicht möglich sein, da ICMP weder TCP noch UDP ist.
 
Jede Modbus-TCP Verbindung ist dabei unabhängig von anderen, d.h. jede hat eine andere Verbindungsressource.

Ich würde auch die Fehlerauswertung direkt in die Modbus-Kommunikation integrieren und da nichts weiteres mehr anhängen. Ping wird mit den normalen FBs auch nicht möglich sein, da ICMP weder TCP noch UDP ist.

Danke für Deinen Leitfaden. Dann werde ich es so machen.


Ich setz mein Energiemanagement mit ioBroker auf einem Raspi um.
Ist entspannter als mit ner SPS.

Danke auch für Deinen Hinweis, und das glaub ich gern.
Aber da der Basiszweck der SPS bei uns das Heizungs-/Warmwasser-/Energiemanagement ist, werd ich wieder viele Stunden programmieren/spielen.
 
Naja wenigstens haben wir mit der go-e eine Wallbox mit allen möglichen Schnittstellen.
Die Einbindung der Wallbox steht auch noch auf meiner ToDo.
Anpassung des Ladestroms an die PV-Anlage und ggf. Laden pausieren.
Mal schauen, ob unser Peugeot e208 da auch mitspielt :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bin auch schon neugierig wie praktikabel das sein wird. Mein Firmenskoda kommt erst im September, also hab ich noch ein bisschen Zeit.
Über die Logik, wie und was die können soll (wenn die Kommunikation mal lauft), bin ich absolut noch nicht schlüssig.

Ich glaub das wird sich erst im Realbetrieb ergeben. Wenn das Auto einen geladenen Akku braucht am nächsten Tag hilft eh nix, aber der Rest ist schon spannend.
Ladung pausieren wenn zB Backrohr und Herd an ist und keine 1380W Überschuß mehr übrig sind? Oder wenn es Tag ist weiterlaufen lassen und kurzen Netzbezug zulassen, oder den kurzen Netzbezug nur in einem bestimmten Zeitfenster zulassen, usw..
Auf Dreiphasig schalten wenn wie lange genug Überschuß, wie schnell wieder zurück... (Ist ja auch jedesmal ein neustart der Ladung).
Oder Energiemenge in welcher Zeit... oder, oder...:rolleyes:
 
Ich bin auch schon neugierig wie praktikabel das sein wird. Mein Firmenskoda kommt erst im September, also hab ich noch ein bisschen Zeit.
Über die Logik, wie und was die können soll (wenn die Kommunikation mal lauft), bin ich absolut noch nicht schlüssig.

Ich glaub das wird sich erst im Realbetrieb ergeben. Wenn das Auto einen geladenen Akku braucht am nächsten Tag hilft eh nix, aber der Rest ist schon spannend.
Ladung pausieren wenn zB Backrohr und Herd an ist und keine 1380W Überschuß mehr übrig sind? Oder wenn es Tag ist weiterlaufen lassen und kurzen Netzbezug zulassen, oder den kurzen Netzbezug nur in einem bestimmten Zeitfenster zulassen, usw..
Auf Dreiphasig schalten wenn wie lange genug Überschuß, wie schnell wieder zurück... (Ist ja auch jedesmal ein neustart der Ladung).
Oder Energiemenge in welcher Zeit... oder, oder...:rolleyes:
Bei den ganzen Strategien muss man immer auch die Anzahl der Ladezyklen im Blick haben.
Ich sehe es recht schön an meinen Senec PV-Speicher. Der unterbricht auch nicht weger jeder Schwankung den Lade- oder Entladezyklus.
Da wird schon mal das Netz "zu Hilfe genommen".
Auch wenn ich bislang bei der ganzen Homeautomation ohne Visu zur Bedienung ausgekommen bin, wird's beim Energiemanagement nicht mehr ohne gehen.
 
An dieses Thema hänge ich mich neugieriger weise auch mal dran - ich habe tatsächlich schon mit dem Gedanken gespielt, ob man nicht von der SPS aus die Helligkeit der LEDs des go-e an Tag und Nacht anpassen könnte....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
An dieses Thema hänge ich mich neugieriger weise auch mal dran - ich habe tatsächlich schon mit dem Gedanken gespielt, ob man nicht von der SPS aus die Helligkeit der LEDs des go-e an Tag und Nacht anpassen könnte....
Was hält dich davon ab?
Ist doch per Modbus verfügbar
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo nochmal,

bei meinen bisherigen Modbus Abfragen für Wechselrichter und Smartmeter, habe ich für verscheidene Registerbereiche eine eigene zweite und dritte unabhängige Modbus Abfrage (komplett eigener Baustein) gemacht.

Da es bei dem Charger schon 5 Verschiedene Bereiche gibt, und ausserdem geschrieben werden muss, wollte ich fragen, ob bzw. wie man hier einzelne Bereiche im Modbus Baustein tauschen kann.
Die Abfrage ob das Teil im Netzwerk ist schaut so aus, und damit werden jetzt einmal nur zum testen auch gleich die ersten 10 Holdingregister von Register 206 startend gelesen.

Code:
// Beim CPU hochfahren und/oder wenn alle Verbindungen aus sind, im Abstand von 1 Sekunden neuen Abfrage Zyklus starten
IF "DB_Modbus_Ladestation".Busy = FALSE AND "DB_Modbus_Ladestation".Done = FALSE AND "DB_Time".Clock.Flanke."1Hz_Impuls" = TRUE // 1 Sekunden Flanke für Start
THEN
    "DB_Modbus_Ladestation".Start := TRUE;
ELSE
    "DB_Modbus_Ladestation".Start := FALSE;
END_IF;

"MB_Ladestation_Charger_Modbus"(REQ:="DB_Modbus_Ladestation".Done OR "DB_Modbus_Ladestation".Start, //Takteingang MB_Client,
                                DISCONNECT:="DB_Modbus_Ladestation".Disconnect,
                                MB_MODE:="DB_Modbus_Ladestation".MB_Mode,
                                MB_DATA_ADDR:="DB_Modbus_Ladestation".MB_Data_Addr,
                                MB_DATA_LEN := "DB_Modbus_Ladestation".MB_Data_Len, //Anzahl der zu lesenden Register
                                DONE => "DB_Modbus_Ladestation".Done,
                                BUSY => "DB_Modbus_Ladestation".Busy,
                                ERROR => "DB_Modbus_Ladestation".Error,
                                STATUS => "DB_Modbus_Ladestation".Status,
                                MB_DATA_PTR := "DB_Modbus_Ladestation".HoldingregisterBasis, //Zeiger auf einen Datenpuffer für die vom Modbus-Server zu empfangenden Daten
                                CONNECT := "DB_Modbus_Ladestation".Connect); //TCON_IP_v4: Abfrage Ziel Einstellung

// Überprüfung, ob die Ladestation auf der vorgegebenen IP erreichbar ist
"IEC_Timer_Ladestation_Erreichbar".TOF(IN:="DB_Modbus_Ladestation".Done,
                                       PT:="DB_Ladestation_Charger".Erreichbar.Erreichbar_Timeout_PT,
                                       Q=>"DB_Ladestation_Charger".Erreichbar.Status,
                                       ET=>"DB_Ladestation_Charger".Erreichbar.Erreichbar_Timeout_ET);

Gibt es eine Möglichkeit zb nur "MB_DATA_ADDR:=" und "MB_DATA_PTR :=" direkt anzusprechen und zu wechseln?
Einfach einzeln aus den Systembausteinen/Programmressourcen reinziehen und neu zuzuweisen läßt Tia nicht zu.
Oder muss jedesmal fast der ganze Baustein "MB_Ladestation_Charger_Modbus" neu konfiguriert werden? Soweit ich versucht habe, kann man Done/Busy/Error/Status zwar weglassen, aber das erscheint mir trotzdem recht aufwendig.
Wenn das wirklich so ist, schaut es für mich ja fast einfacher aus, wieder eigene Bausteine für die verschiedenen Bereiche zu erstellen und nach Bedarf aufzurufen, als Werte in einem Baustein zu tauschen.

Was ist hier der richtige und sinnvollste Weg?
 
Ich mache das immer in einer Schrittkette in der die Parameter gesetzt und Ausgänge des MB_CLIENT beschrieben und ausgewertet werden.
Hinter der Schrittkette habe ich eine einzige Instanz des MB_CLIENT. Das Array an DATA_PTR gestalte ich dann so groß, dass es für alle Aufrufe ausreichend ist.
Dann Adresse setzen und Request setzen, Auswertung von DONE, dann Daten von DATA_PTR in den endgültigen Zielbereich umkopieren und REQ auf false, dann neue Adresse und wieder Request usw.
 
Danke Thomas, Schrittkette ist umgesetzt und lauft soweit einmal als Entwurf.

Code:
REGION Modbus_Lesen_schreiben
    // Beim CPU hochfahren und/oder wenn alle Verbindungen aus sind, im Abstand von 2 Sekunden neuen Abfrage Zyklus starten
    IF "DB_Modbus_Ladestation".Busy = FALSE AND "DB_Modbus_Ladestation".Done = FALSE AND "DB_Time".Clock.Flanke."0,5Hz_Impuls" = TRUE // 2 Sekunden Flanke! für Start
    THEN
        "DB_Modbus_Ladestation".Start := TRUE;
    ELSE
        "DB_Modbus_Ladestation".Start := FALSE;
    END_IF;
    
    // Schritt 1 - schauen ob Charger erreichbar und FW lesen.
    IF "DB_Ladestation_Charger".Schritt = 1 THEN
        
        "MB_Ladestation_Charger_Modbus"(REQ := "DB_Modbus_Ladestation".Done OR "DB_Modbus_Ladestation".Start, //Takteingang MB_Client,
                                        DISCONNECT := "DB_Modbus_Ladestation".Disconnect,
                                        MB_MODE := 0, //lesen
                                        MB_DATA_ADDR := 30106, //FW_Abfrage
                                        MB_DATA_LEN := 2, //Anzahl der zu lesenden Register
                                        DONE => "DB_Modbus_Ladestation".Done, //Das Bit am Ausgangsparameter DONE wird auf "1" gesetzt, sobald der letzte Modbus-Auftrag ohne Fehler ausgeführt wurde
                                        BUSY => "DB_Modbus_Ladestation".Busy, //0: Keine Modbus-Anfrage in Bearbeitung - 1: Modbus-Anfrage wird bearbeitet
                                        ERROR => "DB_Modbus_Ladestation".Error, //0: Kein Fehler - 1: Fehler aufgetreten. Die Fehlerursache wird über den Parameter STATUS angezeigt.
                                        STATUS => "DB_Modbus_Ladestation".Status, //siehe Statusliste in der Hilfe
                                        MB_DATA_PTR := "DB_Modbus_Ladestation".Register_FW, //Zeiger auf einen Datenpuffer für die vom Modbus-Server zu empfangenden Daten
                                        CONNECT := "DB_Modbus_Ladestation".Connect); //TCON_IP_v4: Abfrage Ziel Einstellung
        
        // Wenn das erste Lesen erledigt ist, weiter mit Schritt 2
        IF "DB_Modbus_Ladestation".Done = TRUE THEN
            "DB_Ladestation_Charger".Schritt := 2;
        END_IF;
        
        
   // Schritt 2
   ELSIF "DB_Ladestation_Charger".Schritt = 2 THEN
        
        "MB_Ladestation_Charger_Modbus"(REQ := "DB_Modbus_Ladestation".Done,
                                        DISCONNECT := "DB_Modbus_Ladestation".Disconnect,
                                        MB_MODE := 0,
                                        MB_DATA_ADDR := 30101,
                                        MB_DATA_LEN := 2,
                                        DONE => "DB_Modbus_Ladestation".Done,
                                        BUSY => "DB_Modbus_Ladestation".Busy,
                                        ERROR => "DB_Modbus_Ladestation".Error,
                                        STATUS => "DB_Modbus_Ladestation".Status,
                                        MB_DATA_PTR := "DB_Modbus_Ladestation".Register_Werte,
                                        CONNECT := "DB_Modbus_Ladestation".Connect);
        
        // Wenn Lesen erledigt, weiter mit Schritt 3
        IF "DB_Modbus_Ladestation".Done = TRUE THEN
            "DB_Ladestation_Charger".Schritt := 3;
        END_IF;
        
        
usw.... (zu viele Zeichen)
        
        // Schritt 6 - Strom schreiben   
    ELSIF "DB_Ladestation_Charger".Schritt = 6 THEN
        
        "MB_Ladestation_Charger_Modbus"(REQ := "DB_Modbus_Ladestation".Done, //Takteingang MB_Client,
                                        DISCONNECT := "DB_Modbus_Ladestation".Disconnect,
                                        MB_MODE := 1, //1 schreiben
                                        MB_DATA_ADDR := 40300, //Adresse - Strom (299+1)
                                        MB_DATA_LEN := 1,
                                        DONE => "DB_Modbus_Ladestation".Done,
                                        BUSY => "DB_Modbus_Ladestation".Busy,
                                        ERROR => "DB_Modbus_Ladestation".Error,
                                        STATUS => "DB_Modbus_Ladestation".Status,
                                        MB_DATA_PTR := "DB_Ladestation_Charger".Strom_Vorwahl_Dyn_schreiben,
                                        CONNECT := "DB_Modbus_Ladestation".Connect);
        
        // Wenn schreiben erledigt ist, wieder mit lesen weitermachen
        IF "DB_Modbus_Ladestation".Done = TRUE THEN
            "DB_Ladestation_Charger".Schritt := 2;
        END_IF;
        
    END_IF;
    
END_REGION


// Überprüfung, ob der Charger auf der vorgegebenen IP erreichbar ist - True = erreichbar
REGION Charger_Erreichbar
    
    "IEC_Timer_Ladestation_Erreichbar".TOF(IN := "DB_Modbus_Ladestation".Done,
                                           PT := "DB_Ladestation_Charger".Erreichbar.Erreichbar_Timeout_PT,
                                           Q => "DB_Ladestation_Charger".Erreichbar.Status,
                                           ET => "DB_Ladestation_Charger".Erreichbar.Erreichbar_Timeout_ET);
    
    
    // Wenn Ladestation nicht erreichbar Schrittkette am Anfang starten
    IF "DB_Ladestation_Charger".Erreichbar.Status = FALSE THEN
        "DB_Ladestation_Charger".Schritt := 1;
    END_IF;
END_REGION

Da die Verbindung im Gegensatz zum Wechselrichter doch um einges anders ist (Gerät nicht immer verfügbar, Modbusabfrage kann bei Ausschalten vom Charger mittendrin hängen, usw), haben sich noch ein paar Fragen ergeben.

Passt die Auswertung von Fehler 80A3 so?

Code:
// Fehlerbehandlung Modbus Fehler 80A3 - Abbau TCON
REGION Fehlerbehandlung
    IF "DB_Modbus_Ladestation".Status = 16#80A3 THEN
        "DB_Modbus_Ladestation".Fehler_Disconnect.Fehler := TRUE;
        "DB_Ladestation_Charger".Schritt := 1;
    ELSE
        "DB_Modbus_Ladestation".Fehler_Disconnect.Fehler := FALSE;
    END_IF;
    
    "TDISCON_DB_Modbus_Ladestation"(REQ := "DB_Modbus_Ladestation".Fehler_Disconnect.Fehler,
                                    ID := 4,
                                    DONE => "DB_Modbus_Ladestation".Fehler_Disconnect.Done);
END_REGION

Mir ist passiert, dass bei Veränderungen am Baustein (Laden), während er läuft, die Abfrage mit 7004 stehen bleibt (Verbindung hergestellt und überwacht. Keine Auftragsbearbeitung aktiv.), obwohl sie laufen sollte und sich selbst startet, was dann aber nicht mehr funktioniert.
Behebung war den erstellten Systembaustein unter Programmressourcen mit "Startwerte als Aktualwerte laden" wieder zum laufen zu bringen.
Kann der Fehler so auch im Normalen Betrieb auftreten, bzw. wie geht man da mit der Fehlerbehandlung um?

Und gibt es noch spezielle Fehler, die mir noch nicht aufgefallen sind, die man grundsätzlich abfangen sollte?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

meine Webbedienoberfläche auf der SPS ist fürs Testen fertig (Auto fehlt noch immer), aber leider geht über Modbus die 1/3 Phasen Umschaltung nicht. Das Register wird nicht bekannt gegeben (gefragt hab ich schon). Ich werd zwar noch durchschreiben versuchen, aber die Möglichkeit über die HTTP API Schnittstelle (MQTT / REST) ist bekannt.

Da ich keine Ahnung habe wo ich da suchen anfangen soll die Frage, ist das der PUT Befehl, oder mit wechem Baustein geht man das an?

Einphasige Stromregelung und LED Helligkeitsregelung geht schon, und die Funktionen schauen jetzt so aus, sind aber auf der SPS noch nicht fertig durchprogrammiert:

Goe80.jpg
 
Hallo nochmal,

mein Skoda hat mitlerweile schon mehr als 1300kWh zuhause geladen bekommen, und davon mehr als 90% direkt vom Überschuss der PV Anlage trotz noch immer nicht ganz fertiger Programmierung.
Da wir die PV gerade erweitern, wird die Phasenumschaltung demnächst öfters gebraucht werden. Mit den Schützen im Schaltschrank geht es zwar bei meinen Versuchen, ist aber nicht optimal. go-e weigert sich nach wie vor das Modbus Register bekannt zu geben oder eines zu schalten. Keine Ahnung warum.


Bitte darum um Hilfe, bei welchen Befehlen ich mich einlesen muss (1515 mit scl), um genau diese einfache Anweisung bei Bedarf schicken zu können:

http://192.168.0.99/api/set?psm=2 // drei Phasen
http://192.168.0.99/api/set?psm=1 // eine Phase
 
Zuletzt bearbeitet:
Von Siemens gibt es eine Bibliothek mit HTTP-Funktionsbausteinen (LHTTP), mit denen du einen Get-Request mit den entsprechenden Parametern absetzen kannst. Ich habe die selber noch nicht getestet, aber das sollte damit möglich sein.

Du kannst es auch zu mit einer eigenen TCP-Verbindung auf Port 80 machen, und dann den gesamten HTTP-Request z.B. als Byte-Array hinterlegen und dann absenden (ggv. einmal im Browser mit Wireshark mitschneiden und dann alles kopieren). Und je nach dem an der einen Stelle entweder eine 1 oder 2 einsetzen. Aber unter Verwendung der LHTTP bist du flexibler unterwegs, ich würde damit beginnen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bitte darum um Hilfe, bei welchen Befehlen ich mich einlesen muss (1515 mit scl), um genau diese einfache Anweisung bei Bedarf schicken zu können:

http://192.168.0.99/api/set?psm=2 // drei Phasen
http://192.168.0.99/api/set?psm=1 // eine Phase

Funktioniert die Umsachaltung nach dem Ladestart oder muß man für die Umschaltung den Ladevorgang stoppen?
Ich hab noch die alte Hardwareversion und da gibt es die Umschaltung noch nicht.
 
@Thomas_v2.1 - Danke, dann schau ich mir das zu Weihnachten an.

@Blockmove - ja, geht während dem Laden. Alle notwendigen Schritte sind hinterlegt. Strom reduzieren hab ich nicht kontrolliert, Stopp, Umschalten, Start. Geht recht flott, ohne das der charger durch Abschalten aus dem Netz ist.
 
@Thomas_v2.1 - Danke, dann schau ich mir das zu Weihnachten an.

@Blockmove - ja, geht während dem Laden. Alle notwendigen Schritte sind hinterlegt. Strom reduzieren hab ich nicht kontrolliert, Stopp, Umschalten, Start. Geht recht flott, ohne das der charger durch Abschalten aus dem Netz ist.

Mal schauen, vielleicht investier ich dann doch noch in ne neue Wallbox :)
Niedrigste Ladeleistung 1 phasig rund 1,3kW (230V 6A)?
 
Zurück
Oben