SIMATIC IOT2040 Ethernet Troubleshooting: Fix Ping Timeout on eth0 (X1P1)
The SIMATIC IOT2040 is a 32-bit Intel Quark-based industrial gateway designed for edge data acquisition, MQTT bridging, and Modbus/OPC UA aggregation on the shop floor. Despite its rugged packaging, the first commissioning step almost always fails for the same reason: an unanswered ping to the default address 192.168.200.1. This article consolidates the field-verified procedure for restoring link on the X1P1 (eth0) port, isolating the cable versus shield root cause, and validating the IP stack on the Yocto Linux image shipped with the IOT2040.
1. Problem Description
Symptom report from the field:
- Host PC static IP set to
192.168.200.99 / 255.255.255.0on the wired Ethernet adapter. - Target device: SIMATIC IOT2040 at the Siemens factory-default address
192.168.200.1on X1P1 (eth0). -
ping 192.168.200.1 -tfrom Windows Command Prompt returns "Request timed out" or "Destination host unreachable" continuously. - Microsoft Defender Firewall (and any third-party endpoint protection) disabled, but link still fails.
- Substitution with a known-good CAT5e/CAT6 patch cable yields identical behavior.
- Both green (link/activity) and yellow (100 Mb/s) LEDs on the IOT2040 RJ45 are illuminated, indicating PHY-layer autonegotiation completed and a physical link is present.
- The same PC, with the same static IP, can ping and SSH into a SIMATIC IOT-Trainer 2000 housing an IOT2020 — which proves the PC adapter and cable plant are functional.
This is a classic Layer-3 reachable-but-Layer-2-misconfigured symptom on the IOT2000 platform. The link LEDs are deceiving; they confirm the cable is good, not that the CPU has finished bringing up the IP stack.
2. Hardware Identification: IOT2040 Ports, LEDs, and Variants
Before chasing a software fix, identify the exact SKU. The IOT2040 and the IOT-Trainer 2000 look nearly identical but are not pin- or firmware-compatible in every respect.
| Feature | SIMATIC IOT2040 (6ES7647-0AA00-0YA2) | IOT-Trainer 2000 (with IOT2020) |
|---|---|---|
| CPU | Intel Quark X1020, 400 MHz | Intel Quark X1020, 400 MHz |
| RAM / Flash | 1 GB DDR3 / 8 GB onboard | 1 GB DDR3 / 4–8 GB SD card |
| Ethernet ports | 2x 10/100BASE-TX, RJ45: X1P1 (eth0), X1P2 (eth1) | 2x 10/100BASE-TX, RJ45 |
| Arduino shield header | Yes (bottom side, 5 V / 3.3 V selectable) | Yes |
| Default IP eth0 | 192.168.200.1 / 24 | 192.168.200.1 / 24 |
| Default IP eth1 | DHCP client | DHCP client |
| Default credentials | root / (no password on stock Yocto) | root / (varies by image) |
| Link LED (green) | Solid = link, blink = traffic | Solid = link, blink = traffic |
| Speed LED (yellow) | On = 100 Mb/s, off = 10 Mb/s | On = 100 Mb/s, off = 10 Mb/s |
The yellow LED is the only visual indicator of negotiated speed. If it remains off, the PHY has fallen back to 10 Mb/s — almost always a cable integrity or pin-out problem, not a configuration problem.
3. Default Network Configuration of the IOT2040
The IOT2040 ships with a Siemens-built Yocto Linux image (later replaced by the SIMATIC IOT2050 generation running the Example Image based on BalenaOS/Yocto Kirkstone). On the legacy IOT2040, the network configuration is provided by systemd-networkd and is contained in:
/etc/systemd/network/eth0.network
/etc/systemd/network/eth1.network
Default eth0.network content on the stock image:
[Match]
Name=eth0
[Network]
Address=192.168.200.1/24
ConfigureWithoutCarrier=yes
IPv4AcceptRA=no
LinkLocalAddressing=no
Default eth1.network:
[Match]
Name=eth1
[Network]
DHCP=yes
IPv6AcceptRA=no
If the SD card image is rebuilt, the 192.168.200.1 static address is hard-coded by the meta-iot2000 layer. Changing it requires either re-flashing or modifying the network file from the serial console (see Section 6).
4. Root Cause Analysis: Why the Ping Times Out
Three independent root causes are observed in the field, in order of frequency:
4.1 ARP/Interface Not Bound (Most Common on Prototype Hardware)
Early engineering samples and MindConnect IOT2040 variants do not always bring eth0 up by default. The Quark X1020 internal MAC is bound only after the iot2000setup first-boot script completes. If the user powers the device for the first time without an SD card present, the device boots from onboard flash but the network service is gated on the user acknowledging the EULA via the local serial console. Until that happens, 192.168.200.1 is not bound and the kernel drops the ICMP echo request silently.
Verification: connect via the X2 micro-USB serial console (115200 8N1) and check ip addr show eth0. The interface will be DOWN with NO-CARRIER in the output if the setup is incomplete.
4.2 Shield Required for Reliable PHY Bring-Up
The IOT2040 hardware reference design ties the PHY reset and reference clock lines through the Arduino shield edge connector on certain revisions. If no shield is mounted, the link LEDs illuminate (because the PHY has its own power rail), but the MAC-side GMII handshake is not released by the firmware, leaving the Linux eth0 interface in NO-CARRIER state. This is the exact symptom the source thread documents: the user confirmed that mounting the IOT2000 Input/Output Shield (6ES7647-0KA01-0AA2) restored the connection immediately.
ip link on the device shows state DOWN, assume the shield is required for that hardware revision. Order the 6ES7647-0KA01-0AA2 from Siemens (available in stock at major distributors) and re-test.4.3 Cable Type: Straight-Through vs Crossover
The Intel Quark X1020 internal PHY does not implement Auto-MDIX on the IOT2040 reference design. Modern PC NICs do implement Auto-MDIX, but a straight-through patch cable connecting two MDI-only devices fails to establish the TX/RX pairs correctly even though the link LEDs may still light at 10 Mb/s. The resolution in the source thread used a crossover cable (TIA-568-A on one end, TIA-568-B on the other). On a managed switch or modern laptop, Auto-MDIX eliminates the requirement; on a direct PC-to-IOT2040 link, the crossover pinout is the deterministic fix.
| PC NIC → IOT2040 | Recommended Cable | Outcome |
|---|---|---|
| PC with Auto-MDIX → IOT2040 | Straight-through (TIA-568-B both ends) | Works (Auto-MDIX on PC side) |
| PC without Auto-MDIX → IOT2040 | Crossover (T-568-A / T-568-B) | Works |
| PC → Managed switch → IOT2040 | Two straight-through patch cables | Always works (switch handles MDI/MDIX) |
If a crossover cable is not available, plugging both devices into a 100 Mb/s switch is the lowest-risk verification step. The IOT2040 negotiates 10/100 only; do not force a GbE connection.
5. Diagnostic Procedure: Layered from Physical to Application
Walk this list top-down. Stop at the first step that changes the symptom.
-
Visual link check. Both LEDs on X1P1 lit solid green and yellow? If no, reseat the cable, try another RJ45, and confirm the PC NIC is enabled in Device Manager → Network Adapters. On Windows 10/11, a NIC that has entered Energy Efficient Ethernet power-save state can mimic a link failure; disable
Power Management → Allow the computer to turn off this device to save poweron the adapter. - Switch in-line test. Insert a dumb 100 Mb/s switch between PC and IOT2040 with two known-good straight-through patch cables. If ping now works, the cable plant was at fault.
- Crossover cable test. Replace the straight-through with a crossover cable directly between PC and IOT2040. Bypass any docking station or USB-Ethernet adapter, which sometimes drop Auto-MDIX support.
- Shield test. Power down, mount the IOT2000 Input/Output Shield (6ES7647-0KA01-0AA2), power up, wait 90 s for systemd-networkd to converge, then ping.
-
Serial console verification. Connect X2 (micro-USB) at 115200 8N1. Log in as
root. Run:r>
Look forip link show eth0 ip addr show eth0 systemctl status systemd-networkd dmesg | grep -i eth0state UPand the192.168.200.1/24address. Ifstate DOWN, bring it up manually:ip link set eth0 up systemctl restart systemd-networkd -
ARP cache. On the Windows PC, run
arp -d *to flush stale entries, then ping again. Some Windows builds (10 22H2, 11 23H2) cache the IOT2040 MAC as incomplete when the first ping fails, and a stale entry can persist for 10 minutes even after the device is reachable. -
Alternate port: eth1 (X1P2). The stock image sets
eth1to DHCP. Connect X1P2 to a router running a DHCP server, then check the lease table for the IOT2040 MAC (printed on the bottom label). If eth1 obtains an address but eth0 does not, the failure is localized to the X1P1 PHY or its firmware handshake.
6. Reconfiguring the IP Address from the Serial Console
If the default 192.168.200.1 conflicts with an existing network, change it from the serial console before deploying:
mount -o remount,rw /
vi /etc/systemd/network/eth0.network
Replace the Address= line with the new CIDR, for example:
[Network]
Address=10.10.0.50/24
Gateway=10.10.0.1
DNS=10.10.0.1
Save and restart the network service:
systemctl restart systemd-networkd
ip addr show eth0
Reboot to verify the configuration persists across power cycles: reboot.
/ read-only by default. The mount -o remount,rw / command in step 1 is mandatory. After editing, run sync before rebooting to avoid filesystem corruption on the SD card.7. SD Card and Firmware Validation
Symptom variation: the IOT-Trainer's SD card works on the trainer, but the IOT2040's SD card does not work on the trainer, and vice versa. This indicates an image-hardware mismatch, not a hardware fault.
-
Image family. The IOT2020 trainer and the IOT2040 industrial variant use different device-tree blobs (
iot2020.dtbvsiot2040.dtb). The bootloader selects the DTB based on the hardware ID stored in the Quark's EEPROM. Swapping SD cards across hardware does not necessarily boot because the kernel may panic on missing peripherals. - SD card size. The IOT2040 SD controller supports SDHC up to 32 GB. 16 GB SanDisk Industrial or Samsung Pro Endurance cards are field-proven. Consumer-grade cards above 64 GB (SDXC) are not supported on early firmware revisions and will fail to mount.
-
Filesystem integrity. Power loss during a write corrupts the ext4 journal. Reflash the image using
balenaEtcherorWin32DiskImagerand re-test.
Always order the SD card from Siemens (6ES7647-0AA11-0YA2 for the latest IOT2000 SD card with pre-flashed image) to guarantee compatibility.
8. Verification: Confirming End-to-End Connectivity
Once the ping returns, validate the full TCP/IP stack with the following sequence:
-
ping 192.168.200.1from the PC — should return < 1 ms with 0% loss. -
ssh [email protected]— accept the host key. The default is no password. - On the IOT2040, run
ifconfig eth0(legacynet-toolsis included in the example image) to confirm the bound address. - Test the optional web-based setup wizard at
http://192.168.200.1(port 8080 on later images). A 200 OK response confirms theiot2000setupservice is healthy. - From the PC, run
tracert 192.168.200.1on Windows ortraceroute 192.168.200.1on Linux. The trace should resolve in a single hop, proving no rogue L3 device is intercepting traffic.
If SSH hangs at "Connecting…" but ping succeeds, the IOT2040 is on a different subnet — usually because the PC's mask was set to /16 (255.255.0.0) instead of /24 (255.255.255.0), and the kernel is choosing a different source address for the TCP SYN.
9. Common Failure Matrix
| Symptom | Root Cause | Fix |
|---|---|---|
| Both LEDs off | No power, bad cable, dead PHY | Check 24 V supply on X4; replace cable |
| Green on, yellow off (10 Mb/s only) | Cable integrity / pinout | Use crossover or insert switch |
| Both LEDs on, ping fails, no shield | PHY reset line not released | Mount 6ES7647-0KA01-0AA2 shield |
| Both LEDs on, ping fails, with shield | First-boot EULA not accepted | Accept via serial console, reboot |
| Ping works, SSH fails | Wrong subnet mask on PC | Set PC mask to 255.255.255.0 |
| eth0 unreachable, eth1 works | eth0.network file corrupt | Re-flash SD card or repair from serial console |
| Intermittent timeout every ~5 min | Windows NIC power management | Disable EEE / power saving on the adapter |
| Yellow LED off, ping slow (~10 ms) | 10 Mb/s fallback | Check for damaged pairs on the patch cable |
10. Escalation: When to Open a Siemens Support Ticket
Open a case with Siemens Industry Online Support (SIOS) at support.industry.siemens.com if all of the following are true:
- Both LEDs are solid on X1P1 with a verified crossover cable.
- The IOT2000 Input/Output Shield is mounted and seated correctly.
- Serial console confirms
state UPand the correct IP is bound. - Another PC on the same subnet still cannot ping the device.
Include the serial number from the right-hand side label, the firmware version (cat /etc/os-release on the device), and a dmesg log captured via the serial console. These three artifacts let the Siemens support engineer reproduce the failure within minutes.
11. Safety and Power Notes
The IOT2040 accepts 24 V DC ± 20% on the X4 pluggable terminal block. Reverse polarity is not protected on early revisions and will destroy the input fuse (F1, 1.5 A slow-blow, 5x20 mm). Always disconnect power before inserting or removing the Arduino shield or the SD card. Hot-plugging the shield is documented to occasionally latch the Quark X1020 in a state that requires a full 30-second power cycle to recover.
FAQ
Why does the SIMATIC IOT2040 not respond to ping at 192.168.200.1 even though the link LEDs are on?
The most common cause is an incomplete first-boot setup that leaves the eth0 interface in NO-CARRIER state. The fix is to mount the official IOT2000 Input/Output Shield (6ES7647-0KA01-0AA2) and accept the EULA via the X2 micro-USB serial console at 115200 8N1. Once the shield is seated, the PHY reset is released and systemd-networkd binds 192.168.200.1/24 to eth0 within 30–90 seconds.
Does the IOT2040 need a crossover cable to connect to a PC?
The Quark X1020 internal PHY on the IOT2040 reference design does not implement Auto-MDIX. A direct PC-to-IOT2040 link with a straight-through patch cable may negotiate 10 Mb/s and fail to pass traffic, depending on whether the PC NIC's Auto-MDIX compensates. The deterministic fix is a crossover cable (T-568-A on one end, T-568-B on the other) or insertion of a 100 Mb/s switch between the two devices.
What is the default IP address and subnet of the SIMATIC IOT2040?
The stock Siemens image configures eth0 (X1P1) as 192.168.200.1 with a /24 mask (255.255.255.0) via the file /etc/systemd/network/eth0.network. Eth1 (X1P2) is set to DHCP client. To change the static address, remount the root filesystem read-write from the serial console, edit eth0.network, and restart systemd-networkd.
Can I swap the SD card between a SIMATIC IOT2020 trainer and an IOT2040?
No, not without rebuilding the image. The two devices use different device-tree blobs (iot2020.dtb vs iot2040.dtb) and the bootloader selects the DTB based on a hardware ID stored in EEPROM. Swapping cards typically results in a kernel panic or non-functional peripherals. Always flash the correct image for the target hardware.
How do I tell if my IOT2040 is a prototype that needs a different procedure?
Check the label on the right-hand side of the housing. Engineering samples and MindConnect IOT variants are marked with a different MLFB and may not bring up eth0 by default. The IOT-Trainer 2000 (with IOT2020 inside) is functionally similar but uses a different default image; if the trainer works and the IOT2040 does not, the issue is hardware revision specific to the IOT2040, not the PC or cable plant.