Customizing the Siemens LOGO! 8.2 Web Server for I/O Control

David Krause12 min read
HMI / SCADASiemensTutorial / How-to
Licensed PE Working through this on a live machine? A Maine-licensed engineer can take it from here — included with IMD hardware, by the hour for everything else. Book an engineer

Overview

The Siemens LOGO! 8 family of logic modules ships with an integrated web server that exposes monitoring variables, status pages, and basic diagnostic information over HTTP. While earlier LOGO! 8 generations (FS01 through FS06) ship with a fixed, read-only monitoring web interface, the LOGO! 8.2 generation extends the API to allow user-defined HTML, CSS, and JavaScript pages that can read and write process variables. This capability turns the LOGO! 8.2 into a small but capable remote-I/O gateway: a phone, tablet, or PC connected to the same Wi-Fi router can toggle outputs, read inputs, and visualize process state through a purpose-built portal.

This reference walks through the hardware identification steps required to confirm a unit supports custom pages, the firmware prerequisites, the directory layout LOGO! 8.2 expects, the S7 variable mapping used to read inputs and drive outputs, and a troubleshooting matrix covering the most common commissioning failures. It is written for engineers with web-development experience who need to integrate LOGO! I/O into an existing portal or operator interface.

Hardware generation is non-negotiable. LOGO! 8.0 (order numbers ending 0BA0, FS01-FS03) and LOGO! 8.1 (order numbers ending 0BA1, FS04-FS06) do not support custom web pages. Customization is exclusive to the 8.2 generation (order numbers ending 0BA2, FS07 and above). If the wrong hardware is installed, the only remediation is replacement of the base module.

Hardware Identification: 8.0 / 8.1 vs 8.2

Siemens encodes the hardware generation in the order number (Artikelnummer / MLFB) of the LOGO! base module. The relevant suffixes and functional state of the integrated web server are summarized below.

LOGO! 8 generation matrix and web server capabilities
Generation Firmware State (FS) Order Number Suffix Integrated Web Server Custom User Pages
LOGO! 8.0 FS01 - FS03 ...0BA0 (series 0) Monitoring only No
LOGO! 8.1 FS04 - FS06 ...0BA1 (series 1) Monitoring only No
LOGO! 8.2 FS07 and above ...0BA2 (series 2) Monitoring + user pages Yes

To read the order number and firmware state on a powered unit:

  1. On the LOGO! display, press ESC until the main menu appears.
  2. Navigate to Diagnostics > Product Information (or scroll to the system information page).
  3. Record the Order Number (printed on the front of the module, e.g. 6ED1052-1MD08-0BA2) and the Firmware Version.
  4. Cross-check the suffix: 0BA0 = 8.0, 0BA1 = 8.1, 0BA2 = 8.2. The fifth digit from the right of the suffix also encodes the FS level.

For a complete catalog of order numbers and the corresponding manual packages, see the Siemens LOGO! 8 system manual and the LOGO! product support page.

Prerequisites

Before authoring pages, confirm the following items are in place. Skipping any of these steps is the leading cause of "the page never loads" complaints during commissioning.

Prerequisites checklist for LOGO! 8.2 custom web server
# Item Requirement Verification
1 Base module LOGO! 8.2 (order number suffix 0BA2) Read from front label
2 Firmware FS07 or later (8.2 baseline) Diagnostics > Product Info
3 LOGO! Soft Comfort Version 8.2 or later for programming Help > About
4 SD card (optional) Up to 32 GB, FAT32, for user page storage Format with PC, insert before power-up
5 Ethernet LOGO! connected to Wi-Fi router or LAN Ping the configured IP
6 IP configuration Static IP recommended for portal access LOGO! menu > Network
7 Web technologies HTML5, CSS, JavaScript authoring tools Local browser test rig
SD card formatting matters. The LOGO! 8.2 reads user pages from an SD card inserted at power-up. Cards larger than 32 GB or formatted as exFAT / NTFS are silently ignored. Always format with FAT32 and a single primary partition.

