Siemens HMI · Lab Manual

Siemens HMI I/O Status Screen in TIA Portal: Wiring, SCATTER, Text Lists and a Live DI/DO View

Maintenance teams lose minutes on every fault hunting for "which input is it?". This lab builds one HMI screen that answers it for a whole panel: type a byte number and see address, description, NO/NC contact type and live status for eight signals, with filters for ON, OFF, NC and faults. You get the wiring drawings, copy-paste PLC tags and DB, the SCATTER ladder, and text lists in the same format as a TIA Portal export.

2,500+ engineers trained 4.9/5 Google rating 21+ years, Chinchwad, Pune Next batch: contact for dates
Quick answer

Put the selected byte number in "HMI_Status".Card_No. In ladder, one branch per byte compares Card_No and runs SCATTER from %IBn into "HMI_Status".DI.Inp[0..7]. On the HMI, eight rows of symbolic I/O fields use text lists indexed by Card_No for address, description and NO/NC, and the DI.Inp bits for live status. An FC adds NC-fault, change and filter bits for the animations.

  • One screen and about twenty HMI tags cover 60 inputs and 20 outputs.
  • Text lists carry the descriptions, so a rename never touches the PLC.
  • NC contacts are shown as NC and turn the row red when they open.

I/O plan and hardware

The example is a sealed quench heat-treatment furnace. The I/O count is fixed at 60 digital inputs, 20 analog inputs, 20 digital outputs and 10 analog outputs, with the digital descriptions taken from the project text lists. Every card keeps spares for later changes.

Signal typeUsedModulesAddressesTerminal strip
Digital inputs602 × DI 32x24VDC HF%I0.0 – %I7.3 (spare %I7.4 – %I7.7)X10
Digital outputs201 × DQ 32x24VDC/0.5A HF%Q0.0 – %Q2.3 (spare %Q2.4 – %Q3.7)X20
Analog inputs203 × AI 8xU/I/RTD/TC ST%IW100 – %IW138 (spare 4 ch)X30
Analog outputs103 × AQ 4xU/I ST%QW100 – %QW118 (spare 2 ch)X40

Set the analog start addresses by hand (Device view → module → Properties → I/O addresses) to 100, 116 and 132 for the AI cards and 100, 108 and 116 for the AQ cards. Fixed addresses keep the tag list valid when a card is added later. The same approach is shown step by step in Siemens device configuration and tag creation.

Stage 1Terminal wiring drawings (EPLAN style)

Twelve drawing sheets in the layout an EPLAN P8 PLC overview uses: column grid, title block, terminal strip numbers, device tags and the PLC channel with its address. Use the selector to page through the rack, the four DI sheets, two DQ sheets, three AI sheets and two AQ sheets.

Loading drawing…

