Overview
WinCC address multiplexing is the technique of binding a single HMI tag to a selectable subset of PLC memory locations. Instead of authoring 30, 50, or 200 individual screen objects (one per pump, filter, valve, or motor), the engineer defines one tag and one visualization object and varies the underlying address at runtime through an index, a selection widget, or a structured-tag pointer.
Three mechanisms exist across the Siemens HMI portfolio:
- Address multiplexing on Comfort Panels, Unified Comfort Panels, and WinCC Unified RT (TIA Portal V17 onward, current branch V20). The multiplex index is part of the tag configuration itself, so the same HMI tag can point at many DB or I/O addresses.
- Indirect tags on classic WinCC (WinCC V7, WinCC Professional, and PCS 7 OS). An internal tag holds the value, and a script or selection mechanism copies the desired external tag into the internal tag.
- Faceplates on PCS 7 and on TIA Portal WinCC Unified / Professional. A faceplate is a reusable screen window with its own tag interface; one faceplate instance is placed on each faceplate container and re-indexed per object.
For 30+ identical objects (pumps, filters, dosing units, valves), the recommended path in a greenfield project is a faceplate driven by address-multiplexed tags backed by an array-style DB in the S7 PLC. The remainder of this reference walks through each method, the wiring rules, and the verification procedure.
When Address Multiplexing Is the Right Tool
Use address multiplexing when:
- The number of objects exceeds ~8 and is fixed or slowly growing (10 to 500 instances is the sweet spot).
- All instances share the same data layout (current, speed, status word, setpoint, fault code, run-hours).
- The PLC stores instance data in arrays (DB with
ARRAY[1..n] OF STRUCT) or in equally sized, equally named data blocks. - The HMI side must follow array semantics: index 1 maps to instance 1, index 2 to instance 2, and so on.
Avoid address multiplexing when:
- Each object has a unique, non-scalar data layout (mixed types, mixed DB owners).
- The HMI must address process tags by symbolic name rather than by index (the PCS 7 APL faceplate model assumes this; do not mix the two paradigms).
- The number of objects is below ~6 and unlikely to grow. In that case a small handful of dedicated faceplate instances is faster to commission than a generic multiplexing infrastructure.
Faceplates in WinCC and PCS 7
A faceplate is a reusable graphic window with a defined tag interface. The PCS 7 Advanced Process Library (APL) ships with a complete set: @MOT_SPEED, @MOT_STD, @VALVE_AN, @CTRL_PID, @DOSE, and so on. Each faceplate exposes an interface (for example, INPUT: IF_INPUT, OUTPUT: IF_OUTPUT) that is wired to one motor block (FB) in the AS.
On TIA Portal WinCC Professional and Unified, you create user-defined faceplates with the Faceplate Editor. Each faceplate has its own tag interface (interface tags). You instantiate the faceplate on a screen as a faceplate container, set the container properties, and bind the instance to the correct PLC address.
PCS 7 faceplates do not expose address multiplexing directly. Instead, they rely on the underlying CFC chart or SFC assigning the same symbolic block type to each instance. The OS compiles the symbol resolution at compile time. In contrast, WinCC Unified and Comfort Panel faceplates can carry an index that drives an address-multiplexed tag inside the faceplate.
Indirect Tag Method (Classic WinCC V7 / Professional)
The classic WinCC pattern for dynamic tag selection uses one internal HMI tag as the displayed value and a small ladder of external tags as the source pool. The example below implements a 10-motor current overview.
- Create 10 external tags that mirror the PLC tags:
MOTOR1_CURRENT,MOTOR2_CURRENT, ...MOTOR10_CURRENT. Each points to the same DB block but with a different byte offset, or each points to its own data word. - Create one internal tag, for example
DISPLAYED_CURRENT(data typeRealorFloat, default value 0.0). - On the screen, place an I/O field or Bar bound to
DISPLAYED_CURRENT. - Place a Selection widget (radio buttons, drop-down list, or index input field) with values 1..10. The selection writes its current value into a second internal tag, for example
MOTOR_SELECT(data typeWordorInt). - On change of
MOTOR_SELECT, run a C or VBS script that reads the correspondingMOTORn_CURRENTexternal tag and writes it toDISPLAYED_CURRENT.
Sample VBS in classic WinCC:
Sub OnSelect_Change(ByVal Item)
Dim iMotor, sTag
iMotor = SmartTags("MOTOR_SELECT")
If iMotor < 1 Or iMotor > 10 Then Exit Sub
sTag = "MOTOR" & iMotor & "_CURRENT"
SmartTags("DISPLAYED_CURRENT") = SmartTags(sTag)
End Sub
This approach is portable across WinCC V7, WinCC Professional, and WinCC Flex (with the syntax adjusted). It is also the only approach that works on legacy panels that do not support address multiplexing (Basic Panels 1st generation and OP 73 / TP 177A class).
Address Multiplexing (WinCC Unified and Comfort Panels)
Per the official Siemens documentation, address multiplexing is configured at the HMI tag level. You define one HMI tag, point it at a base PLC address (DB number, byte offset, bit offset), and add one or more index tags that the runtime uses to compute the actual address.
Reference: Address multiplexing (RT Unified) - WinCC Unified V20.
Reference: Address multiplexing (Basic Panels, Panels, Comfort Panels, RT Professional).
Multiplex Index Sizing
The index tag is typically a Word or Int with a configured minimum and maximum value. Address multiplexing in TIA Portal supports up to two index tags per HMI tag, allowing a 2-D array layout. The runtime computes:
Effective_byte_offset = Base_offset + (Index1_value * Element_size) + (Index2_value * Row_size)
where Element_size is the byte width of the HMI tag's data type, and Row_size is the byte width of one full row of the underlying array. For a tag of type Real, Element_size = 4. For DWord, Element_size = 4. For Bool packed at the bit level, the calculation also includes a bit-offset contribution.
Configuration Steps in TIA Portal (Unified)
- In the project tree, open HMI Tags on the Unified device.
- Create a new tag, for example
Motor_Current, typeReal, connection to the S7-1500 PLC. - In the tag properties, set the PLC address:
DB20with base offset, for exampleDB20.DBX0.0. - Enable Multiplexing and add an index tag. Point it at an internal HMI tag of type
Int, for exampleMotor_Index(range 1..30). - Set Factor to
4(the byte width ofReal). - Compile the HMI and download.
At runtime, write 5 to Motor_Index. The HMI reads from DB20.DBD(0 + (5-1) * 4) = DB20.DBD16 if the index is 1-based and the array starts at offset 0.
Structured Tags and Array Backing in the PLC
The PLC side should mirror the HMI array layout. For S7-1500 with optimized block access, define a DB as follows:
DATA_BLOCK "MotorData"
STRUCT
Motor : ARRAY[1..30] OF STRUCT
Current : REAL; // Ampere, scaling 0..63 A
Speed : REAL; // RPM, scaling 0..3600
Status : WORD; // bit-coded status word
FaultCode : UINT; // 0 = OK, nonzero = fault number
RunHours : DINT; // accumulated run hours, seconds / 3600
END_STRUCT;
END_STRUCT;
END_DATA_BLOCK
Address map (1-based, optimized access):
| Element | Symbol | Byte offset (typical) |
|---|---|---|
| Motor[1].Current | %DB20.DBD0 | 0 |
| Motor[1].Speed | %DB20.DBD4 | 4 |
| Motor[1].Status | %DB20.DBW8 | 8 |
| Motor[1].FaultCode | %DB20.DBW10 | 10 |
| Motor[1].RunHours | %DB20.DBD12 | 12 |
| Motor[2].Current | %DB20.DBD16 | 16 |
| Motor[n].* | %DB20.DBD((n-1)*16) | (n-1)*16 |
The HMI multiplex factor for each tag type is therefore:
| HMI tag | PLC type | Byte width | Multiplex factor |
|---|---|---|---|
| Motor_Current | REAL | 4 | 4 |
| Motor_Speed | REAL | 4 | 4 |
| Motor_Status | WORD | 2 | 2 |
| Motor_FaultCode | UINT | 2 | 2 |
| Motor_RunHours | DINT | 4 | 4 |
Row stride is 16 bytes per motor instance. The base offset is 0, so for instance n:
Offset = (n - 1) * 16 + FieldOffset
Faceplate with Multiplexed Interface Tags
For 30 motors the typical screen layout is:
- A screen-level index stored in an internal HMI tag, e.g.
Overview_Index(range 1..30). - One faceplate container displaying the motor faceplate for the indexed instance. The container's interface tags are address-multiplexed tags:
Motor_Current,Motor_Speed,Motor_Status,Motor_FaultCode. - A navigation widget (next / previous buttons, or a slider 1..30) that increments / decrements
Overview_Index. - An optional overview grid with 30 small status indicators (one per motor) wired to the same multiplexed
Motor_Statustag with a per-cell constant index. With 30 cells and 30 distinct index values, you need either 30 separate HMI tags (one per cell) or a script-driven loop that updates one index at a time. The latter is preferred on smaller panels.
Comparison: Method Selection Matrix
| Method | Best for | Panel / RT | Update behavior | Commissioning cost |
|---|---|---|---|---|
| Indirect tag + script (classic WinCC) | Legacy panels, < 16 objects, slow-changing displays | WinCC V7, WinCC Professional, WinCC Flex (legacy) | Snapshot on selection change | Low |
| Address multiplexing (single index) | Linear array of identical objects, 10..500 instances | Comfort Panels, Unified Comfort Panels, RT Professional, RT Unified | Continuous polling, scaled by acquisition cycle | Medium |
| Address multiplexing (two indices) | 2-D array layouts (tank farm rows/columns) | Same as single index (Unified V18+, Comfort Panels) | Continuous | Medium-high |
| PCS 7 APL faceplate | Process-control projects with CFC/SFC | PCS 7 OS (WinCC V7 based or V8 based) | Continuous, symbol-bound | Low if APL used as-is |
| User-defined faceplate + multiplexing | New TIA Portal projects, reusable object types | WinCC Professional / Unified | Continuous, multiplex-driven | High initial, low marginal |
Step-by-Step: Building a 30-Motor Overview Screen
Prerequisites
- TIA Portal V18 or later (V20 recommended for the latest WinCC Unified multiplexing documentation).
- S7-1500 CPU with firmware V2.9 or later, project containing DB20 "MotorData" as shown above.
- Comfort Panel TP1500 Comfort or Unified Comfort Panel TP1900.
- HMI connection configured (PROFINET or PROFIBUS), DB20 set as accessible from HMI.
Step 1 - Configure PLC DB
- Add DB20 with the array layout above.
- Set DB attribute Optimized block access = OFF if you must address by absolute offset, or leave ON and use the symbolic access mode for HMI tag pointers.
- Compile the S7 program and download to the CPU.
Step 2 - Create HMI Tags
- Open the HMI device, navigate to HMI Tags.
- Create internal tag
Overview_Index(typeInt, range 1..30, start value 1). - Create external tags
Motor_Current,Motor_Speed,Motor_Status,Motor_FaultCode. Connection: the S7-1500 PLC; DB20; for each, configure the address range and enable multiplexing with index tagOverview_Index.
Step 3 - Build the Faceplate
- Open the Faceplate Editor, create a new faceplate
Motor_Faceplate. - Add interface tags:
IF_Current(Real),IF_Speed(Real),IF_Status(Word),IF_FaultCode(UInt). - Place visualization elements (bar, I/O field, status icon) and bind them to the interface tags.
- Compile and release the faceplate.
Step 4 - Place the Faceplate Container
- Open the screen
Motor_Overview. - Insert a faceplate container, choose
Motor_Faceplateas the type. - Bind the container's interface to the multiplexed tags
Motor_Current,Motor_Speed, etc. - Insert Next and Previous buttons with events that increment / decrement
Overview_Index(clamp at 1 and 30).
Step 5 - Build the Status Grid
- Insert a grid of 30 small color indicators (rectangles or status icons).
- For each cell, wire the color animation to
Motor_Statuswith a per-cell constant index using a separate internal tag (e.g.Cell_01_Index...Cell_30_Index) each pre-loaded with the cell number. The multiplexedMotor_Statustag evaluates each cell independently. - Alternatively, use a VBS loop on screen start that rotates one multiplex index and writes 30 status values into an internal array; this avoids the constant-index tag overhead but introduces a small startup delay.
Verification Procedure
- Compile the HMI project. Resolve any "multiplex index out of range" warnings.
- Download to the panel. Start runtime.
- Open the trace / tag monitor on the panel (Tools → Diagnostics → Tags). Confirm that
Overview_Indexupdates and thatMotor_Currentshows the value of the selected motor. - Force a value in the PLC for motor 5 (DB20.DBD64 if stride 16, motor 5 = offset 64). Verify the HMI displays it after setting
Overview_Index = 5. - Use the navigation buttons to step 1..30. Verify faceplate values change accordingly.
- Run the panel for 24 hours under nominal load. Inspect the diagnostic buffer for "tag update failed" entries. None should appear.
- Check CPU cycle time: address multiplexing adds no CPU load, but the HMI connection cycle must be sized for the tag count. A Comfort Panel default acquisition cycle of 1 s for ~200 multiplexed tags is typical.
Troubleshooting Matrix
| Symptom | Likely root cause | Corrective action |
|---|---|---|
| HMI always shows 0.0 for Motor_Current | Multiplex index not updated, or DB not accessible from HMI | Check Overview_Index in tag monitor; verify DB20 has "Accessible from HMI" attribute |
| Values off by one motor | 0-based vs 1-based array mismatch between PLC and HMI | Verify the HMI multiplex base offset: if array is 1-based and DB offset 0, set base offset = -Factor. If 0-based, leave at 0 |
| Tag monitor shows "Address error" | Index range exceeds configured min/max | Clamp Overview_Index to 1..30 in the button event |
| Faceplate stays static when index changes | Container interface tag wired to wrong tag, or faceplate cache not invalidated | Re-bind container interface tags; recompile faceplate; clear HMI cache |
| Performance is sluggish on TP700 | Too many multiplexed tags, or acquisition cycle too short | Reduce multiplexed tag count, increase cycle to 500 ms, enable tag bundling |
| Status word reads garbage after motor 16 | Optimized block access renumbered offsets | Disable optimized access, recompile, or use symbolic tag pointers |
| Runtime disconnects sporadically | HMI connection resource exhausted | Reduce number of concurrent connections; switch from S7-1500 PUT/GET to OPC UA if Unified |
Engineering Best Practices
- One block type per object class on the PLC side. Wrap each motor or filter in its own FB; place all instances in a cyclic OB (OB1 or OB35). This decouples the HMI from absolute addresses and makes the FB reusable.
- Symbolic PLC tag pointers for Unified Comfort Panels. When you use symbolic addressing, the HMI multiplex factor becomes symbolic and is immune to optimization reshuffles.
- Keep one DB per object class. Mixing motors, valves, and PID blocks into one DB makes address multiplexing fragile; one DB per class with a consistent stride is easier to scale.
- Document the multiplex factor in the tag comment. Example comment: "Multiplex factor 4 (REAL stride), index tag Overview_Index, base offset 0, array Motor[1..30]".
- Set the HMI acquisition cycle to the process cycle. For motors, 1 s is usually adequate. For dosing or fast valves, drop to 100 ms but verify CPU load.
- Use a faceplate release cycle. When you change a faceplate, all instances update on next HMI compile / download. Avoid mid-shift changes if the process is running.
Migration Notes: WinCC Flex → TIA Portal
Older WinCC Flex projects (TP177, MP277, Comfort Panels) can be migrated to TIA Portal WinCC Professional or Unified. Address multiplexing is supported on Comfort Panels in TIA Portal V14 SP1 onward. The classic WinCC Flex projects that used the indirect-tag-and-script pattern continue to work after migration, but should be progressively converted to address multiplexing for performance reasons. The migration tool is launched via Project → Migrate project. After migration, validate all multiplexed tags with the procedure above.
FAQ
How many instances can address multiplexing handle on a Comfort Panel?
Up to 2000 instances per HMI tag when the index range is configured from 1..2000, but practical limits are imposed by acquisition cycle and panel CPU. Comfort Panels (TP700 / TP1500 / TP2200) typically handle 80-200 multiplexed tags per screen at a 1 s cycle before scan delay becomes visible.
What is the difference between faceplates and address multiplexing?
A faceplate is a reusable screen object with its own tag interface. Address multiplexing is a tag-level configuration that lets one HMI tag read many PLC addresses. The two are often combined: a faceplate uses multiplexed interface tags, so one faceplate type can visualize any of 30 instances just by changing the multiplex index.
Can address multiplexing work with optimized DB access on S7-1500?
Yes, but the base offset must be set to the absolute byte offset of the first array element after compile. With optimized access, offsets are recalculated on each block compile. Use symbolic tag pointers to avoid offset drift.
Does address multiplexing work on Basic Panels (KTP400 / KTP700)?
Only on 2nd generation Basic Panels with TIA Portal V14 SP1 or later. First-generation Basic Panels do not support address multiplexing; use the indirect-tag-and-script pattern or split the project across screens.
How do I multiplex a boolean (status bit) field?
Configure the HMI tag as type Bool with the corresponding bit in the status word. The multiplex factor is 1 (each bit occupies 1 bit). For a packed status word, point the HMI tag at the bit offset within the word: index drives (n-1)*16 for the word, plus a fixed bit offset (0..15) for the individual boolean. Two-dimensional multiplexing (index1 = motor, index2 = bit position) is supported on Unified V18+ and Comfort Panels.