Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

FB dynamisch instanzieren/referenzieren?

smart9
2014-07-21
2015-04-29
  • smart9 - 2014-07-21

    Hallo,

    in einem "ManagerBaustein" möchte ich zur Laufzeit festlegen, welcher FB aufgrufen werden soll. Alle haben eine gleiche Schnittstelle nach aussen, jedoch die Implementation ist unterschiedlich. Nun könnte man hergehen, alle FB's instanzieren, und z.B. über einen 'Case' die entsprechende Instanz aufrufen und ausführen. Gibt es eine elegantere Methode, z.B. den FB dynamisch zu instanzieren oder einen Pointer auf die identische "FB-Hülle" zu legen? (Pointer of FB funktioniert nur mit der abgeleiteten Instanz, nicht mit dem Funktionsblock selbst). Oder hat jemand eine andere Idee? Vielen Dank für Eure Hilfe.

    Matthias

     
  • singleton - 2014-07-22

    Hi,
    schau mal in der Hilfe nach ```

    __NEW

    und

    __DELETE

    ```. Das sollte Deinen Anwendungsfall abdecken.

     
  • smart9 - 2014-07-22

    Hallo singleton,

    vielen Dank für Deinen Hinweis. Aber leider bin ich hier auch nicht in der Lage, dynamisch verschiedene FB's zur Laufzeit zu instanzieren und einer Referenz (bzw. Pointer) zuzuweisen. Der Pointer, welcher __New zurückgibt, muss spezifisch deklariert sein, kann nicht allgemein gehalten werden, also z.B.: POINTER TO fbModuleLeftCorner. Möchte ich demselben Pointer mit __New einen FB 'fbModuleRightCorner' allozieren, bekomme ich einen Konvertierungsfehler.
    Ich muss also folgendermassen vorgehen, dass es für jeden mögl. FB wieder den dazugehörigen Pointer gibt, was wieder etwas unschön ist.

    VAR
       uiSelection: UINT;
       pModuleLeftCorner: POINTER TO fbModuleLeftCorner;
       pModuleRightCorner: POINTER TO fbModuleRightCorner;
          
    END_VAR
    CASE uiSelection OF   
    cLeft:
       pModuleLeftCorner:=__NEW(fbModuleLeftCorner);
       
    cRight:
       pModuleRightCorner:=__NEW(fbModuleRightCorner);
       
    ...
    ...
    END_CASE
    
     
  • franzhoepfinger - 2014-11-09

    Alle FB's ein gemeinsames Interface implementieren lassen. Siehe "Factory" im Buch von Gamma

     
  • Pippen - 2015-04-29

    franzhoepfinger hat geschrieben:
    Alle FB's ein gemeinsames Interface implementieren lassen. Siehe "Factory" im Buch von Gamma

    Wie heisst dieses Buch genau?

     

Log in to post a comment.