Files
codesys-home-automation/codesys-tree/_io.md
nearxos d98c44bfa3 Initial commit: CODESYS tree, integration docs, Node-RED scripts.
PLC application sources (NVL, rooms, boiler), HA/Node-RED integration guide, and NVL patch utilities.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-26 21:21:56 +03:00

7.3 KiB

Device I/O Inventory

Snapshot of all hardware I/O channels and their CODESYS variable mappings. Source: read_device_io against C:\codesys-projects\Codesys_Home_Automation\Home_Automation.project (channels_only=true). Raw data: _io.json.

Device tree (hardware)

Device Path In Out Mapped out Addr range
GPIOs_A_B Device/GPIOs_A_B 1 (DWORD) 1 (DWORD) 0 %ID1 / %QD2
K1 Device/EtherCAT_Master/EK1100/K1 16 BOOL 0 %IX0.0..%IX1.7
K2 Device/EtherCAT_Master/EK1100/K2 0 16 BOOL 14 / 16 %QX0.0..%QX1.7
K3 Device/EtherCAT_Master/EK1100/K3 0 16 BOOL 15 / 16 %QX2.0..%QX3.7
K4 Device/EtherCAT_Master/EK1100/K4 0 16 BOOL 12 / 16 %QX4.0..%QX5.7

