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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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:POINTERTOfbModuleLeftCorner;Â Â pModuleRightCorner:POINTERTOfbModuleRightCorner;Â Â Â Â END_VARCASEuiSelectionOFÂ Â cLeft:Â Â pModuleLeftCorner:=__NEW(fbModuleLeftCorner);Â Â cRight:Â Â pModuleRightCorner:=__NEW(fbModuleRightCorner);Â Â ......END_CASE
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
Hi,
schau mal in der Hilfe nach ```
__NEW
und
__DELETE
```. Das sollte Deinen Anwendungsfall abdecken.
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.
Alle FB's ein gemeinsames Interface implementieren lassen. Siehe "Factory" im Buch von Gamma
Wie heisst dieses Buch genau?