Understanding the LOGO! 8.2 Web Server Architecture

The LOGO! 8.2 web server is a small embedded HTTP daemon listening on TCP port 80 (or 443 when TLS is enabled on supported revisions). It serves three classes of content:

  1. System pages — the read-only monitoring pages (Inputs, Outputs, Flags, Analog values) shipped with the firmware. These are not modifiable.
  2. User pages — HTML/CSS/JavaScript files placed in the /user directory of the SD card root. These are the customizable surface.
  3. API endpoints — JSON-style S7 variable access URLs used by user pages to read inputs and write outputs. The client-side JavaScript calls these endpoints with simple HTTP GET or POST requests.

Authentication is enforced through a username/password pair configured under LOGO! menu > Network > Web Server Access. Without credentials, the user pages and the variable endpoints both return HTTP 401. This is the same authentication layer that protects the integrated monitoring pages, so a single user/password pair governs both surfaces.

For background on how HTTP request/response cycles work between a browser and an embedded server, refer to the MDN Web Docs overview of web servers. If the project requires a fully custom HTTP daemon (for example, a C++ standalone server with GET/HEAD/POST/PUT/DELETE support) running on a separate host, the alouane04/Custom-HTTP-Server reference implementation demonstrates the protocol mechanics, but it is not a substitute for the LOGO! built-in server when targeting the LOGO! itself.

Step-by-Step: Building Custom Web Pages

Step 1 — Configure the LOGO! IP and web server access

  1. On the LOGO! display, navigate to Network Settings.
  2. Set IP Address to a static address on the local subnet (for example 192.168.1.50 with subnet 255.255.255.0).
  3. Enable the Web Server and define an Admin User and password.
  4. Confirm the gateway IP matches the Wi-Fi router so the portal is reachable from any LAN client.

Step 2 — Prepare the SD card layout

Format a microSD card (4–32 GB) as FAT32. Create the following directory tree at the card root:


SD_ROOT/
  user/
    index.html
    css/
      style.css
    js/
      app.js
    img/
      logo.png

The user/ directory name is mandatory; the web server maps it to the root of the user-page namespace, so http://<LOGO_IP>/user/index.html resolves to user/index.html on the card. Subdirectories (css, js, img) are arbitrary.

Step 3 — Author the entry page

Create a minimal index.html at user/index.html:


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>LOGO! 8.2 I/O Portal</title>
  <link rel="stylesheet" href="css/style.css">
</head>
<body>
  <h1>LOGO! I/O Control</h1>
  <div class="row">
    <button id="q1-on">Q1 ON</button>
    <button id="q1-off" class="danger">Q1 OFF</button>
    <span class="status">I1: <span id="i1">?</span></span>
  </div>
  <script src="js/app.js"></script>
</body>
</html>

Step 4 — Wire the client-side JavaScript to the LOGO! API

LOGO! 8.2 exposes variable access through HTTP endpoints. Reading uses GET, writing uses POST with a JSON body. The base URL convention is /s7/r/<varname> for reads and /s7/w/<varname> for writes. Variable names are the symbolic names defined in the LOGO! Soft Comfort program, prefixed with the data block (for example DB1.Q1, DB1.I1, DB1.MW10).


// app.js — minimal read/write driver
const BASE = location.origin; // matches LOGO! IP
const USER = 'admin';
const PASS = 'yourPassword';
const HDR  = 'Authorization: Basic ' + btoa(USER + ':' + PASS);

async function readVar(name) {
  const r = await fetch(`${BASE}/s7/r/${name}`, { headers: { HDR } });
  if (!r.ok) throw new Error(`read ${name} failed: ${r.status}`);
  return (await r.json()).value;
}

async function writeVar(name, value) {
  const r = await fetch(`${BASE}/s7/w/${name}`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json', HDR },
    body: JSON.stringify({ value })
  });
  if (!r.ok) throw new Error(`write ${name} failed: ${r.status}`);
  return r.json();
}

