# fb_switch Function Block Documentation ## Overview The `fb_switch` function block is the core control logic for managing lighting in each room. It processes switch inputs from Node-RED and generates light control outputs. ## Function Block Structure ```iec FUNCTION_BLOCK fb_switch VAR_INPUT switches: struct_switches; // Switch states received from Node-RED END_VAR VAR_OUTPUT lights: struct_lights; // Light control outputs sent to Node-RED END_VAR VAR all_off: fb_toogleButton; // Toggle button for "all off" command all_on: fb_toogleButton; // Toggle button for "all on" command sw_1: fb_toogleButton; // Toggle button for switch 1 sw_2: fb_toogleButton; // Toggle button for switch 2 sw_3: fb_toogleButton; // Toggle button for switch 3 sw_4: fb_toogleButton; // Toggle button for switch 4 sw_5: fb_toogleButton; // Toggle button for switch 5 sw_6: fb_toogleButton; // Toggle button for switch 6 END_VAR ``` ## Data Structures ### struct_switches (Input) ```iec TYPE struct_switches : STRUCT all_off: BOOL; // Command to turn all lights off all_on: BOOL; // Command to turn all lights on sw_1: BOOL; // Switch 1 state sw_2: BOOL; // Switch 2 state sw_3: BOOL; // Switch 3 state sw_4: BOOL; // Switch 4 state sw_5: BOOL; // Switch 5 state sw_6: BOOL; // Switch 6 state END_STRUCT END_TYPE ``` ### struct_lights (Output) ```iec TYPE struct_lights: STRUCT l_1: BOOL; // Light 1 control output l_2: BOOL; // Light 2 control output l_3: BOOL; // Light 3 control output l_4: BOOL; // Light 4 control output l_5: BOOL; // Light 5 control output l_6: BOOL; // Light 6 control output END_STRUCT END_TYPE ``` ## Functionality ### Individual Switch Control Each switch (`sw_1` through `sw_6`) is processed by a `fb_toogleButton` instance: - **Input**: Switch state from `switches.sw_X` (received from Node-RED) - **Output**: Light control to `lights.l_X` (sent to Node-RED) - **Behavior**: Toggle functionality - each switch press toggles the corresponding light state ### Global Commands 1. **All Off (`switches.all_off`)**: - When activated, turns off all lights (l_1 through l_6) - Uses `fb_toogleButton` instance `all_off` 2. **All On (`switches.all_on`)**: - When activated, turns on all lights (l_1 through l_6) - Uses `fb_toogleButton` instance `all_on` - Logic uses AND gates to combine with individual switch states ### Logic Flow 1. **Switch Input Processing**: - Each `sw_X` input is fed to its corresponding `fb_toogleButton` instance - The toggle button processes the input and generates an output 2. **Light Output Generation**: - Individual switch outputs directly control their corresponding lights - `all_off` command can override individual controls - `all_on` command combines with individual switch states using AND logic 3. **Output Assignment**: - `sw_1` → `lights.l_1` - `sw_2` → `lights.l_2` - `sw_3` → `lights.l_3` - `sw_4` → `lights.l_4` - `sw_5` → `lights.l_5` - `sw_6` → `lights.l_6` ## fb_toogleButton Function Block The `fb_toogleButton` is a toggle button implementation with debouncing and timing features. ### Structure ```iec FUNCTION_BLOCK fb_toogleButton VAR_INPUT Input: BOOL; // Input signal (switch state) END_VAR VAR_OUTPUT Output: BOOL; // Output signal (light control) END_VAR VAR Switch: BOOL; // Internal switch state Light: BOOL; // Internal light state Flag1: BOOL; // Internal flag 1 Flag2: BOOL; // Internal flag 2 RT: R_TRIG; // Rising edge trigger Pulse: TP; // Pulse timer CTU_0: CTU; // Counter up 0 CTD_0: CTD; // Counter down 0 CTU_1: CTU; // Counter up 1 CTU_2: CTU; // Counter up 2 TOF_0: TOF; // Timer off delay 0 END_VAR ``` ### Features - **Rising Edge Detection**: Uses `R_TRIG` to detect switch press events - **Pulse Generation**: Uses `TP` (pulse timer) for debouncing or pulse generation - **Timing Control**: Uses `TOF` (timer off delay) for delayed turn-off - **Counters**: Uses `CTU` and `CTD` counters for state management - **Toggle Logic**: Implements toggle behavior - each press changes state ### Behavior 1. **Input Processing**: - Detects rising edge of input signal - Generates a pulse for processing - Applies timing delays for debouncing 2. **State Management**: - Maintains internal switch and light states - Toggles output on each valid input pulse - Uses flags for state tracking 3. **Output Generation**: - Output reflects the toggled state - May include timing delays (TOF) for smooth operation ## Usage in System ### Per-Room Instance Each room has an instance of `fb_switch`: - `masterBedroom: fb_switch` - `masterBathroom: fb_switch` - `bedroom_1: fb_switch` - `bedroom_2: fb_switch` - `bathroom: fb_switch` - `guest_wc: fb_switch` - `kitchen: fb_switch` - `pantry: fb_switch` - `livingRoom: fb_switch` - `diningRoom: fb_switch` - `veranda: fb_switch` - `entrance: fb_switch` - `front: fb_switch` - `back: fb_switch` - `side: fb_switch` - `hallway: fb_switch` ### Network Variable Integration - **Input**: Receives `struct_switches` from Node-RED via network variable `NVL_Receiver` - **Output**: Sends `struct_lights` to Node-RED via network variable `NVL_Sender` ### Control Flow ``` Node-RED (Zigbee Switch) ↓ MQTT Message ↓ Node-RED Processing ↓ Network Variable (struct_switches) ↓ fb_switch (CODESYS) ↓ fb_toogleButton Processing ↓ Light Control Output (struct_lights) ↓ Network Variable (NVL_Sender) ↓ Node-RED ↓ EtherCAT Relay Output ↓ Physical Light ``` ## Notes - Each room can control up to 6 individual lights - Global commands (`all_on`, `all_off`) provide room-level control - Toggle button implementation includes debouncing to prevent rapid switching - Timing functions ensure smooth operation and prevent electrical issues - The system supports both individual light control and group control per room --- **Documentation Date**: January 27, 2026 **Sources**: - `Home_Automation.export` (CODESYS XML) - `Home_Automation.xml` (PLCopen XML) **Additional Details**: See [CODESYS XML Analysis](../codesys/codesys-xml-analysis.md) for timing characteristics and detailed logic flow extracted from the PLCopen XML format.