Siemens HMI Text Lists Setup in TIA Portal with Symbolic I/O

David Krause13 min read
HMI ProgrammingSiemensTutorial / How-to
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

Dynamic operator messages on a Siemens HMI panel do not require custom scripts when the design is built around a Text List bound to a Symbolic I/O Field. The PLC writes a single integer to a tag; the HMI selects the matching entry from the text list and renders it on screen. This approach is supported across the SIMATIC HMI portfolio in TIA Portal — from KTP400 Basic to the Unified Comfort Panels — and survives controller–HMI firmware updates, runtime migrations, and language switches without recompilation of VB or C code on the panel.

This reference documents the configuration procedure for the Text List + Symbolic I/O Field method, contrasts it with the older SetText / ChangeTag script approach, and supplies working SCL/LAD logic, parameter tables, and a troubleshooting matrix for field commissioning. It applies to:

  • TIA Portal V16 / V17 / V18 / V19 (legacy method also valid on V13–V15.1)
  • SIMATIC WinCC Comfort / Advanced (Comfort Panels, RT Professional)
  • SIMATIC WinCC Unified (Unified Comfort Panels, MTP devices)
  • SIMATIC S7-1200 (CPU firmware V4.2 and later)
  • SIMATIC S7-1500 (CPU firmware V1.8 and later)
  • SIMATIC ET 200SP / ET 200pro HMIs

Prerequisites

Item Requirement Notes
TIA Portal V16.0 Update 6 or later recommended Text List API stable from V14 SP1 onward
STEP 7 Professional License dongle or trial WinCC Comfort/Advanced add-on required for HMI configuration
SIMATIC HMI panel Image ≥ 16.0 for V17, ≥ 17.0 for V18, ≥ 18.0 for V19 Match image to TIA Portal version to avoid compatibility warnings
PLC CPU S7-1200 FW ≥ 4.2 or S7-1500 FW ≥ 1.8 Older firmware lacks full Symbolic I/O Field data-type support
PLC ↔ HMI connection PROFINET or PROFIBUS (S7 routing) HMI tag must be configured with the same name as the PLC tag or aliased
Engineering access Project read/write on TIA Portal Compile + download both PLC and HMI devices after changes
Critical: Always compile the PLC block first and then the HMI. If the HMI tag points to a non-existent PLC tag, the HMI compiler emits Error 132002 "Tag not linked to a PLC tag". The runtime shows the placeholder ### instead of the configured text.

Architecture: How Text Lists Resolve at Runtime

The Symbolic I/O Field reads an INT/WORD/DINT value from a configured tag. At runtime, the WinCC engine looks up that value inside the assigned Text List and displays the corresponding string in the configured font, color, and language. No script interpreter executes; the lookup is a single hash-map access on the panel.

PLC CPUWrites INT to TagHMI Tag (INT)e.g. "HMI_StatusMsg"Text List "StatusList"0="Idle" 1="Run" 2="Fault"Symbolic I/O FieldRenders selected string

Step-by-Step Configuration

Step 1 — Create the Text List

  1. In the TIA Portal project tree, expand your HMI device (e.g., HMI_1 [TP1200 Comfort]).
  2. Open Text and graphic lists → Text lists.
  3. Double-click Add new. Rename it to something application-specific (e.g., tlMachineStatus). Names must be unique, ≤ 128 chars, and conform to IEC 61131-3 identifiers.
  4. In the List entries table, fill in the Value column with integers. The runtime accepts any whole number that fits an INT (-32768 … +32767) or DINT (-2.1e9 … +2.1e9) when the list is declared Decimal.
  5. Fill the Text column with the operator-facing string for each value. Empty rows are skipped at runtime.
  6. Set Default if you want a fallback for unrecognized values; otherwise the Symbolic I/O Field shows the configured default placeholder.
  7. Repeat for each language in Project languages (TIA Portal > Languages & Resources). All entries must be translated before exporting the project to a non-default runtime language, otherwise English fallback is rendered.
Value (INT) Text (English) Text (Spanish) Text (German)
0 Idle — waiting for start Inactivo — esperando arranque Bereit — Startfreigabe
1 Running En marcha In Betrieb
2 Holding En pausa Im Halt
3 Fault — E-Stop active Fallo — paro de emergencia Störung — Not-Halt aktiv
4 Maintenance mode Modo mantenimiento Wartungsbetrieb
10 Recipe 10 loaded Receta 10 cargada Rezept 10 geladen
Tip: Reserve gaps in the value range (e.g., 10, 20, 30) so future states can be inserted without renumbering. Value 0 should always be defined; WinCC uses it as the boot state.

