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:
- Building N orientation variants of the faceplate (up, right, down, left) and toggling the
Visibilityproperty of each instance. - Building a single faceplate with multiple internal visibility groups driven by a state property through an in-faceplate script.
- Triggering that in-faceplate script reliably at screen load and on demand through a dedicated
Refreshproperty 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.
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
- Open the faceplate in the editor.
- Open Properties > Interface.
- Add a new property of type
BoolnamedVisible.
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.
Wiring the Refresh Trigger
- Add a CPU-side tag in the PLC, e.g.
"DB_Faceplates".RefreshFaceplateof typeBool. - Expose it as an HMI tag with acquisition mode Cyclic continuous, 100 ms cycle.
- Drag the HMI tag onto the
Refreshproperty of every faceplate instance on the screen. - In the PLC, write
TRUEto the tag continuously (or increment a counter every scan). - On the screen, a loaded event script may set
Refresh = 0to 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
Refreshboolean 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
HMIRuntimecalls 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
- Compile the project (TIA Portal > Project > Compile > Software (rebuild all)) — confirm there are no "Faceplates are not supported in scripts" warnings.
- Start WinCC Runtime Simulator and open the screen containing the faceplates.
- Toggle the orientation tag in the HMI tag table and confirm exactly one orientation becomes visible at a time.
- Force the
Refreshtag 0→1→0 and verify the in-faceplate script executes once per edge. - Download the project to the TP1200 Comfort and repeat the test under real firmware to rule out simulator-only behavior.
- 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.