P4044

Code

P4044

Message

Function block field name is already declared in a base function block via EXTENDS

This error occurs when a derived function block (using the CODESYS/TwinCAT EXTENDS vendor extension) redeclares a field that is already declared on its base function block, or any ancestor further up the EXTENDS chain. Real TwinCAT rejects this as a duplicate definition even when the redeclared field has a different type.

Example

The following code will generate error P4044:

FUNCTION_BLOCK FB_Base
VAR
    state : INT;
END_VAR
END_FUNCTION_BLOCK

FUNCTION_BLOCK FB_Derived EXTENDS FB_Base
VAR
    state : BOOL;
END_VAR
END_FUNCTION_BLOCK

To fix this error, rename the field in the derived function block (or remove it, if the inherited field already serves the purpose):

FUNCTION_BLOCK FB_Base
VAR
    state : INT;
END_VAR
END_FUNCTION_BLOCK

FUNCTION_BLOCK FB_Derived EXTENDS FB_Base
VAR
    derivedState : BOOL;
END_VAR
END_FUNCTION_BLOCK

This applies transitively: a field declared on any ancestor in the EXTENDS chain (not just the immediate base) cannot be redeclared.

Verified against a real TcXaeShell compile (C0097: Duplicate definition of variable ... in function block ... and in base ...) before this check was implemented. Covered by rule_extends_field_duplicated::tests in the compiler’s own test suite.

Think IronPLC is wrong about this?

If you believe this diagnostic is incorrect, open an issue on GitHub with a small sample that demonstrates the problem.