Step 2 — Add the HMI Tag

  1. Under HMI tags, double-click Add new.
  2. Name: HMI_StatusMsg (must match the Symbolic I/O Field configuration below).
  3. Data type: INT. (Use WORD or BYTE only if your PLC variable is the same width; mismatched widths truncate silently.)
  4. Connection: link to the matching PLC tag, e.g., DB_Main.StatusCode.
  5. Acquisition mode: Cyclic in operation, cycle 500 ms for status displays. Faster cycles (100 ms) waste HMI bus bandwidth without visible benefit for text lists.
  6. If you prefer local HMI logic, leave the PLC link empty and use an HMI-side script or tag calculation; for production machines, always link to the PLC to keep the source of truth in the controller.

Step 3 — Place and Configure the Symbolic I/O Field

  1. Open the target screen (e.g., RootScreen_01).
  2. From the Tools palette, drag a Symbolic I/O Field onto the canvas.
  3. In the properties pane under General:
    • Tag: select HMI_StatusMsg.
    • Display: Text list (NOT Numeric and NOT Date/Time).
    • Text list: select tlMachineStatus.
    • Mode: Output (read-only on the HMI). Use Input/Output only if the operator must change the value via a separate selection field.
  4. Under Appearance:
    • Background: transparent if embedding into a status bar.
    • Font: at least 14 pt for 7" panels, 16 pt for 10" panels.
    • Text color: bind to a PLC-driven color tag if you want fault highlighting (red on value 3, green on value 1, etc.).
  5. Under Animations: optional — add an Appearance animation driven by HMI_StatusMsg that swaps the background to red when value = 3.

Step 4 — PLC Program Logic

Write the integer that selects the desired list entry from any OB (e.g., OB1, OB35, or a cyclic interrupt). The block below is valid SCL for both S7-1200 (FW 4.2+) and S7-1500. Place it in a function block FB_StateMachine with instance DB DB_StateMachine.

// SCL: Map machine states to Text List values
FUNCTION_BLOCK FB_StateMachine
VAR
    StateCode : INT;    // HMI-bound tag
    HeaterOn  : BOOL;
    EStopOK   : BOOL;
END_VAR
BEGIN
    IF NOT EStopOK THEN
        StateCode := 3;          // "Fault — E-Stop active"
    ELSIF HeaterOn THEN
        StateCode := 1;          // "Running"
    ELSE
        StateCode := 0;          // "Idle — waiting for start"
    END_IF;
END_FUNCTION_BLOCK

For a multi-state model with explicit numbering and a case ladder (easier to extend than if/elsif):

// SCL: 5-state machine with reserved gaps
CASE nCurrentState OF
    0:  HMI_StatusMsg := 0;     // Idle
    1:  HMI_StatusMsg := 1;     // Running
    2:  HMI_StatusMsg := 2;     // Holding
    3:  HMI_StatusMsg := 3;     // Fault
    10: HMI_StatusMsg := 10;    // Recipe 10
ELSE
    HMI_StatusMsg := -1;        // undefined — will render default text
END_CASE;

LAD equivalent (single network):

|    EStopOK   HeaterOn   HMI_StatusMsg:=INT    |
|------[/]------+----------( MOV  3 )-----------|     // fault
|------[ ]------+----------( MOV  1 )-----------|     // running
|------[ ]------+[/]-------( MOV  0 )-----------|     // idle
Performance note: Updating the integer every PLC cycle is unnecessary. For status display, gate the write with a rising-edge-detected change-detect block (CHANGED tag from S7-1500 system constants) or with a 200 ms cyclic interrupt (OB200 on S7-1500) to avoid flooding the HMI bus.

WinCC Comfort vs WinCC Unified Differences

Aspect WinCC Comfort / Advanced WinCC Unified
Object name Symbolic I/O Field Symbolic I/O Field (same name)
Configuration path HMI tags → Text and graphic lists HMI tags → Text lists (Unified)
Tag data type INT, WORD, BYTE, DINT INT, DINT, LREAL (numeric)
Default display when value absent Last configured text or empty Shows # placeholder and logs warning to diagnostic view
Multi-language Up to 32 project languages Up to 32 project languages; runtime switching via SetLanguage system function
Scripting fallback VB scripts on value change JavaScript via Scripts pane
Recommended firmware Panel image ≥ 16.0 (TIA V16) Unified firmware ≥ 17.0 (TIA V17)

