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

Zeiger auf Funktionsblöcke

2006-02-10
2007-07-24
  • Thomas Fränz - 2006-02-10

    Wir möchten ein Array von Zeigern auf Funktionsblöcke anlegen. Um indiziert Callbackfunktionen (by Namestring) aufrufen zu können. Die Funktionen sollen unterschiedliche Bodys aber gleichartige Parameterblöcke haben.

    Genau wie dies offenbar bei den Callbacks für die Externen Events funktioniert.

    Unter Codesys 2.3.x.x ist es mit ADR zwar möglich einen Zeiger auf die Instanzdaten zu erzeugen aber nicht auf den Body ! D.h. es wird bei der dereferenzierung des Funktionszeigers immer der deklarierte Body (das Template) gerufen und leider nicht der Body zur konkreten Instanz.

    Mit INDEXOF kann man sich zwar einen Index für einen Body besorgen, aber wie ruft man dann einen Funktionsblock dessen Index man hat ?

    Wer hat eine Lösung (Idee, Lib, C-Funktion) ?

     
  • Wolfgang Doll - 2006-02-17

    Der indirekte Aufruf von Funktionsblöcke z.B. über eine Stringvariable mit dem Namen des FB lässt sich über einige Umwege realisieren.

    Voraussetzung ist die CAA_Callback.lib.

    Dies ist eine externe Bibliothek, welche die Funktion CB_CallFunctionByIndex zur Verfügung stellt.

    Ein Aufruf sieht z.B. wie folgt aus:

    dwValue := CB_CallFunctionByIndex(INDEXOF(CallbackFBI1), dwParam1, dwParam2, dwParam3);
    
    ```Im Anhang findet sich die Spezifikation der CAA_Callback.lib.
    Es ist wichtig das diese Funktion <span style="color: underline">nur</span> eine Funktion aufrufen kann, die folgende Voraussetzungen erfüllt:
    Ein möglicher Prototyp sieht also so aus:
    

    FUNCTION CallbackFBI1: DWORD
    VAR_INPUT
       Param1: DWORD;
       Param2: DWORD;
       Param3: DWORD;
    END_VAR

    ```Im Anhang gibt es CoDeSys Projekt mit dem NamenFB-Pointer-Liste.pro. Dort habe ich folgenden Ansatz gewählt:Wenn die CAA_Callback.lib nicht zur Verfügung steht, kann man sich eventuell eine eigene C-Blibliothek schreiben. Sie sollte dann etwas in der folgenden Art enthalten:

    unsigned long CB_CallFunctionByIndex(
                                  short sPOUIndex,
                                  unsigned long ulParam1,
                                  unsigned long ulParam2,
                                  unsigned long ulParam3)
    {
       void* pPlcFunctions;
       unsigned long ulValue = 0;
       if(sPOUIndex != -1)
       {
          pPlcFunctions = RtsGetIecFctPointer(sPOUIndex);
          if (RtsProgramLoaded() && pPlcFunctions != 0)
          {
             ulValue = SysCallWith3Param(
                         (PFCALLBACK)pPlcFunctions,
                         ulParam1,
                         ulParam2,
                         ulParam3
                      );
          }
       }
       return(ulValue);
    }
    

    CAA_Callback.pdf [45.66 KiB]

    CAA_Callback.zip [4.97 KiB]

    FB Pointer Liste.zip [5.4 KiB]

     
  • lothar - 2007-07-23

    Guten Tag Herr Doll,

    im CAA_CALLBACK.zip fehlt leider die CAA_Types.lib.

    --> unbekannter Typ 'CAA_HANDLE'

    Würden Sie diese bitte noch nachliefern?

    Gruss

    lothar

     
  • Wolfgang Doll - 2007-07-24

    Hallo !

    Anbei eine mögliche Implementierung der CAA_Types.lib

    Viele Grüße

    Wolfgang Doll

    CAA_Types.zip [4.87 KiB]

     

Log in to post a comment.