document.getElementById('q1-on').onclick  = () => writeVar('DB1.Q1', 1);
document.getElementById('q1-off').onclick = () => writeVar('DB1.Q1', 0);

setInterval(async () => {
  try { document.getElementById('i1').textContent = await readVar('DB1.I1'); }
  catch (e) { console.warn(e); }
}, 1000);
Polling interval: the LOGO! 8.2 web server is sized for light operator-HMI use, not for control loops. Keep read polls at 1000 ms or slower. Continuous sub-100 ms polling will starve the S7 communication buffer and may delay the standard monitoring pages as well.

Step 5 — Insert the SD card and reboot

  1. Power down the LOGO! 8.2.
  2. Insert the prepared SD card.
  3. Power up. The LOGO! scans /user during boot; if the structure is valid, the new pages are available immediately.

Step 6 — Test from a browser

  1. Connect the PC to the same Wi-Fi router or LAN as the LOGO!.
  2. Browse to http://192.168.1.50/user/ (use the configured IP).
  3. Authenticate with the admin credentials when prompted.
  4. Click the buttons and confirm the corresponding output relay clicks; the input indicator should update every second.

Variable Mapping and S7 Communication

LOGO! variables map onto the standard S7 addressing scheme used by Siemens PLCs. The web server in 8.2 reads and writes through this same address space, so any symbolic name visible in the LOGO! Soft Comfort variable table is reachable from a custom page.

Common LOGO! address references and their typical use
Address Type Width Typical Use
I1 – I24 Digital input 1 bit Push buttons, sensors
AI1 – AI8 Analog input 16 bits Temperature, pressure transducers
Q1 – Q16 Digital output 1 bit Relay coils, contactors
AQ1 – AQ2 Analog output 16 bits Variable-speed drives, proportional valves
M1 – M27 Flag (marker) 1 bit Internal status, latches
VW0 – VW850 Variable word 16 bits Setpoints, counters, timers
VB0 – VB1700 Variable byte 8 bits Compacted data, ASCII strings

For inputs and outputs, the symbolic name in the API matches the LOGO! program variable (e.g. I1 in the program becomes DB1.I1 in the web API, where DB1 is the LOGO! data block). For markers and the variable word/byte area, the symbolic name must be the named variable from the Soft Comfort project — bare numeric references (VW10) are valid only if the project exposes them by that name.

The complete data type and address conventions are documented in the LOGO! 8 system manual (entry ID 109741041) and the LOGO! Soft Comfort online help (entry ID 109973506).

Security Considerations

Operating a control surface over plain HTTP on a shared LAN introduces several risks that must be addressed before the portal is exposed beyond a development bench.

  1. Change the default password. The factory user/password is well-known; it must be replaced with a strong secret.
  2. Restrict the user to a non-admin role if the firmware revision supports role-based access. Operators should not be able to change LOGO! configuration from the portal.
  3. Do not expose the LOGO! web server to the public internet without an authenticated reverse proxy (nginx, Caddy, or similar) terminating TLS, plus IP allow-listing or VPN. Direct exposure invites credential brute-force and unauthorized write access to outputs.
  4. Use HTTPS where supported. Some 8.2 firmware revisions permit TLS on the integrated server; enable it whenever possible to prevent credential and process data leakage on the LAN.
  5. Audit outputs before connecting loads. A custom page that writes Q1 unconditionally will energize whatever is wired to that terminal. Validate the write logic in a no-load bench setup before deploying to motors, heaters, or valves.
Safety interlocks stay in the LOGO! program. The web portal is a control surface, not the control logic. Hard-wired E-stops and software interlocks must remain in the LOGO! ladder/FBD program. Never rely on a browser page to enforce a safety boundary.

Verification and Testing

After deploying the SD card, run the following verification sequence to confirm full end-to-end functionality. Record results for each step in the commissioning log.