Text List vs Script — Engineering Trade-offs

Criterion Text List + Symbolic I/O Field Script (VB / JavaScript)
Compile time Compile only; no runtime JIT Compile + load script interpreter on first call
Performance Single hash-map lookup, < 5 ms String concat, can take 30–80 ms on first call
Cyber exposure No runtime scripting engine required VBScript / JScript engine must be enabled (security audit point)
Version compatibility Stable from TIA V14 SP1 → V19 Syntax changes between V14, V15.1, V16, V17, V18
Maintenance Centralized in one list, multi-language editor Code spread across screens, harder to translate
CPU load on panel Negligible 10–40 % during heavy script activity
Auditability Diff-friendly XML export of text lists Embedded strings inside script bodies

Recommendation: use Text Lists for any text that can be enumerated at engineering time. Reserve scripts for dynamic string composition (e.g., timestamps, live OEE values) where the text is computed at runtime.

Multi-Language Deployment

  1. In TIA Portal > Languages & Resources, enable the target runtime languages (Spanish, German, French, Chinese, etc.).
  2. For every Text List entry, fill all language columns. Untranslated cells display the reference-language string with a TIA Portal warning at compile time.
  3. Compile the HMI project. The compiler emits warning W12:6041 if any cell is untranslated.
  4. Configure the HMI > Language & Font > Active language = Set by PLC. Connect a PLC byte (e.g., DB_Lang.LangID) where 0 = English, 1 = German, 2 = Spanish per the WinCC language index table.
  5. Runtime switching: write the new language ID and call SetLanguage (Comfort) or use the Unified Language system tag.
LangID (Byte) WinCC Language Reference
0 English (United States) Default project language
1 Deutsch (Deutschland)
2 Español (España, alfabetización internacional)
3 Français (France)
4 Italiano (Italia)

Verification Procedure

After downloading the project to both PLC and HMI, perform the following checks before signing off commissioning:

  1. Power-cycle test. Cycle the HMI. The Symbolic I/O Field must display Idle — waiting for start (value 0) within 5 seconds. If the field shows ###, the tag is not linked.
  2. Force-tag test. In TIA Portal > Online & diagnostics > Force, write 1, 2, 3, 10 sequentially to DB_Main.StatusCode. Confirm each text appears within the configured acquisition cycle (500 ms default).
  3. Out-of-range test. Force 99999. The Symbolic I/O Field should show the configured default text (or blank if no default).
  4. Language switch test. Change DB_Lang.LangID from 0 → 2 and verify the Spanish strings render.
  5. Communication-loss test. Disconnect the PROFINET cable. The Symbolic I/O Field should freeze on the last value (not crash); the WinCC status bar shows the lost connection icon.
  6. Reboot-restoration test. Force a fault (value 3), reboot the HMI, confirm the fault text persists because the PLC tag is retentive (mark as Retain in the DB).

Troubleshooting Matrix

Symptom Probable Cause Fix
Field shows ### HMI tag not linked to PLC tag, or PLC tag deleted Re-link in HMI tag properties; recompile
Field shows 0 always Symbolic I/O Field set to Display: Numeric instead of Text list Switch the Display mode and re-download
Field shows raw number instead of text No Text List assigned in the Text list property Select the correct list from the dropdown
Text appears, then reverts to Idle PLC tag overwritten every cycle by an unrelated block Cross-reference StatusCode in the project (Ctrl+F) and remove the rogue assignment
Language switch does not change the text Reference language column not translated Fill all language cells; recompile; re-deploy runtime image
Field visible in TIA, missing at runtime Layer / screen-level visibility animation hides it Disable the animation during bench test
Compile error 132002 HMI tag references a PLC tag that does not exist in the compiled PLC Recompile PLC blocks first, then HMI
Compile warning W12:6041 Untranslated language cell Translate or accept the warning in Project languages > Reference language
Unnecessary bus load Acquisition cycle set to 100 ms with non-changing value Raise cycle to 500 ms; consider On change acquisition mode

Advanced Patterns

Color-Coded Status Bars

Bind the background color of the Symbolic I/O Field to an Appearance animation. Under Animations > Appearance, add three triggers driven by the same tag:

  • Value 0 (Idle) → background #E5E7EB (light grey)
  • Value 1 (Running) → background #16A34A (green)
  • Value 3 (Fault) → background #DC2626 (red), blink rate 1 Hz via Animations > Visibility

