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:
260
docs/codesys/codesys-xml-analysis.md
Normal file
260
docs/codesys/codesys-xml-analysis.md
Normal file
@@ -0,0 +1,260 @@
|
||||
# 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)
|
||||
Reference in New Issue
Block a user