<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to Zeiger auf Funktionsblöcke</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/9947f0f7f4/" rel="alternate"/><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/9947f0f7f4/feed.atom" rel="self"/><id>https://forge.codesys.com/forge/talk/Deutsch/thread/9947f0f7f4/</id><updated>2020-02-28T10:10:03.896000Z</updated><subtitle>Recent posts to Zeiger auf Funktionsblöcke</subtitle><entry><title>Zeiger auf Funktionsblöcke</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/9947f0f7f4/?limit=25#5f54" rel="alternate"/><published>2020-02-28T10:10:03.896000Z</published><updated>2020-02-28T10:10:03.896000Z</updated><author><name>Wolfgang Doll</name><uri>https://forge.codesys.com/u/wolfgang-doll/</uri></author><id>https://forge.codesys.comd6a9a1ff6a05a7811ac8f66411194a3ef55373ad</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hallo !&lt;/p&gt;
&lt;p&gt;Anbei eine mögliche Implementierung der CAA_Types.lib&lt;/p&gt;
&lt;p&gt;Viele Grüße&lt;/p&gt;
&lt;p&gt;Wolfgang Doll&lt;/p&gt;
&lt;p&gt;&lt;a class="" href="https://forum-de.codesys.com//download/file.php?id=205" rel="nofollow"&gt;CAA_Types.zip &lt;span&gt;&lt;span&gt;[4.87 KiB]&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Zeiger auf Funktionsblöcke</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/9947f0f7f4/?limit=25#8aec" rel="alternate"/><published>2020-02-28T10:09:56.634000Z</published><updated>2020-02-28T10:09:56.634000Z</updated><author><name>lothar</name><uri>https://forge.codesys.com/u/lothar/</uri></author><id>https://forge.codesys.com06902205c4ef476a59e70528f1d698580d288a87</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Guten Tag Herr Doll,&lt;/p&gt;
&lt;p&gt;im CAA_CALLBACK.zip fehlt leider die CAA_Types.lib.&lt;/p&gt;
&lt;p&gt;--&amp;gt; unbekannter Typ 'CAA_HANDLE'&lt;/p&gt;
&lt;p&gt;Würden Sie diese bitte noch nachliefern?&lt;/p&gt;
&lt;p&gt;Gruss&lt;/p&gt;
&lt;p&gt;lothar&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Zeiger auf Funktionsblöcke</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/9947f0f7f4/?limit=25#77f2" rel="alternate"/><published>2020-02-28T10:09:53.869000Z</published><updated>2020-02-28T10:09:53.869000Z</updated><author><name>Wolfgang Doll</name><uri>https://forge.codesys.com/u/wolfgang-doll/</uri></author><id>https://forge.codesys.com028221a835669cb591b965d390f4f918521a623e</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Der indirekte Aufruf von Funktionsblöcke z.B. über eine Stringvariable mit dem Namen des FB lässt sich über einige Umwege realisieren.&lt;/p&gt;
&lt;p&gt;Voraussetzung ist die &lt;strong&gt;CAA_Callback.lib&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Dies ist eine externe Bibliothek, welche die Funktion &lt;strong&gt;CB_CallFunctionByIndex&lt;/strong&gt; zur Verfügung stellt.&lt;/p&gt;
&lt;p&gt;Ein Aufruf sieht z.B. wie folgt aus:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;dwValue := CB_CallFunctionByIndex(INDEXOF(CallbackFBI1), dwParam1, dwParam2, dwParam3);

```Im Anhang findet sich die Spezifikation der CAA_Callback.lib.
Es ist wichtig das diese Funktion &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"color: underline"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;nur&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt; eine Funktion aufrufen kann, die folgende Voraussetzungen erfüllt:
Ein möglicher Prototyp sieht also so aus:
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;FUNCTION CallbackFBI1: DWORD&lt;br/&gt;
VAR_INPUT&lt;br/&gt;
   Param1: DWORD;&lt;br/&gt;
   Param2: DWORD;&lt;br/&gt;
   Param3: DWORD;&lt;br/&gt;
END_VAR&lt;/p&gt;
&lt;p&gt;```Im Anhang gibt es CoDeSys Projekt mit dem Namen&lt;strong&gt;FB-Pointer-Liste.pro&lt;/strong&gt;. 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:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;unsigned&lt;/span&gt; &lt;span class="nv"&gt;long&lt;/span&gt; &lt;span class="nv"&gt;CB_CallFunctionByIndex&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;
                              &lt;span class="nv"&gt;short&lt;/span&gt; &lt;span class="nv"&gt;sPOUIndex&lt;/span&gt;,
                              &lt;span class="nv"&gt;unsigned&lt;/span&gt; &lt;span class="nv"&gt;long&lt;/span&gt; &lt;span class="nv"&gt;ulParam1&lt;/span&gt;,
                              &lt;span class="nv"&gt;unsigned&lt;/span&gt; &lt;span class="nv"&gt;long&lt;/span&gt; &lt;span class="nv"&gt;ulParam2&lt;/span&gt;,
                              &lt;span class="nv"&gt;unsigned&lt;/span&gt; &lt;span class="nv"&gt;long&lt;/span&gt; &lt;span class="nv"&gt;ulParam3&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
{
   &lt;span class="nv"&gt;void&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;pPlcFunctions&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;unsigned&lt;/span&gt; &lt;span class="nv"&gt;long&lt;/span&gt; &lt;span class="nv"&gt;ulValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;sPOUIndex&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
   {
      &lt;span class="nv"&gt;pPlcFunctions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;RtsGetIecFctPointer&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;sPOUIndex&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;RtsProgramLoaded&lt;/span&gt;&lt;span class="ss"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;pPlcFunctions&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
      {
         &lt;span class="nv"&gt;ulValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;SysCallWith3Param&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;
                     &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;PFCALLBACK&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;pPlcFunctions&lt;/span&gt;,
                     &lt;span class="nv"&gt;ulParam1&lt;/span&gt;,
                     &lt;span class="nv"&gt;ulParam2&lt;/span&gt;,
                     &lt;span class="nv"&gt;ulParam3&lt;/span&gt;
                  &lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      }
   }
   &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ulValue&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
}
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;a class="" href="https://forum-de.codesys.com//download/file.php?id=90" rel="nofollow"&gt;CAA_Callback.pdf &lt;span&gt;&lt;span&gt;[45.66 KiB]&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="" href="https://forum-de.codesys.com//download/file.php?id=89" rel="nofollow"&gt;CAA_Callback.zip &lt;span&gt;&lt;span&gt;[4.97 KiB]&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="" href="https://forum-de.codesys.com//download/file.php?id=88" rel="nofollow"&gt;FB Pointer Liste.zip &lt;span&gt;&lt;span&gt;[5.4 KiB]&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Zeiger auf Funktionsblöcke</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/9947f0f7f4/?limit=25#5375" rel="alternate"/><published>2020-02-28T10:09:47.013000Z</published><updated>2020-02-28T10:09:47.013000Z</updated><author><name>Thomas Fränz</name><uri>https://forge.codesys.com/u/thomas-fraenz/</uri></author><id>https://forge.codesys.com0867ccb6b9f414af54a5921f35c438e4716d1eaa</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Genau wie dies offenbar bei den Callbacks für die Externen Events funktioniert.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Mit INDEXOF kann man sich zwar einen Index für einen Body besorgen, aber wie ruft man dann einen Funktionsblock dessen Index man hat ?&lt;/p&gt;
&lt;p&gt;Wer hat eine Lösung (Idee, Lib, C-Funktion) ? &lt;/p&gt;&lt;/div&gt;</summary></entry></feed>