# go-eCharger - S7 1500 Anbindung/Pingen/Protokoll



## JoGi65 (17 Juli 2021)

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!


----------



## Thomas_v2.1 (17 Juli 2021)

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.


----------



## Blockmove (17 Juli 2021)

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


----------



## JoGi65 (18 Juli 2021)

Thomas_v2.1 schrieb:


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




Blockmove schrieb:


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


----------



## Blockmove (18 Juli 2021)

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


----------



## JoGi65 (18 Juli 2021)

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


----------



## Blockmove (18 Juli 2021)

JoGi65 schrieb:


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


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.


----------



## TheLevel (19 Juli 2021)

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


----------



## Blockmove (19 Juli 2021)

TheLevel schrieb:


> 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


----------



## TheLevel (19 Juli 2021)

Blockmove schrieb:


> Was  hält dich davon ab?
> Ist doch per Modbus verfügbar


Eigentlich nichts - ich hatte, um ehrlich zu sein, noch gar nicht nachgeschaut, was überhaupt alles verfügbar ist. Aber jetzt, wo die Box an ihrem Bestimmungsort hängt, versuche ich mal etwas Zeit dafür zu finden.


----------



## Blockmove (19 Juli 2021)

Es gibt ne ordentliche Modbus-Beschreibung für die Box.


----------



## JoGi65 (6 August 2021)

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.


```
// 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?


----------



## Thomas_v2.1 (6 August 2021)

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.


----------



## JoGi65 (13 August 2021)

Danke Thomas, Schrittkette ist umgesetzt und lauft soweit einmal als Entwurf.



Spoiler





```
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?



Spoiler





