Overview
The migration of S7-300/S7-400 projects to S7-1500 with TIA Portal V14, V14 SP1, and V15 introduced fully symbolic, optimized-block programming. Engineers can reference a motor start bit as Motor1.Start instead of DB10.DBX0.0, and TIA Portal assigns data-block numbers transparently. The expectation is that the same symbolic philosophy applies to HMI screens, where one settings faceplate should drive twenty, fifty, or two hundred field devices with a single tag-index variable.
That expectation collides with concrete limits in WinCC Comfort, WinCC Advanced, and the underlying S7-1500 data-block sizing rules. The multiplex value on the HMI side must be an integer type (INT, SINT, DINT, or USINT). Optimized data blocks have a 64 kB / 65 536-byte ceiling for the relevant loadable types. Faceplates drop multiplexed, symbolically addressed tags when the source block is set to "Optimized block access." This article documents the root causes, the workarounds that shipped with V14 and V15, and the TIA Portal V20 feature that finally closes the gap.
Prerequisites
- SIMATIC S7-1500 CPU (tested on 1511-1 PN; same logic applies to 1512, 1515, 1516, 1517, 1518, and the ET 200 SP variants).
- TIA Portal V14, V14 SP1, V15, V15.1, V16, V17, V18, V19, or V20 — set the HMI tags to a CPU whose firmware matches the TIA version. See the Siemens support entry on HMI multiplexing.
- Operator panel: SIMATIC TP1200 Comfort, TP900 Comfort, TP700 Comfort, KTP1200 Basic, or Unified Comfort (MTP/MTP Pro) for V20.
- Optional: WinCC Unified V18 or later for the array-index multiplexing path.
- Working PLC project with at least one FB that contains a typed motor, valve, or transmitter data structure.
Problem Details
The symptom manifests in two stages:
-
HMI multiplex field shows red: In a Comfort faceplate or screen, the user assigns a tag such as
"Motor_DB[Index]".Speedand bindsIndexto an INT tag. Engineering compiles cleanly until the field is dragged to the screen — TIA raises an error indicating the index must be a constant. -
Faceplate instance does not update: When the faceplate tag is bound to
"MyMotors".Data[Index]with the arrayDatasitting in an optimized instance DB, the runtime shows the element at index 0 regardless of the value ofIndex. No error is raised at compile time.
The engineer is forced to revert to the S7-300 era trick of referencing the DB by number — typically a global DB containing a parallel array — because no symbolic alternative is exposed in the Comfort target.
Root Cause
Three independent constraints combine to break the symbolic-multiplexing workflow on V14-V15.
Constraint 1 — Multiplex Index Type Is Restricted to Integers
WinCC Comfort and WinCC Advanced evaluate the HMI tag used as a multiplex index and reject any symbolic or STRING-typed value. Only INT, SINT, DINT, and USINT qualify. The multiplexing manual page lists the four allowed index types explicitly. A field device name such as "MOT_034" therefore cannot act as the multiplex value, even though WinCC internally stores tag names as WSTRING.
Constraint 2 — Optimized vs. Standard Block Access
S7-1500 data blocks default to "Optimized block access." Optimized blocks store data in a non-contiguous layout and expose only symbolic addresses. Comfort and WinCC Advanced can read symbolic tags only when the tag is statically known at compile time. Multiplexing an index into an optimized array is supported for PLC tags, but the runtime resolves the array element via the S7-1500 "symbolic-only" path, which fails for faceplate container multiplexing on a TP1200 Comfort in V14 and V15. The same faceplate works when the source DB is converted to "Standard (and compatible with S7-300/400)" — i.e., non-optimized, absolute address layout.
Constraint 3 — 64 kB Data Block Ceiling
Even if you pre-program a single global DB containing an array of UDT_Motor to act as the "name → data" mapping table, the array element count is bounded by the DB load memory limit. For non-optimized DBs the per-DB limit is 64 kB minus the DB header overhead. A motor UDT that holds 32 bytes of process data caps the array at approximately 2 040 elements. Add a parallel set of motor name strings and the practical ceiling drops further.
Comparison of Available Workarounds (V14 – V17)
| Method | Symbolic? | Works with Optimized DB? | Faceplate-Compatible? | Scalability | Min. TIA Version |
|---|---|---|---|---|---|
| Pre-built array of UDT in global DB, multiplexed by INT index | Yes (only when DB is non-optimized) | No — must be standard | Yes on Comfort | ~2 000 motors / DB | V14 |
| Instance DB per motor, accessed by DB number | No — DB number is the address | N/A | Yes on Comfort | DB count limited by work memory | V14 |
| FB instance array of multi-instance DBs | Yes | Yes | Yes, but requires indirect field read | Set in FB static, recompiled on change | V15 |
| Faceplate with one tag per instance | Yes | Yes | Yes (no multiplexing) | Linear with screen count | V13 SP1 |
| VBScript on RT Professional (WinCC Professional) | Partial | Partial | Yes (RT Pro only) | String lookup in DB | V14 SP1 |
| DB name multiplexing (ChangeDBName) | Yes | Yes | Yes | Unlimited (system function) | V20 |
Solution Path A — Array-of-UDT Multiplexing (V14 – V17)
This is the path most teams land on. Build one global DB that contains a fixed-size array, then address the elements symbolically on the HMI.
- Create a user-defined data type
UDT_Motorcontaining the motor's I/O, setpoints, and status words. Keep the UDT under 256 bytes so the 64 kB ceiling leaves room for growth. - Create a global DB
DB_AllMotors. In the properties, set "Optimized block access" to OFF so it remains compatible with Comfort multiplexed faceplate access. - Declare an array inside the DB. TIA Portal caps the upper bound at compile time. For example:
Motor : ARRAY[1..500] OF UDT_Motor; for a 32-byte UDT this consumes about 16 kB and leaves headroom for a parallel name string DB. - On the PLC side, populate the array from your FB instances:
"DB_AllMotors".Motor[MyIndex] := MyInstance;triggered by a startup OB or a request tag. - On the HMI side, bind the faceplate tag to
"DB_AllMotors".Motor[Index]whereIndexis an INT tag updated by the operator.
Solution Path B — Multi-Instance FB with Static Array (V15+)
Keep the block fully optimized by storing all motors as STATIC elements inside one FB. The HMI accesses "FB_Plant".Static.Motors[Index].
- Declare an FB
FB_Plantwith a static arrayMotors : ARRAY[1..200] OF UDT_Motor. - Add a single instance DB (e.g.,
IDB_Plant) — TIA Portal assigns the DB number. - Bind the faceplate to
"IDB_Plant".Motors[Index]. - Because the DB stays optimized, you keep symbolic-only benefits on the PLC side; the HMI multiplex must still use an INT index.
This approach was the most-used workaround in V15 and V15.1 and is what Siemens documents in the official multiplexing FAQ.
Solution Path C — WinCC Unified Array Multiplexing (V18+)
Unified Comfort panels and Unified PCs lift several Comfort constraints. The TIA Portal V20 documentation on WinCC Unified address multiplexing states the index tag must still be INT or DINT, but Unified accepts symbolic indices that resolve to MachineXY_Motors{0} at runtime. Unified also supports WSTRING tag lists that can be displayed next to the index for operator confirmation.
- Switch the HMI target from Comfort to Unified Comfort (MTP700 / MTP1000 / MTP1200) or to a Unified PC runtime.
- Define the HMI tag
MotorIndexas INT and bind it to the multiplexed element tag"MachineXY_Motors". - Bind the index field on the screen to
MotorIndex. Unified resolves the array element at runtime without recompilation.
Solution Path D — DB Name Multiplexing in TIA Portal V20
TIA Portal V20 introduces the "DB name multiplexing" feature and the system function ChangeDBName for WinCC. The V20 connectivity "What's New" page documents both. This is the only path that removes the integer-index constraint without leaving the symbolic world.
- Engineer a UDT or a reference DB that holds the field-device tag string (e.g.,
"MOT_034"). - Configure the HMI tag connection as "Symbolic — DB name multiplexed."
- From a button or a script on the HMI, call
ChangeDBName("MyMotors", SelectedName)whereSelectedNameis a STRING-typed HMI tag. - The runtime rewrites the symbolic resolution to the new DB name; subsequent tag reads point to the chosen instance DB.
This approach requires the CPU firmware to support V20 system functions — currently the 1511-1 PN firmware 2.9 (V20 line) and later. Older firmware running the same TIA V20 project will reject the system function.
Implementation Example — UDT Array Multiplexing on V15
The following code shows the PLC side and the HMI side of the most common V15 deployment.
PLC — Data Block (non-optimized):
DATA_BLOCK "DB_AllMotors"
{ S7_Optimize_Access := 'FALSE' }
AUTHOR : 'Eng'
VERSION : 0.1
STRUCT
Motor : ARRAY[1..500] OF UDT_Motor;
NameList : ARRAY[1..500] OF STRING[16];
END_STRUCT;
END_DATA_BLOCK
PLC — Populate on Startup (OB100):
// Pseudo-code for demonstration
FOR i := 1 TO 500 DO
"DB_AllMotors".Motor[i] := "IDB_Plant".Static.Motors[i];
"DB_AllMotors".NameList[i] := "MOT_" + INT_TO_STRING(i);
END_FOR;
HMI — Comfort Faceplate tag binding:
Tag (internal): MotorIndex // INT, 1..500
Faceplate property: ProcessTag = "DB_AllMotors".Motor[MotorIndex]
Faceplate property: DeviceName = "DB_AllMotors".NameList[MotorIndex]
Compile and download. Cycle the index from the PLC or the HMI and verify the displayed DeviceName matches the expected motor.
Verification
- Online → Watch table
DB_AllMotors; confirm the array element atMotorIndexreflects the active instance. - Open the faceplate in the Comfort runtime; change the
MotorIndextag and observe the visible values update within one PLC scan cycle (typical 50–100 ms). - Force an out-of-range index (e.g.,
501); the faceplate should display zero or a configured fallback. If it faults, add a limit check in the index HMI tag's event. - Trigger a PLC restart; confirm the populate routine (OB100 / startup OB) re-populates the array and the faceplate shows the first motor after the HMI re-establishes the connection.
- On V20, log the
ChangeDBNamereturn value via theGetInformationsystem function and verify it returns 0 (success) for each device selection.
Best Practices
- Keep UDT size ≤ 64 bytes when you anticipate more than 1 000 multiplexed elements; the 64 kB ceiling hits at about 1 024 elements for a 64-byte UDT and at 2 048 for 32 bytes.
- Pair each UDT array with a parallel STRING array for human-readable labels. Operators will not select a motor by integer index without a name.
- Disable optimized block access only on the multiplexing DB. Keep application FBs optimized so you retain symbolic-only safety on code blocks.
- Reserve the first element of the index range (e.g., 0 or 1) as "No selection" to avoid accidental operator actions.
- Use WinCC Unified for greenfield deployments on MTP panels — it accepts symbolic array indices and exposes the WSTRING name tag without an extra DB.
- For V20+ projects with frequent device additions, prefer the
ChangeDBNamepath; it removes the 64 kB ceiling because the target DB can be a separate instance DB per device. - Document the index semantics in the project header so that the maintenance team does not confuse the PLC index with the tag name.
Troubleshooting Matrix
| Symptom | Likely Cause | Fix |
|---|---|---|
| Faceplate always shows element 0 | Source DB is optimized, multiplex not supported | Disable optimized access on the multiplexing DB or migrate to Unified |
| Compile error: "Multiplex index must be a constant" | Tag bound is STRING or WSTRING | Convert to INT/DINT; bind a parallel text list for display |
| Runtime error 0x8010 on V20 | CPU firmware older than V20 line | Upgrade CPU firmware to 2.9 or later |
| DB download rejected — "Array exceeds max length" | Array upper bound × UDT size > 64 kB | Split into multiple DBs or shrink UDT |
| NameList shows garbage characters | STRING length mismatch between UDT and array | Match STRING[16] declaration across both blocks |
| Faceplate instance missing after HMI restart | Multiplexing DB not re-loaded | Mark the multiplexing DB as "non-removable from load memory" in DB properties |
| Slow screen response on TP1200 | Index change triggers full screen repaint | Use background tag polling instead of on-demand read |
Field-Commissioning Notes
During commissioning, expect to discover that the "symbolic" name you assigned to a motor in the project (e.g., Conveyor_Belt_07) does not match the operator's tag (e.g., CV07). Always wire the multiplexed name through a text list or a parallel name array; never let the operator see the PLC array index. Validate the populate routine with a watch table on every motor index at least once before handover, because a single bad element corrupts the entire faceplate view.
When upgrading an existing V15 project to V20, do not enable ChangeDBName on a panel that has not been re-flashed. The system function silently fails on earlier Comfort firmware versions and the operator sees no error feedback.
FAQ
Can I use a STRING tag as the multiplex index in TIA Portal V15?
No. WinCC Comfort, WinCC Advanced, and the multiplexing engine in WinCC Unified accept only INT, SINT, DINT, or USINT as the index. The constraint is documented in Siemens support entry 109747174.
Why does my faceplate show the wrong motor on TP1200 Comfort?
Optimized data blocks are not supported as the multiplex source for Comfort faceplates in TIA Portal V14 and V15. Disable optimized block access on the source DB or migrate to WinCC Unified, which handles symbolic array indices natively.
What is the largest UDT array I can fit in one DB for multiplexing?
A non-optimized DB on S7-1500 tops out at 65 536 bytes. A 32-byte UDT allows approximately 2 040 array elements; a 64-byte UDT allows roughly 1 020. Split into multiple DBs of the same UDT type if you need more elements.
Does TIA Portal V20 finally allow STRING-based multiplexing?
Yes — via the new "DB name multiplexing" option and the ChangeDBName system function. The feature is documented on the TIA Portal V20 connectivity page and requires CPU firmware 2.9 or later.
Should I move from Comfort panels to Unified panels for large multiplex screens?
For new projects with more than a few hundred devices, yes. WinCC Unified accepts symbolic array indices such as MachineXY_Motors{0}, supports WSTRING text lists, and removes the optimized-vs-standard access conflict described in the V20 WinCC Unified multiplexing documentation.