Onewire, Camera device, SPI, I?C, EtherCAT_Master and EK1100 return no host parameters / channels of their own (they're parents/couplers).

Totals: 16 digital inputs (none mapped), 48 digital outputs (41 mapped, 7 free).

Findings worth flagging

Duplicate output mapping (likely a bug)

Application.NVL_Sender.light_livingRoom.l_1 is written by two physical output channels:

Where IEC addr
K2 ch 10 %QX1.1
K4 ch 16 %QX5.7

Both physical relays will switch together whenever the variable is written. One of these should be remapped — usually K4 %QX5.7 would be the one to free up (based on K4's role as the spillover terminal).

Unmapped output channels

Device IEC addr Channel
GPIOs_A_B %QD2 (DWORD)
K2 %QX0.5 Ch 6
K2 %QX0.7 Ch 8
K3 %QX2.3 Ch 4
K4 %QX5.2 Ch 11
K4 %QX5.3 Ch 12
K4 %QX5.5 Ch 14
K4 %QX5.6 Ch 15

No inputs mapped

K1 (16-channel digital input terminal, %IX0.0..%IX1.7) is wired up at hardware level but has zero variable mappings. If you have physical switches on K1, the PLC currently can't see them.

Variable target

All mapped outputs write into Application.NVL_Sender.* — i.e. the global variable list that is broadcast over UDP to the receiver. This is the "Option C" relay-feedback pattern referenced in the GVL comment: the program writes the desired relay state into the NVL_Sender variable, the EtherCAT terminal switches the actual relay, and the value read back is exactly the value just written.

No outputs are mapped against the application's room/light function block outputs (fb_room.lights.* / fb_light.light_output). The new fb_room / fb_light logic is therefore not yet driving the physical relays — that wiring would need to be done in PLC_PRG (or Lights_new) by assigning each FB output into the corresponding NVL_Sender.light_*.l_N slot before the IO write phase.

Per-channel detail

K1 (Device/EtherCAT_Master/EK1100/K1)

Ch IEC addr Dir Variable
1 %IX0.0 INP (unmapped)
2 %IX0.1 INP (unmapped)
3 %IX0.2 INP (unmapped)
4 %IX0.3 INP (unmapped)
5 %IX0.4 INP (unmapped)
6 %IX0.5 INP (unmapped)
7 %IX0.6 INP (unmapped)
8 %IX0.7 INP (unmapped)
9 %IX1.0 INP (unmapped)
10 %IX1.1 INP (unmapped)
11 %IX1.2 INP (unmapped)
12 %IX1.3 INP (unmapped)
13 %IX1.4 INP (unmapped)
14 %IX1.5 INP (unmapped)
15 %IX1.6 INP (unmapped)
16 %IX1.7 INP (unmapped)

K2 (Device/EtherCAT_Master/EK1100/K2)

Ch IEC addr Dir Variable
1 %QX0.0 OUT Application.NVL_Sender.light_dinningRoom.l_1
2 %QX0.1 OUT Application.NVL_Sender.l_entrance.l_1
3 %QX0.2 OUT Application.NVL_Sender.light_dinningRoom.l_2
4 %QX0.3 OUT Application.NVL_Sender.light_dinningRoom.l_3
5 %QX0.4 OUT Application.NVL_Sender.light_guestWc.l_1
6 %QX0.5 OUT (unmapped)
7 %QX0.6 OUT Application.NVL_Sender.light_dinningRoom.l_4
8 %QX0.7 OUT (unmapped)
9 %QX1.0 OUT Application.NVL_Sender.l_entrance.l_2
10 %QX1.1 OUT Application.NVL_Sender.light_livingRoom.l_1 ⚠ duplicated on K4 ch 16
11 %QX1.2 OUT Application.NVL_Sender.light_livingRoom.l_2
12 %QX1.3 OUT Application.NVL_Sender.light_livingRoom.l_3
13 %QX1.4 OUT Application.NVL_Sender.light_livingRoom.l_4
14 %QX1.5 OUT Application.NVL_Sender.light_kitchenArea.l_1
15 %QX1.6 OUT Application.NVL_Sender.light_kitchenArea.l_2
16 %QX1.7 OUT Application.NVL_Sender.light_kitchenArea.l_3

K3 (Device/EtherCAT_Master/EK1100/K3)

Ch IEC addr Dir Variable
1 %QX2.0 OUT Application.NVL_Sender.light_kitchenArea.l_4
2 %QX2.1 OUT Application.NVL_Sender.light_hallway.l_1
3 %QX2.2 OUT Application.NVL_Sender.light_office.l_1
4 %QX2.3 OUT (unmapped)
5 %QX2.4 OUT Application.NVL_Sender.light_shower.l_1
6 %QX2.5 OUT Application.NVL_Sender.light_shower.l_2
7 %QX2.6 OUT Application.NVL_Sender.light_hallway.l_2
8 %QX2.7 OUT Application.NVL_Sender.light_bedroom.l_1
9 %QX3.0 OUT Application.NVL_Sender.light_bedroom.l_2
10 %QX3.1 OUT Application.NVL_Sender.light_masterBedroom.l_1
11 %QX3.2 OUT Application.NVL_Sender.light_masterBedroom.l_2
12 %QX3.3 OUT Application.NVL_Sender.light_masterBedroom.l_3
13 %QX3.4 OUT Application.NVL_Sender.light_masterBedroom.l_4
14 %QX3.5 OUT Application.NVL_Sender.light_masterBath.l_1
15 %QX3.6 OUT Application.NVL_Sender.light_masterBath.l_2
16 %QX3.7 OUT Application.NVL_Sender.light_masterBath.l_3

K4 (Device/EtherCAT_Master/EK1100/K4)

Ch IEC addr Dir Variable
1 %QX4.0 OUT Application.NVL_Sender.light_livingRoom.l_5
2 %QX4.1 OUT Application.NVL_Sender.light_outBack.l_1
3 %QX4.2 OUT Application.NVL_Sender.light_outBack.l_2
4 %QX4.3 OUT Application.NVL_Sender.light_outFront.l_2
5 %QX4.4 OUT Application.NVL_Sender.light_coveredVeranda.l_2
6 %QX4.5 OUT Application.NVL_Sender.light_coveredVeranda.l_3
7 %QX4.6 OUT Application.NVL_Sender.light_coveredVeranda.l_4
8 %QX4.7 OUT Application.NVL_Sender.l_outSide.l_1
9 %QX5.0 OUT Application.NVL_Sender.l_outFront.l_1
10 %QX5.1 OUT Application.NVL_Sender.l_outVeranda.l_4
11 %QX5.2 OUT (unmapped)
12 %QX5.3 OUT (unmapped)
13 %QX5.4 OUT Application.NVL_Sender.boiler_status.relay_output
14 %QX5.5 OUT (unmapped)
15 %QX5.6 OUT (unmapped)
16 %QX5.7 OUT Application.NVL_Sender.light_livingRoom.l_1 ⚠ duplicates K2 ch 10

GPIOs_A_B (Device/GPIOs_A_B)

Ch IEC addr Dir Variable
GPIOs in %ID1 INP (DWORD) (unmapped)
GPIOs out %QD2 OUT (DWORD) (unmapped)

The Raspberry Pi onboard GPIO bank exists in the project but is not wired to any variables.