/* ============================================================ ESP32-WROOM Siemens LOGO! 8 FS4 ============================================================ LOGO! IP-Adresse: 192.168.0.99 LOGO! Variable: VW0 S7-Adresse: DB1.DBW0 Kommunikation: S7 / ISO-on-TCP TCP Port 102 Rack 0 Slot 2 ESP32: Asynchroner Webserver Automatische LOGO!-Wiederverbindung VW0 wird alle 500 ms gelesen ============================================================ BENÖTIGTE LIBRARIES ============================================================ Settimino AsyncTCP ESPAsyncWebServer ============================================================ */ #include #include #include #include #include #include // ============================================================ // WLAN // ============================================================ const char* WIFI_SSID = "xxxxxx"; const char* WIFI_PASSWORD = "xxxxxx"; // ============================================================ // LOGO! 8 FS4 // ============================================================ IPAddress LOGO_IP( 192, 168, 0, 99 ); // ============================================================ // LOGO! V-MEMORY // // Die V-Memory der LOGO! wird über DB1 angesprochen. // ============================================================ const uint16_t LOGO_DB = 1; // VW0 = Word ab Byte 0 const uint16_t VW0_ADDRESS = 0; // VW = 2 Bytes const uint16_t VW0_LENGTH = 2; // ============================================================ // KOMMUNIKATIONSZEITEN // ============================================================ // LOGO! alle 500 ms lesen const unsigned long READ_INTERVAL = 500; // Nach 3 Sekunden erneut verbinden const unsigned long RECONNECT_INTERVAL = 3000; // ============================================================ // S7 CLIENT // ============================================================ S7Client Client; // ============================================================ // ASYNCHRONER WEBSERVER // ============================================================ AsyncWebServer server(80); // ============================================================ // GLOBALE VARIABLEN // ============================================================ // VW0 als 16-Bit Integer int16_t VW0_Value = 0; // Verbindungsstatus bool LogoConnected = false; // Timer unsigned long LastRead = 0; unsigned long LastReconnect = 0; // ============================================================ // WEBSEITE // ============================================================ const char INDEX_HTML[] PROGMEM = R"rawliteral( LOGO! 8 FS4

Siemens LOGO! 8 FS4

VW0   /   DB1.DBW0
--
LOGO! wird gesucht ...
ESP32-WROOM
S7 / TCP 102
)rawliteral"; // ============================================================ // LOGO! VERBINDEN // ============================================================ bool ConnectLogo() { // Bereits verbunden? if (Client.Connected) { LogoConnected = true; return true; } Serial.println(); Serial.println( "----------------------------------------" ); Serial.println( "Verbinde mit Siemens LOGO! 8 FS4" ); Serial.print( "IP: " ); Serial.println( LOGO_IP ); /* ------------------------------------------------------------ LOGO! 8 Verbindung Rack = 0 Slot = 2 Settimino verwendet hier: ConnectTo(IP, Rack, Slot) ------------------------------------------------------------ */ int Result = Client.ConnectTo( LOGO_IP, 0, 2 ); if (Result == 0) { Serial.println( "LOGO! Verbindung erfolgreich." ); Serial.println( "Rack: 0" ); Serial.println( "Slot: 2" ); Serial.println( "Port: 102" ); LogoConnected = true; return true; } Serial.print( "LOGO! Verbindung FEHLER." ); Serial.print( " Fehlercode: " ); Serial.println( Result ); LogoConnected = false; return false; } // ============================================================ // VW0 LESEN // ============================================================ bool ReadVW0() { // Keine Verbindung if (!Client.Connected) { LogoConnected = false; return false; } // -------------------------------------------------------- // 2 Bytes für VW0 // -------------------------------------------------------- byte Buffer[VW0_LENGTH]; // -------------------------------------------------------- // DB1.DBW0 lesen // -------------------------------------------------------- int Result = Client.ReadArea( S7AreaDB, LOGO_DB, VW0_ADDRESS, VW0_LENGTH, Buffer ); // -------------------------------------------------------- // Fehler // -------------------------------------------------------- if (Result != 0) { Serial.print( "Fehler beim Lesen von VW0: " ); Serial.println( Result ); Client.Disconnect(); LogoConnected = false; return false; } // -------------------------------------------------------- // S7 / LOGO! verwendet Big Endian // // Buffer[0] = High Byte // Buffer[1] = Low Byte // -------------------------------------------------------- VW0_Value = (int16_t) ( ((uint16_t)Buffer[0] << 8) | Buffer[1] ); // -------------------------------------------------------- // Diagnose // -------------------------------------------------------- Serial.print( "VW0 = " ); Serial.print( VW0_Value ); Serial.print( " HEX = 0x" ); if (Buffer[0] < 0x10) Serial.print("0"); Serial.print( Buffer[0], HEX ); if (Buffer[1] < 0x10) Serial.print("0"); Serial.println( Buffer[1], HEX ); return true; } // ============================================================ // SETUP // ============================================================ void setup() { // -------------------------------------------------------- // Serieller Monitor // -------------------------------------------------------- Serial.begin( 115200 ); delay(500); Serial.println(); Serial.println(); Serial.println( "==========================================" ); Serial.println( " ESP32-WROOM" ); Serial.println( " Siemens LOGO! 8 FS4" ); Serial.println( " VW0 Webserver" ); Serial.println( "==========================================" ); // ======================================================== // WLAN // ======================================================== WiFi.mode( WIFI_STA ); WiFi.begin( WIFI_SSID, WIFI_PASSWORD ); Serial.print( "Verbinde mit WLAN" ); while ( WiFi.status() != WL_CONNECTED ) { delay(500); Serial.print("."); } Serial.println(); Serial.println( "WLAN verbunden." ); Serial.print( "ESP32 IP-Adresse: " ); Serial.println( WiFi.localIP() ); // ======================================================== // S7 // ======================================================== Client.SetConnectionType( S7_Basic ); // ======================================================== // WEBSEITE // ======================================================== server.on( "/", HTTP_GET, [](AsyncWebServerRequest *request) { request->send_P( 200, "text/html", INDEX_HTML ); } ); // ======================================================== // JSON API // ======================================================== server.on( "/value", HTTP_GET, [](AsyncWebServerRequest *request) { String JSON = "{"; JSON += "\"value\":"; JSON += String(VW0_Value); JSON += ",\"connected\":"; if (LogoConnected) { JSON += "true"; } else { JSON += "false"; } JSON += "}"; request->send( 200, "application/json", JSON ); } ); // ======================================================== // 404 // ======================================================== server.onNotFound( [](AsyncWebServerRequest *request) { request->send( 404, "text/plain", "404 - Seite nicht gefunden" ); } ); // ======================================================== // WEBSERVER START // ======================================================== server.begin(); Serial.println( "Webserver gestartet." ); Serial.print( "Webseite: http://" ); Serial.println( WiFi.localIP() ); Serial.println( "==========================================" ); } // ============================================================ // LOOP // ============================================================ void loop() { unsigned long Now = millis(); // ======================================================== // LOGO! VERBINDUNG // ======================================================== if (!Client.Connected) { LogoConnected = false; if ( Now - LastReconnect >= RECONNECT_INTERVAL ) { LastReconnect = Now; ConnectLogo(); } } // ======================================================== // VW0 LESEN // ======================================================== if ( Client.Connected && Now - LastRead >= READ_INTERVAL ) { LastRead = Now; ReadVW0(); } /* ------------------------------------------------------------ KEIN delay()! Der Webserver arbeitet asynchron. ------------------------------------------------------------ */ }