Aufruf eines FB über Interface

Nina
2017-01-02
2017-01-02
  • Nina - 2017-01-02

    Frage: Wie kann ich über ein Interface den FB direkt aufrufen/ausführen? (also nicht eine Methode des FB!)

    Interface:

    INTERFACE itfFB
    PROPERTY iVarA: INT
    METHOD doWork: bool;
    

    Funktionsblock:

    [/FUNCTION_BLOCK  fbA IMPLEMENTS itfFB
    VAR_OUTPUT
        iVarB: INT;
    END_VAR
    VAR
        _iVarA: INT;
    END_VAR
    iVarB := _iVarA ;
       METHOD doWork :bool
          THIS^();
    

    Set-Implementierung des Interfaces itfFB in den fbA:

       _iVarA:=iVarA;
    

    PRG:

    VAR
       fbA1:=fbA;
       itfFB1:=itfFB:=fbA1;
    END_VAR
    itfFB1.iVarA:=5;
    itfFB1();    // -> Fehler
    fbA1();   // -> geht (fbA1.iVarB ist 5), ist aber nicht gewollt, da der FB nur über Interface angesprochen werden soll/muss
    itfFB1.doWork();   // -> hat keinen  Effekt,  (fbA1.iVarB ist 0)
    

    Klar könnte der FB auch eine Methode doWork mit dem Code "iVarB := _iVarA ;" beinhalten, Ziel ist es aber den Code des FB's selbst auszuführen.

     
  • AAsmussen - 2017-01-02

    Hi Nina

    Mein Vorschlag:
    Erweitere dein Interface um eine Referenz-Variable vom Typ deines FBs.

    PROPERTY rFbThis : REFERENCE TO FB_MyFB
    

    Dieses Property wird dann im Get'er des FBs mit THIS^ beschrieben

    rFbThis REF= THIS^;
    

    Anschließend kann dann via Interface auf die Instanz des FBs zugegriffen werden:

    IF __ISVALIDREF(ifMy.rFbThis) THEN
       ifMy.rFbThis();
    END_IF 
    

    Allerdings wiederspricht m.E. diese Vorgehensweise etwas den OOP-Grundgedanken.
    Demnach sollten nur Methoden verwendet werden und ein Body bleibt leer.

     

Log in to post a comment.