# FB_CylinderMonitor — S7-1500 SCL Universal Cylinder Supervisor > **Platform:** Siemens S7-1500 | TIA Portal V18+ | SCL > **Blocks:** `FB_CylinderMonitor` · `FB_CylFaultCollector` > **Companion to:** [`FB_WeldSequencer`](../README.md) A drop-in cylinder monitoring library for any pneumatic or hydraulic actuator. Handles all real-world sensor configurations — zero, one, or two position sensors — generates direction-aware timeout faults, detects sensor conflicts and lost positions, gates actuator outputs for safety, and feeds structured fault data directly to an HMI and machine sequencer. --- ## Table of Contents 1. [Why This Exists](#1-why-this-exists) 2. [Files](#2-files) 3. [Sensor Configuration Options](#3-sensor-configuration-options) 4. [Fault Logic Per Configuration](#4-fault-logic-per-configuration) 5. [FB_CylinderMonitor — Interface](#5-fb_cylindermonitor--interface) 6. [FB_CylFaultCollector — Interface](#6-fb_cylfaultcollector--interface) 7. [Output Gating Pattern](#7-output-gating-pattern) 8. [Integration with FB_WeldSequencer](#8-integration-with-fb_weldsequencer) 9. [Demo: Welding Cell (4 cylinders)](#9-demo-welding-cell-4-cylinders) 10. [HMI Integration](#10-hmi-integration) 11. [TIA Portal Setup](#11-tia-portal-setup) 12. [Timing Reference](#12-timing-reference) 13. [Fault Code Reference](#13-fault-code-reference) 14. [Adapting for Other Applications](#14-adapting-for-other-applications) 15. [Safety Notes](#15-safety-notes) --- ## 1. Why This Exists Every cylinder in a machine needs the same boilerplate logic: - Did it reach position in time? If not → fault - Are both sensors TRUE at once? That's wiring or hardware failure → fault - Did it leave position without being commanded? → fault - What should the machine do when it faults — pause or stop? - What should the operator see on the HMI? Writing this 20+ times per machine is error-prone and inconsistent. `FB_CylinderMonitor` encapsulates it once, handles all sensor topologies, and gives you clean `AtFwd`/`AtBwd` booleans that replace raw sensor reads in your step advance conditions. --- ## 2. Files ``` 📁 CylinderMonitor/ ├── FB_CylinderMonitor.scl # FB_CylinderMonitor + FB_CylFaultCollector ├── DEMO_WeldCellIntegration.scl # Integration demo (4 cylinders + sequencer) └── README_CylinderMonitor.md # This file ``` --- ## 3. Sensor Configuration Options Set `SensorConfig` (INT) on each FB instance: | Value | Constant | Sensor Setup | Typical Use | |---|---|---|---| | `0` | `CFG_NONE` | No sensors | Valves, no-feedback actuators | | `1` | `CFG_ONE_FWD` | Sensor at FWD (extended) end only | Clamps, grippers — only care about "closed" | | `2` | `CFG_ONE_BWD` | Sensor at BWD (retracted) end only | Ejectors — only care about "home" | | `3` | `CFG_TWO` | Sensor at both ends | Weld heads, positioners, gates | ### Which configuration to use? ``` Q: Does the cylinder need to confirm both extended AND retracted? YES → CFG_TWO (3) Q: Only need to know it's closed/extended? YES → CFG_ONE_FWD (1) Q: Only need to know it's home/retracted? YES → CFG_ONE_BWD (2) Q: No sensor at all (timer-only advance)? YES → CFG_NONE (0) ``` --- ## 4. Fault Logic Per Configuration ### CFG_NONE (0) — No faults possible from position ``` Cmd_Fwd ON ──────────────────────────────────▶ CylCmd_FwdSafe ON CylState = AT_FWD (trusted) No sensors → no timeout → no conflict Advance logic: use sequencer's step timer ``` ### CFG_ONE_FWD (1) — Fault on FWD only ``` Cmd_Fwd ON ──┬──────────────────────▶ CylCmd_FwdSafe ON │ Sen_Fwd? ──TRUE────▶ AtFwd = TRUE ✓ (timer reset) │ └─FALSE───▶ T_Timeout running │ │ │ ▼ T_Timeout elapsed │ FaultCode = 1 (FWD TIMEOUT) │ Fault_Active = TRUE │ CylCmd_FwdSafe → FALSE (gated off) │ Cmd_Bwd ON ──▶ No BWD timeout possible (no BWD sensor) CylState reports AT_BWD when FWD sensor clears ``` ### CFG_ONE_BWD (2) — Fault on BWD only ``` Cmd_Bwd ON ──┬──────────────────────▶ CylCmd_BwdSafe ON │ Sen_Bwd? ──TRUE────▶ AtBwd = TRUE ✓ (timer reset) │ └─FALSE───▶ T_Timeout running │ ▼ T_Timeout elapsed │ FaultCode = 2 (BWD TIMEOUT) │ Cmd_Fwd ON ──▶ No FWD timeout (no FWD sensor) CylState reports AT_FWD when BWD sensor clears ``` ### CFG_TWO (3) — Full fault coverage ``` Cmd_Fwd ON ──▶ Sen_Fwd? ─TRUE──▶ AtFwd ✓ timer cancelled └─FALSE─▶ Timeout FWD → FaultCode 1 Cmd_Bwd ON ──▶ Sen_Bwd? ─TRUE──▶ AtBwd ✓ timer cancelled └─FALSE─▶ Timeout BWD → FaultCode 2 BOTH sensors TRUE simultaneously → FaultCode 3 (CONFLICT) → immediate fault No cmd + was at known pos + both sensors go FALSE → FaultCode 4 (LOST) Both Cmd_Fwd AND Cmd_Bwd TRUE → FaultCode 3 (command conflict) ``` --- ## 5. FB_CylinderMonitor — Interface ### VAR_INPUT | Name | Type | Description | |---|---|---| | `CylName` | `String[32]` | Human name, e.g. `'Clamp Cylinder'` — used in HMI text | | `SensorConfig` | `Int` | 0=NONE, 1=ONE_FWD, 2=ONE_BWD, 3=TWO | | `T_Timeout` | `Time` | Max time for cylinder to reach position | | `Cmd_Fwd` | `Bool` | Extend / close command | | `Cmd_Bwd` | `Bool` | Retract / open command | | `Cmd_Reset` | `Bool` | Rising edge clears fault | | `Sen_Fwd` | `Bool` | Forward / extended position sensor | | `Sen_Bwd` | `Bool` | Backward / retracted position sensor | | `Enable` | `Bool` | FALSE = ignore commands, hold state | ### VAR_OUTPUT | Name | Type | Description | |---|---|---| | `CylCmd_FwdSafe` | `Bool` | **Gated FWD output** — connect to DQ | | `CylCmd_BwdSafe` | `Bool` | **Gated BWD output** — connect to DQ | | `AtFwd` | `Bool` | Position confirmed at FWD | | `AtBwd` | `Bool` | Position confirmed at BWD | | `Intermediate` | `Bool` | Between positions (TWO config, no cmd) | | `Moving` | `Bool` | Command active, not yet confirmed | | `Fault_Active` | `Bool` | Any fault present | | `Fault_FwdTimeout` | `Bool` | Specific fault bit | | `Fault_BwdTimeout` | `Bool` | Specific fault bit | | `Fault_Conflict` | `Bool` | Sensor conflict fault bit | | `Fault_Lost` | `Bool` | Lost position fault bit | | `FaultCode` | `Int` | Numeric code (0–4) | | `CylState` | `Int` | State code (0–6) | | `HMI_StatusText` | `String[80]` | Ready-to-display status | | `HMI_FaultText` | `String[80]` | Ready-to-display fault message | --- ## 6. FB_CylFaultCollector — Interface Aggregates up to 8 cylinder monitor faults into one summary. Wire its outputs to the sequencer's `Cmd_Pause` and `Cmd_Stop`. ### Key Outputs | Name | Type | Description | |---|---|---| | `CylFaultAny` | `Bool` | OR of all cylinder faults | | `CylFaultWord` | `Word` | Bitmask — bit 0 = Cyl1, bit 7 = Cyl8 | | `Cmd_MachinePause` | `Bool` | **Wire to sequencer `Cmd_Pause`** | | `Cmd_MachineStop` | `Bool` | **Wire to sequencer `Cmd_Stop`** | | `Cmd_Warning` | `Bool` | Amber lamp — non-stopping fault | | `FirstFaultText` | `String[80]` | First fault message for HMI banner | | `ActiveFaultCount` | `Int` | Number of cylinders currently faulted | ### Machine Response Configuration | Input | Value | Effect | |---|---|---| | `Response_Timeout` | `0` | Warning only — machine keeps running | | `Response_Timeout` | `1` | Pause machine | | `Response_Timeout` | `2` | Stop machine (requires Reset) | | `Response_Conflict` | `0/1/2` | Same options | | `Response_Lost` | `0/1/2` | Same options | **Recommended defaults:** ```scl Response_Timeout := 1; // Pause — timeout may be temporary, operator can check Response_Conflict := 2; // Stop — two sensors both TRUE = hardware fault Response_Lost := 2; // Stop — cylinder moved without command = mechanical issue ``` --- ## 7. Output Gating Pattern The core safety pattern of this FB is **output gating**. Instead of writing: ```scl // ❌ Unsafe — raw command goes direct to DQ %Q0.1 := Act_HeadExtend; ``` You write: ```scl // ✅ Safe — passes through monitor, gated off on fault "DB_CylHead"( Cmd_Fwd := Act_HeadExtend, ... ); %Q0.1 := "DB_CylHead".CylCmd_FwdSafe; // Only energises if healthy ``` When a fault occurs (timeout, conflict, lost position): 1. `CylCmd_FwdSafe` → `FALSE` immediately (same scan as fault detection) 2. Solenoid valve de-energised → cylinder stops 3. `Fault_Active` → `TRUE` → collector → sequencer `Cmd_Pause` or `Cmd_Stop` 4. `HMI_FaultText` → operator message describes exactly what failed --- ## 8. Integration with FB_WeldSequencer The two FBs communicate in both directions: ``` FB_CylinderMonitor FB_WeldSequencer ──────────────────── ───────────────────────────── AtFwd ─────────────────────────────▶ Sen_ClampClosed (step 2 advance) AtFwd ─────────────────────────────▶ Sen_HeadAtWeldPos (step 3 advance) AtBwd ─────────────────────────────▶ Sen_HeadRetracted (step 9 advance) Fault_Active └──▶ FB_CylFaultCollector Cmd_MachinePause ──────────▶ Cmd_Pause (OR with operator PB) Cmd_MachineStop ──────────▶ Cmd_Stop (OR with operator PB) FB_WeldSequencer FB_CylinderMonitor ───────────────────────────── ──────────────────── Act_HeadExtend ─────────────────────▶ Cmd_Fwd Act_HeadRetract ────────────────────▶ Cmd_Bwd Seq_Running OR Seq_Paused ──────────▶ Enable ``` ### Step Advance with Monitor vs Raw Sensor | Without Monitor | With Monitor | |---|---| | `_stepAdvReady := Sen_ClampClosed` | `_stepAdvReady := "DB_CylClamp".AtFwd` | | Advances even if clamp timed out | Will not advance if monitor is faulted | | No timeout detection | FaultCode 1 triggers machine pause | Using `AtFwd`/`AtBwd` from the monitor instead of raw sensor inputs means a faulted cylinder **also prevents step advance**, so the sequencer's own watchdog timer provides a belt-and-braces fallback catch. --- ## 9. Demo: Welding Cell (4 Cylinders) The demo file `DEMO_WeldCellIntegration.scl` shows all four configurations side by side: | Instance | Cylinder | Config | Timeout | Fault Response | |---|---|---|---|---| | `DB_CylClamp` | Clamp | ONE_FWD | 2 s | Pause | | `DB_CylHead` | Weld Head | TWO | 3 s | Pause (timeout) / Stop (conflict) | | `DB_CylEject` | Part Ejector | ONE_BWD | 1.5 s | Pause | | `DB_CylGas` | Gas Valve | NONE | n/a | n/a | ### Execution Order (critical) In your OB (OB1 or OB30), call in this order: ``` 1st → "DB_CylClamp"(...) FB_CylinderMonitor 2nd → "DB_CylHead"(...) FB_CylinderMonitor 3rd → "DB_CylEject"(...) FB_CylinderMonitor 4th → "DB_CylGas"(...) FB_CylinderMonitor 5th → "DB_CylFaults"(...) FB_CylFaultCollector 6th → "DB_WeldSeq"(...) FB_WeldSequencer ``` Monitors run first so that `AtFwd`/`AtBwd` and `Fault_Active` values are fresh when the sequencer evaluates step advance conditions and Cmd_Pause/Stop in the same scan. --- ## 10. HMI Integration ### Recommended Screen Objects #### Cylinder Overview Faceplate (one per cylinder) | Element | Tag | Type | |---|---|---| | Status text | `DB_CylClamp.HMI_StatusText` | Text field | | Fault text | `DB_CylClamp.HMI_FaultText` | Text field (red, visible on fault) | | State indicator | `DB_CylClamp.CylState` | Bar/value with colour map | | Moving animation | `DB_CylClamp.Moving` | Animated cylinder graphic | | At FWD lamp | `DB_CylClamp.AtFwd` | Green indicator | | At BWD lamp | `DB_CylClamp.AtBwd` | Green indicator | | Fault lamp | `DB_CylClamp.Fault_Active` | Red indicator | #### CylState Colour Map (for bargraph or rectangle) | Value | Colour | Label | |---|---|---| | 0 | Grey | Idle | | 1 | Yellow | Moving FWD | | 2 | Green | At FWD ✓ | | 3 | Yellow | Moving BWD | | 4 | Green | At BWD ✓ | | 5 | Orange | Intermediate | | 6 | Red | FAULTED | #### Global Alarm Banner ``` Tag: DB_CylFaults.FirstFaultText Visible: DB_CylFaults.CylFaultAny = TRUE Background: Red Example text: "Weld Head: FWD TIMEOUT — check cylinder, solenoid and FWD sensor" ``` #### Fault Bitmask Display (overview bar) ``` Tag: DB_CylFaults.CylFaultWord (WORD) Display as: 8 individual bit lamps Bit 0 = Clamp Bit 1 = Head Bit 2 = Ejector Bit 3 = Gas ... ``` #### Operator Guidance Text Logic For each cylinder fault, the HMI_FaultText already tells the operator exactly what to check: ``` FaultCode 1 → "Clamp Cylinder: FWD TIMEOUT — check cylinder, solenoid and FWD sensor" FaultCode 2 → "Weld Head: BWD TIMEOUT — check cylinder, solenoid and BWD sensor" FaultCode 3 → "Weld Head: SENSOR CONFLICT — FWD + BWD both active. Check wiring/sensors" FaultCode 4 → "Weld Head: LOST POSITION — cylinder moved without command. Check mechanics" ``` No lookup table needed — the text is generated inside the FB using the `CylName` you configured. --- ## 11. TIA Portal Setup ### Create Instance DBs For each cylinder, right-click project tree → **Add new block** → **Data Block** → Instance DB of `FB_CylinderMonitor`: ``` DB_CylClamp : FB_CylinderMonitor DB_CylHead : FB_CylinderMonitor DB_CylEject : FB_CylinderMonitor DB_CylGas : FB_CylinderMonitor DB_CylFaults : FB_CylFaultCollector ``` ### Initial Parameter Setup (in startup OB or first-scan block) ```scl // Set cylinder names and configs once at startup // (or set directly in instance DB initial values in TIA Portal) "DB_CylClamp".CylName := 'Clamp Cylinder'; "DB_CylClamp".SensorConfig := 1; "DB_CylClamp".T_Timeout := T#2S; "DB_CylHead".CylName := 'Weld Head'; "DB_CylHead".SensorConfig := 3; "DB_CylHead".T_Timeout := T#3S; "DB_CylEject".CylName := 'Part Ejector'; "DB_CylEject".SensorConfig := 2; "DB_CylEject".T_Timeout := T#1500MS; "DB_CylGas".CylName := 'Gas Purge Valve'; "DB_CylGas".SensorConfig := 0; ``` Alternatively, set initial values directly in the instance DB's data view in TIA Portal — these persist through power cycles. --- ## 12. Timing Reference | Cylinder Type | Recommended T_Timeout | Notes | |---|---|---| | Fast pneumatic (< 50 mm) | `T#1S` | Small bore, short stroke | | Standard pneumatic | `T#2S` | Most clamps, grippers | | Long-stroke pneumatic | `T#3S`–`T#5S` | Weld heads, gates | | Hydraulic | `T#5S`–`T#15S` | Slower by nature | | Spring-return valve | N/A (NONE config) | No position sensor | **Rule of thumb:** Set timeout to 3× the expected travel time. Fast enough to catch real faults, slow enough to avoid nuisance trips on normal variation. --- ## 13. Fault Code Reference | Code | Name | Cause | HMI Message | Machine Action | |---|---|---|---|---| | `0` | No fault | Normal | *(empty)* | None | | `1` | FWD timeout | Sen_Fwd not TRUE within T_Timeout after Cmd_Fwd | `"[Name]: FWD TIMEOUT — check cylinder, solenoid and FWD sensor"` | Pause (configurable) | | `2` | BWD timeout | Sen_Bwd not TRUE within T_Timeout after Cmd_Bwd | `"[Name]: BWD TIMEOUT — check cylinder, solenoid and BWD sensor"` | Pause (configurable) | | `3` | Conflict | Sen_Fwd AND Sen_Bwd both TRUE, or Cmd_Fwd AND Cmd_Bwd both TRUE | `"[Name]: SENSOR CONFLICT — FWD + BWD both active. Check wiring/sensors"` | Stop (configurable) | | `4` | Lost position | Was at known position; both sensors dropped with no command | `"[Name]: LOST POSITION — cylinder moved without command. Check mechanics"` | Stop (configurable) | --- ## 14. Adapting for Other Applications ### Add a pressure/flow sensor as virtual FWD confirmation ```scl // Gas valve with pressure feedback "DB_CylGas"( CylName := 'Gas Valve', SensorConfig := 1, // ONE_FWD T_Timeout := T#1S, Cmd_Fwd := Act_GasValve, Sen_Fwd := PressureSwitch_OK, // Add this DI ... ); ``` ### Motor or servo (use as virtual "cylinder" with limit switches) ```scl "DB_CylSlide"( CylName := 'Transfer Slide', SensorConfig := 3, T_Timeout := T#4S, Cmd_Fwd := SlideMotor_Fwd, Cmd_Bwd := SlideMotor_Rev, Sen_Fwd := LS_SlideForward, Sen_Bwd := LS_SlideReverse, ... ); ``` ### Changing timeout at runtime ```scl // Speed-dependent timeout (slow mode vs normal mode) IF SlowMode THEN "DB_CylHead".T_Timeout := T#8S; ELSE "DB_CylHead".T_Timeout := T#3S; END_IF; ``` Note: `T_Timeout` is read by the TON each scan — changes take effect immediately on the next timer start. ### More than 8 cylinders Extend `FB_CylFaultCollector` array declarations from `[1..8]` to `[1..N]` and add corresponding `VAR_INPUT` slots. --- ## 15. Safety Notes > ⚠️ `FB_CylinderMonitor` is a **diagnostic and convenience layer**. It is NOT a safety function and should NOT be used as the sole means of protecting personnel from cylinder movement. ### This FB provides (diagnostic/operational layer): - Timeout detection → pause or stop production - Sensor conflict → immediate output gate + machine stop - HMI guidance text for operator troubleshooting - Output gating (software level only — not certified) ### This FB does NOT replace (safety layer): - **Hardware safety valves** (5/2 safety valve with spring return for E-Stop) - **Dual-channel safety relay** monitoring for guard interlocks - **Safety PLC** (S7-1500F) for PLd/SIL2 applications - **Mechanical hard stops** preventing overtravel - **Pressure relief valves** on hydraulic systems ### Minimum safety architecture: ``` E-Stop ──▶ Safety Relay ──▶ Safety Valve ──▶ Cylinder (power removed in hardware) │ └──▶ Safety_EStopOK input on FB_WeldSequencer (software layer) Door open ──▶ Safety Switch ──▶ Safety Relay │ └──▶ Safety_DoorClosed input on FB_WeldSequencer ``` The cylinder monitor's `CylCmd_FwdSafe` / `CylCmd_BwdSafe` outputs control directional valves only. Power removal for E-Stop must be done at the hardware safety relay level, not by this FB. --- ## Changelog | Version | Date | Notes | |---|---|---| | 0.1 | 2025 | Initial release — 4 sensor config types, 4 fault codes, HMI text | --- ## Licence MIT — free to use and adapt. --- *For the full welding cell sequencer (10 steps, AUTO/INCR mode, stop categories), see [`README.md`](../README.md).*