Skip to main content

PLCOPEN-CP3: Variables shall be initialized before being used

Every variable declaration should carry an explicit initializer.

Why is it bad?

Reading from an uninitialized variable yields whatever value happened to be sitting in the underlying memory cell at boot. On a PLC that means the program behaviour depends on power-up state, EEPROM contents, or the previous program's last write — all of which are non-deterministic and impossible to test for.

This rule fires on every non-located VAR declaration that has no initializer. Located variables (AT %...) are exempt because the address itself defines where the value comes from.

Example

FUNCTION demo : INT
VAR_INPUT
x1 : INT := 0;
x2 : INT; (* PLCOPEN-CP3 — no initializer *)
x3 : STRING[5]; (* PLCOPEN-CP3 *)
x5 : ARRAY [1..2, 1..3] OF INT; (* PLCOPEN-CP3 *)
END_VAR
END_FUNCTION

Use instead:

FUNCTION demo : INT
VAR_INPUT
x1 : INT := 0;
x2 : INT := 0;
x3 : STRING[5] := '';
x5 : ARRAY [1..2, 1..3] OF INT := [[0,0,0],[0,0,0]];
END_VAR
END_FUNCTION

Resources

  1. PLCOpen Software Construction Guidelines