DI sheets show NO and NC contacts as wired in the field, so the drawing, the PLC NC mask and the HMI column all say the same thing. Wire colours follow DC practice: red L+, blue signal and 0 V.
Safety: Emergency stops %I2.3 and %I2.4 appear here for indication only. The stop function itself must stay in the hard-wired or safety-PLC circuit, never in this status logic.
Full digital input list – 64 channels
AddressDescriptionContactPLC tagTerminal
%I0.0Charge Fork BackwardNCDI_0_0_Charge_Fork_BackwardX10:1
%I0.1Discharge Fork BackwardNCDI_0_1_Discharge_Fork_BackwardX10:2
%I0.2Fork Base DownNCDI_0_2_Fork_Base_DownX10:3
%I0.3Fork Base UpNODI_0_3_Fork_Base_UpX10:4
%I0.4Charge Fork ForwardNODI_0_4_Charge_Fork_ForwardX10:5
%I0.5Discharge Fork ForwardNCDI_0_5_Discharge_Fork_ForwardX10:6
%I0.6Charge Fork Half Way BackNODI_0_6_Charge_Fork_Half_Way_BackX10:7
%I0.7Discharge Fork Halfway BackNODI_0_7_Discharge_Fork_Halfway_BackX10:8
%I1.0Discharge Fork BackwardNCDI_1_0_Discharge_Fork_BackwardX10:9
%I1.1Front Door Open SwitchNCDI_1_1_Front_Door_Open_SwitchX10:10
%I1.2Front Door Close Limit SwitchNCDI_1_2_Front_Door_Close_Limit_SwitchX10:11
%I1.3Intermediate Door Open Limit SwitchNODI_1_3_Intermediate_Door_Open_Limit_SwitchX10:12
%I1.4Intermediate Door Close Limit SwitchNODI_1_4_Intermediate_Door_Close_Limit_SwitchX10:13
%I1.5Elevator Up Limit SwitchNODI_1_5_Elevator_Up_Limit_SwitchX10:14
%I1.6Elevator Down Limit SwitchNODI_1_6_Elevator_Down_Limit_SwitchX10:15
%I1.7Charge Ready On Elevator Deck Limit SwitchNODI_1_7_Charge_Ready_On_Elevator_Deck_Limit_SwitchX10:16
%I2.0Rear Door Open Limit SwitchNCDI_2_0_Rear_Door_Open_Limit_SwitchX10:17
%I2.1Rear Door Close Limit SwitchNCDI_2_1_Rear_Door_Close_Limit_SwitchX10:18
%I2.2Charge On Exit Traverser TrolleyNCDI_2_2_Charge_On_Exit_Traverser_TrolleyX10:19
%I2.3Emergency Stop For Front PanelNODI_2_3_Emergency_Stop_For_Front_PanelX10:20
%I2.4Emergency Stop For Rear PanelNODI_2_4_Emergency_Stop_For_Rear_PanelX10:21
%I2.5Spare(2)NODI_2_5_Spare_2X10:22
%I2.6Spare(3)NODI_2_6_Spare_3X10:23
%I2.7Heating Chamber Fan In Operation(1)NODI_2_7_Heating_Chamber_Fan_In_Operation_1X10:24
%I3.0Fresh Charge Entry Safe Cp(1)NCDI_3_0_Fresh_Charge_Entry_Safe_Cp_1X10:25
%I3.1Vestibule Oil Cooling Pump On(1)NCDI_3_1_Vestibule_Oil_Cooling_Pump_On_1X10:26
%I3.2Alarm AcceptNODI_3_2_Alarm_AcceptX10:27
%I3.3Bell AcceptNODI_3_3_Bell_AcceptX10:28
%I3.4Carb Boosting In ProgressNODI_3_4_Carb_Boosting_In_ProgressX10:29
%I3.5Carb Diffusion In ProgressNODI_3_5_Carb_Diffusion_In_ProgressX10:30
%I3.6Hardening Soak In ProgressNODI_3_6_Hardening_Soak_In_ProgressX10:31
%I3.7Process EndNODI_3_7_Process_EndX10:32
%I4.0Charge Fork Fwd & Discharge Fork RvsNCDI_4_0_Charge_Fork_Fwd_Discharge_Fork_RvsX10:33
%I4.1Discharge Fork Fwd & Charge Fork RvsNCDI_4_1_Discharge_Fork_Fwd_Charge_Fork_RvsX10:34
%I4.2Oil Agitator Auto SelectionNODI_4_2_Oil_Agitator_Auto_SelectionX10:35
%I4.3Charge Entry Self TempNODI_4_3_Charge_Entry_Self_TempX10:36
%I4.4Rear Door Flame Curtain AutoNODI_4_4_Rear_Door_Flame_Curtain_AutoX10:37
%I4.5Quench Oil Cooling Pump OnNODI_4_5_Quench_Oil_Cooling_Pump_OnX10:38
%I4.6Charge Entry Site TempNODI_4_6_Charge_Entry_Site_TempX10:39
%I4.7Oil Agitator Manually Slow Mode SelectionNODI_4_7_Oil_Agitator_Manually_Slow_Mode_SelectionX10:40
%I5.0Auto Oper Selection In Rear Oper PanelNCDI_5_0_Auto_Oper_Selection_In_Rear_Oper_PanelX10:41
%I5.1Manual Oper Selection In Rear Oper PanelNCDI_5_1_Manual_Oper_Selection_In_Rear_Oper_PanelX10:42
%I5.2Rear Door OpenNODI_5_2_Rear_Door_OpenX10:43
%I5.3Elevator Chain Drive OnNODI_5_3_Elevator_Chain_Drive_OnX10:44
%I5.4Rear Door CloseNODI_5_4_Rear_Door_CloseX10:45
%I5.5Acknowledge Front Oper PanelNODI_5_5_Acknowledge_Front_Oper_PanelX10:46
%I5.6Acknowledge Rear Oper PanelNODI_5_6_Acknowledge_Rear_Oper_PanelX10:47
%I5.7Oil Agitator Manually FastNODI_5_7_Oil_Agitator_Manually_FastX10:48
%I6.0Auto Oper Selection In Front Oper PanelNCDI_6_0_Auto_Oper_Selection_In_Front_Oper_PanelX10:49
%I6.1Manual Oper Selection In Front Oper PanelNCDI_6_1_Manual_Oper_Selection_In_Front_Oper_PanelX10:50
%I6.2Charge Fork Forward(1)NODI_6_2_Charge_Fork_Forward_1X10:51
%I6.3Discharge Fork ForwardNODI_6_3_Discharge_Fork_ForwardX10:52
%I6.4Charge Pusher Fork ReversingNODI_6_4_Charge_Pusher_Fork_ReversingX10:53
%I6.5Front Door Open Push ButtonNODI_6_5_Front_Door_Open_Push_ButtonX10:54
%I6.6Front Door Close Push ButtonNODI_6_6_Front_Door_Close_Push_ButtonX10:55
%I6.7Intermediate Door Open Push ButtonNODI_6_7_Intermediate_Door_Open_Push_ButtonX10:56
%I7.0Intermediate Door Close Push ButtonNCDI_7_0_Intermediate_Door_Close_Push_ButtonX10:57
%I7.1Elevator Up Push ButtonNCDI_7_1_Elevator_Up_Push_ButtonX10:58
%I7.2Elevator Down Push ButtonNODI_7_2_Elevator_Down_Push_ButtonX10:59
%I7.3Auto Start Push ButtonNODI_7_3_Auto_Start_Push_ButtonX10:60
%I7.4Spare–DI_7_4_SpareX10:61
%I7.5Spare–DI_7_5_SpareX10:62
%I7.6Spare–DI_7_6_SpareX10:63
%I7.7Spare–DI_7_7_SpareX10:64
Full digital output list – 32 channels
AddressDescriptionPLC tagTerminal
%Q0.0Charge Fork Forward Discharge Fork BackwardDQ_0_0_Charge_Fork_Forward_Discharge_Fork_BackwardX20:1
%Q0.1Discharge Fork Forward Charge Fork BackwardDQ_0_1_Discharge_Fork_Forward_Charge_Fork_BackwardX20:2
%Q0.2Elevator Chain Drive OnDQ_0_2_Elevator_Chain_Drive_OnX20:3
%Q0.3Ring Burner OnDQ_0_3_Ring_Burner_OnX20:4
%Q0.4Pusher Base Table Up(1)DQ_0_4_Pusher_Base_Table_Up_1X20:5
%Q0.5Pusher Base Table Down(1)DQ_0_5_Pusher_Base_Table_Down_1X20:6
%Q0.6Front Door OpenDQ_0_6_Front_Door_OpenX20:7
%Q0.7Front Door CloseDQ_0_7_Front_Door_CloseX20:8
%Q1.0Intermediate Door OpenDQ_1_0_Intermediate_Door_OpenX20:9
%Q1.1Intermediate Door CloseDQ_1_1_Intermediate_Door_CloseX20:10
%Q1.2Elevator UpDQ_1_2_Elevator_UpX20:11
%Q1.3Elevator DownDQ_1_3_Elevator_DownX20:12
%Q1.4Rear Door OpenDQ_1_4_Rear_Door_OpenX20:13
%Q1.5Rear Door Close(1)DQ_1_5_Rear_Door_Close_1X20:14
%Q1.6Exit Roller Drive OnDQ_1_6_Exit_Roller_Drive_OnX20:15
%Q1.7Tray In Position (To Confirm)DQ_1_7_Tray_In_PositionX20:16
%Q2.0Agitator Rotation High Speed IndDQ_2_0_Agitator_Rotation_High_Speed_IndX20:17
%Q2.1Agitator Rotation Low IndDQ_2_1_Agitator_Rotation_Low_IndX20:18
%Q2.2Agitator High SpeedDQ_2_2_Agitator_High_SpeedX20:19
%Q2.3Agitator Low SpeedDQ_2_3_Agitator_Low_SpeedX20:20
%Q2.4SpareDQ_2_4_SpareX20:21
%Q2.5SpareDQ_2_5_SpareX20:22
%Q2.6SpareDQ_2_6_SpareX20:23
%Q2.7SpareDQ_2_7_SpareX20:24
%Q3.0SpareDQ_3_0_SpareX20:25
%Q3.1SpareDQ_3_1_SpareX20:26
%Q3.2SpareDQ_3_2_SpareX20:27
%Q3.3SpareDQ_3_3_SpareX20:28
%Q3.4SpareDQ_3_4_SpareX20:29
%Q3.5SpareDQ_3_5_SpareX20:30
%Q3.6SpareDQ_3_6_SpareX20:31
%Q3.7SpareDQ_3_7_SpareX20:32
Analog input list – 24 channels
AddressTagSignalRangeTypePLC tag
%IW100TT101Heating chamber temperature zone 10–1200 °C4–20 mA, 2-wireAI_00_TT101_Raw
%IW102TT102Heating chamber temperature zone 20–1200 °C4–20 mA, 2-wireAI_01_TT102_Raw
%IW104TT103Heating chamber temperature zone 30–1200 °C4–20 mA, 2-wireAI_02_TT103_Raw
%IW106TT104Vestibule temperature0–600 °C4–20 mA, 2-wireAI_03_TT104_Raw
%IW108TT105Quench oil temperature0–200 °C4–20 mA, 2-wireAI_04_TT105_Raw
%IW110TT106Oil cooler outlet temperature0–200 °C4–20 mA, 2-wireAI_05_TT106_Raw
%IW112AT201Carbon potential (oxygen probe)0–1.6 %C4–20 mA, 2-wireAI_06_AT201_Raw
%IW114AT202Atmosphere dew point-20–+20 °C4–20 mA, 2-wireAI_07_AT202_Raw
%IW116PT301LPG supply pressure0–2 bar4–20 mA, 2-wireAI_08_PT301_Raw
%IW118PT302Carrier (endo) gas pressure0–100 mbar4–20 mA, 2-wireAI_09_PT302_Raw
%IW120PT303Compressed air pressure0–10 bar4–20 mA, 2-wireAI_10_PT303_Raw
%IW122FT401Endo gas flow0–30 m³/h4–20 mA, 2-wireAI_11_FT401_Raw
%IW124FT402Enrichment gas flow0–2 m³/h4–20 mA, 2-wireAI_12_FT402_Raw
%IW126FT403Dilution air flow0–2 m³/h4–20 mA, 2-wireAI_13_FT403_Raw
%IW128LT501Quench oil tank level0–100 %4–20 mA, 2-wireAI_14_LT501_Raw
%IW130TT107Exhaust gas temperature0–600 °C4–20 mA, 2-wireAI_15_TT107_Raw
%IW132IT601Heating fan motor current0–50 A4–20 mA, 2-wireAI_16_IT601_Raw
%IW134IT602Agitator 1 motor current0–30 A4–20 mA, 2-wireAI_17_IT602_Raw
%IW136IT603Agitator 2 motor current0–30 A4–20 mA, 2-wireAI_18_IT603_Raw
%IW138PT304Furnace chamber pressure0–25 mmWC4–20 mA, 2-wireAI_19_PT304_Raw
%IW140–SPARE––AI_20_Spare
%IW142–SPARE––AI_21_Spare
%IW144–SPARE––AI_22_Spare
%IW146–SPARE––AI_23_Spare
Analog output list – 12 channels
AddressTagSignalRangeTypePLC tag
%QW100TCV101Zone 1 burner control valve0–100 %4–20 mAAQ_00_TCV101_Out
%QW102TCV102Zone 2 burner control valve0–100 %4–20 mAAQ_01_TCV102_Out
%QW104TCV103Zone 3 burner control valve0–100 %4–20 mAAQ_02_TCV103_Out
%QW106FCV401Endo gas flow control valve0–100 %4–20 mAAQ_03_FCV401_Out
%QW108FCV402Enrichment gas control valve0–100 %4–20 mAAQ_04_FCV402_Out
%QW110FCV403Dilution air control valve0–100 %4–20 mAAQ_05_FCV403_Out
%QW112SIC601Heating fan VFD speed reference0–50 Hz4–20 mAAQ_06_SIC601_Out
%QW114SIC602Agitator VFD speed reference0–50 Hz4–20 mAAQ_07_SIC602_Out
%QW116TCV104Oil cooler water valve0–100 %4–20 mAAQ_08_TCV104_Out
%QW118AY201Carbon potential retransmission to recorder0–1.6 %C4–20 mAAQ_09_AY201_Out
%QW120–SPARE––AQ_10_Spare
%QW122–SPARE––AQ_11_Spare

