Problem Overview
When commissioning a PIDConL controller block from the Siemens PCS 7 Advanced Process Library (APL) V7.1 SP5, the message-acknowledgement status outputs MsgAckn1 and MsgAckn2 remain permanently 0, even though the corresponding alarms are visible in WinCC, can be acknowledged by the operator, and re-trigger correctly. The auxiliary error flags MsgErr1 and MsgErr2 likewise never leave 0. The HMI side shows correct alarm lifecycle behaviour, but the controller block itself never propagates the ACK_STATE from the internal ALARM_8P instances back to the application program.
This symptom is independent of how the controller is wired in the CFC chart: signal-conditioning inputs (PV_IN, SP_IN, SP_OP), the operator-permitted bits, and the output-side LMN path all behave normally. Only the two message-status words and the two message-error words are frozen at zero, which breaks any external logic that branches on whether an alarm has been acknowledged (for example, suppression of bumpless transfer during an active alarm window).
The symptom is well-documented in PCS 7 installations running APL 7.1 SP5 where the PIDConL is called exclusively from a time-driven organisation block such as OB35, and where OB1 is left empty (or contains only the default warm-restart OB100 logic). The alarm pipeline through WinCC works because the ALARM_8P block always reports its ACK_STATE to the OS via the configured message path. The controller-block outputs only reflect that state when an explicit update mechanism is enabled.
Affected Products and Versions
| Component | Version / Catalog | Status |
|---|---|---|
| SIMATIC PCS 7 Advanced Process Library (APL) | V7.1 (incl. SP5), V7.1 SP1, V7.1 SP2 | Affected — default Feature Bit 22 = 0 |
| SIMATIC PCS 7 APL | V8.0, V8.1, V8.2, V9.0, V9.1 | Affected — same Feature.Bit22 word, same default |
| Block family | PIDConL, PIDConR, PIDConS (CFC type FB 1869 / APL family) | Affected — all controllers that embed ALARM_8P for limit messaging |
| Firmware dependency | S7-400 CPU (CPU 410-5H, CPU 416, CPU 417), AS 410 | None — pure software/parameter issue |
| OS / HMI | WinCC V7.1+, PCS 7 OS Runtime | Not affected — WinCC alarm line is independent of the controller output |
The behaviour is documented in the BRAUMAT / PCS 7 Library V7.1 description and the English-language companion document. The SIMATIC PCS 7 Process Control System APL V9.0 manual keeps the same MsgAckn1/MsgAckn2 output naming convention, confirming that the Feature-Bit interpretation has remained stable across major releases.
Root Cause
The PIDConL block encapsulates one CTRL_PID arithmetic core plus up to two ALARM_8P message blocks for the MsgLock1/MsgLock2 limit-message logic. Internally, the two MsgAckn outputs are wired to the ACK_STATE output of the embedded ALARM_8P instances, and MsgErr1/MsgErr2 are wired to the MSG_ERR output of the same instances.
Whether those internal ACK_STATE / MSG_ERR signals are actually copied out to the visible block outputs is gated by Feature.Bit22 of the PIDConL instance, where the Feature word is a 32-bit configuration input exposed on the block faceplate:
| Bit | Meaning in PIDConL Feature word |
|---|---|
| 0–21 | Standard configuration bits (operator-permitted ranges, tracking mode, anti-reset windup behaviour, setpoint ramp, etc.) |
| 22 | 1 = Enable message-state actualization (MsgAckn1/2 and MsgErr1/2 outputs are refreshed each PIDConL call) |
| 23 | 0 = Alarm type is status (magenta), 1 = alarm (red), 2 = warning (yellow) — selectable per limit |
| 23–31 | Reserved / vendor-specific behaviour, refer to the APL manual for the active release |
When Feature.Bit22 is 0 (the APL default), the MsgAckn1, MsgAckn2, MsgErr1, and MsgErr2 outputs are written only when an event in OB1 (the cyclic free-running OB) touches the block. Because modern PCS 7 installations run almost all of their logic inside OB35 (the 100 ms time-of-day interrupt) and leave OB1 essentially empty, the cyclic refresh of those four outputs never happens. The ALARM_8P instances still report their ACK_STATE to WinCC via the message path, but the value is not copied into the controller block's outputs.
This is why the symptom is invisible on the HMI but breaks any CFC/SFC logic that reads MsgAckn1 or MsgAckn2. It also explains the operator observation that "the ACK_STATE only updates after 10–15 seconds": that latency is exactly the period between two OB1 passes (or the next S7 communication cycle that incidentally reads the block) — not the OB35 period.
OB1 can be used; enabling the per-cycle update adds one read of the embedded ALARM_8P.ACK_STATE and MSG_ERR per PIDConL call and therefore increases the OB35 CPU time. Plants with hundreds of controller instances and tight 100 ms cycle budgets prefer the default. Plants that read MsgAckn* in safety or interlocking logic must enable Bit22.Solution — Enable Feature Bit 22
- Open the CFC chart that contains the
PIDConLinstance in the PCS 7 Engineering Station. - Right-click the
PIDConLblock → Open Properties (or press Alt+Enter on the block faceplate). - Switch to the Inputs/Outputs tab and locate the
Featureinput (DWORD, 32 bits, default value = 0 in newly inserted instances). - Compute the new DWORD value:
Feature = Feature OR (1 << 22). For a default value of0this gives16#00400000. If other bits are already set (for example Bit0 = 1 to enable setpoint tracking, or Bit8 = 1 to enable bumpless transfer at start-up), keep them and add16#00400000to the existing value. - Click Apply, close the dialog, and recompile the chart (Chart > Compile > All).
- Download the program changes to the AS in RUN mode (CFC supports online download of parameter changes without CPU stop).
- Observe the
MsgAckn1/MsgAckn2outputs in a watched CFC instance table, or in the block-icon faceplate via WinCC, and confirm the value toggles to1after acknowledging the alarm on the OS.
The Feature input can also be set dynamically through CFC interconnections, although this is rarely done because Bit22 toggling changes the CPU load profile mid-cycle. For permanent behaviour, set it as a constant value on the block.
Alternative — Activate OB1 Refresh Path
If Bit22 must remain 0 to preserve CPU headroom (typical for very large PCS 7 plants with hundreds of PIDConL instances and a tight OB35 cycle), the alternative is to ensure the PIDConL instance is called from OB1. The library implements a low-cost refresh of the four status words on the OB1 pass, which does not have the full per-cycle cost of the Bit22 path.
- In the S7 program editor, open the
OB1source. - Insert a CFC-in-OB call: from the menu Insert > Block Call > From CFC Chart, browse to the chart containing the
PIDConLinstance, and insert a call to that chart family. - Compile and download. Note that this path introduces the
MsgAckn*latency observed in the field (10–15 seconds in typical configurations), because OB1 free-running cycle time is not deterministic and is often dominated by the OB35 interrupt. - Use this option only when read-consumers of
MsgAckn*can tolerate that latency (for example, slow trend annotations or operator-information blocks).
Trade-off summary:
| Approach | CPU impact | Update latency | Recommended use |
|---|---|---|---|
| Bit22 = 0, OB1 call present (default) | Lowest | One OB1 pass (seconds) | Hundreds of controllers, latency-tolerant consumers |
| Bit22 = 1 (recommended) | +1 ALARM_8P read per PIDConL call per OB35 pass | One OB35 pass (≤ 100 ms) | Safety/interlock logic reading MsgAckn*, any deterministic requirement |
| Bit22 = 1 + OB1 call | Highest | Both paths active | Not recommended — duplicates CPU load |
Verification Procedure
After enabling Feature.Bit22, verify the fix end-to-end:
- In the CFC online view, force the controlled variable
PVjust outside the configuredMsgLock1high limit and confirm the alarm appears in the WinCC alarm line. - Acknowledge the alarm from the WinCC alarm view (click the green checkmark on the unacknowledged alarm row).
- Watch the
MsgAckn1output in the CFC instance table — it must transition toW#16#0001within one OB35 cycle (≤ 100 ms). - Bring the process back into the limit band so the alarm clears itself; verify
MsgAckn1returns toW#16#0000on the next alarm clear edge. - Repeat for
MsgAckn2by forcing a violation of the second limit (MsgLock2). - To validate
MsgErr1/MsgErr2, temporarily delete the WinCC message configuration for one of the twoALARM_8Pinstances (in the OS project editor, mark the message as not generated). The correspondingMsgErr1orMsgErr2must then transition to1, confirming the error-flag plumbing. Restore the message configuration before sign-off. - Run an S7-CPU utilization trace for at least 10 minutes and confirm the OB35 cycle time increase is consistent with one extra
ALARM_8P.ACK_STATE/MSG_ERRread perPIDConLper cycle. On a CPU 410-5H with 100 controllers and 100 ms OB35, expect a 1–3 ms increase.
Related I/O and Configuration
The SIMATIC PCS 7 Process Control System APL PIDConL I/O manual lists every input and output that interacts with the message-status path. The relevant subset is:
| I/O | Direction | Type | Meaning |
|---|---|---|---|
| MsgLock1 | Input | BOOL | External lock of the 1st ALARM_8P instance (incoming messages are suppressed) |
| MsgLock2 | Input | BOOL | External lock of the 2nd ALARM_8P instance |
| MsgAckn1 | Output | WORD | Bit0–7 = ACK_STATE of ALARM_8P #1; gated by Feature.Bit22 |
| MsgAckn2 | Output | WORD | Bit0–7 = ACK_STATE of ALARM_8P #2; gated by Feature.Bit22 |
| MsgErr1 | Output | BOOL | 1 = messaging error on ALARM_8P #1 (e.g. OS link failure) |
| MsgErr2 | Output | BOOL | 1 = messaging error on ALARM_8P #2 |
| EventTsIn | Input | STRUCT | Interconnect with EventTsOut of EventTs/Event16Ts for time-stamped audit events |
| Feature | Input | DWORD | 32-bit configuration word; Bit22 enables message-state actualization |
The general ALARM_8P messaging-error semantics are documented in the SIMATIC Process Function Library V3.0 manual, which states that MSG_ERR rises when the message path (configured in the OS project editor) is incomplete, when the AS-OS connection is interrupted, or when the message number has not been generated during compilation.
Performance and Cycle-Time Considerations
Each PIDConL call with Feature.Bit22 set performs two additional accesses to the embedded ALARM_8P blocks (one for ACK_STATE, one for MSG_ERR), plus the implicit internal copy to the MsgAckn1/MsgAckn2/MsgErr1/MsgErr2 outputs. On a CPU 416-3 PN/DP with 100 controllers and OB35 at 100 ms, measured delta is in the 1–3 ms range per OB35 pass; on a CPU 410-5H the absolute impact is similar but represents a smaller percentage of the available cycle budget.
If you are running the AS close to the configured communication load (CPU utilisation > 70 %), audit the change first with the S7 CPU load monitor (PLC > Diagnostics > CPU Load) or PCS 7 Maintenance Station. For plants in the 90 %+ band, prefer the OB1-refresh alternative and accept the higher MsgAckn* latency for non-safety consumers.
Common Pitfalls
-
Setting Bit22 only on one of several controllers. Each
PIDConLinstance carries its own Feature word — there is no global override. Review every controller in the plant that consumesMsgAckn*. -
Forgetting to recompile the OS after a chart change. Although the
MsgAckn*values are read internally, an OS recompile is required if you also added or renamedALARM_8Pmessages. Without it,MsgErr*may legitimately rise. -
Confusing
MsgLockwithMsgAckn.MsgLockis an input that suppresses incoming messages; it does not clearMsgAckn*. To reset an acknowledgement state programmatically, drop the relevant limit throughMsgLock = 1and back to0, then re-trigger the alarm. -
Reading
MsgAckn1bitwise in CFC. The output is a WORD that mirrorsALARM_8P.ACK_STATE. Use the low byte (bits 0–7) as the eight discrete acknowledgement flags of the message instance; do not interpret the high byte. -
Assuming OB100 warm-restart is sufficient. The
OB100path initialises the controller and the message blocks but does not refreshMsgAckn*when Bit22 is0. Cyclic OB35 / OB1 execution is required.
Quick Reference — DWORD Value for Bit22
| Scenario | Feature value (hex) | Feature value (decimal) |
|---|---|---|
| Default (Bit22 off) | 16#00000000 | 0 |
| Bit22 on, no other bits set | 16#00400000 | 4194304 |
| Bit22 on + Bit0 (example — enable setpoint tracking) | 16#00400001 | 4194305 |
| Bit22 on + Bit8 (example — start-up bumpless) | 16#00400100 | 4194560 |
Use the CFC online Watch view to read the live Feature DWORD before changing it, so you OR the new bit into the existing mask rather than overwriting the configuration.
Why are PIDConL MsgAckn1 and MsgAckn2 always 0 even though the alarm acknowledges correctly in WinCC?
The internal ALARM_8P blocks always report their ACK_STATE to the OS message path, which is why WinCC works. The MsgAckn1/MsgAckn2 outputs on the PIDConL block, however, are only refreshed when Feature.Bit22 is set (value 16#00400000 in the Feature DWORD). With the default Bit22 = 0 and OB1 essentially empty, the copy from ALARM_8P.ACK_STATE into MsgAckn* never runs, so the outputs stay frozen at zero.
What Feature.Bit22 value enables message-state actualization on PIDConL?
Set the Feature input DWORD to the bitmask 16#00400000 (decimal 4 194 304, bit 22 = 1). If other Feature bits are already configured, OR 16#00400000 into the existing value rather than overwriting it. Download the chart after the change; CFC supports online download of parameter-only edits.
Does enabling Bit22 increase CPU load?
Yes. Each PIDConL call with Bit22 = 1 performs two extra reads (ACK_STATE and MSG_ERR) from the embedded ALARM_8P instances. On a CPU 416-3 PN/DP with ~100 controllers and OB35 at 100 ms, expect a 1–3 ms per-cycle increase. On a CPU 410-5H the absolute delta is similar but a smaller percentage of the cycle budget. If the AS already runs above 70 % utilisation, audit with the S7 CPU load monitor first.
Can I keep Bit22 = 0 and still get correct MsgAckn* values?
Yes, by ensuring PIDConL is called from OB1. The library writes MsgAckn1/MsgAckn2/MsgErr1/MsgErr2 on the OB1 free-running pass. The trade-off is non-deterministic latency (typically several seconds), so use this only when downstream logic tolerates that delay. Do not combine OB1 refresh with Bit22 = 1, because the two paths duplicate work.
Are MsgErr1 and MsgErr2 affected by the same Feature bit?
Yes — Bit22 gates both the MsgAckn* AND the MsgErr* outputs. With Bit22 = 0 and no OB1 call, MsgErr1 and MsgErr2 are also frozen at zero, even though MSG_ERR from the underlying ALARM_8P may be active. The standard reason for MSG_ERR going high is a missing or uncompiled OS message, an interrupted AS-OS connection, or a duplicate message number. After enabling Bit22, MsgErr* will correctly report those conditions.