Commissioning verification matrix
Test Action Expected Result Pass Criteria
Page load Browse to /user/ from a phone on the same Wi-Fi HTML loads, CSS applied, no console errors Page renders < 2 s
Authentication Clear cookies, reload page Browser prompts for credentials, then loads 401 with bad creds, 200 with good
Read digital input Toggle a physical input wired to I1 Indicator on page flips within 1 cycle Polling latency ≤ 1.5 s
Write digital output Click Q1 ON Output relay energizes, audible click, LED on Write returns 200, output state changes
Write analog value POST a value to AQ1 Analog output tracks the new value Measured value within 1%
Reboot persistence Power-cycle the LOGO! User pages still served from SD card Pages reload without manual intervention
Bad credentials Enter wrong password Server returns 401, page does not load No data exposed

Troubleshooting Matrix

Common LOGO! 8.2 custom-web-server faults and remedies
Symptom Likely Root Cause Remediation
404 Not Found on /user/ Hardware is 8.0 or 8.1 Replace base module with 8.2 (suffix 0BA2)
404 on a specific file File path is case-sensitive on the SD card Match directory and file names exactly to the references in HTML
Page loads but buttons do nothing Wrong variable name (e.g. Q1 instead of DB1.Q1) Use the symbolic name with DB prefix as shown in the Soft Comfort variable table
401 Unauthorized from fetch() Credentials not sent or wrong base64 encoding Confirm btoa(user + ':' + pass) produces the expected string
Inputs always show 0 Polling interval too fast; server queue saturates Reduce polling to 1 s; batch reads in a single endpoint if available
Outputs do not energize LOGO! program does not have a writable coil for that output (e.g. driven by a one-shot block) Edit the Ladder/FBD so the output address is free to be set by the API
SD card not detected at boot Card formatted as exFAT, NTFS, or larger than 32 GB Reformat as FAT32 with a single primary partition, ≤ 32 GB
Browser caches stale page No cache-busting on HTML assets Add a query string to script/CSS includes (e.g. app.js?v=2)
Polling errors only on phone Phone on guest network or VLAN different from LOGO! Connect phone to the same SSID; verify router is not AP-isolating clients
Write returns 200 but output does not change Output is being reset every LOGO! scan by a higher-priority block Use markers as API targets and let the LOGO! program map markers to outputs in the FBD

Frequently Asked Questions

Can I add custom web pages to a LOGO! 8.0 or 8.1 base module?

No. The 8.0 (FS01-FS03) and 8.1 (FS04-FS06) generations ship with a fixed monitoring web server only. Custom user pages are supported exclusively on the LOGO! 8.2 generation (order numbers ending 0BA2, FS07 and above). Older units cannot be firmware-upgraded to 8.2 because the underlying web server is a hardware/firmware-coupled feature.

How do I tell whether my LOGO! is 8.0, 8.1, or 8.2 without opening the cabinet?

Read the order number (MLFB) on the front label. The suffix determines the generation: 0BA0 = 8.0, 0BA1 = 8.1, 0BA2 = 8.2. For example, 6ED1052-1MD08-0BA2 is an 8.2 unit. The same value is also reported under Diagnostics > Product Information on the LOGO! display.

Do custom pages survive a power cycle?

Yes, provided the SD card remains inserted. The LOGO! 8.2 reads the /user directory on every boot. If the card is removed or corrupted, the built-in monitoring pages continue to work but custom pages are unavailable until the card is restored.

What polling rate is safe for reading inputs from a custom page?

Keep the read interval at 1 second or slower. The LOGO! 8.2 web server is optimized for operator-HMI traffic, not for high-rate control. Sub-200 ms polling can saturate the S7 communication buffer and delay the standard monitoring pages, so a 1000 ms cadence is the recommended starting point.

Can I expose the LOGO! web server to the public internet?

Direct exposure is not recommended. Place an authenticated reverse proxy (nginx, Caddy, or similar) in front of the LOGO!, terminate TLS at the proxy, and use IP allow-listing or a VPN to restrict access. Enable HTTPS on the LOGO! itself if the firmware revision supports it, and always replace the default admin password before deployment.

Back to blog