1. Problem Statement
Non-acknowledgeable process messages in the WinCC/PCS 7 OS runtime remain visible in the message list, the message line, the group display, the block icon, and the status bar of the screen window even after the underlying automation system (AS) cause has been cleared. Operators cannot acknowledge the message because the standard acknowledge button is disabled or the message is not assigned to an authorization group that permits acknowledgment. The condition is observed across PCS 7 V8.0, V8.1, V8.2, and V9.0 installations but is most disruptive on systems where the operator's only recourse is a full OS restart.
The official Siemens Support article 109751476 - Deletion of non-acknowledgeable process messages in the WinCC PCS 7 OS runtime provides a C script solution for PCS 7 V9.0 / WinCC V7.4 SP1. That script calls runtime functions that do not exist in WinCC V7.3 (PCS 7 V8.0/V8.1) or WinCC V7.4 (PCS 7 V8.2), which is the core compatibility gap this document addresses.
2. Affected Versions and Compatibility Matrix
The root cause and the available remediation differ significantly between PCS 7 versions. The matrix below captures the verified behavior of the official deletion script and the supported runtime APIs.
| PCS 7 Version | WinCC Version | WinCC Update / SP | Official Script 109751476 Works | Notes |
|---|---|---|---|---|
| V7.1 | V7.0 | SP3 / SP4 | No | Runtime C API for MSG state manipulation not exposed. |
| V7.1 SP3 | V7.0 SP3 | Update 6+ | No | Use alarm hiding workaround. |
| V8.0 | V7.2 | SP2 / HF7 | No | Use alarm hiding workaround. |
| V8.1 | V7.3 | SP1 / SP2 | No | Use alarm hiding workaround; verify SP level. |
| V8.2 | V7.4 | SP1 | Partial | Some C functions exist, some do not; test on non-production first. |
| V9.0 | V7.4 | SP1+ | Yes | Reference implementation per Support article 109751476. |
| V9.0 SP1+ | V7.4 | SP1+ | Yes | Same script, additional hotfix for edge cases. |
To determine the installed version on a running OS server, open the WinCC Explorer and read Project Properties > Computer > Version or check C:\Program Files\Siemens\Automation\WinCC\bin\WinCC.exe file version.
3. Root Cause Analysis of Non-Acknowledgeable Messages
A process message transitions through states defined in the WinCC alarm engine. The relevant internal state bits are:
| Internal Bit | Meaning | Hex |
|---|---|---|
| MSG_STATE_COME | Message has come in | 0x0001 |
| MSG_STATE_GO | Message has gone | 0x0002 |
| MSG_STATE_QUIT | Message has been acknowledged | 0x0004 |
| MSG_STATE_LOCK | Message is locked (gearing) | 0x0010 |
| MSG_STATE_COMEBACK | Message has come in again (flapping) | 0x0040 |
| MSG_STATE_RESET | Reset triggered | 0x0100 |
| MSG_STATE_NOT_ACK | No acknowledgment possible (operator rights / state) | 0x1000 |
Non-acknowledgeable behavior is normally produced by one of four conditions:
- Authorization mismatch: The operator logged in has a lower level than the Authorization field configured in the message class. The Ack button is greyed out. Visible in WinCC Explorer > Alarm Logging > Message Classes > Authorization.
- Gearing locked: The message is part of a geared message group and the locking signal is held. The MSG_STATE_LOCK bit prevents acknowledgment.
- AS variable toggled too fast: The incoming bit toggles faster than the operator can acknowledge, leaving the message in a perpetual Incoming/Outgoing state. The block icon and status bar reflect the last known state but the message line keeps the last entry visible.
- Project / configuration error: A message class is configured with Single acknowledgment = No and Group acknowledgment = No, leaving the operator with no path. The WinCC CS documentation in the AS-OS Engineering manual lists the relevant class settings under "Acknowledgment concept".
Items (1) and (4) are configuration defects and should be corrected in the engineering project before any runtime workaround is applied. Items (2) and (3) are runtime conditions and the focus of the rest of this document.
4. Reference: The Official V9.0 Deletion Procedure
The Siemens Support article 109751476 deploys a C action triggered by a button on a separate WinCC picture. The script enumerates the message archive, identifies messages in the Not Acknowledgeable state, and forces the state to a value that the runtime treats as closed. The script body is delivered by Siemens as a downloadable project template accompanying the support entry.
The deletion logic relies on WinCC C API functions and runtime Pokes that are part of the WinCC V7.4 SP1 release. The names of those functions are not published in the public Siemens manual set; the support article is the only authoritative reference. The script's failure on V7.3 (PCS 7 V8.1) is the source thread's central observation: "some of c functions not exist in older wincc." Because the exact function list is not disclosed, this document does not attempt to reproduce the script verbatim but does cover the same logical operation using the alarm hiding and archive manipulation techniques available on V7.3.
5. Why the V9.0 Method Fails on V8.1 and Earlier
WinCC C API surface is extended between major versions. The functions referenced by the V9.0 script fall into two categories:
-
Message state query / modification: Functions in the
msrt_apifamily used to read and write the state of a runtime message. Introduced and stabilized in WinCC V7.4 SP1. - Alarm archive maintenance: Functions that interact with the SQL-based alarm logging archive (segment manipulation, forced commitment). The exact entry points are version-dependent.
On a WinCC V7.3 SP2 (PCS 7 V8.1) installation, the C compiler emits unresolved external errors when the script is loaded. The diagnosis is straightforward: open the Global Script C editor, recompile the project, and read the output window. Any line containing unresolved external symbol or LNK2019 corresponds to a function that does not exist in this build of WinCC. There is no patch or hotfix that back-ports these functions into V7.3; the only path is to use a runtime technique that does not depend on them.
6. Alarm Hiding Workaround (Detailed Procedure)
The hide-alarm feature is present in every WinCC V7.x release that ships the AlarmControl OCX. It is purely a runtime operator action and does not require scripting. The procedure is the source thread's recommended fallback for V8.1 systems.
6.1 Prerequisites
- Operator authorization level 9 (System) or higher, because the Hide function is in the System authorization class.
- A WinCC picture with an AlarmControl inserted from the WinCC object palette (Controls > WinCC AlarmControl).
- Toolbar configured to expose the Hide button. Default WinCC toolbars do not include it.
6.2 Configure the AlarmControl Toolbar
- Open Graphics Designer and create a new picture called
Pic_HideNonAck.pdlin the project directory\Grafic\. - Insert an AlarmControl from the object palette. Resize to cover most of the screen.
- Double-click the control to open the configuration dialog.
- Switch to the Toolbar tab. The dialog lists the available buttons in a tree view.
- Expand Message list and enable the entry Hide message. The corresponding toolbar button is added.
- Confirm with OK. Save the picture.
6.3 Filter for the Non-Acknowledgeable Message
- Open the OS runtime and navigate to the new picture. Log in as a system-level user.
- Click the Selection button in the alarm control toolbar to open the message selection dialog.
- Set the following filter criteria:
- State = Incoming, Incoming/Outgoing, Outgoing (deselect Acknowledged)
- Acknowledgment = "Not acknowledgeable" or filter by Authorization = No ack
- Time range = wide enough to include the stuck message
- Apply the filter. The list collapses to the candidate messages.
6.4 Hide the Message
- Right-click the offending message in the list.
- Select Hide message (or click the toolbar Hide button).
- Confirm the dialog "Do you want to hide this message?".
The hidden message is removed from the live message list and from the message line. It is written to the alarm log with the operator name and the timestamp. The hide action does not modify the AS variable, the message class, or the underlying status word in the block icon, which is the limitation discussed in the next section.
6.5 Restore Hidden Messages
If the hidden message returns (e.g., the AS condition reoccurs), the OS does not automatically re-display it. To recover hidden messages during commissioning or test:
- Open the same picture and the same filter.
- Click the Show hidden messages toolbar button (configured alongside Hide message in step 6.2).
- Select the message and click Restore message.
7. Cleaning the Residual Block Icon and Status Bar Symbols
After the message is hidden, operators observe that the block icon faceplate and the screen window status bar still display the alarm symbol. The cause is that the block icon and the status bar are driven by the block's MSG_STAT output word, not by the message list state. The hide action clears the list but does not write to the AS status word.
The residual symbols are not caused by lingering real conditions; the source thread confirms "in the fact there are not reasons for these messages and alarm symbols." The symbols are stale state in the block instance DB that was never cleared because the gear/lock bit remained high after the cause went away.
7.1 Trigger-and-Acknowledge Reset
The cleanest non-scripted reset is a forced trigger and acknowledge cycle. This is normally only used during commissioning, not in production, because it requires the operator to simulate the alarm condition.
- Open the faceplate of the affected block.
- Locate the message that is stuck. The faceplate shows the message text and the acknowledge button if authorization permits.
- If the ACK button is enabled, click it. The symbol clears and the message line removes the entry.
- If the ACK button is disabled, log in with a higher authorization level (level 9 "System") and try again.
7.2 Status Word Reset via WinCC Tag Simulation
For blocks where the ACK button is permanently disabled (configuration defect or wrong authorization class), the next option is to clear the block's status word directly.
- Identify the block instance DB and the bit that drives the alarm. In the standard PCS 7 APL libraries, this is typically bit
MSG_STAT.0(incoming) andMSG_STAT.2(acknowledged) of the instance DB'sMSG_STATword. - Open the faceplate in maintenance view (Authorization level 6 or higher).
- Trigger the alarm manually by setting the input condition for one scan cycle. Use the simulation input on the block faceplate where available.
- Clear the input. The block raises and acknowledges the message in one cycle, and the MSG_STAT word returns to 0.
7.3 Scripted Reset on V7.3 (Advanced)
For systems where the manual cycle is impractical (many blocks), a C script on a separate picture can iterate over a configured tag list and write 0 to MSG_STAT. The script does not call the missing V7.4 API; it uses SetTagWord and the tag names that the WinCC tag management exports for each instance DB. Because the procedure is project-specific (block type, instance tag naming, authorization class), it cannot be reproduced verbatim. The general pattern:
// Pseudo-code for V7.3 block icon cleanup
// Compile in WinCC Global Script C editor
#include "apdefap.h"
void OnClick(const char* lpszPictureName, const char* lpszObjectName)
{
int i;
char szTag[256];
for (i = 0; i < g_nBlockCount; i++)
{
sprintf(szTag, "AS_%s_H1.MSG_STAT", g_szBlocks[i]);
DWORD dwOldVal = GetTagDWord(szTag);
// Bit pattern of "incoming, not acknowledged"
if (dwOldVal & 0x0001)
{
// Trigger via standard MSG_LOCK manipulation
sprintf(szTag, "AS_%s_H1.MSG_LOCK", g_szBlocks[i]);
SetTagByte(szTag, 0);
}
}
}
8. Alternative Approaches
8.1 Use the OS Project Editor to Suppress Message Classes
For systems where the offending messages belong to a class that is not safety-critical (e.g., system messages, operator messages, lifecycle messages), the OS project editor can disable the class entirely. This is a permanent project change and is appropriate only when the class is not used in the operator's workflow. The path is WinCC Explorer > OS Project Editor > Message Configuration > Message Classes; uncheck the box next to the class to be suppressed, then compile the OS.
8.2 Cold Restart of the OS
A full OS restart clears the runtime message list and the in-memory status words. The block icons in the AS retain the last state, so a restart is not a complete fix; it is a temporary measure. Schedule it for the next planned outage.
8.3 Open a Siemens Support Request
9. Prevention and Engineering Best Practices
- Configure authorization carefully. In the message class, set the Authorization for acknowledgment to a level that the operator can reach, or configure a separate "Main operator" level. Misconfigured authorization is the most common cause of non-acknowledgeable messages in brownfield migrations.
- Flapping suppression. Use the Suppression time field in the message configuration to filter messages that toggle faster than a defined debounce. A value of 500 ms is typical for process alarms.
- Gearing review. For each geared message group, ensure that the locking signal (the input that holds the gear) is wired to a value that returns to 0 when the underlying condition clears. Gears that latch on a manual reset cause the exact symptom described in this document.
- Test the message class during FAT. The factory acceptance test should include a deliberate non-acknowledgeable condition and verify that the operator can recover. The recovery path tested in FAT is the path that will work in production.
- Document the operator's recovery path. Add a one-page procedure to the operations manual: how to filter, how to hide, how to restore. The procedure in section 6 is the basis for that one-pager.
10. Verification and Commissioning Checklist
Run the following checks after applying any of the procedures above. Each check has a pass/fail criterion and a recovery step if the check fails.
| # | Check | Pass Criterion | Recovery if Failed |
|---|---|---|---|
| 1 | OS runtime starts without Global Script compile errors | No LNK2019 / unresolved external symbol in the output window | Revert the C file, use alarm hiding |
| 2 | Operator can log in at authorization level 9 | Login screen accepts the user, horn silences | Reconfigure WinCC user administration |
| 3 | Alarm control shows the Hide button | Button visible in the picture, not greyed | Re-configure toolbar per section 6.2 |
| 4 | Filter for non-acknowledgeable messages returns at least one row | Row count > 0 for the documented case | Re-check filter criteria; widen time range |
| 5 | Hide action removes the row from the message list | Row disappears, no error toast | Check operator authorization; check alarm logging service |
| 6 | Hidden message is recorded in the alarm log | SQL query on the archive shows the message with operator name and "Hidden" flag | Verify alarm logging redundancy settings |
| 7 | Block icon symbol clears after the trigger-and-acknowledge cycle | Faceplate returns to green, no alarm symbol | Check MSG_STAT in the instance DB |
| 8 | Status bar in the screen window clears | Status bar returns to white, no horn icon | Cycle the screen window (open and close) |
| 9 | New process alarms are received normally | Test alarm raises and acknowledges in < 5 s | Verify alarm logging service is running |
| 10 | Operator can restore a hidden message (test path) | Show hidden + Restore brings the message back | Re-check toolbar configuration for Show hidden |
11. Troubleshooting Matrix
| Symptom | Likely Cause | First Action | Escalation |
|---|---|---|---|
| Compile error LNK2019 in Global Script | C function not present in this WinCC version | Read error log, identify symbol | Switch to alarm hiding workaround |
| Hide button is greyed out | Operator below authorization level 9 | Log in as a system-level user | Configure a higher-level user |
| Filter returns 0 rows for a known stuck message | Time range too narrow or state filter wrong | Widen time range, deselect state filter | Check that the message is in the runtime archive |
| Block icon symbol persists after hide | MSG_STAT word still set in AS | Run trigger-and-acknowledge cycle | Apply scripted reset per section 7.3 |
| Status bar symbol persists after hide | Screen window did not refresh | Close and reopen the screen window | Cycle the picture by calling OpenPicture in script |
| Hidden message returns after operator action | AS condition is genuinely recurring | Investigate the AS cause before hiding | Open a maintenance ticket |
| Alarm log shows hidden message but operator name is blank | Operator logged out before action committed | Re-do the hide action, stay logged in | Check the alarm logging redundancy switch-over time |
| OS becomes slow after several hide actions | Hidden messages accumulate in the archive | Archive the alarm log segment | Schedule a cleanup window |
12. Summary of Tools and Where to Get Them
- Siemens Support article 109751476 - Official V9.0 deletion template and procedure. Reference only; not portable to V7.3 / V7.4 SP0.
- WinCC Explorer (part of the PCS 7 installation) - for project editor and version inspection.
- Graphics Designer (part of the PCS 7 installation) - for the alarm hiding picture.
- SQL Server Management Studio (SSMS) for SQL Server 2014 / 2016 - for verifying the alarm log content after a hide action.
Why does the official Siemens script 109751476 fail on PCS 7 V8.1?
The script relies on C runtime functions introduced in WinCC V7.4 SP1 (PCS 7 V9.0). PCS 7 V8.1 ships with WinCC V7.3 SP2, which does not export those symbols. The Global Script C compiler reports LNK2019 unresolved external symbol errors. The fix is to use the alarm hiding procedure on a separate WinCC picture rather than the V9.0 C script.
How do I configure the Hide button on the alarm control toolbar?
Open Graphics Designer, double-click the AlarmControl, switch to the Toolbar tab, expand "Message list", and enable "Hide message". Save the picture. The button is then visible in the OS runtime when the operator is logged in at authorization level 9 (System) or higher.
Why do the block icon and status bar symbols persist after I hide the message?
The block icon faceplate and the screen window status bar are driven by the AS status word (typically MSG_STAT) of the block instance DB, not by the WinCC message list state. Hiding a message clears the list and the message line but does not write to the AS. Run a trigger-and-acknowledge cycle on the faceplate, or use the script in section 7.3 to clear the status word on WinCC V7.3.
Can I delete the message permanently instead of hiding it?
Permanent deletion from the running alarm log is not supported by any Siemens-supplied tool. The hide action is the closest operator-level action; the message remains in the archive with a "Hidden" flag. For permanent removal, schedule a database segment cleanup outside the runtime window.
What authorization level is required to hide a message?
Authorization level 9 (System) in the WinCC user administration. Configure at least one user with this level for the maintenance shift. Without level 9, the Hide button is disabled in the toolbar.
Does hiding a message also clear the global horn?
Yes. The horn is driven by the message list state, not by the AS status word. Hiding the message removes it from the list and the horn stops immediately. The block icon symbol, however, will still be visible until the AS status word is cleared.
How do I show a hidden message again during commissioning?
Add the "Show hidden messages" toolbar button to the same AlarmControl (same dialog as section 6.2). Open the picture, click "Show hidden messages", select the message in the list, and click "Restore message". The message reappears in the live message list and the message line.