Stage 2PLC tags – copy and paste

144 tags: 8 DI byte tags and 4 DQ byte tags for SCATTER, then every bit and analog channel. The byte tags replace names such as Tag_1, which tell a maintenance engineer nothing.

  1. Fast way: click Copy for TIA tag table, open the IO_List tag table, click the first empty Name cell and press Ctrl+V. Name, data type and address fill in.
  2. With comments: click Copy for Excel import, paste into cell A1 of a sheet named PLC Tags, save as .xlsx, then in the tag table use Import. This version also brings the comments and HMI access flags.
DI_Byte_0	Byte	%IB0
DI_Byte_1	Byte	%IB1
DI_Byte_2	Byte	%IB2
DI_Byte_3	Byte	%IB3
DI_Byte_4	Byte	%IB4
DI_Byte_5	Byte	%IB5
DI_Byte_6	Byte	%IB6
DI_Byte_7	Byte	%IB7
DQ_Byte_0	Byte	%QB0
DQ_Byte_1	Byte	%QB1
DQ_Byte_2	Byte	%QB2
DQ_Byte_3	Byte	%QB3
DI_0_0_Charge_Fork_Backward	Bool	%I0.0
DI_0_1_Discharge_Fork_Backward	Bool	%I0.1
…  (144 rows in total – use the copy button)

