WinCC Comfort TP1200 Faceplate Rotation Using Visibility

David Krause10 min read
SiemensTutorial / How-toWinCC
Licensed PE Working through this on a live machine? A Maine-licensed engineer can take it from here — included with IMD hardware, by the hour for everything else. Book an engineer

Overview

On a SIMATIC TP1200 Comfort running WinCC Comfort V15.1 in TIA Portal, engineers frequently need to rotate or coordinate two faceplates on the same screen so that they share visual real estate, animate differently, or appear only on demand. Unlike WinCC Unified faceplates, the WinCC Comfort/Advanced faceplate object is a sealed container: its absolute .Top, .Left, .Width, and .Height properties cannot be changed from VBScript at runtime, and the editor will reject the assignment with "Faceplates are not supported in scripts" at compile time.

This article documents three field-proven workarounds used on real TP1200 Comfort panels:

  1. Building N orientation variants of the faceplate (up, right, down, left) and toggling the Visibility property of each instance.
  2. Building a single faceplate with multiple internal visibility groups driven by a state property through an in-faceplate script.
  3. Triggering that in-faceplate script reliably at screen load and on demand through a dedicated Refresh property backed by a CPU tag.

The techniques are applicable to all Comfort Panel families (TP700, TP900, TP1200, TP1500, TP1900, TP2200) and to WinCC Runtime Advanced on PC, as long as the project is built with TIA Portal V15.1 or later within the V15.x branch.

Target firmware: WinCC Comfort/Advanced V15.1, image version Comfort V15.1 Update 6 or later recommended. Image < V15.1 has known issues with faceplate script triggers on UDT members; see the WinCC Comfort system manual release notes in the TIA Portal Help (menu: Help > Show installed documentation > WinCC Comfort V15.1).

Prerequisites

  • TIA Portal V15.1 (or V15.1 Update 6) with WinCC Comfort/Advanced option installed.
  • SIMATIC TP1200 Comfort (6AV2 124-1MC01-0AX0) or any Comfort/Advanced Runtime target.
  • A CPU connection tag set (HMI tags) of data type Bool, Int, or UDT used as the faceplate interface.
  • Basic familiarity with faceplate container objects and the faceplate interface editor (Properties > Interface).

Why Faceplate Position Cannot Be Scripted

The faceplate container in WinCC Comfort/Advanced is exposed as a sealed runtime object. Calling:

HMIRuntime.Screens("Screen_1").ScreenItems("Faceplate_1").Top = 100

raises a compile error: "Faceplates are not supported in scripts." The same restriction applies to .Left, .Width, .Height, and .Layer on a faceplate instance. Internally, the faceplate is rendered as a single composed graphic; only its Visibility, Appearance, and interface tag values are scriptable.

Pop-up screens are also unusable when more than one must be open simultaneously, since WinCC Comfort allows only a single pop-up layer on the active screen at a time. This forces engineers toward either duplication or visibility animation.

Solution 1 — Orientation Variants with Visibility Animation

The simplest robust technique is to draw the faceplate once for each logical orientation (up, right, down, left) and stack four instances on top of each other at the same .Top / .Left coordinates. Then animate Visibility on each instance with a tag value:

Orientation tag value Faceplate_UP visible Faceplate_RIGHT visible Faceplate_DOWN visible Faceplate_LEFT visible
0 true false false false
1 false true false false
2 false false true false
3 false false false true

Configure each instance via Properties > Animations > Visibility with an expression such as Orientation == 0, Orientation == 1, and so on. Use direct tag values rather than scripts for the animation trigger; direct animations are evaluated on the rendering thread and do not invoke the VBScript engine.

Pros and Cons

Aspect Orientation Variants
Compile time Longer; four faceplates to draw and maintain
Runtime performance Excellent on TP1200 — animations are native
Maintenance burden High — any change must be made four times
Tag cost One interface tag per visible group

Solution 2 — Single Faceplate with Visibility State Groups

For animated or complex faceplates that are repeated several times on a single screen, the four-variant approach becomes expensive on the TP1200 Comfort's ARM-based renderer. A single faceplate with internal visibility groups performs significantly better.

Step 1 — Add a Faceplate Visibility Property

  1. Open the faceplate in the editor.
  2. Open Properties > Interface.
  3. Add a new property of type Bool named Visible.

