Overview
Engineers building complex HMI screens on SIMATIC HMI Comfort Panels (TP700, TP900, TP1200, TP1500, TP1900, TP2200) frequently need to operate on dozens of identical process objects - analog inputs, valves, drives, sensors - that all share the same data structure. Creating a dedicated popup screen per object quickly becomes unmanageable: a 200-tag I/O system means 200 faceplates, 200 event chains, and 200 places to fix a bug.
The official TIA Portal Help (V15 / V16) supports two multiplexing modes for Comfort Panels:
- Address multiplexing - the index tag is bound to a configured bit/byte/word offset that the runtime uses to resolve the symbolic tag at display time.
- Symbolic multiplexing - the index tag is bound directly to a symbolic PLC tag (for example an element of an array of UDT); the runtime substitutes the full tag name.
The well-known limitation: symbolic multiplexing does not support PLC UDTs that contain BOOL members used as commands from HMI to PLC. Displaying values is fine; toggling or setting individual bits inside a UDT through the multiplexed pointer is not. This article shows three field-proven workarounds that stay inside the TIA Portal V15/V16 Comfort Panel runtime, validated against the SIMATIC S7-1500 / ET 200MP Manual Collection (TIA Portal V15.1) and the Comfort Panel product catalog (e.g. 6AV2124-0GC01-0AX0 TP700 Comfort).
Prerequisites
| Item | Requirement |
|---|---|
| Engineering tool | TIA Portal V15.1 or V16 (WinCC Comfort / Professional) |
| HMI runtime | Comfort Panel firmware >= V15.1 Update 2 for V15 project; >= V16 Update 1 for V16 project |
| PLC | S7-1500 / ET 200MP (CPU 1511-1 PN and up). S7-1200 also works with reduced array limits. |
| PLC data type | One or more UDTs declared in the PLC data types folder (e.g. typeAI, typeValve) |
| PLC DB | Global DB with ARRAY[1..n] of "typeAI" instances, plus an INT index tag |
| HMI tags | External HMI tags of the same UDT (created in the HMI tag table) if faceplate IO fields are used |
| Script runtime | VB script option must be enabled on the Comfort Panel (Runtime Settings > Scripts) |
Why Symbolic Multiplexing Fails on BOOL Members
The WinCC Comfort runtime resolves a multiplexed tag by replacing a placeholder in the configured tag name with the value of the index tag. The HMI-to-PLC write path for a BOOL field expects a single-bit address, not a bit extracted from a larger structure. When the index points to "MyDB".Analog[7].Value, the runtime can format the value, but it cannot decompose "MyDB".Analog[7].Reset into a writable one-bit command. The dialog box for the connection remains empty and the property disappears from the IntelliSense.
Two structural rules follow from this:
- You can multiplex
REAL,INT,DINT,WORD,DWORDmembers for display and for numeric input. - You cannot multiplex a BOOL member that must be written from the HMI. The only writable symbols that the runtime can substitute are sized to one whole data word (BOOL buttons that are wired to absolute bit addresses still work because they are not multiplexed).
Method 1 - Array of UDT with Symbolic Multiplexing (Display Only)
This is the cleanest method for projects where the operator only needs to read analog values and additional INT/WORD status fields.
PLC side
- Create a UDT
typeAIwith membersValue : REAL,Raw : INT,HighLimit : REAL,LowLimit : REAL,Status : WORD. - Create a global DB
DB_AIand addArrayAna : ARRAY[1..64] OF "typeAI". - Add an
INTtagiIndexin the same DB (or any DB accessible from HMI).
HMI side
- Open the HMI tag table. Create one external tag of PLC UDT type for each field you want to display (for example
HMI_AI_Valueof typeREAL,HMI_AI_Rawof typeINT). Leave the PLC address empty for now. - Open the HMI screen, drop an IO field and open Properties > General > Tag.
- Switch the tag selection to Multiplex. In Index Tag select the HMI tag that is mapped to the PLC tag
"DB_AI".iIndex. - Click Multiplexed Tag. In V15.1+ the dialog accepts an array element selector. Use the syntax:
where"DB_AI".ArrayAna[iIndex].ValueiIndexis the runtime index HMI tag (must be declared on the HMI side first). - Repeat for each member you want to display. Each IO field can use a different multiplexed tag, all driven by the same index.
Driving the index
Bind a "Select" button, a slider, or a screen number to the index tag. Operators then select channel 1..64 and the screen repaints without a popup.
Method 2 - Single Faceplate with Calculated Offset (Mixed Read/Write)
When you must also push commands (start calibration, acknowledge, reset) into the same object, build a single faceplate type, expose every UDT member as a faceplate tag, and call the faceplate with a calculated instance index from a surrounding screen.
Step 1 - Create the faceplate
- Right-click Faceplates > Add new faceplate. Name it
FP_AI. - Add faceplate tags of PLC UDT type:
FP_AI_Value : REAL,FP_AI_Raw : INT,FP_AI_Ack : BOOL,FP_AI_Reset : BOOL. - Place IO fields, bars and buttons on the faceplate. For the two BOOL buttons, leave the Tag field empty - you will wire them through the instance interface.
Step 2 - Provide the instance in the calling screen
- Create internal HMI tags
FP_AI_Value_i,FP_AI_Raw_i,FP_AI_Ack_i,FP_AI_Reset_iof the matching types. - In a global script or on the Loaded event of the surrounding screen, compute the address from
iIndexand assign it. In V15.1 you can use Tag multiplexing bound to the faceplate tag, with a symbolic index pointing to the same array element as in Method 1. - Drop one or more
FP_AIinstances on the screen. For each instance, set the Tag property ofFP_AI_Valueto the multiplexed tag"DB_AI".ArrayAna[iIndex].Value, and so on for the other members.
Step 3 - Toggle the BOOL members
Because the BOOL faceplate tags are not multiplexable, expose them as single-bit tags bound to absolute addresses. A clean way is to pack all command bits of all 64 objects into a single data block:
// In PLC DB_AI
CmdBits : ARRAY[1..64] OF WORD; // 16 command bits per object
// layout: bit 0 = Ack, bit 1 = Reset, bit 2 = Hold, ...
On the HMI, each faceplate instance receives:
FP_AI_Ack := "DB_AI".CmdBits[iIndex].X0
FP_AI_Reset := "DB_AI".CmdBits[iIndex].X1
Because the entire WORD member CmdBits[iIndex] is multiplexed symbolically, the bit slices .X0 and .X1 can be written from the HMI through the standard BOOL button. The runtime accepts a bit slice of a multiplexed word as a writable target.
Method 3 - Absolute Multiplexing with VB Script (Legacy Style)
Engineers who maintain V13/V14 projects or need to control which physical DB the runtime writes to can use a VB script on the faceplate's Event > Click action. The script manipulates the multiplexed tag's address before it is sent to the PLC.
Configure the multiplex tag
- Create an HMI tag
MV_Ackof type BOOL with Address multiplexing enabled. - Configure the offset to one byte, starting at
%DB20.DBX0.0. The runtime will substituteDBX0.0withDBX(n).0wheren = iIndex.
VB script on a button
' SmartTag "MV_Ack" is a faceplate tag
' Index tag is bound at the faceplate instance level
Sub OnClick(ByVal Item)
Dim i
i = SmartTag("iIndex") ' read current object index 1..64
SmartTag("MV_Ack").Offset = i - 1 ' byte offset into DB20
SmartTag("MV_Ack").Value = True ' set the bit
' Pulse the command - many PLC programs need a rising edge only
SmartTag("MV_Ack").Value = False
End Sub
This pattern works because absolute multiplexing on Comfort Panels permits the runtime to resolve a single-bit address at the substituted location. The trade-off is that the script must be reachable on the screen, which forces you to use a faceplate-based event - dropping the script directly on a screen button does not let you change the address at runtime.
SmartTag().Offset access with a typed .Item(...) index. If you migrate a V15 project to V16, wrap the offset access in a #If V16 Then ... #Else ... #End If compile switch in the script editor to keep both versions buildable.Configuration Step-by-Step (Recommended: Method 2)
- Define the UDT in PLC data types. Keep BOOL commands out of the displayed tag set - put them in a parallel command DB.
-
Instantiate the array in a global DB:
Ana : ARRAY[1..64] OF "typeAI"andCmdBits : ARRAY[1..64] OF WORD. -
Add the index:
iIndex : INTin the same DB. -
Create faceplate tags in the Comfort Panel project for every UDT member you want to show, plus a faceplate tag of type
INTfor the index. - Build
FP_AIwith IO fields linked to the numeric faceplate tags and two buttons linked to the BOOL tags. -
Place one
FP_AIinstance on the screen. Wire each faceplate tag to a multiplexed HMI tag using the syntax"DB_AI".Ana[iIndex].Value, etc. -
Wire the BOOL buttons to
"DB_AI".CmdBits[iIndex].X0and"DB_AI".CmdBits[iIndex].X1. - Bind the index to a numeric input or a screen-selector.
- Compile and download both the S7-1500 project and the Comfort Panel image.
-
Runtime test by changing
iIndexand confirming that all 64 objects display their own values and that the buttons write to the correctCmdBitsword.
Verification and Commissioning
| Check | Expected result | How to confirm |
|---|---|---|
| Index 1 selected | IO fields show Ana[1] values |
Cross-check DB_AI.Ana[1].Value in the PLC online watch table |
| Index 64 selected | IO fields show Ana[64] values |
Watch table on DB_AI.Ana[64]
|
| Ack button press | Bit 0 of CmdBits[iIndex] goes high for one cycle |
Force iIndex and trace CmdBits
|
| Reset button press | Bit 1 of CmdBits[iIndex] pulses |
Same as above |
| Online change of index | Screen updates within 200 ms | Cyclic OB1 update rate on S7-1500 default 2 ms; HMI acquisition cycle 100 ms typical |
| Engineering change | Modify faceplate, all instances update | Right-click faceplate > "Update instances" |
Limitations and Edge Cases
- Array bounds - S7-1500 supports up to 65535 elements per array; Comfort Panel symbol resolution degrades above about 200 multiplexed instances in a single screen. Split the array into two screens if you need more.
- String members in UDTs are multiplexable for display only; the HMI cannot write to a STRING member of a multiplexed UDT.
-
Nested UDTs (UDT that contains another UDT) are supported as display tags but the multiplexer syntax becomes verbose:
"DB_AI".Ana[iIndex].Sub.Value. - Data blocks optimized for access - if the S7-1500 DB uses the "Optimized block access" attribute (the default for new DBs), the symbolic multiplexer still works; if the DB is set to "Standard" access, the syntax must use absolute addresses inside the array element.
- TP700 memory - 6AV2124-0GC01-0AX0 ships with 12 MB of project memory. A faceplate-heavy project with 50 instances typically consumes 2-4 MB. Plan for 100 instances max per project without an SD card upgrade.
Troubleshooting Matrix
| Symptom | Likely cause | Remedy |
|---|---|---|
IO field stays at ####
|
Index HMI tag is not declared or not bound | Verify the index tag exists in the HMI tag table and its PLC connection is correct |
Tag dialog rejects [iIndex]
|
Project compiled with V14 or earlier | Upgrade project to V15.1+; symbolic array indexing needs TIA V15.1 minimum |
| BOOL button writes to wrong object | Bit slice wired to absolute address instead of CmdBits[iIndex].X0
|
Re-wire to multiplexed word + bit slice |
| VB script error "Object required: SmartTag" | VB option disabled on the panel | Runtime Settings > Services > Scripts > enable VBScript |
| Compilable in TIA V15, fails in V16 | Legacy Offset property removed |
Wrap script in #If V16 Then ... #Else ... as shown above |
| Connection error 33:0011 "PLC not reachable" on tag write | Index out of array range | Clamp the HMI index to 1..64 on the PLC side using a LIMIT instruction |
| Faceplate instance does not update when index changes | Acquisition cycle too long | Lower acquisition cycle of the index tag and the faceplate tags |
Performance Notes for Large Projects
For a Comfort Panel running 50+ faceplate instances, three settings dominate the perceived responsiveness:
- HMI acquisition cycle - reduce from the default 1 s to 200 ms for faceplate-relevant tags. This is the single biggest factor.
- Update of the screen - in the screen properties, raise the "Number of tags to be updated per cycle" to the maximum your panel supports (TP700 = 50, TP1200 = 100, TP1900 = 200). Above these values the runtime queues updates and the multiplex lag becomes visible.
- PLC cycle time - the S7-1500 OB1 must run below 10 ms for a 64-element array. The PLCSIM simulator in TIA Portal defaults to 100 ms; test on a real CPU before commissioning.
FAQ
Can I multiplex a BOOL member of a UDT directly from the HMI?
No. The WinCC Comfort runtime can display a BOOL from a multiplexed UDT but cannot bind a writable HMI tag to it. Use Method 2 (parallel WORD command array with bit slicing) or Method 3 (absolute address multiplexing with VB script) to push a BOOL command.
What is the minimum TIA Portal version for symbolic UDT array multiplexing?
TIA Portal V15.1. V15.0 supports tag multiplexing but not the array-element syntax "DB".Array[iIndex].Field. V16 and V17 are fully compatible; the syntax is unchanged.
How many multiplexed instances can a TP700 Comfort handle in one screen?
Approximately 50 faceplate instances at default update settings, up to 100 if the update batch size is raised and acquisition cycle is reduced to 200 ms. Above that, split the array across multiple screens.
Does the PLC have to use optimized block access?
It can, but it is not required. Optimized access is the default for new S7-1500 DBs and works with symbolic multiplexing. If the DB uses standard access, the index element must use an absolute array offset (e.g. DB20.Ana[0] zero-based) inside the HMI tag.
Can I migrate a V15 multiplexing project that uses VB scripts to V16 without rewriting?
Yes, with care. V16 removed the SmartTag().Offset property used in legacy absolute multiplexing. Wrap the offset access in a #If V16 Then ... #Else ... block, or migrate the project to Method 2 (symbolic multiplexing with a parallel command array) which does not need a script at all.