```
// 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?


----------



## JoGi65 (23 Oktober 2021)

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:


----------



## JoGi65 (13 Dezember 2022)

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


----------



## Thomas_v2.1 (13 Dezember 2022)

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.


----------



## Blockmove (13 Dezember 2022)

JoGi65 schrieb:


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


----------



## JoGi65 (14 Dezember 2022)

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


----------



## Blockmove (14 Dezember 2022)

JoGi65 schrieb:


> @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)?


----------



## TheLevel (14 Dezember 2022)

Blockmove schrieb:


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


Ja, genau, 6A einphasig habe ich auch als kleinste Stufe. Ich habe auch den "alten" go-e und schalte manuell mit einem Schalter zwischen ein- und drei-phasig um, wobei ich letzteres sehr selten nutze.


----------



## JoGi65 (14 Dezember 2022)

ja, auch die neuehat 6A ein und drei phasig als kleinste Stufe. Aber es gibt schon wieder eine neuere.


----------



## Blockmove (14 Dezember 2022)

JoGi65 schrieb:


> ja, auch die neuehat 6A ein und drei phasig als kleinste Stufe. Aber es gibt schon wieder eine neuere.


Die neue kann - meines Wissens - intern umschalten.
Bei meiner alten müsste ich selbst die Zuleitung umschalten.


----------



## JoGi65 (14 Dezember 2022)

Du hast die V2, ich habe die V3, welche schon die interne Phasenumschaltung hat (schauen beide gleich aus). Jetzt gibt es aber eine ganz neue Version mit neuem Gehäuse.
Register etc. sind gleich, aber ich glaube, sie hatten mit unseren Versionen auf einigen Registern nur max. 100.000 schreib Zyklen.

Ich denke, das ist jetzt alles (auch) über RAM ansprechbar.


----------



## Blockmove (14 Dezember 2022)

JoGi65 schrieb:


> Du hast die V2, ich habe die V3, welche schon die interne Phasenumschaltung hat (schauen beide gleich aus). Jetzt gibt es aber eine ganz neue Version mit neuem Gehäuse.
> Register etc. sind gleich, aber ich glaube, sie hatten mit unseren Versionen auf einigen Registern nur max. 100.000 schreib Zyklen.
> 
> Ich denke, das ist jetzt alles (auch) über RAM ansprechbar.



Beim Zugriff über HTTP-API kam das mit einem Firmware-Update.
Da gibt 2 Parameter für die Einstellung des Stroms. Eines wird gespeichert, das andere ist nur im RAM.
Ich weiß nicht, ob das mittlerweile auch per Modbus geht.


----------



## JoGi65 (14 Dezember 2022)

Blockmove schrieb:


> Ich weiß nicht, ob das mittlerweile auch per Modbus geht.



Ja, mach ich per Modbus und funktioniert einwandfrei.


----------



## JoGi65 (17 Dezember 2022)

Thomas_v2.1 schrieb:


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



*Vielen Dank, Thomas_v2.1!* 
So einfach hat noch nie was neues funktioniert... Ich glaub der Weihnachtsmann hat meine Steuerung getauscht...

Bibliothek "*Libraries_Comm_Controller*" von Siemens downloaden und einfügen - (hab ich bisher nicht gekannt das es sowas gibt)
Baustein "*LHTTP_Get V2.1.0*" reinziehen (siehe Thomas_v2.1, scheinbar sind v2.1 Versionen brauchbar )
Es wird ein Bausteinbezogener DB erstellt.
Baustein mit DB beschalten und Werte eingeben (geht bis auf den letzten Parameter - den hab ich extra erstellt - Frage dann ganz unten)

Funktioniert.

*Frage1:*
Die Modbus Abfrage/Schreiben lauft dauernd mit ca. 30-120ms Durchlauf.
Der LHTTP_Get ist bei 20+ Umschaltversuchen immer durchgekommen, ist aber (noch) nicht in die Modbusschrittkette integriert.
Ist es ok das so zu lassen? (eigene conn_ID)

*Frage2:*
Beim Beschalten des Bausteins mit dem automatisch erstellten DB, hat er den rot umrandeten Teil nicht akzeptiert.
Das Array[*] of Char sollte bei 0 starten (lt. Beschreibung), aber ich kann da statt dem Stern nichts eingeben, und so mit dem Stern drinnen, nimmt es der Baustein nicht an.
Was mache ich da falsch?






Spoiler: Code





```
// LHHTP - Befehl Phasenumschaltung
"LHTTP_Get_DB_Charger1"(execute:="LHTTP_Get_DB_Charger1".execute,
                        hwID:="LHTTP_Get_DB_Charger1".hwID,
                        connID:="LHTTP_Get_DB_Charger1".connID,
                        url:="LHTTP_Get_DB_Charger1".url,
                        queryParams:="LHTTP_Get_DB_Charger1".queryParams,
                        userFields:="LHTTP_Get_DB_Charger1".userFields,
                        tls:="LHTTP_Get_DB_Charger1".tls,
                        keepConnection:="LHTTP_Get_DB_Charger1".keepConnection,
                        timeOut:="LHTTP_Get_DB_Charger1".timeOut,
                        connected=>"LHTTP_Get_DB_Charger1".connected,
                        done=>"LHTTP_Get_DB_Charger1".done,
                        busy=>"LHTTP_Get_DB_Charger1".busy,
                        error=>"LHTTP_Get_DB_Charger1".error,
                        status=>"LHTTP_Get_DB_Charger1".status,
                        diagnostics=>"LHTTP_Get_DB_Charger1".diagnostics,
                        responseCode=>"LHTTP_Get_DB_Charger1".responseCode,
                        length=>"LHTTP_Get_DB_Charger1".length,
                        responseData:="DB_LS_Charger1_COM".Phasen_Status);
```





*Für die Box Besitzer:*
Ich konnte mit den Strommesswerten durch die Modbusabfrage ca. 30+ msec. nicht feststellen, das der Strom vor dem Umschalten runtergeregelt wird. Also besser die Stromreduzierung in den Umschaltzyklus integrieren.
Der Umschaltvorgang dauer ca. 22 sec.


----------



## Oberchefe (18 Dezember 2022)

Da das ein InOut ist,  musst du wahrscheinlich in einem anderen DB das Array mit der gewünschten Größe anlegen und dies dann beim Bausteinaufruf verschalten?


----------



## JoGi65 (18 Dezember 2022)

Ja, so hab ich es auch gemacht. Mich hat es nur gewundert, für was es den Teil im DB dann gibt. 
Ist das nur als Muster drinnen, damit man sich auskennt, bezüglich Datentyp etc.?


----------