Step 2 — Group Internal Objects

Inside the faceplate, group the screen objects into the logical groups whose visibility you want to drive independently (e.g. Group_Header, Group_Body, Group_Footer, Group_Orientation_UP, Group_Orientation_RIGHT, Group_Orientation_DOWN, Group_Orientation_LEFT).

Step 3 — Add Internal State Booleans

Inside the faceplate, declare one Bool internal tag per group, for example:

internal.Bool bHeader, bBody, bFooter, bOriUp, bOriRight, bOriDown, bOriLeft

Step 4 — Configure Visibility Animations

For each group, open Properties > Animations > Visibility and bind it to the corresponding internal bool tag.

Step 5 — Add a Switch-Case Script on the Refresh Property

Open Properties > Events > Value changed on the new Refresh property and add a VBScript:

Select Case State
    Case 0 ' Up
        bOriUp      = True
        bOriRight   = False
        bOriDown    = False
        bOriLeft    = False
    Case 1 ' Right
        bOriUp      = False
        bOriRight   = True
        bOriDown    = False
        bOriLeft    = False
    Case 2 ' Down
        bOriUp      = False
        bOriRight   = False
        bOriDown    = True
        bOriLeft    = False
    Case 3 ' Left
        bOriUp      = False
        bOriRight   = False
        bOriDown    = False
        bOriLeft    = True
    Case Else
        bOriUp      = True
        bOriRight   = False
        bOriDown    = False
        bOriLeft    = False
End Select

The script is invoked once when the faceplate loads and again whenever the bound Refresh tag changes value. Internal bools then drive the visibility animations natively.

Triggering the In-Faceplate Script on Screen Load

The faceplate itself does not raise a "Loaded" event in WinCC Comfort the way a screen does. To force a single execution when the screen opens, you must drive the Refresh property from outside the faceplate.

Common pitfall: Using an internal HMI tag and changing it from a screen-level script will not fire the value-changed event inside the faceplate. WinCC Comfort suppresses internal-tag value-changed events to prevent infinite loops and only raises the event on I/O field interaction. Always use a tag whose acquisition is "Cyclic on demand" from the PLC, or a directly-linked HMI tag from the CPU area pointer.

Wiring the Refresh Trigger

  1. Add a CPU-side tag in the PLC, e.g. "DB_Faceplates".RefreshFaceplate of type Bool.
  2. Expose it as an HMI tag with acquisition mode Cyclic continuous, 100 ms cycle.
  3. Drag the HMI tag onto the Refresh property of every faceplate instance on the screen.
  4. In the PLC, write TRUE to the tag continuously (or increment a counter every scan).
  5. On the screen, a loaded event script may set Refresh = 0 to force a fresh 0→1 edge so the value-changed event fires once when the screen is entered.

Using UDT Members as Faceplate Interface Variables

Many projects parameterize faceplates through a UDT instance tag (e.g. TypeFaceplateData) bound to the faceplate interface. WinCC Comfort V15.1 fully supports value changed events on UDT member variables — you do not need a separate scalar refresh tag if every UDT member used inside the script is a Bool, Int, or Real.

However, mixing the UDT event with a dedicated Refresh boolean is the cleanest pattern:

  • The UDT carries business state (orientation, mode, level).
  • The Refresh boolean triggers the in-faceplate re-derivation.

If you do not want to consume a PLC tag, place the Refresh property behind an HMI internal tag that you toggle from a button event on the screen. The button click is the only context in which internal-tag value changes reliably raise the event.

TP1200 Comfort Performance Notes

The TP1200 Comfort uses a 1.2 GHz ARM Cortex-A9 with 256 MB RAM. Past testing on TP1200 panels showed that faceplates relying on large numbers of layered objects with dynamic visibility animations triggered by VBScript (rather than direct tag binding) become laggy when more than three or four instances are visible simultaneously. To keep the panel responsive:

  • Bind visibility animations directly to tag values, not to script-set internal tags.
  • Limit each faceplate to fewer than 30 dynamic objects where possible.
  • Avoid HMIRuntime calls from inside the faceplate script; only touch internal tags and properties.
  • Prefer a single faceplate with multiple internal groups over several complete faceplate instances.

