Initial commit: Home automation docs and CODESYS project
- Reorganized project: codesys/, docs/codesys|redesign|integration|reference/, scripts/ - CODESYS project and exports in codesys/ - Documentation index in docs/README.md - Redesign and light naming configuration - Water boiler control and safety design Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
223
docs/redesign/fb_switch-documentation.md
Normal file
223
docs/redesign/fb_switch-documentation.md
Normal file
@@ -0,0 +1,223 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user