Erstellen eines FBs in der SPS, der das C++ Objekt anlegt und dessen Funktionalität anbietet
- 1. Legen Sie eine SPS an und fügen Sie dort einen neuen Funktionsbaustein an.
Dieser Proxy-Baustein soll die Funktionalität bereitstellen, die in C++ programmiert wurde. Dies kann er über einen Schnittstellenpointer, der von der C++ Klasse definiert wurde und aufgrund der TMC-Beschreibungsdatei in der SPS bekannt ist.
- 2. Deklarieren Sie im Deklarationsteil des Funktionsbausteins als Ausgang einen Schnittstellenzeiger auf die Schnittstelle (IIncrement), die später die Funktionalität nach außen bereitstellt.
- 3. Legen Sie eine Library-ID, Klassen-ID und die Schnittstellen-ID als Membervariablen an, wie im vorherigen Schritt gezeigt.
Während die Schnittstellen-ID über eine globale Liste verfügbar ist, wird die Library-ID und Klassen-ID - sofern sie noch nicht bekannt sein sollte - über einen anderen Weg ermittelt. Ein möglicher Weg hierfür ist eine Instanz zwischenzeitig anzulegen und die Informationen aus dem Dialog zu entnehmen, bevor sie wieder gelöscht werden kann:
- 4. Fügen Sie dem SPS Proxy-Baustein die FB_init Konstruktormethode hinzu.
Für den Fall, dass es sich nicht um einen Online Change sondern um die Initialisierung des Bausteins handelt, wird ein neues TcCOM-Objekt (Klasseninstanz der spezifizierten Klasse) angelegt und der Schnittstellenzeiger auf die spezifizierte Schnittstelle geholt.
Als erstes wird mittels der Methode F_GetClassIdVersioned() aus der Library-ID sowie der Klassen-ID die versionierte Klassen-ID berechnet. Danach wird der verwendeten Funktion FW_ObjMgr_CreateAndInitInstance() auch der Name und der Zielzustand des TcCOM-Objektes mitgegeben. Diese zwei Parameter werden hier als Eingangsparameter der FB_init Methode deklariert, weshalb sie bei Instanziierung des Proxy-Bausteins anzugeben sind. Die zu instanziierende TwinCAT C++ Klasse kommt ohne TcCOM-Initialisierungsdaten und ohne TcCOM-Parameter aus.
Bei diesem Funktionsaufruf zählt das Objekt selbst einen Referenzzähler hoch.
- 5. Es ist zwingend notwendig, die verwendete Referenz wieder freizugeben und das Objekt zu löschen, sofern es nicht mehr verwendet wird. Rufen Sie hierzu die Funktion FW_ObjMgr_DeleteInstance() im FB_exit Destruktor des Bausteins auf.
- Damit ist die Implementierung des Proxy-Funktionsbausteins bereits abgeschlossen.
- 6. Deklarieren Sie zum Aufruf der über die Schnittstelle bereitgestellten Methoden in der Applikation eine Instanz des Proxy-Bausteins. Die Aufrufe selbst finden alle über den als Ausgang des Bausteins definierten Schnittstellenzeiger statt. Wie bei Zeigern typisch, muss eine Überprüfung auf Null vorrausgehen. Daraufhin können die Methoden, auch mittels Intellisense, direkt aufgerufen werden.
- Das Beispiel ist bereit zum Test.