Verification Checklist

  1. Compile the project (TIA Portal > Project > Compile > Software (rebuild all)) — confirm there are no "Faceplates are not supported in scripts" warnings.
  2. Start WinCC Runtime Simulator and open the screen containing the faceplates.
  3. Toggle the orientation tag in the HMI tag table and confirm exactly one orientation becomes visible at a time.
  4. Force the Refresh tag 0→1→0 and verify the in-faceplate script executes once per edge.
  5. Download the project to the TP1200 Comfort and repeat the test under real firmware to rule out simulator-only behavior.
  6. Monitor panel CPU load in the service page (Settings > Service > Performance) to confirm render time stays below ~60 ms per cycle.

Troubleshooting Matrix

Symptom Likely cause Fix
Compile error "Faceplates are not supported in scripts" Script tries to write .Top/.Left on a faceplate Switch to visibility animation; remove all position writes
Script does not fire on screen load Internal HMI tag used as trigger; internal events are suppressed Use a CPU-side tag toggled from PLC, or trigger via button event
Faceplate flickers when state changes Visibility animation bound to a script-set internal tag Bind visibility animation directly to the interface tag value
TP1200 becomes laggy with several faceplates Too many layered instances or too many script-driven objects Consolidate to single faceplate with internal groups; reduce dynamic objects
UDT value-changed event never fires inside faceplate UDT member is a complex type or array not supported as event source Use a scalar Bool/Int UDT member, or add a dedicated Refresh scalar

Migration Note — WinCC Unified Faceplates

If the project is later migrated to WinCC Unified (TIA Portal V17 or later with a Unified Comfort Panel), the constraints above change: faceplate position can be animated, instance scripts can use the full HMIRuntime object model, and faceplates can be opened from other faceplates while preserving the connection. See the Siemens Support forum entry "Simple Sample and TIPs - WinCC Unified - Faceplate" for examples of dynamic faceplate invocation. For projects moving from WinCC Comfort to Unified, the migration guide section 3.4.5 "Faceplates" documents how to align the original faceplate geometry on the new canvas.

Summary

On WinCC Comfort V15.1 / TP1200 Comfort, faceplate position is immutable from scripts; rotation, transition, and re-layout must be implemented through visibility rather than geometry. For projects with one or two instances on screen, four orientation variants driven by an Int tag are the fastest path. For projects with several instances or for animated faceplates, a single faceplate with internal visibility groups — triggered via a dedicated Refresh property backed by a CPU tag — scales cleanly and avoids the lag seen with script-driven layered instances.

How do I move a WinCC Comfort faceplate at runtime?

You cannot change the .Top or .Left of a faceplate instance from VBScript in WinCC Comfort V15.1; the editor rejects the assignment with "Faceplates are not supported in scripts." Use visibility animation on multiple pre-positioned instances instead, or migrate to WinCC Unified where faceplate geometry is scriptable.

How do I trigger a script inside a faceplate exactly once when the screen loads?

Add a Refresh property of type Bool to the faceplate interface and bind it to a CPU-side tag toggled from the PLC. Internal HMI tags do not raise value-changed events reliably in WinCC Comfort, so use a CPU tag or a button event instead. The in-faceplate script on value changed will then execute on each 0→1 edge.

Can I use a UDT tag as a faceplate interface variable in WinCC Comfort V15.1?

Yes. TIA Portal V15.1 supports UDT instances as faceplate interface tags, including value-changed events on scalar UDT members (Bool, Int, Real). For complex UDT members such as nested structs or arrays, place a dedicated scalar Refresh property next to the UDT and trigger the script from that scalar.

Why does my TP1200 Comfort become laggy when several animated faceplates are on one screen?

Script-driven visibility animations on layered faceplate instances cost more CPU than direct tag-bound animations. Consolidate into a single faceplate with internal visibility groups bound directly to tags, keep each faceplate below roughly 30 dynamic objects, and avoid HMIRuntime calls inside faceplate scripts to keep render time under 60 ms per cycle on the TP1200.

Can I open two pop-up screens at once to show two coordinated faceplates?

No. WinCC Comfort only allows a single active pop-up layer per screen. To show two coordinated faceplates simultaneously, place them directly on the base screen and use visibility animation rather than pop-up screens.

Back to blog