Stage 3The HMI_Status DB – copy and paste

The DB matches the addresses in the ladder: Card_No at DBB0 and DI.Inp at DBX2.0. It is a standard (not optimized) DB so those absolute addresses stay fixed. DI_NC_Mask holds one bit per NC contact, already filled from the text list Input Add C.

  1. Copy the source, save it as HMI_Status.db.
  2. Project tree → External source files → Add new external file → pick the file.
  3. Right-click it → Generate blocks from source. Set the DB number to 1 in its properties if TIA chose another.
DATA_BLOCK "HMI_Status"
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
   STRUCT
      Card_No : Byte;          // DI byte shown on HMI (0..7)   -> %DB1.DBB0
      Card_No_DQ : Byte;       // DQ byte shown on HMI (0..2)   -> %DB1.DBB1
      DI : Struct              // -> %DB1.DBX2.0
         Inp : Array[0..7] of Bool;   // SCATTER of selected %IB
      END_STRUCT;
      DQ : Struct              // -> %DB1.DBX4.0
         Out : Array[0..7] of Bool;   // SCATTER of selected %QB
      END_STRUCT;
      Filter_DI : Byte;        // 0 All, 1 ON, 2 OFF, 3 NC only, 4 Faults
      Filter_DQ : Byte;        // 0 All, 1 ON, 2 OFF
      Show_DI : Array[0..7] of Bool;      // row visibility on HMI
      Show_DQ : Array[0..7] of Bool;
      DI_Fault : Array[0..7] of Bool;     // NC contact open
      DI_Changed : Array[0..7] of Bool;   // flashes until Clear
      DQ_Changed : Array[0..7] of Bool;
      DI_Prev : Array[0..7] of Bool;
      DQ_Prev : Array[0..7] of Bool;
      Prev_Card : Byte;
      Prev_Card_DQ : Byte;
      Clear_Changed : Bool;    // HMI button, PLC resets it
      DI_On_Count : USInt;
      DI_Fault_Count : USInt;
      DQ_On_Count : USInt;
      DI_NC_Mask : Array[0..7] of Byte := [16#27, 16#07, 16#07, 16#03, 16#03, 16#03, 16#03, 16#03];  // 1 = NC contact
   END_STRUCT;
BEGIN
END_DATA_BLOCK

Stage 4SCATTER ladder for every byte

One network for inputs and one for outputs. Each branch compares Card_No with a constant and, only on its own byte, runs SCATTER from the byte tag into the DB array. Only one branch is true at a time, so the array always holds the byte the operator picked.

Network 1: Selected DI byte → "HMI_Status".DI.Inp (SCATTER) %DB1.DBB0 "HMI_Status". Card_No == Byte 0 SCATTERByte ENENO IN %IB0"DI_Byte_0" OUT P#DB1.DBX2.0"HMI_Status".DI.Inp %DB1.DBB0 "HMI_Status". Card_No == Byte 1 SCATTERByte ENENO IN %IB1"DI_Byte_1" OUT P#DB1.DBX2.0"HMI_Status".DI.Inp %DB1.DBB0 "HMI_Status". Card_No == Byte 2 SCATTERByte ENENO IN %IB2"DI_Byte_2" OUT P#DB1.DBX2.0"HMI_Status".DI.Inp %DB1.DBB0 "HMI_Status". Card_No == Byte 3 SCATTERByte ENENO IN %IB3"DI_Byte_3" OUT P#DB1.DBX2.0"HMI_Status".DI.Inp %DB1.DBB0 "HMI_Status". Card_No == Byte 4 SCATTERByte ENENO IN %IB4"DI_Byte_4" OUT P#DB1.DBX2.0"HMI_Status".DI.Inp %DB1.DBB0 "HMI_Status". Card_No == Byte 5 SCATTERByte ENENO IN %IB5"DI_Byte_5" OUT P#DB1.DBX2.0"HMI_Status".DI.Inp %DB1.DBB0 "HMI_Status". Card_No == Byte 6 SCATTERByte ENENO IN %IB6"DI_Byte_6" OUT P#DB1.DBX2.0"HMI_Status".DI.Inp %DB1.DBB0 "HMI_Status". Card_No == Byte 7 SCATTERByte ENENO IN %IB7"DI_Byte_7" OUT P#DB1.DBX2.0"HMI_Status".DI.Inp
To draw a branch in LAD: insert CMP == (type Byte), open a branch, drag SCATTER from Instructions → Basic instructions → Move, set its type to Byte, then copy the branch and change only the constant and the IN tag.
Check your existing network: if the rung starts with a contact on the constant false, none of the SCATTER boxes ever runs and the HMI status stays frozen. Delete that contact, or replace it with a real enable bit.

Shorter alternative in SCL

The eight branches can be replaced by PEEK, which reads the input byte whose number is in Card_No. Use it when you are comfortable with indirect addressing; the ladder version is easier for maintenance staff to follow online.

// One-line alternative to the 8 branches of Network 1 (SCL network or FC)
// #b : Byte (Temp)
#b := PEEK(area := 16#81,              // 16#81 = process image inputs
           dbNumber := 0,
           byteOffset := "HMI_Status".Card_No);
