Overview
Faceplates in Siemens WinCC TIA Portal (Comfort, Advanced, and Professional) are reusable graphical HMI objects that consolidate tag connections, animations, and scripts behind a single instanceable container. In WinCC V11, the faceplate editor was still maturing and user-defined data types (UDTs / PLC data types) from the S7 controller could not be directly linked to faceplate interface tags. This forced engineers to build faceplate-style objects by hand using screen windows, tag prefixes, and event-driven scripts. This reference documents the field-proven workaround used when UDT-bound faceplates are unavailable, and extends it with the multi-instance animation pattern required for motor, valve, and PID faceplate libraries.
Prerequisites
- STEP 7 / TIA Portal V11 or later (V13, V14, V15.1, V16 tested with the same method).
- WinCC Comfort, Advanced, or Professional V11 SP2 (or later) installed and licensed.
- An S7-300 / S7-400 / S7-1200 / S7-1500 controller project with a downloaded DB containing the process variables (motor speed, temperature, current, control bits, etc.).
- HMI tags already declared in the default tag table of the HMI device.
- Read access to the Siemens configuration manual: Configuration instruction for creating faceplates with WinCC Comfort or WinCC Advanced (entry ID 68062988 on the Siemens Support portal).
Understanding the V11 UDT Limitation
In WinCC V11, when you create a faceplate and add tags to its interface, only elementary data types (BOOL, INT, REAL, STRING, etc.) are accepted. Adding a structured tag pointing to a derived data type (for example MOTOR_1 built on a UDT containing speed, temperature, current, control) fails with the faceplate type-check error or is silently rejected at compile time. Siemens documented this restriction locally for V11; support for fully-typed faceplate interfaces was introduced progressively in V13 SP1 and stabilized in V15.1.
Until you migrate to a TIA Portal version that supports structured faceplate tags, the supported replacement is to simulate a faceplate with a screen window, drive its contents with a tag prefix, and animate visibility/position from a global index tag.
Step-by-Step: Building a Faceplate-Style Screen Window
1. Create the PLC data block
Define a UDT in the S7 controller (or a DB with a hand-typed structure). Example for a motor block on an S7-1500:
TYPE "UDT_MOTOR"
VERSION : 0.1
STRUCT
speed : REAL; // RPM feedback
temperature: REAL; // Winding temp, degC
current : REAL; // Amps RMS
control : WORD; // Engineer control word
config : BOOL; // Maintenance enable bit
run_cmd : BOOL; // Start command
fault : BOOL; // Fault latched
END_STRUCT;
END_TYPE
Instantiate the DB:
DATA_BLOCK "DB_MOTORS"
STRUCT
motor_1 : "UDT_MOTOR";
motor_2 : "UDT_MOTOR";
motor_3 : "UDT_MOTOR";
END_STRUCT;
END_DATA_BLOCK
2. Expose the tags to the HMI
Open the HMI device, default tag table, and add one access tag per element of every instance if you cannot point to the structured DB directly. The naming convention used in the original field workflow is:
| HMI Tag | PLC Address | Type | Purpose |
|---|---|---|---|
| MOTOR_1_speed | DB_MOTORS.motor_1.speed | REAL | Display |
| MOTOR_1_temperature | DB_MOTORS.motor_1.temperature | REAL | Display |
| MOTOR_1_current | DB_MOTORS.motor_1.current | REAL | Display |
| MOTOR_1_control | DB_MOTORS.motor_1.control | WORD | Engineer write |
| MOTOR_1_config | DB_MOTORS.motor_1.config | BOOL | Maintenance enable |
| MOTOR_1_run_cmd | DB_MOTORS.motor_1.run_cmd | BOOL | Start |
| MOTOR_1_fault | DB_MOTORS.motor_1.fault | BOOL | Indication |
Repeat for MOTOR_2_* and MOTOR_3_*. For 100 motors this means 700 HMI tags; the structured-tag shortcut in V17+ avoids this entirely.
3. Build the faceplate picture
- Add a new screen to the HMI project. Name it
FP_Motor. - Place an I/O field linked to the tag
.speed(note the leading dot — this is the tag prefix placeholder, not a real tag name). - Add a bar graph linked to
.current. - Add a text field bound to
.temperaturewith a limit-value color animation (green < 80 degC, yellow 80-95, red > 95). - Add a button with the event Press → SetPropertyByConstant to toggle a bit, e.g. writing 1 to
.run_cmd. - Add a second button wired to
.controlfor engineer maintenance.
4. Insert the screen window on the process screen
- Open the root process picture (e.g.
Screen_Overview). - Drag a Screen Window object onto the canvas.
- Configure:
-
Screen →
FP_Motor -
Tag prefix →
MOTOR_1_(must end with the separator configured in the HMI; the underscore convention is recommended).
-
Screen →
- All tag references prefixed with a dot inside the screen window are concatenated with the prefix, so
.speedresolves toMOTOR_1_speed.
5. Change the motor number via SetPropertyByConstant
Add a motor selector dropdown on the overview screen. On the Change event of that dropdown, use the system function SetPropertyByConstant to rewrite the screen window's tag prefix:
- Property:
TagPrefix - Object:
ScreenWindow_1 - Value: dynamic, built from the dropdown index, e.g.
"MOTOR_" + IntToString(ddMotor.Index) + "_"
The screen window re-instantiates the picture with the new prefix; all 700 tags become reachable through one selector without any faceplate multiply-instance dialog.
Animating a Secondary Window from a Prefix-Driven Bit
The harder problem is making a second screen window (a maintenance popup) appear when the engineer presses a button inside the first faceplate window. The trigger bit lives in the same prefix namespace, so you cannot simply bind the secondary window's Visible property to the prefixed tag — that would re-prefix it twice.
Solution: the @NOTP:: tag-name qualifier
WinCC provides the qualifier @NOTP:: (no tag prefix) to indicate that a tag name must be looked up without the current screen window's prefix. The function was introduced specifically for this cross-prefix animation case and is documented in the WinCC Comfort/Advanced manual under "Accessing tags in screen windows".
- Define a global index tag (no prefix) in the default tag table, e.g.
user.config,user1.config,user2.config. These are ordinary BOOL tags whose names happen to be shared with the per-instanceconfigbit — they act as the "animator" for the maintenance window. - Inside the faceplate picture, the button that the engineer presses writes to
.config(prefixed, e.g.MOTOR_1_config). Use a script or two SetBit functions to mirror the value to the globaluser.config:
// VBS inside the button Press event
SetBit user.config ' global animator, @NOTP:: implied by global name
SetBit .config ' local instance, prefix-resolved to MOTOR_1_config
- On the maintenance popup screen window, set the Visible animation to the tag
user.configwritten with the@NOTP::qualifier. In the animation dialog enter the tag as:
@NOTP::user.config
The runtime ignores the screen window's current prefix and resolves the tag against the global tag table. The maintenance window shows whenever any motor's config bit is set.
Scaling to hundreds of instances
Maintaining hundreds of user1.config, user2.config ... bits is impractical. Replace the fixed array with a single WORD tag user_mask, where each bit represents one motor. The faceplate button writes:
' Set bit n of user_mask
SetBit user_mask.n
On the maintenance screen window, drive visibility from a script that decodes which bit is set and forwards the index to the screen window's TagPrefix property using SetPropertyByTag rather than SetPropertyByConstant. This keeps one global animator and one maintenance window for the entire plant.
| Problem | Root Cause | Fix |
|---|---|---|
| Faceplate rejects UDT tag | V11 faceplate type-check disallows structured tags | Use screen window with element-by-element tags |
| Screen window ignores new tag prefix | Tag prefix update requires re-instantiation | SetPropertyByConstant on TagPrefix property of the screen window |
| Secondary window does not appear on prefix-driven bit | Tag is double-prefixed by the inner screen window | Prefix the tag reference with @NOTP:: to bypass the prefix |
| Hundreds of animator tags needed | One global BOOL per instance is unscalable | Encode in a WORD mask and decode with SetPropertyByTag |
| Maintenance popup shows wrong motor's data | Secondary window uses a static prefix | Set the secondary window's TagPrefix from the same index that triggered it |
Tag-Prefix Reference Table
| Property | Value to enter | Resolves to |
|---|---|---|
| Plain reference inside screen window | .speed |
<TagPrefix>speed |
| Global reference inside screen window | global_speed |
global_speed (no prefix) |
| Explicit no-prefix reference | @NOTP::user.config |
user.config (no prefix, never relative) |
| External PLC reference | DB_MOTORS.motor_2.fault |
Direct absolute access (no prefix applied) |
Upgrading to Modern Faceplates
The technique above is a workaround for V11 only. Starting with TIA Portal V15.1 and continuing through WinCC Unified V20, faceplate interfaces accept structured tags directly. To migrate:
- Open the HMI project in TIA Portal V17 or later.
- Convert the screen-window-based faceplate to a true faceplate: right-click the screen window → "Create faceplate".
- Replace the per-element tag list with a single structured tag of type
UDT_MOTOR. - For each instance, use the Faceplate type property in the faceplate container to select the version. The configuration of the Faceplate type property is documented at Siemens docs — Creating a faceplate instance (V20).
- Delete the global animator tags (
user.configetc.) and animate directly on the structured tag's element.
Verification Procedure
- Compile the HMI project; the warnings "Tag prefix not defined" or "Tag not found" must be zero.
- Download to the HMI runtime (RT / Unified PC / Panel).
- On the overview screen, change the motor selector dropdown. The faceplate values must update within one polling cycle (typically 1 s for S7-1500 / 2 s for S7-300).
- Press the maintenance button. The popup must open with the prefix-resolved control word for the selected motor.
- Change the selector while the popup is open. The popup must follow the new motor because the prefix was re-applied.
- Close the popup, click a different motor's button. Verify the popup opens for the new motor and not the previously selected one.
.control word typically forces a setpoint, jog, or override. Wire a hardwired Engineer Present key-switch on the panel and an enable in the PLC safety logic before exposing the maintenance I/O field to operators. The screen-window technique does not change the underlying PLC safety obligation; it is a visualization-only construct.Troubleshooting Matrix
| Symptom | Likely Cause | Corrective Action |
|---|---|---|
| Tag prefix change has no effect on screen window contents | TagPrefix property name differs by TIA version (TagPrefix vs. PictureName) | Open the property list for the screen window; the property is "TagPrefix" in V11-V15 and "TagPrefix" in Unified |
| Maintenance popup always visible |
@NOTP:: qualifier missing or global tag not declared |
Verify the global BOOL exists in the default tag table; prefix the animation reference with @NOTP::
|
| Compile error "Tag prefix invalid" | Prefix contains characters disallowed in tag names | Use only [A-Za-z0-9_]; do not include the dot, comma, or space |
| Button toggles wrong motor after selector change | SetPropertyByConstant fired before re-instantiation | Add a 200 ms delay or call SetPropertyByConstant in the Change event, not Press |
| Runtime warning: "Access to non-existent tag" | Element tag missing from default table | Generate all per-instance tags via a PLC tag table export to Excel and import to HMI |
Best-Practice Checklist
- Always use a single-character or short separator (
_) for the tag prefix; long prefixes consume HMI string memory. - Keep the maintenance popup as a separate screen window, never as a layered object on the same faceplate canvas — V11 cannot animate position of child objects reliably from prefixed tags.
- Document the global animator tag (
user.config) in a comment block at the top of the default tag table so future engineers understand the@NOTP::usage. - Plan the migration to a true faceplate type in TIA V17+ before the project exceeds ~50 instances; the per-element tag sprawl becomes unmaintainable beyond that scale.
- Use SetPropertyByTag (not ByConstant) when the prefix index is itself a tag value; it avoids string concatenation in VBS and runs on the C-level tag engine.
Why does WinCC TIA V11 reject UDT tags in faceplates?
The V11 faceplate editor validates the interface tag list against elementary data types only. Structured (UDT-derived) tags were added in TIA V13 SP1 and stabilized in V15.1. Until you upgrade, expose the UDT elements as individual HMI tags and use a screen window with a tag prefix instead.
How do I change the motor shown in a screen window faceplate?
Use the system function SetPropertyByConstant on the screen window's TagPrefix property from a selector's Change event. The new prefix is concatenated to every dot-prefixed tag reference inside the window at the next redraw cycle.
What is the @NOTP:: tag prefix qualifier used for?
@NOTP:: forces the runtime to resolve a tag name without applying the current screen window's tag prefix. It is required when an animation on a secondary window must react to a bit that lives in the same prefix namespace as the primary faceplate, preventing the double-prefix resolution.
How can I scale the workaround to 100+ motor faceplates?
Replace per-instance global animator bits with a single WORD mask. The faceplate button sets bit n of the mask; a script on the maintenance screen window decodes the bit and applies the matching TagPrefix via SetPropertyByTag. One mask, one popup, 100 instances.
When should I migrate from the screen-window technique to a true faceplate?
Plan the migration when the project is upgraded to TIA Portal V17 or later. WinCC Unified V20 supports structured tag interfaces natively, and the conversion is performed by right-clicking the screen window and choosing "Create faceplate" as documented in the Siemens docs portal.