Enumerated PLC Type Instead of Magic Numbers

Replace raw INT literals with an enumerated PLC tag type (TIA V18+) so the SCL editor catches typos:

TYPE UDT_MachineState :
  STRUCT
    Idle          : BOOL;
    Running       : BOOL;
    Holding       : BOOL;
    Fault         : BOOL;
    Maintenance   : BOOL;
  END_STRUCT;
END_TYPE

VAR
    stState : UDT_MachineState;
    iCode   : INT;
END_VAR

iCode := SEL(i := stState.Idle,       IN0 := 0, IN1 := 3); // 3 if Idle
iCode := SEL(i := stState.Running,    IN0 := iCode, IN1 := 1);

Centralizing the Status Code in a Watchdog DB

For multi-station machines, write the status from each station FB into a shared DB_Diagnostics block. The HMI connects to DB_Diagnostics.MasterStatus. This avoids a tag proliferation and simplifies alarm filtering in WinCC.

Edge Cases and Field-Proven Caveats

  • Range overflow. Configuring a value greater than 32767 in an INT-typed list on legacy panels (FW < 16) wraps to negative. Always use DINT for values that may exceed INT range.
  • Trailing whitespace. TIA Portal preserves trailing spaces in Text List cells; WinCC renders them as a leading blank on the next selection. Trim strings before commit.
  • Special characters. Ampersands (&), less-than (<), and HTML tags inside Text List cells are escaped in WinCC Comfort but interpreted in WinCC Unified HTML rendering. Validate with the HTML preview pane.
  • Recipe parameter arrays. If the text depends on a recipe variable (e.g., recipe number 1..100), do not create 100 list entries; instead use an indirect text list with a parameter tag and concatenate in the Symbolic I/O Field's Text field using the %d placeholder.
  • Cold restart behavior. On Comfort Panels, the Symbolic I/O Field re-evaluates on power-up; if the PLC is still booting and the tag is uninitialized, the field shows the default text, not the live value. Add a startup-suppress tag if the field must remain blank during PLC boot.
  • Number formatting for non-INTEGER lists. The list accepts BYTE and WORD. Ensure the HMI tag type matches the PLC tag type byte-for-byte; mismatches cause silent truncation on Comfort Panels.

Related Configuration — Linking to PLC Data Blocks

  1. In the PLC project, open DB_Main.
  2. Add a new tag: StatusCode : INT; with Retain = true.
  3. Mark the DB as Optimized block access (S7-1200/1500 default) and enable Accessible from HMI.
  4. Compile and download the PLC.
  5. In the HMI project, edit HMI_StatusMsg > PLC tag > browse to DB_Main.StatusCode.
  6. If using symbolic access, ensure the HMI connection uses S7-1200/1500 protocol with the Symbolic access check box enabled; absolute addressing is legacy.

FAQ

What is the difference between a Text List and a Symbolic I/O Field in TIA Portal?

A Text List is a static lookup table mapping integer values to strings (and languages). A Symbolic I/O Field is a screen object that displays a tag value either as a number, date/time, or — when configured as Display: Text list — as the corresponding string from an assigned Text List. The Text List supplies the dictionary; the Symbolic I/O Field supplies the display surface.

Can I update the displayed text from the PLC without using VB scripts?

Yes. The PLC writes an INT (or DINT) value to a shared tag. The HMI's Symbolic I/O Field, configured with Display: Text list, automatically resolves the value to the matching string at runtime. No script interpreter runs on the panel.

How do I switch the displayed language at runtime?

Translate every Text List cell in Languages & Resources. Configure the HMI's Active language to Set by PLC and connect a byte tag (e.g., DB_Lang.LangID) where 0 = English, 1 = German, 2 = Spanish per the WinCC language index. The Symbolic I/O Field updates its text within one acquisition cycle (typically 500 ms).

Why does my Symbolic I/O Field show ### instead of the configured text?

The most common cause is a broken link between the HMI tag and the PLC tag. Open the HMI tag properties, re-link to the correct PLC tag (e.g., DB_Main.StatusCode), recompile both PLC and HMI, and re-download. TIA Portal will emit compiler error 132002 if the link cannot be resolved.

Which TIA Portal version is required for multi-language Text Lists?

Text Lists with full multi-language support are stable from TIA Portal V14 SP1 onward. For projects with more than 16 project languages, use TIA Portal V17 or later, which expanded the language index table to 32 entries and added per-cell fallback for missing translations.

Back to blog