Problem Context
Operators in continuous process plants must be able to tell, at a glance, whether a PID loop is running in closed-loop (automatic) mode or whether the controller output is being driven manually by the operator or by an upstream override. The indication is critical during start-up, trip recovery, and any time field devices - control valves, variable speed drives, damper actuators - appear to be misbehaving. A faceplate that does not flag the manual state is one of the most common reasons for slow fault-finding and for accidental manual operation going unnoticed for hours.
On a SIMATIC PCS 7 HMI, this information is normally surfaced through the controller faceplate. The Standard PID Control block (PID_CP) does provide the underlying state internally, but the block does not expose a single dedicated 'Manual Mode' tag that automatically appears in the OS tag list of a default project template. Engineers must derive the flag from the block's own I/O and route it to a BOOL tag that the faceplate graphic can bind to.
This reference documents the standard method to derive the Auto/Manual flag for the Standard PID Control block (often referred to in the field as 'FB1' when it is the first controller instance in the program), exposes the tag to the OS, and binds it to a faceplate indicator that the operations team can read in a single glance.
Block Identification and Library Location
The Standard PID Control block is part of the SIMATIC PCS 7 master data library, located at:
Master Data Library > Controllers > Standard PID Control > PID_CP
In a PCS 7 project, when the block is placed in a CFC chart, the system generates a matching instance DB. By convention, the first instance in a project is often assigned to DB 1, which is the source of the field term 'FB1' - in practice the term refers to the instance data block, not the block type itself. The block type, the I/O surface, and the behaviour described here are preserved across PCS 7 V8.0, V8.1, V8.2, V9.0, and V9.1, so the manual-mode derivation logic is portable across these releases. The PCS 7 Standard Library documentation is published on the Siemens Industry Online Support portal at support.industry.siemens.com as part of the 'PCS 7 - Standard Library' manual set.
The block is the continuous, fixed-setpoint variant. The 'CP' suffix distinguishes it from the step controller PID_ES and from the self-tuning controller PID_ST. If the loop in question uses PID_ST or PID_ES, the Man_On, ENO, and Com_Rst signals are still present and the logic described here applies unchanged. The same is true if the project mixes PID_CP loops with FB 41 'CONT_C' or FB 42 'CONT_S' from the legacy S7 Standard Library: the derived flag pattern is identical, although the input/output symbol names differ in STEP 7 (for example, COM_RST and MAN_ON for FB 41).
I/O Map Used for Manual Mode Detection
Three signals are required to derive a robust Manual Mode flag. The direction, data type, and meaning of each are listed below.
| Signal | Direction | Type | Meaning |
|---|---|---|---|
| Man_On | Output | BOOL | TRUE while the controller is actively in manual mode. Set by the block when the operator selects manual in the faceplate, when MS = MANUAL is forced, or when an external Man_On request is honoured. |
| ENO | Output | BOOL | ENO of the FB. FALSE indicates the block did not finish processing in the current cycle (for example, due to a stop, a non-fatal runtime error, or because the block was not called). |
| Com_Rst | Input | BOOL | Complete restart. While TRUE, the block initialises the I-action and forces the output to its initial value. The Man_On state is not meaningful during a complete restart. |
Manual Mode Detection Logic
A robust Manual Mode flag is high only when all three of the following are true:
- The block reports that it is in manual mode (Man_On = TRUE).
- The block executed without error in the current cycle (ENO = TRUE).
- The block is not being initialised (Com_Rst = FALSE).
The Boolean expression is therefore:
Man_Mode_Active = Man_On AND ENO AND (NOT Com_Rst)
Including ENO prevents a stale flag from being latched on if the block is no longer being processed (for example, if a downstream stop has disabled the OB). Including Com_Rst avoids showing 'Manual' while the I-action is being initialised, which is a state the operator should see as 'Restart' rather than 'Manual.'
STL and SCL Implementation
The simplest deployment is a one-network SCL function block that evaluates the three signals and writes the result to a BOOL output. The output can be exposed directly to the OS as a stand-alone flag, or it can be added as a member of a project-wide controller status DB.
FUNCTION_BLOCK PID_Man_Flag
VAR_INPUT
i_Man_On : BOOL;
i_ENO : BOOL;
i_Com_Rst : BOOL;
END_VAR
VAR_OUTPUT
o_ManMode : BOOL;
END_VAR
BEGIN
o_ManMode := i_Man_On AND i_ENO AND NOT i_Com_Rst;
END_FUNCTION_BLOCK
The equivalent STL implementation inside a function or function block, using the local symbols of the FB, is a single network:
// Network 1: Derive Manual Mode flag for faceplate
// Inputs : i_Man_On, i_ENO, i_Com_Rst (all BOOL)
// Output : o_ManMode (BOOL)
A #i_Man_On // controller is in manual
A #i_ENO // block processed without error
AN #i_Com_Rst // not in complete restart
= #o_ManMode
If you prefer not to deploy a separate function block, you can place the same logic on a separate network in the FC that already calls PID_CP, using the instance DB symbol for the inputs. With the instance DB assigned to DB 1 (the 'FB1' instance referenced in the field), the symbols resolve symbolically in the editor.
Ladder Logic Implementation
The same expression in LAD is a single network with one normally-open contact per TRUE-condition and one normally-closed contact on Com_Rst.
Network 1: Manual Mode Active
| i_Man_On i_ENO i_Com_Rst(NC) |
+--| |-------+| |------+ |/ |------( )----+
o_ManMode
Place this contact network in the same FC/FB that hosts PID_CP, or in a project-wide status FC that is called in OB 35 (the cyclic interrupt used for PID execution in PCS 7). Avoid placing the logic in OB 1 because the cyclic interrupt guarantees deterministic timing for the flag update.
CFC Implementation in PCS 7
In a PCS 7 CFC chart, drop the PID_CP block, then add a small logic block to derive the flag. The cleanest approach is a single AND block (from the PCS 7 standard library, FB 1700 series) with an INV block in front of the Com_Rst input.
- From PID_CP output Man_On, run a sheet interconnector to the first input of the AND block.
- From PID_CP output ENO, run a sheet interconnector to the second input of the AND block.
- From PID_CP input Com_Rst, route the signal into the input of an INV block, then run the INV output to the third input of the AND block.
- Route the AND block output to a new BOOL tag named Loop_Man_Mode in the chart's I/O sheet.
- Mark the Loop_Man_Mode tag as OS-relevant in the chart I/O editor.
- Compile the chart, then compile the OS.
Exposing the Manual Mode Tag to the OS
To make the derived flag appear in WinCC, the tag must be marked OS-relevant and the OS must be recompiled. The exact steps in the PCS 7 plant view are:
- Open the CFC chart that contains PID_CP and the AND block.
- Right-click the output Loop_Man_Mode in the chart's I/O sheet.
- Select 'Object Properties' and enable the 'OS-relevant' attribute. Optionally set 'Operator-controllable' to No - the operator should not toggle the flag directly.
- From the PCS 7 plant view, right-click the S7 program and choose 'Compile OS.'
- Wait for the OS server to import the new tag. If the picture is already open, the runtime may need to reload the affected picture; in OS Server / OS Client setups, the client cache must also be refreshed.
- Verify in WinCC Explorer that the tag appears under the structure tag that represents this loop (typically the loop's own S7 structure instance).
The tag is automatically enrolled in the standard PCS 7 archive for the loop if the archive configuration references the parent structure. No additional archive wiring is required if the standard template is in use.
WinCC Faceplate Configuration
Once the tag is on the OS, bind it to a faceplate element. The faceplate for the Standard PID Control block is shipped with PCS 7 as part of the standard HMI library. If you have created a custom faceplate, follow the same binding steps for your custom graphic.
- Open the loop picture in the Graphics Designer.
- Open the faceplate instance (double-click the controller symbol).
- Insert a status indicator - a circle shape with two states - on the faceplate, near the Auto/Manual button.
- Link the 'Visible' or 'Appearance' property of the indicator to the Loop_Man_Mode tag using a dynamic dialog or a C action.
- Configure the visual states: a yellow or red filled circle when Loop_Man_Mode is TRUE, and a green or grey filled circle when FALSE.
- Add a text element 'MAN' that becomes visible when Loop_Man_Mode is TRUE.
- Save, close, and re-test the picture in runtime.
For operators that need an audible or alarm feedback, raise a 'Manual Mode Active' message class entry from the Loop_Man_Mode tag. Right-click the tag in WinCC Explorer, select 'Properties' > 'Messages,' and create a new message of class 'Operator Note' with the text 'Loop is in Manual Mode.' If the site policy requires a horn for every manual entry, use message class 'Warning' instead and ensure the loop's area authorisation covers the operator's role.
Status Word Bits and Internal Mode
The PID_CP block maintains an internal status word that combines the actual mode, the limits, the tracking flag, and the error state. The most relevant bits for manual detection are summarised below. The status word is accessible as a single byte or word in the instance DB, depending on the block version.
| Bit | Symbol | Meaning |
|---|---|---|
| 0 | Mod_On | The block is being processed. Used by the OS to grey out inactive loops. |
| 1 | Man_Op | Operator has requested manual mode. Set on the request, before the block transitions. |
| 2 | Man_On | Controller is actively in manual mode. The same value as the BOOL output Man_On. |
| 3 | Auto_Op | Operator has requested auto mode. |
| 4 | Sp_Track | Setpoint is being tracked by the process variable. |
| 5 | Pv_Hlm | PV exceeded the high limit. |
| 6 | Pv_Llm | PV dropped below the low limit. |
Bit 2 (Man_On) is the same signal exposed as the BOOL output. If you are already consuming the status word for limit-handling logic, you can mask and extract this single bit and OR it into the manual flag instead of running a separate wire. This reduces the I/O count on the AND block and keeps the loop's logic in a single status DB.
Edge Cases and Failure Modes
The following edge cases frequently cause the Manual Mode indicator to read incorrectly if not handled explicitly.
Com_Rst pulse during SFC startup: A momentary Com_Rst clears the I-action and may briefly clear Man_On. The faceplate will flicker from 'MAN' to 'AUTO' and back. The recommended mitigation is to latch the flag on a rising edge of Man_On, then clear it on a falling edge after a 2-second debounce in the OS. The C action is straightforward: store Loop_Man_Mode_Latch in a process tag, set it when Loop_Man_Mode goes true, clear it only after Loop_Man_Mode has been false for the debounce time.
Block not called: If the cyclic OB that calls PID_CP is stopped - for example, during a partial restart or under a CPU stop - ENO is FALSE and the derived flag is suppressed. The faceplate should not show 'Manual' in this state. Configure the loop picture to default to 'Unknown' (greyed out) when the flag is not asserted and the loop is not in auto either. The Mod_On bit is useful for distinguishing this case from a true manual state: if Mod_On is FALSE and Loop_Man_Mode is FALSE, the indicator should show 'Unknown' rather than 'AUTO.'
Operator authorisation: Manual mode can be requested only by operators with the right authorisation level. If the flag is set but the operator cannot request auto, check the authorisation in the OS user administration and the operator's role on this area. PCS 7 areas inherit authorisation from the parent hierarchy; verify that the loop's parent area carries the correct 'Operation - Manual' permission.
Tracking and Override: PID_CP supports SP_TRACK for setpoint tracking and a separate override input on the faceplate. When the loop is being overridden, Man_On may not be set. If you need to indicate that the loop is being driven externally, use the override bit in the status word. In most projects this is the only additional signal that needs to be OR'd into the indicator.
Simulation mode: In SIMIT or PCS 7 Plant Simulation, the controller runs against a simulated process. The Man_On flag behaves identically, but be aware that the simulated operator can also drive the output directly from the simulation tool. In that case, the loop is effectively manual but the controller's internal mode may still read auto. The faceplate indicator therefore reflects controller mode, not plant state, during simulation - the maintenance team should be aware of this distinction during FAT and SAT.
Loss of OS connection: If the OS Server loses the S7 connection, WinCC tags retain their last value with quality code 0x1C (substitute value) or 0x00 (bad). Configure the faceplate to show 'Unknown' when the quality code is anything other than 0x80 (good). A loop that the operator believes to be in manual but the OS shows as 'Unknown' should be treated with caution until the S7 connection is restored.
Verification Procedure
After deployment, verify the indicator on the live OS with the following steps. Run the full procedure during SAT and repeat a shortened version during each shift handover for the first week of operation.
- Open the loop picture in WinCC Runtime.
- Confirm the faceplate shows 'AUTO' by default. The Loop_Man_Mode tag in the tag monitor should read 0.
- Click the 'Manual' button on the faceplate. The status indicator should turn to 'MAN' within one cycle (OB 35 cycle time, typically 100 ms or 1 s depending on the OB35 configuration).
- Click the 'Auto' button. The indicator should return to 'AUTO'.
- Force Com_Rst = TRUE from PLCSIM or a test program. The indicator should briefly drop to 'Unknown' or 'AUTO' and return to 'MAN' when Com_Rst is released. The 2-second debounce, if implemented, should suppress the flicker.
- Force ENO = FALSE (or stop the OB that calls PID_CP). The indicator should be suppressed entirely.
- Toggle operator authorisation to deny manual mode. The button should be greyed out and the flag should remain in its current state.
- Check the operator audit log to confirm the manual entry and exit are recorded with the correct operator ID and timestamp.
- Trigger a complete CPU restart and verify that the loop returns to the configured start-up mode (auto, manual, or last value) with the indicator showing the correct state after the SFC startup sequence.
Diagnostic Tips for Field Commissioning
When the indicator does not behave as expected, work through the following diagnostic checks in order. The table maps the most common symptoms to their most likely causes and the first action to take.
| Symptom | Likely Cause | Action |
|---|---|---|
| Flag stuck TRUE | Stale output latch from a previous manual session, or the AND block is wired to the wrong instance DB. | Check the tag's source connection in WinCC and trace the BOOL back to the CFC chart I/O. Use 'CFC Cross References' to find every sheet interconnector that touches the flag. |
| Flag stuck FALSE | Operator is in auto, the AND block output is not marked OS-relevant, or the OS server has not reloaded the picture. | Right-click the tag in WinCC and inspect the 'Update' and 'Quality' properties. Quality Code 0x80 = OK; 0x00 = bad. Reload the picture from the OS client menu. |
| Flag flickers | Com_Rst is being pulsed by the SFC startup, or the OB35 cycle is being shared with a faster task. | Use the operator log to see the toggle pattern. Implement a 2 s debounce in the OS. Verify OB35 priority is lower than OB1 but higher than OB100. |
| Indicator grey | Loop is not in Mod_On state, or OB35 is not calling PID_CP. Quality code on the tag is not 0x80. | Check CPU run state and OB35 priority. Use the PCS 7 diagnostic 'CFC Runtime' view. Confirm the chart's run priority is set to the same OB35 priority as other loops. |
| Manual entry rejected | Operator authorisation does not include the 'Operation - Manual' permission for the loop's area. | Open the OS user administration, locate the operator's role, and add the missing permission. Verify the inheritance from parent area. |
| Indicator correct on OS Server but not OS Client | OS client cache is stale, or the client's package has not been updated. | Re-export the OS Server package and load it on the client. Verify the tag is included in the package by checking WinCC Explorer's 'Computer' properties. |
Frequently Asked Questions
Why does the Standard PID Control block not expose a dedicated 'Manual Mode' tag in the OS tag list by default?
The block does expose the state internally as the BOOL output Man_On and as bit 2 of the internal status word. PCS 7 does not surface this single bit as a stand-alone OS tag in the default project templates, so the engineer must derive the flag from the existing I/O and mark it as OS-relevant in the CFC chart. The same pattern is used for the 'tracking' and 'override' indications.
What is the difference between Man_On and the operator's manual request?
Man_On reflects the actual mode of the block, not the request. The operator clicks the 'Manual' button, the faceplate writes the request, and the block sets Man_On after the next cycle. During the transition, Man_On remains FALSE even though the operator has already clicked the button. Use Man_On to drive the faceplate indicator, not the request bit (Man_Op in the status word).
Can the manual flag be derived in CFC, or do I have to write SCL?
Both work. The simplest CFC approach is to use the standard AND block (FB 1700 series) and an INV block on the Com_Rst input, then route the AND output to a new OS-relevant BOOL tag. SCL is preferred if the logic block is reused in many loops, in which case a small FC with the expression 'Man_On AND ENO AND NOT Com_Rst' is more maintainable than a CFC copy in every chart.
How do I display the manual flag in the standard PCS 7 faceplate?
Open the faceplate instance, insert a status indicator (a circle with two states) near the Auto/Manual button, and bind its appearance to the Loop_Man_Mode tag using a C action or a dynamic dialog. Most sites colour the indicator red or yellow when manual and green or grey when auto. Optionally add a text element 'MAN' with the same binding, and raise an 'Operator Note' message on the rising edge of the flag.
What happens to the manual flag during a complete restart (Com_Rst = TRUE)?
During a complete restart, the block initialises the I-action and forces the output to the configured initial value. The Man_On output may be cleared momentarily. The derived faceplate flag is intentionally suppressed in this state by the AND-NOT(Com_Rst) condition, so the operator sees 'AUTO' or 'Unknown' rather than a false 'MAN' indication. Add a 2-second debounce in the OS to handle short Com_Rst pulses from the SFC startup sequence.