- 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>
261 lines
7.2 KiB
Markdown
261 lines
7.2 KiB
Markdown
# CODESYS PLCopen XML Analysis
|
|
|
|
## Overview
|
|
|
|
This document contains detailed information extracted from the PLCopen XML export (`Home_Automation.xml`), which provides a more structured view of the project compared to the CODESYS export format.
|
|
|
|
## Project Information
|
|
|
|
- **Format**: PLCopen XML (TC6 0200)
|
|
- **CODESYS Version**: V3.5 SP21
|
|
- **Export Date**: 2026-01-27T14:48:52
|
|
- **Project Name**: Home_Automation.project
|
|
|
|
## Task Configuration
|
|
|
|
### MainTask
|
|
- **Type**: Cyclic
|
|
- **Interval**: t#4ms (4 milliseconds)
|
|
- **Priority**: 1
|
|
- **Watchdog**: Disabled
|
|
- **Program**: PLC_PRG
|
|
|
|
### EtherCAT_Task
|
|
- **Type**: Cyclic
|
|
- **Interval**: t#4ms (4 milliseconds)
|
|
- **Priority**: 1
|
|
- **Watchdog**: Disabled
|
|
- **Purpose**: EtherCAT communication and network variable updates
|
|
|
|
## Data Structures
|
|
|
|
### struct_switches
|
|
|
|
```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
|
|
|
|
```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
|
|
```
|
|
|
|
## Function Block: fb_toogleButton
|
|
|
|
### Interface
|
|
|
|
**Inputs**:
|
|
- `Input: BOOL` - Input signal (switch state from network)
|
|
|
|
**Outputs**:
|
|
- `Output: BOOL` - Output signal (light control)
|
|
|
|
**Internal Variables**:
|
|
- `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
|
|
|
|
### Implementation (Ladder Diagram)
|
|
|
|
**Network 1: Input Debouncing**
|
|
- Input signal → TP (Pulse Timer) with PT = t#100ms
|
|
- TP output → TOF (Timer Off Delay) with PT = t#100ms
|
|
- TOF output → Switch (internal state)
|
|
- **Purpose**: Debounces input signal with 100ms pulse and 100ms off delay
|
|
|
|
**Network 2: Flag1 Logic**
|
|
- Switch AND (NOT Light) AND (NOT Flag2) → Flag1
|
|
- **Purpose**: Sets Flag1 when switch is on, light is off, and Flag2 is off
|
|
|
|
**Network 3: Flag2 Logic**
|
|
- Switch AND Light AND (NOT Flag1) → Flag2
|
|
- **Purpose**: Sets Flag2 when switch is on, light is on, and Flag1 is off
|
|
|
|
**Network 4: Light Toggle Logic**
|
|
- Flag1 AND (NOT Flag2) → Light (toggle)
|
|
- **Purpose**: Toggles light state based on flag conditions
|
|
|
|
**Network 5: Output Assignment**
|
|
- Light → Output
|
|
- **Purpose**: Direct output assignment
|
|
|
|
### Timing Characteristics
|
|
|
|
- **Input Debounce**: 100ms pulse timer (TP)
|
|
- **Output Delay**: 100ms off delay (TOF)
|
|
- **Total Response Time**: ~200ms (debounce + delay)
|
|
|
|
## Function Block: fb_switch
|
|
|
|
### Interface
|
|
|
|
**Inputs**:
|
|
- `switches: struct_switches` - Switch states from Node-RED
|
|
|
|
**Outputs**:
|
|
- `lights: struct_lights` - Light control outputs to Node-RED
|
|
|
|
**Internal Variables**:
|
|
- `all_off: fb_toogleButton` - Toggle button for "all off"
|
|
- `all_on: fb_toogleButton` - Toggle button for "all on"
|
|
- `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
|
|
|
|
### Implementation (Continuous Function Chart - CFC)
|
|
|
|
**Logic Flow for Each Light (l_1 through l_6)**:
|
|
|
|
1. **All Off Logic**:
|
|
```
|
|
all_off.Output AND lights.l_X → AND gate → (forces light off)
|
|
```
|
|
|
|
2. **All On Logic**:
|
|
```
|
|
all_on.Output AND (NOT lights.l_X) → AND gate → (forces light on)
|
|
```
|
|
|
|
3. **Individual Switch Logic**:
|
|
```
|
|
switches.sw_X → sw_X.Input → sw_X.Output → lights.l_X
|
|
```
|
|
|
|
4. **Combined Logic (OR)**:
|
|
```
|
|
(all_on logic) OR (sw_X.Output) OR (other sources) → lights.l_X
|
|
```
|
|
|
|
**Execution Order** (example for l_1):
|
|
1. Execution Order 1: AND gate for all_on logic
|
|
2. Execution Order 2: sw_2 toggle button
|
|
3. Execution Order 3: OR gate combining sources
|
|
4. Execution Order 4: AND gate for all_off logic
|
|
5. Execution Order 5: Output assignment to lights.l_1
|
|
6. Execution Order 30: sw_1 toggle button (individual control)
|
|
|
|
**Key Logic Patterns**:
|
|
|
|
- **All Off**: Uses AND gate with `all_off.Output` and current light state
|
|
- **All On**: Uses AND gate with `all_on.Output` and inverted light state
|
|
- **Individual Control**: Each switch has its own toggle button instance
|
|
- **Priority**: All_off can override individual controls, all_on combines with individual
|
|
|
|
## Program: Lights
|
|
|
|
The "Lights" program contains instances of `fb_switch` for all 15 rooms:
|
|
|
|
1. `masterBedroom: fb_switch`
|
|
2. `masterBathroom: fb_switch`
|
|
3. `bedroom_1: fb_switch`
|
|
4. `bedroom_2: fb_switch`
|
|
5. `bathroom: fb_switch`
|
|
6. `guest_wc: fb_switch`
|
|
7. `kitchen: fb_switch`
|
|
8. `pantry: fb_switch`
|
|
9. `livingRoom: fb_switch`
|
|
10. `diningRoom: fb_switch`
|
|
11. `veranda: fb_switch`
|
|
12. `entrance: fb_switch`
|
|
13. `front: fb_switch`
|
|
14. `back: fb_switch`
|
|
15. `side: fb_switch`
|
|
16. `hallway: fb_switch`
|
|
|
|
## Network Variables
|
|
|
|
### NVL_Sender (Sent to Node-RED)
|
|
|
|
All 15 room light structures:
|
|
- `l_masterBedroom` through `l_outBack` (struct_lights)
|
|
|
|
### NVL_Receiver (Received from Node-RED)
|
|
|
|
All 15 room switch structures:
|
|
- `masterBedroom` through `outBack` (struct_switches)
|
|
|
|
## Control Logic Summary
|
|
|
|
### Individual Light Control
|
|
|
|
1. **Switch Input** → `switches.sw_X` (from Node-RED)
|
|
2. **Toggle Processing** → `fb_toogleButton` instance
|
|
- 100ms debounce (TP)
|
|
- 100ms delay (TOF)
|
|
- Toggle logic with flags
|
|
3. **Output** → `lights.l_X` (to Node-RED)
|
|
|
|
### Global Commands
|
|
|
|
**All Off**:
|
|
- `switches.all_off` → `all_off` toggle button
|
|
- Output ANDed with current light state
|
|
- Forces all lights off
|
|
|
|
**All On**:
|
|
- `switches.all_on` → `all_on` toggle button
|
|
- Output ANDed with inverted light state
|
|
- Forces all lights on
|
|
- Combined with individual switches via OR logic
|
|
|
|
### Timing Characteristics
|
|
|
|
- **Task Cycle**: 4ms (MainTask and EtherCAT_Task)
|
|
- **Input Debounce**: 100ms
|
|
- **Output Delay**: 100ms
|
|
- **Network Variable Update**: 50ms (from .export analysis)
|
|
- **Total Response**: ~200ms (debounce + delay)
|
|
|
|
## Implementation Language
|
|
|
|
- **fb_toogleButton**: Ladder Diagram (LD)
|
|
- **fb_switch**: Continuous Function Chart (CFC)
|
|
- **Lights Program**: Continuous Function Chart (CFC)
|
|
|
|
## Key Insights
|
|
|
|
1. **Debouncing**: All switch inputs are debounced with 100ms pulse timer
|
|
2. **Toggle Logic**: Uses flag-based state machine for reliable toggling
|
|
3. **Priority System**: All_off has priority over individual controls
|
|
4. **Combined Control**: All_on works in conjunction with individual switches
|
|
5. **Fast Response**: 4ms task cycle ensures responsive control
|
|
6. **Structured Design**: Each room is independent with its own fb_switch instance
|
|
|
|
---
|
|
|
|
**Analysis Date**: January 27, 2026
|
|
**Source File**: `Home_Automation.xml`
|
|
**Format**: PLCopen XML (TC6 0200)
|