1. Problem Overview
Engineers commissioning Siemens WinCC (WinCC flexible 2008, WinCC V7, or TIA Portal WinCC) panels against S7-300 / S7-400 controllers frequently attempt to "force" or "set" a digital input such as I0.1 directly from an HMI button. The HMI button is configured with the SetBit event and the tag points at the input address. In every documented case the bit never latches, and the operator sees the input remain 0 regardless of how many times the button is pressed. Status bits (Q addresses) read back correctly, so the WinCC-to-PLC connection itself is healthy.
This article documents the root cause, the proper substitute architecture (flag-bit / Merker / DB bit with parallel logic in the PLC program), and the exact WinCC tag and STEP 7 configuration required to simulate a physical input from an HMI panel without modifying the original machine program in any meaningful way.
2. Root Cause: The S7 Scan Cycle Owns the I Image
Every SIMATIC S7 CPU executes a deterministic scan cycle. For an S7-300 with the default scan order, the cycle is documented in the S7-300 Automation System, CPU 31xC and CPU 31x Operating Instructions and is summarized as:
- CPU writes the Process Image of the Outputs (PIQ) to the physical output modules.
- CPU reads the physical input modules into the Process Image of the Inputs (PII) - this is the only event that sets bits in
I,IB,IW, andID. - CPU executes the user program in OB1, FCs, and FBs, top to bottom.
- Operating system runs self-test, communication, and time-of-day interrupts.
- Cycle restarts at step 1.
The PII is a memory area in the system memory of the CPU that is refreshed once per cycle from the input modules. The HMI writes through a PUT/DPWRDAT or through the configured S7 connection to the same system memory area, but the very next OB1 cycle overwrites any value the HMI wrote. The bit therefore appears to "immediately fall back to zero." This is identical to writing to an output from the user program at one location while another location clears it within the same scan; the last write wins, and the I image is always reloaded from the hardware.
I (Input) address area. The HMI, the programming device, and the user program can only read that area. This is a deliberate design that mirrors IEC 61131-3 conventions and Rockwell MicroLogix 1400 (1766-UM001P-EN-P) controller behavior, where the input data file (I:1) is also written exclusively by the CPU scan.3. Why HMI Tag Writes to I0.1 Always Fail
When a WinCC tag is configured with the address I 0.1 (WinCC notation) or EW0 / Bit 1 (STEP 7 notation), the panel sends a write request over the MPI/PROFINET/Industrial Ethernet connection. The CPU accepts the request and writes the byte into the PII. Within milliseconds the next OB1 cycle starts, the CPU reads input module 0 byte 0 from the backplane, and your write is gone. Operators may briefly see I0.1 = 1 in the tag status, but logic that reads I0.1 in the same scan will never see the forced value, and external monitoring of the physical terminal shows no voltage change.
| Action | Result | Why |
|---|---|---|
HMI button SetBit on I 0.1
|
Bit briefly true in WinCC status, false in PLC | PII overwritten on next cycle |
HMI button SetBit on M 0.1
|
Bit latches in PLC, visible in WinCC | Merker area is in user memory, not hardware-mapped |
HMI button SetBit on DB1.DBX0.1
|
Bit latches in PLC, visible in WinCC | DB area is in user memory, persistent |
HMI button ResetBit on I 0.1
|
No effect | Already overwritten by PII refresh |
The pattern is not a WinCC bug. It is the documented behavior of the S7 memory model. The same restriction applies to the Output area in a different way: writing Q0.0 from an HMI while OB1 also writes Q0.0 produces a race condition whose resolution is undefined.
4. The Correct Architecture: Flag-Based Input Simulation
The standard Siemens solution to "I need an HMI button to behave like a wired pushbutton on a specific input" is to keep the physical input wired and add a parallel flag (Merker, M area) in the ladder or FBD. The HMI writes the Merker; OB1 ORs the Merker with the real input; downstream logic sees the same result as if the physical switch had been pressed.
// STEP 7 FBD/segment logic substitute
// Network 1: simulate I0.1 from HMI
// I0.1 (real sensor) ----+-- ( ) -- I0.1_sim
// M0.1 (HMI flag) ----+ (intermediate marker)
// ---( )-- I0.1_sim, used downstream wherever I0.1 was used
Why this is the only safe pattern:
- It is non-invasive: the original I0.1 wiring is untouched, the original logic referencing I0.1 is untouched, and a single new network ORs in the substitute.
- It is deterministic: the OR is evaluated every scan, so the HMI can set the flag at any point in the cycle and the next scan picks it up.
- It is reversible: disconnect the OR branch or add a feature bit to enable/disable HMI override without changing the I/O list.
- It is multi-HMI safe: if six panels all write the same
M0.1, last-writer-wins is acceptable for a momentary pushbutton simulation. If six panels try to write the sameI0.1, the race is invisible because the CPU always overwrites the value.
DB1.DBX10.0) and gate the SetBit on the panel to prevent operator conflicts.5. Prerequisites
- STEP 7 V5.4 SP5 or later, with the original S7-300/400 program open or at least the symbol table editable online.
- WinCC flexible 2008 SP3 (or WinCC V7, TIA Portal WinCC) installed, with the project that connects to the target PLC.
- Configured S7 connection in WinCC flexible (MPI, PROFIBUS, or PROFINET) with the same rack/slot as the target CPU. Verify by reading any
Qaddress successfully on the panel. - Authorization to add one network to OB1 and one DB or Merker in the symbol table. If the original program is locked or compiled to a memory card without source, the flag can still be added by writing to a free Merker (
M) byte from the HMI and using the existing free address space in the program.
6. Step-by-Step: Add the Substitute Flag in STEP 7
- Open the S7 project in STEP 7 and open the symbol table (Options > Symbol Table).
- Add a new symbol:
Symbol: HMI_I0_1_SIM
Address: M 0.1
Data type: BOOL
Comment: HMI substitute for digital input I0.1 - If you also need a downstream "logical I0.1" that combines the real input with the substitute, add:
Symbol: I0_1_LOGIC
Address: M 10.0
Data type: BOOL
Comment: OR result of I0.1 and HMI_I0_1_SIM, used wherever I0.1 was referenced - Open OB1 and insert a new network (Network 7 in this example):
Network 7: HMI override for I0.1 A I0.1 // physical sensor O M0.1 // HMI substitute (HMI_I0_1_SIM) = M10.0 // I0_1_LOGIC, used downstream - Find every existing reference to
I0.1in OB1, FCs, and FBs. Right-click and use Replace Address to changeI0.1toM10.0(I0_1_LOGIC). Keep one reference to the rawI0.1in the new Network 7. - Save and download to the CPU. Use Download in RUN if the process is running and the new network does not affect a critical path. STEP 7 will warn about STOP -> RUN if the CPU is in RUN-p mode and the change is not in an FB with multiple instance capability.
7. Step-by-Step: Configure the WinCC Tag and Button
- In WinCC flexible 2008, open the project and select Communication > Connections. Double-check that the configured connection matches the CPU rack and slot, and that the protocol is one of MPI, PROFIBUS DP, or PROFINET (Industrial Ethernet). See the WinCC flexible 2008 Communication manual for the connection parameters per CPU type.
- Open Tags and create a new tag:
Name: HMI_I0_1_SIM
Connection: <your S7 connection>
Address: M 0.1(WinCC flexible notation, notI 0.1)
Data type: Bool
Acquisition cycle: 500 ms(or 100 ms for fast response)
Comment: HMI override for input I0.1 - Open the screen where the pushbutton is placed (or add a new button). On the Events tab, configure:
Press event ->SetBit-> Tag:HMI_I0_1_SIM-> (no value, BOOL self-references the bit)
Release event ->ResetBit-> Tag:HMI_I0_1_SIM
This gives a momentary pushbutton behavior that mirrors a real wired switch. - For a maintained (latching) button, use Toggle with a small script, or use two buttons, one SetBit and one ResetBit. The Toggle event is documented in Siemens Application Example 24109937 for similar patterns.
- Compile the project and transfer to the panel. The runtime should now show the bit toggling correctly in the WinCC tag status, and the PLC logic that references
M10.0(I0_1_LOGIC) will see the simulated input.
8. Verification
- Online in STEP 7, open OB1 and monitor Network 7. Press the HMI button;
M0.1should go to1within one acquisition cycle (default 500 ms), andM10.0should follow. - Release the HMI button.
M0.1returns to0;M10.0follows only if the realI0.1is also low. - Physically disconnect the sensor wire from input terminal I0.1. The HMI button should still drive the logic downstream of
M10.0. This proves the substitute is independent of the real input. - Reconnect the sensor and drive it physically. The HMI button should be OR-able with the physical input (both can be active at once).
- Watch the cycle-time OB1 statistics (Tools > Operating Mode > Module Information) and confirm that adding the OR network has not pushed the cycle above the configured maximum cycle time (default 150 ms on an S7-313C, 600 ms on an S7-416).
9. Advanced: Using a Data Block Instead of a Merker
For larger panels with many simulated inputs, prefer a dedicated instance DB over Merker bytes. The reason is symbolic clarity and the ability to download a single DB without affecting the rest of the program. A typical layout:
DATA_BLOCK "HMI_Overrides"
STRUCT
I0_0_SIM : BOOL; // DB1.DBX0.0
I0_1_SIM : BOOL; // DB1.DBX0.1
I0_2_SIM : BOOL; // DB1.DBX0.2
I0_3_SIM : BOOL; // DB1.DBX0.3
Panel_OK : BOOL; // DB1.DBX0.4 - heartbeat from HMI
END_STRUCT;
END_DATA_BLOCK;
In WinCC, point the HMI tag at DB1.DBX0.1 instead of M0.1. The OR in OB1 changes to:
Network 7: HMI override for I0.1
A I0.1
O DB1.DBX0.1
= M10.0
10. Edge Cases and Field-Proven Caveats
| Edge case | Symptom | Root cause | Fix |
|---|---|---|---|
| Bit still falls back to 0 after SetBit | WinCC tag address was set to I 0.1 instead of M 0.1 / DB1.DBX0.1
|
User typed input address because that is what was being simulated | Re-create the tag with the flag address; do not use I addresses for HMI write tags |
| Bit latches, but downstream logic does not see it | Downstream logic still references raw I0.1 not M10.0
|
Replace Address was missed on at least one network | Cross-reference I0.1 in STEP 7 (Ctrl+Shift+F) and ensure the only live reference is in the OR network |
| Multiple panels, only the last writer sticks | Operators see the bit flipped back unexpectedly | Two HMIs own the same M0.1 and operators race |
Add an authority tag and gate the SetBit with a panel ID match, or use a separate Merker per panel and an OR |
| Bit disappears on power cycle | SetBit works until the next STOP -> RUN | Merker is non-retentive and the DB was not marked | Mark the flag area retentive in CPU or DB properties |
| WinCC tag shows "connection error" after transfer | Tag was created against the wrong connection | WinCC flexible allows multiple connections per project | Open Tag properties, pick the correct S7 connection, recompile and transfer |
| SetBit fires but no visual confirmation on panel | Button has no "pressed" state animation | Missing the Appearance/Flashing event | Bind the button's "pressed" appearance to the same HMI tag so the operator sees the state |
11. Safety and Engineering Discipline
HMI-driven input simulation must never be used to bypass a safety-rated device (E-stop, light curtain, guard interlock). The S7 F-CPU variants (CPU 315F, CPU 416F) handle fail-safe I/O in a separate I image called the fail-safe I image; HMI writes to that area are not allowed by the F-runtime and the F-system will enter PASSIVATION if the safety signature is violated. Use the substitute-flag pattern only for operational inputs that do not participate in a safety function.
Document every HMI-owned flag in the project symbol table with a comment prefix such as [HMI-OVR]. During code review, the reviewer can grep for the prefix and confirm that no HMI override feeds a safety-relevant signal. This practice is borrowed from PLC coding standards (IEC 61131-3 naming conventions) and is especially important when more than one engineer maintains the program over the asset's life.
12. Quick Reference Table: HMI-to-PLC Tag Address Rules
| Memory area | Readable from HMI? | Writable from HMI? | Use case |
|---|---|---|---|
I (Process Image of Inputs) |
Yes | No (overwritten by CPU scan) | Display real input status |
Q (Process Image of Outputs) |
Yes | Possible but discouraged | Display output state, manual override with care |
M (Merker / flags) |
Yes | Yes | HMI buttons, latches, operator requests |
DB (Data blocks) |
Yes | Yes | Structured HMI-driven data, recipes, setpoints |
PI (Periphery inputs, direct) |
Yes | No | High-speed reading bypassing the PII |
PQ (Periphery outputs, direct) |
Yes | Yes (rare) | Direct output writes from HMI, advanced only |
13. FAQ
Why can WinCC set M0.1 but not I0.1 from an HMI button?
Merker (M) bits live in the CPU's user-memory area and are written only by the user program and HMI writes. Input (I) bits are part of the Process Image of Inputs, which the CPU overwrites from the input modules at the start of every OB1 cycle. Any HMI write to an I address is therefore discarded within milliseconds, so the button appears to do nothing in the user logic.
Can I rename M0.1 to I0.1 in the symbol table and have it work?
No. The symbol name is cosmetic; the address area is what the CPU enforces. A symbol with the name I0_1_SIM pointing at M0.1 will work, but a symbol with the name I0_1_SIM pointing at I0.1 will still be subject to the PII refresh and your write will be lost.
What is the smallest change to the original program to support an HMI pushbutton that simulates I0.1?
Add one network to OB1 that ORs the existing I0.1 with a new Merker (M0.1), assign the result to a new Merker (M10.0), and replace I0.1 with M10.0 in all downstream networks. The HMI writes M0.1. The change is one added network, one OR contact per consumer network, and one new WinCC tag.
Does this pattern work on S7-1200 and S7-1500 with TIA Portal?
Yes. The PLC scan cycle still owns the I image, the HMI cannot write to the I address area, and the substitute-flag pattern is functionally identical. In TIA Portal, prefer a global DB over a Merker for the flag, and configure the HMI tag in the PLC's tag table so the HMI inherits the symbol.
Is it safe to simulate safety inputs like an E-stop with this method?
No. Safety inputs on F-CPUs are read into the fail-safe I image and the F-runtime will not accept HMI writes. HMI override of an E-stop, light curtain, or guard interlock is a violation of functional-safety standards (IEC 62061, ISO 13849-1) and can defeat the safety function. Use the substitute-flag pattern only for non-safety operational inputs.