Ich bin zwar mit TwinCat unterwegs, aber mein Problem ist wohl eher eine Codesys-Sache. Die Experten von 3S sind daher herzlich zum Mitlesen eingeladen.
Ich deklariere zwei FBs:
und
"fblBase" hat eine Aktion "pubBaseActn".
Im Hauptprogramm deklariere ich von jedem FB eine Instanz
und rufe beide Aktionen auf
Beim Übersetzen erhalte ich für den Aufruf von "varExtd.pubBaseActn" den Fehler "inpExtd ist kein Eingang von fblBase".
Sicher, der FB, von dem die Aktion geerbt wurde, kennt "inpExtd" nicht. Ich rufe aber ausdrücklich eine Instanz von "fblExtd" auf, die diese Variable beinhaltet.
Ist das wirklich so gewollt? Mir ist schon klar, dass so etwas bei unterschiedlich grossen VAR_IN_OUT-Bereichen nicht funktionieren kann, weil die geerbten Aktionen für die Stackgrösse der Basisklasse kompiliert sind.
Aber hier handelt es sich um eine statische Variable des FBs. Wenn ich es so schreibe,
funktioniert es ja. Und an sich sollte doch beides identisch sein.
Ich deklariere zwei FBs:
Code:
FUNCTION_BLOCK fblBase
VAR_INPUT
inpBase:BOOL;
END_VAR
Code:
FUNCTION_BLOCK fblExtd EXTENDS fblBase
VAR_INPUT
inpExtd:BOOL;
END_VAR
Im Hauptprogramm deklariere ich von jedem FB eine Instanz
Code:
PROGRAM MAIN
VAR
varBase:fblBase;
varExtd:fblExtd;
END_VAR
Code:
varBase.pubBaseActn(
inpBase:=TRUE);
varExtd.pubBaseActn(
inpBase:=TRUE,
inpExtd:=TRUE);
Sicher, der FB, von dem die Aktion geerbt wurde, kennt "inpExtd" nicht. Ich rufe aber ausdrücklich eine Instanz von "fblExtd" auf, die diese Variable beinhaltet.
Ist das wirklich so gewollt? Mir ist schon klar, dass so etwas bei unterschiedlich grossen VAR_IN_OUT-Bereichen nicht funktionieren kann, weil die geerbten Aktionen für die Stackgrösse der Basisklasse kompiliert sind.
Aber hier handelt es sich um eine statische Variable des FBs. Wenn ich es so schreibe,
Code:
varExtd.inpExtd:=TRUE;
varExtd.pubBaseActn(
inpBase:=TRUE);