SCATTER(IN := #b, OUT => "HMI_Status".DI.Inp);

Stage 5Filter, NC fault and change logic

The HMI only shows bits; this FC decides which rows are visible, which NC contacts are open, and which bits changed since the byte was opened. Generate it from source like the DB and call it in OB1 directly after Networks 1 and 2.

Filter_DIButtonRow visible when
0Allevery row
1ON onlyDI.Inp[b] = 1
2OFF onlyDI.Inp[b] = 0
3NC onlycontact type NC
4FaultsNC contact that reads 0
FUNCTION "FC_HMI_IO_Status" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_TEMP
      i : Int;
      card : Int;
      on : Bool;
      ncBits : Array[0..7] of Bool;
   END_VAR

BEGIN
	// Call in OB1 AFTER the two SCATTER networks.
	// 1. Keep the HMI byte numbers inside the real hardware
	IF "HMI_Status".Card_No > 7 THEN
	    "HMI_Status".Card_No := 7;
	END_IF;
	IF "HMI_Status".Card_No_DQ > 2 THEN
	    "HMI_Status".Card_No_DQ := 2;
	END_IF;
	#card := BYTE_TO_INT("HMI_Status".Card_No);
	
	// 2. NO/NC pattern of the selected DI byte, one Bool per bit
	SCATTER(IN := "HMI_Status".DI_NC_Mask[#card],
	        OUT => #ncBits);
	
	// 3. New byte selected or Clear pressed: forget old changes
	IF ("HMI_Status".Card_No <> "HMI_Status".Prev_Card) OR "HMI_Status".Clear_Changed THEN
	    FOR #i := 0 TO 7 DO
	        "HMI_Status".DI_Changed[#i] := FALSE;
	        "HMI_Status".DI_Prev[#i] := "HMI_Status".DI.Inp[#i];
	    END_FOR;
	END_IF;
	IF ("HMI_Status".Card_No_DQ <> "HMI_Status".Prev_Card_DQ) OR "HMI_Status".Clear_Changed THEN
	    FOR #i := 0 TO 7 DO
	        "HMI_Status".DQ_Changed[#i] := FALSE;
	        "HMI_Status".DQ_Prev[#i] := "HMI_Status".DQ.Out[#i];
	    END_FOR;
	END_IF;
	"HMI_Status".Prev_Card := "HMI_Status".Card_No;
	"HMI_Status".Prev_Card_DQ := "HMI_Status".Card_No_DQ;
	"HMI_Status".Clear_Changed := FALSE;
	
	// 4. Digital inputs: fault, change, filter, counters
	"HMI_Status".DI_On_Count := 0;
	"HMI_Status".DI_Fault_Count := 0;
	FOR #i := 0 TO 7 DO
	    #on := "HMI_Status".DI.Inp[#i];
	    "HMI_Status".DI_Fault[#i] := #ncBits[#i] AND NOT #on;
	    IF #on <> "HMI_Status".DI_Prev[#i] THEN
	        "HMI_Status".DI_Changed[#i] := TRUE;
	    END_IF;
	    "HMI_Status".DI_Prev[#i] := #on;
	    CASE BYTE_TO_INT("HMI_Status".Filter_DI) OF
	        1: "HMI_Status".Show_DI[#i] := #on;
	        2: "HMI_Status".Show_DI[#i] := NOT #on;
	        3: "HMI_Status".Show_DI[#i] := #ncBits[#i];
	        4: "HMI_Status".Show_DI[#i] := "HMI_Status".DI_Fault[#i];
	        ELSE "HMI_Status".Show_DI[#i] := TRUE;
	    END_CASE;
	    IF #on THEN
	        "HMI_Status".DI_On_Count := "HMI_Status".DI_On_Count + 1;
	    END_IF;
	    IF "HMI_Status".DI_Fault[#i] THEN
	        "HMI_Status".DI_Fault_Count := "HMI_Status".DI_Fault_Count + 1;
	    END_IF;
	END_FOR;
	
	// 5. Digital outputs: change, filter, counter
	"HMI_Status".DQ_On_Count := 0;
	FOR #i := 0 TO 7 DO
	    #on := "HMI_Status".DQ.Out[#i];
	    IF #on <> "HMI_Status".DQ_Prev[#i] THEN
	        "HMI_Status".DQ_Changed[#i] := TRUE;
	    END_IF;
	    "HMI_Status".DQ_Prev[#i] := #on;
	    CASE BYTE_TO_INT("HMI_Status".Filter_DQ) OF
	        1: "HMI_Status".Show_DQ[#i] := #on;
	        2: "HMI_Status".Show_DQ[#i] := NOT #on;
	        ELSE "HMI_Status".Show_DQ[#i] := TRUE;
	    END_CASE;
	    IF #on THEN
	        "HMI_Status".DQ_On_Count := "HMI_Status".DQ_On_Count + 1;
	    END_IF;
	END_FOR;
END_FUNCTION

Stage 6Text and graphics lists (same format as g.xlsx)

The text lists follow the naming of the project export: Input Add b holds the description of bit b for every byte, Input Add C b holds NO or NC, and the value of each entry is the byte number. One new set, Input Address b, shows the address as text so column 1 is a single clean field.

Text listIndexed byExample textUsed in
Input Address 0 … 7Card_No%I3.5Column 1
Input Add 0 … 7Card_NoFORK BASE UPColumn 2
Input Add C 0 … 7Card_NoNO / NCColumn 3
Input StatusDI.Inp[b]Off / OnColumn 4
Output Address / Add / Add C 0 … 7Card_No_DQsame for outputsDQ screen
IO FilterFilter_DIAll … FaultsFilter caption

Copy both sheets, paste each into its own sheet of one Excel file with the names TextList and TextListEntry, save, then import in the Text and graphic lists editor of the HMI device.

Name	ListRange	Comment [en-US]
Input Status	Decimal	<No value>
Output Status	Decimal	<No value>
IO Filter	Decimal	<No value>
Input Address 0	Decimal	<No value>
Input Add 0	Decimal	<No value>
Input Add C 0	Decimal	<No value>
Input Address 1	Decimal	<No value>
…  (51 text lists)
Name	Parent	DefaultEntry	Value	Text [en-US]	FieldInfos
Text_list_entry_1	Input Address 0		0	%I0.0	
Text_list_entry_2	Input Address 0		1	%I1.0	
Text_list_entry_3	Input Address 0		2	%I2.0	
Text_list_entry_4	Input Address 0		3	%I3.0	
Text_list_entry_1	Input Add 0		0	CHARGE FORK BACKWARD	
Text_list_entry_2	Input Add 0		1	DISCHARGE FORK BACKWARD	
Text_list_entry_3	Input Add 0		2	REAR DOOR OPEN LIMIT SWITCH	
Text_list_entry_4	Input Add 0		3	FRESH CHARGE ENTRY SAFE CP(1)	
Text_list_entry_1	Input Add C 0		0	NC	
Text_list_entry_2	Input Add C 0		1	NC	
Text_list_entry_3	Input Add C 0		2	NC	
Text_list_entry_4	Input Add C 0		3	NC	
…

Graphics lists

Graphics listValueGraphicMeaning
GL_Lamp0Lamp_GreyStatus column, off
GL_Lamp1Lamp_GreenStatus column, on
GL_Fault0(none)No fault
GL_Fault1Warning_RedNC contact open

Take a grey lamp, a green lamp and a red warning symbol from the WinCC graphics collection (or import your own PNGs) and use them in a Graphic I/O field, mode Output, next to the status text.

Problems found in the supplied text lists

These were corrected in the copy-paste data above. Fix them in the project as well so the export and the drawing agree.

AddressText in g.xlsxWhat to fix
%I0.0CHARGE FORK BACK WARD%I0.0spelling corrected → CHARGE FORK BACKWARD
%I0.1DISCHARGE FORK BACK WARD%I0.1spelling corrected → DISCHARGE FORK BACKWARD
%I0.5DICHARGE FORK FORWARD%I0.5spelling corrected → DISCHARGE FORK FORWARD
%I0.6CHARGE FORK H .W BACK%I0.6spelling corrected → CHARGE FORK HALF WAY BACK
%I1.0DISCHARGE FORK BACK WARD%I1.0spelling corrected → DISCHARGE FORK BACKWARD
%I2.4EMERGENCY STOP FPR REAR PANEL%I2.4spelling corrected → EMERGENCY STOP FOR REAR PANEL
%I3.1VESTIBULE OIL COOLING PUMPON(1)%I3.1spelling corrected → VESTIBULE OIL COOLING PUMP ON(1)
%I3.3BELL ACCECPT%I3.3spelling corrected → BELL ACCEPT
%I3.6HARENING SOAK IN PROGRESS%I3.6spelling corrected → HARDENING SOAK IN PROGRESS
%I4.0CHARGE FORK FWD & DISCARGE FORK RVS%I4.0spelling corrected → CHARGE FORK FWD & DISCHARGE FORK RVS
%I4.1DISCHARGE FORK FWD & CARGE FORK RVS%I4.1spelling corrected → DISCHARGE FORK FWD & CHARGE FORK RVS
%I5.0AUTO OPEN SELECTION IN REAR OPEN PANEL%I5.0spelling corrected → AUTO OPER SELECTION IN REAR OPER PANEL
%I5.1MANUAL OPEN SELECTION IN REAR OPEN PANEL%I5.1spelling corrected → MANUAL OPER SELECTION IN REAR OPER PANEL
%I5.2REAL DOOR OPEN%I5.2spelling corrected → REAR DOOR OPEN
%I5.3ELEVATOR CHAIR DRIVE ON%I5.3spelling corrected → ELEVATOR CHAIN DRIVE ON
%I6.7INTERMDIATE DOOR OPEN PUSH BUTTON%I6.7spelling corrected → INTERMEDIATE DOOR OPEN PUSH BUTTON
%Q0.1DICHARGE FORK FORWARD CHRGE FORK BACKWARD%Q0.1spelling corrected → DISCHARGE FORK FORWARD CHARGE FORK BACKWARD
%Q1.7TRAY IN POSITION ????%Q1.7placeholder ??? – confirm signal name
%I0.1DISCHARGE FORK BACKWARDsame description used on another address – check drawing
%I0.5DISCHARGE FORK FORWARDsame description used on another address – check drawing
%I1.0DISCHARGE FORK BACKWARDsame description used on another address – check drawing
%I6.3DISCHARGE FORK FORWARDsame description used on another address – check drawing

Stage 7HMI screen and animations

Build one row, test it, then copy it seven times and change only the row number b in the text list names and tag indexes. The table lists every object of row b.

ObjectType and modeProcess tagText list / animation
Byte selectorI/O field, mode Input/output, format 9"HMI_Status".Card_NoTag limits 0 … 7; buttons ◄ ► call DecreaseTag / IncreaseTag
Column 1 – AddressSymbolic I/O field, mode Output"HMI_Status".Card_NoText list Input Address b (b = row 0…7) → shows %I3.5
Column 2 – DescriptionSymbolic I/O field, mode Output, width 420 px"HMI_Status".Card_NoText list Input Add b
Column 3 – NO / NCSymbolic I/O field, mode Output"HMI_Status".Card_NoText list Input Add C b; Appearance: text colour red when value shows NC
Column 4 – Live statusSymbolic I/O field + Graphic I/O field"HMI_Status".DI.Inp[b]Text list Input Status (Off/On); graphics list GL_Lamp; Appearance 0 = grey, 1 = green
Row backgroundRectangle behind the row"HMI_Status".DI_Fault[b]Appearance 1 = light red; second animation on DI_Changed[b] = yellow, Flashing = Yes
Row visibility (filter)Group the 5 objects of the row"HMI_Status".Show_DI[b]Visibility animation: visible when 1
Filter buttonsButtons All / ON / OFF / NC / Faults"HMI_Status".Filter_DIPress → SetTag value 0 … 4; Appearance on Filter_DI shows the active button
CountersI/O fields, mode OutputDI_On_Count, DI_Fault_CountFault count red when > 0
Clear changesButton"HMI_Status".Clear_ChangedPress → SetBit; the PLC resets it

For outputs, copy the screen and swap Card_No → Card_No_DQ, DI.Inp → DQ.Out and Input → Output in the text list names. Drop the NC filter and the fault animation. Layout rules for fonts and colours are in HMI screen design best practices, and I/O field details in HMI I/O fields and setpoint entry.

Stage 8Live simulator – perform and test

This works like the finished panel. Change the byte, click a status lamp to simulate the field, try every filter, and type an address such as I2.3 to jump straight to it. The dark line under the table shows what the PLC is doing at that moment.

I/O STATUS – SEALED QUENCH FURNACE
AddressDescriptionNO / NCLive status

Test checklist

  • Card_No 0 … 7 changes all eight descriptions and addresses together.
  • Forcing or bridging an input turns its lamp green and the row flashes yellow until Clear.
  • Opening an NC contact turns the row red and raises the fault counter.
  • Typing 9 in the byte field is refused by the tag limits; the FC also clamps it to 7.
  • Each filter shows only matching rows; All brings every row back.

More animations worth adding

  • Analog status page. Same byte idea for channels: Card_No picks an AI card, rows show tag, scaled value, a bar graph and the raw value. Raw 32767 on a 4–20 mA channel means wire break, so colour that row red. Scaling is covered in PLC analog input scaling.
  • Byte overview strip. Eight small boxes, one per byte, each showing its ON count and turning red when DI_Fault_Count for that byte is above zero. Touching a box sets Card_No.
  • Last change time. Store RD_SYS_T in an array when a bit changes and show it in a fifth column; it helps prove intermittent limit switches.
  • Force indication. Show a yellow banner when the CPU has forced I/O, read from the diagnostic buffer, so nobody leaves forces behind after testing.
  • Access level. Let operators view only; give the Clear button and forcing tools to the maintenance user group as in HMI user administration.

Practice notes

I/O status screen – my practice steps

  1. → no red rows? then go on
  2. ! no FALSE contact at start of rung
  3. change b in list name AND tag index!
  4. done = show trainer ✍

Troubleshooting

SymptomCauseFix
Status never changesRung disabled (FALSE contact) or FC not calledRemove the contact; call the FC after the networks
Description shows ###Text list has no entry for that Card_NoAdd the missing value 0 … 7 to the list
All rows show the same textEvery row uses Input Add 0Change the list to Input Add b for row b
NC rows red although wiredDI_NC_Mask does not match field wiringCorrect the mask and the Input Add C list together
Wrong bits after downloadDB is optimized, absolute DBX2.0 no longer validUntick Optimized block access, compile, download
Filter leaves gapsHidden objects keep their placeExpected in Comfort; use an index list for a compact view

For hardware faults behind a bad signal, see Siemens PLC diagnostics and troubleshooting.

Frequently asked questions

What does the SCATTER instruction do in TIA Portal?

SCATTER splits a Byte, Word or DWord into individual Bools and writes them to an Array of Bool or a Struct. Here it turns the selected input byte, for example %IB3, into "HMI_Status".DI.Inp[0..7] so the HMI reads only eight bits.

Why use one byte selector instead of 60 rows on the HMI?

One screen with eight rows, a byte number and text lists replaces eight screens. The panel reads about twenty tags instead of more than eighty, which keeps the screen fast and saves tags on Runtime Advanced licences.

How do I show NO and NC contacts correctly?

Keep the contact type in a text list for the NO/NC column and in DI_NC_Mask in the PLC. An NC input that reads Off means the contact is open, so the PLC raises DI_Fault and the HMI shows that row in red.

Which PLCs support SCATTER?

All S7-1500 CPUs and S7-1200 CPUs with firmware 4.2 or newer. On older S7-1200 firmware, move the byte into a Byte tag and read the bits with slice access such as #b.%X0.

Can I import the text lists instead of typing them?

Yes. Paste the two copied sheets into an Excel file with sheet names TextList and TextListEntry, the same layout as an export from the Text and graphic lists editor, then import it into the HMI device.

Does the filter remove rows or only hide them?

In WinCC Comfort and Advanced a hidden object keeps its position, so the row leaves a gap. If you need a compact list, let the PLC build an index of matching rows and show the descriptions through that index.

Reviewed by Bhawesh Kumar SinghIndustrial Automation Trainer and Industry 4.0 Consultant · Softwell Automation · 21+ years industry experience

Get the full syllabus + free demo class

Share your details—a Softwell training advisor will contact you with batch dates, fees and hardware-practice options.

No spam. Used only to share course details for this enquiry.

Build this screen on real hardware

S7-1500 racks, Comfort panels and furnace-style I/O in the Chinchwad lab, or live online.

Request Course Details
Verified learning pathway

Discuss the Siemens HMI I/O Status Screen

Explore practical curriculum, software, hardware and batch options for this technology.

Content reviewed: 26 October 2026

Siemens PLC & TIA Portal Learning Path

Continue with the related Siemens PLC tutorials in this practical learning series.

  1. SCL vs Ladder Logic
  2. Upload PLC Program
  3. TIA Selection Tool
  4. Analog Input Scaling
  5. PLC Counters
  6. PLC Timers
  7. Addressing & Data Types
  8. Hardware & PLC Tags
  9. OB, FB, FC & DB
☎ Call WhatsApp ✉ Email Enquire Now