Quantcast
Channel: SPS-Forum - Automatisierung und Elektrotechnik
Viewing all articles
Browse latest Browse all 46422

Tc3: Vererbung von Aktionen

$
0
0
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:
Code:

FUNCTION_BLOCK fblBase
VAR_INPUT
    inpBase:BOOL;
END_VAR

und
Code:

FUNCTION_BLOCK fblExtd EXTENDS fblBase
VAR_INPUT
    inpExtd:BOOL;
END_VAR

"fblBase" hat eine Aktion "pubBaseActn".
Im Hauptprogramm deklariere ich von jedem FB eine Instanz
Code:

PROGRAM MAIN
VAR
    varBase:fblBase;
    varExtd:fblExtd;
END_VAR

und rufe beide Aktionen auf
Code:

varBase.pubBaseActn(
    inpBase:=TRUE);
varExtd.pubBaseActn(
    inpBase:=TRUE,
    inpExtd:=TRUE);

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,
Code:

varExtd.inpExtd:=TRUE;
varExtd.pubBaseActn(
    inpBase:=TRUE);

funktioniert es ja. Und an sich sollte doch beides identisch sein.

Viewing all articles
Browse latest Browse all 46422


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>