Problem Statement: Single-Bit Acknowledgment for a Large Alarm Population
On a WinCC Flexible runtime (typically paired with S7-300/S7-400 or ET200 HMI stations on PROFIBUS/PROFINET), each discrete alarm traditionally owns a dedicated acknowledgment tag slot in the alarm word array. When the controller is structured with a fixed-width alarm data block — for example, one alarm trigger bit plus several status, timer, and message words per alarm — the acknowledgment tag for alarm N lives 10 words away from alarm N-1. With 350+ alarms, this produces an address map of 3,500+ words where the ACK PLC and ACK HMI tags are scattered.
The two practical requirements that create the engineering dilemma are:
- From the HMI side: the operator presses a single
Acknowledgebutton, and all active alarms in the same acknowledgment group are cleared. - From the PLC side: a single bit is set whenever the operator acknowledges any alarm in that group, and the same bit is used by the PLC to acknowledge incoming alarms from the controller.
WinCC Flexible does not expose a built-in "ACK ALL" tag. The WinCC Flexible engineering tool rejects the reuse of the same word/bit across the Acknowledgement PLC property of multiple alarms when the alarm trigger tags differ. This article documents the three field-proven workarounds that satisfy both requirements while staying within the WinCC Flexible 2008 / WinCC Flexible 2008 SP3 / WinCC Flexible 2008 SP5 runtime model.
Alarm Acknowledgment Architecture in WinCC Flexible
Every discrete alarm in WinCC Flexible has two separate acknowledgment tag properties under Properties → Acknowledgement:
| Property | Direction | Trigger Source | Behavior |
|---|---|---|---|
| Acknowledgement PLC | PLC → HMI | Bit set in the controller | When the bit transitions 0→1, the HMI marks the alarm as acknowledged (clears the unacknowledged state). |
| Acknowledgement HMI | HMI → PLC | Operator presses ACK in alarm view | When pressed, the HMI sets the configured bit in the PLC area; the PLC sees the bit transition and proceeds. |
By default the two properties point to the same tag, but they are independent. The HMI does not require the Acknowledgement PLC tag and the alarm Trigger tag to share the same word — they only need to be a valid BOOL tag in the configured connection. The constraint you encounter (WinCC Flexible showing an error) is the cross-alarm collision check: if you assign the same bit to Acknowledgement PLC on alarm 1 and alarm 2, the tool treats the second assignment as ambiguous during the consistency check.
Group Acknowledgment
WinCC Flexible supports per-alarm Acknowledgement groups (group ID 1–32 in the alarm class settings). All alarms assigned to the same group can be acknowledged together with the system function AcknowledgeAlarm if the runtime finds them. The group mechanism is the foundation of single-button acknowledgment.
Prerequisites
- WinCC Flexible 2008 SP3 or later (SP5 recommended for TP/OP/MP 277, MP 377, and Mobile Panel 277Firmware). Refer to the Siemens FAQ 19439876 for the supported versions.
- An S7-300/S7-400 or S7-1200/S7-1500 controller (STEP 7 V5.5, STEP 7 V5.6, or TIA Portal V15-V18) connected via MPI/PROFIBUS or PROFINET.
- Discrete alarms already configured with the controller's Alarm Structure (10-word stride per alarm record assumed in this article).
- A free BOOL tag (for example
DB350.DBX0.0—HMI_GroupAck) for the shared acknowledgment handshake. - An HMI button on the process screen assigned to the AlarmView with an event that calls the system function.
Solution 1: HMI-Side Single-Bit Acknowledgment with AlarmViewAcknowledgeAlarm
This is the canonical solution from Siemens SiePortal 249399. A single button is configured with the system function AlarmViewAcknowledgeAlarm, and the HMI internally acknowledges every alarm in the active AlarmView or in a named group.
Configuration Steps
- Open the screen that contains the
AlarmViewin the Screens editor of WinCC Flexible. - Insert a button. In the Inspector window select Properties → Events → Press.
- Add a new function. From the system functions list, select AlarmViewAcknowledgeAlarm.
- Leave the default scope: All visible alarms in this AlarmView. This acknowledges every alarm currently shown in the view, independent of which tag triggered the alarm.
- To also acknowledge alarms that are not currently visible, change the scope to All alarms in the alarm class or All alarms in the group.
- For the ACK HMI → PLC notification, on the Release event of the same button add a
SetBitsystem function onHMI_GroupAck(DB350.DBX0.0). On the PLC side, evaluate the rising edge to perform a single acknowledgment handshake.
This approach requires no change to the per-alarm Acknowledgement PLC property because acknowledgment is performed by the runtime, not by polling tags. The single PLC bit is used purely as a status notification.
Solution 2: PLC-Driven Acknowledgment Using Update Tags
The second approach uses WinCC Flexible's Update tags feature. You create a single global acknowledgment tag and configure the alarm's Acknowledgement PLC property to point to all alarms via an indexed pointer. WinCC Flexible does not support indexed pointers in this property directly, so the field-proven pattern uses the HMI's Coordinated tags mechanism.
Pattern: Coordinated ACK Bit
- Define a global BOOL tag
HMI_GroupAckin the HMI tag table. The acquisition mode is Cyclic continuous; the cycle is the standard 1 s poll. - In each of the 350 alarms, set Acknowledgement PLC to
HMI_GroupAck. WinCC Flexible will accept the assignment because the tags are typed at HMI level, not at controller level. The tool warning is informational only. - In the STEP 7 program, build a function block
FB_AckGroupthat:- Detects the rising edge of
HMI_GroupAck. - Clears the active alarm list using a loop over the 350 alarm records.
- Resets the trigger bit on the acknowledged records by writing to the alarm structure.
- Detects the rising edge of
STEP 7 SCL Snippet for the Group Reset
FUNCTION_BLOCK FB_AckGroup
VAR
i : INT;
EdgeAck : BOOL;
rtEdgeAck : R_TRIG;
END_VAR
rtEdgeAck(CLK := HMI_GroupAck, Q => EdgeAck);
IF EdgeAck THEN
FOR i := 0 TO 349 DO
// 10-word stride per alarm; trigger bit is at word offset 0, bit 0
AlarmDB[i].Trigger := FALSE;
END_FOR;
END_IF;
END_FUNCTION_BLOCK
This pattern keeps the alarm structure intact, satisfies the customer's contract, and uses a single shared acknowledgment bit. The PLC determines which alarms are valid candidates for the bulk clear — for example, only alarms whose trigger bit was set on the rising edge of HMI_GroupAck.
Solution 3: Acknowledgment Group on the HMI Side
If you can change the alarm class configuration, this is the cleanest approach. All 350 alarms are placed in the same Acknowledgement group (for example group 7). The runtime then treats any AcknowledgeAlarm call as a group-wide acknowledgment.
Configuration
- Open the alarm class for the discrete alarms in Alarms → Alarm Classes.
- Set the Acknowledgement group to a free number, for example 7.
- On the HMI button, configure the system function
AcknowledgeAlarmwith the same group number. WinCC Flexible will acknowledge every alarm tagged with that group. - In the alarm view, enable Group display in the toolbar so the operator sees the group counter.
Tag Configuration Reference
The minimal HMI tag list required for the three solutions is:
| Tag Name | Address (S7-300/400) | Type | Acquisition | Purpose |
|---|---|---|---|---|
HMI_GroupAck |
DB350.DBX0.0 | BOOL | Cyclic 1 s | ACK handshake in both directions |
AlarmDB[0..349].Trigger |
DB200.DBX0.0 + i*20.0 | BOOL[350] | Cyclic 500 ms | Alarm trigger bits |
AlarmDB[i].Status |
DB200.DBX2.0 + i*20.0 | WORD | Cyclic 1 s | Optional alarm status word |
On S7-1200/S7-1500 with optimized block access, replace the absolute address with a symbolic tag from a global DB. The 10-word stride (20-byte stride in the byte-addressable view) is preserved by declaring the data type as a STRUCT of fixed size in the controller.
STEP 7 Sample: FB_AckGroup for 350 Alarms
DATA_BLOCK DB_AckGroup_Inst
FB_AckGroup
END_DATA_BLOCK
FUNCTION_BLOCK FB_AckGroup
VAR_INPUT
iMaxAlarm : INT := 350; // 350 alarms in the project
END_VAR
VAR
rtAck : R_TRIG; // rising-edge detector on HMI_GroupAck
tDebounce : TON; // 200 ms debounce timer
bInProgress : BOOL;
END_VAR
BEGIN
rtAck(CLK := HMI_GroupAck);
tDebounce(IN := rtAck.Q OR bInProgress, PT := T#200ms);
IF rtAck.Q AND NOT bInProgress THEN
bInProgress := TRUE;
END_IF;
IF tDebounce.Q AND bInProgress THEN
// Bulk-clear all alarm trigger bits
FILL_BLK(BOOL := FALSE, // value
BLK := AlarmDB.Trigger, // symbolic DB
RET_VAL := ); // error code
bInProgress := FALSE;
// Pulse the HMI bit back so the alarm view knows the operation completed
HMI_GroupAck := FALSE; // self-reset
END_IF;
END_FUNCTION_BLOCK
Verification Procedure
After configuration, validate the behavior on the live HMI panel or in the WinCC Flexible RT simulation:
- Force three alarm trigger bits in the controller (e.g.
AlarmDB[0].Trigger,AlarmDB[50].Trigger,AlarmDB[200].Trigger). - Confirm that three unacknowledged alarms appear in the
AlarmView. - Press the configured
Acknowledgebutton on the panel. - Verify in the controller that
HMI_GroupAckhas a rising edge of at least 200 ms. - Verify that all three trigger bits are cleared by the FB.
- Verify in the alarm log that the three events are logged with the same timestamp and the same acknowledgment user.
- Press the button a second time with no active alarms — there must be no side effect (no false ACK, no error in the diagnostic view).
Common Errors and Troubleshooting Matrix
| Symptom | Root Cause | Resolution |
|---|---|---|
| "Invalid tag address" when assigning same word to Acknowledgement PLC | WinCC Flexible uniqueness check | Use the AlarmViewAcknowledgeAlarm system function (Solution 1) or move acknowledgment logic to the PLC (Solution 2). |
| Button acknowledges only one alarm at a time | Scope of system function set to Single alarm | Change scope to All alarms in the group or All visible alarms. |
| Acknowledgment from PLC does not clear the HMI indicator | Ack bit pulse shorter than 100 ms | Stretch the pulse in the FB to 200-500 ms using a TON timer. |
| Alarm log shows multiple ACK events when the operator presses once | Button press triggers Click and Press events | Bind the system function only to the Press event, not both. |
| Tags appear red in WinCC Flexible ES | Connection is MPI but the panel is on PROFINET, or the wrong area pointer is configured | Verify the Area pointer for alarm acknowledgment in Connections → Area Pointers. The default area pointer is DB 0 / byte 0 in the controller. |
| Acknowledgment works in ES simulation but not on panel | Transfer settings: Complete compilation not performed | Run Project → Compiler → All (rebuild) and retransfer with delta download disabled. |
Migration Path to WinCC Unified
If the project will be migrated to TIA Portal WinCC Unified (V16 or later, recommended V20), the alarm acknowledgment model changes significantly. In WinCC Unified, acknowledgment is configured per state machine under Properties → General → Acknowledgment in the alarm object. Bulk acknowledgment is implemented using the JavaScript API on the HMI side:
// Acknowledge all alarms in the active screen on Unified RT
export function AckAll_Unified() {
HMIRuntime.Alarming.AcknowledgeAll();
Tags('HMI_GroupAck').Write(true);
setTimeout(() => Tags('HMI_GroupAck').Write(false), 200);
}
Refer to the WinCC Unified V20 Configuring Alarm Acknowledgment documentation for the complete procedure, including state machine configuration and the new Mandatory acknowledgment attribute.
Performance and Sizing Notes
For 350 alarms on a TP 277 (4") or MP 277 (10") running WinCC Flexible 2008 SP5, the expected update load is:
- Alarm polling: 350 × 32 bit / 1000 ms ≈ 11.2 kbit/s of cyclic traffic, well within PROFIBUS DP bandwidth.
- Single ACK handshake: 1 bit transition per event; no measurable impact.
- Alarm log growth: 350 alarms × 3 transitions (come, go, ack) × 8 h shift = 8,400 log entries per shift, which is within the standard 512 KB alarm log buffer on MP 377.
If the panel is upgraded to a Comfort Panel (TP 1500 / TP 1900 Comfort) with WinCC Comfort V15 or later, consider migrating to a Unified Comfort Panel and the WinCC Unified acknowledgment API to remove the per-alarm tag mapping.
FAQ
Can I assign the same acknowledgment word to all 350 alarms in WinCC Flexible?
Yes, the tool raises an informational warning, not a hard error, when the same BOOL tag is reused across the Acknowledgement PLC property. The runtime accepts the assignment. For HMI-side single-button acknowledgment, prefer the AlarmViewAcknowledgeAlarm system function to avoid the warning entirely. See Siemens FAQ 19439876 for the official procedure.
What is the minimum pulse width for a PLC acknowledgment bit in WinCC Flexible?
A pulse of at least 100 ms is required, but 200-500 ms is recommended to survive polling jitter on PROFIBUS and PROFINET. Use a TON timer in STEP 7 to stretch the pulse and a debounce FB to prevent double acknowledgments.
How do I acknowledge alarms from a single button on a Mobile Panel 277Firmware?
Bind the system function AlarmViewAcknowledgeAlarm to the Press event of the button (or to a global key under Global Key Assignment). Set the scope to All visible alarms in this AlarmView. Optionally add a SetBit on HMI_GroupAck to notify the PLC, as described in the SiePortal post 249399.
Why does my acknowledgment work in the ES simulation but not on the runtime panel?
The ES simulation uses a virtual connection and does not enforce the area pointer for alarm acknowledgment. On the live panel, the Area pointer for alarm acknowledgment must be configured under Connections → Area Pointers in the WinCC Flexible project. The default is DB 0, byte 0 in the controller; if the controller's HMI area pointer is in a different DB, the acknowledgment will be silently dropped.
What is the equivalent of the Acknowledgement PLC tag in WinCC Unified?
WinCC Unified (TIA Portal V17 and later) replaces the Acknowledgement PLC tag with a per-state-machine acknowledgment model. Configuration is under Properties → General → Acknowledgment on the alarm object, and bulk acknowledgment is performed with the JavaScript API HMIRuntime.Alarming.AcknowledgeAll(). See the WinCC Unified V20 documentation for details.