Methoden zur Verfügung stellendes TwinCAT 3 C++ Modul
Dieser Artikel beschreibt die Erstellung eines TwinCAT 3 C++ Moduls, das eine Schnittstelle mit einigen Methoden zur Verfügung stellt, die von einer SPS, aber auch von anderen C++ Modulen aufgerufen werden kann.
Die Idee besteht darin, eine einfache Zustandsmaschine in C++ zu erstellen, die von anderen Modulen von außen gestartet und gestoppt werden kann, aber auch das Setzen oder Lesen des bestimmten Zustands der C++ Zustandsmaschine ermöglicht.
Zwei weitere Artikel nutzen das Ergebnis dieser C++ Zustandsmaschine.
- Aufruf der Funktionalität von der SPS Logik her - also von der SPS auf C++ Code einwirken.
- Aufruf der Funktionalität von der C++ Logik - also Wechselwirkung zwischen zwei C++ Modulen.
Dieser Artikel beschreibt:
- Schritt 1: Erstellen Sie ein neues TwinCAT 3 Projekt.
- Schritt 2: Erstellen Sie einen neuen TwinCAT 3 C++ Treiber.
- Schritt 3: Erzeugen Sie eine neue TwinCAT 3 Schnittstelle.
- Schritt 4: Fügen Sie der Schnittstelle Methoden hinzu.
- Schritt 5: Fügen Sie eine neue Schnittstelle zum Modul hinzu.
- Schritt 6: Starten Sie den TwinCAT TMC Code Generator, um einen Code für die Modulklassenbeschreibung zu erzeugen.
- Schritt 7: Implementieren Sie die Membervariablen und den Konstruktors.
- Schritt 8: Implementieren Sie Methoden.
- Schritt 9: Implementieren Sie zyklische Aktualisierung.
- Schritt 10: Kompilieren Sie Code kompilieren
- Schritt 11: Erstellen Sie eine Instanz des C++ Moduls.
- Schritt 12: Fertig, überprüfen Sie die Ergebnisse.
Schritt 1: TwinCAT 3 Projekt erstellen
Als erstes legen Sie wie gewohnt ein TwinCAT Projekt an.
Schritt 2: Erstellen Sie einen neuen TwinCAT 3 C++ Treiber
- 1. Klicken Sie mit der rechten Maustaste auf C++ und Add New Item...
- 2. Wählen Sie die Vorlage TwinCAT Driver Project und geben einen Treibernamen ein, „StateMachineDrv“ in diesem Beispiel. Klicken Sie auf Add um fortzufahren.
- 3. Wählen Sie eine für diesen neuen Treiber zu verwendende Vorlage. In diesem Beispiel ist „TwinCAT Module Class with Cyclic IO“ gewählt, da der interne Zähler der Zustandsmaschine verfügbar ist, um den IO zugeordnet zu werden.
- 4. Klicken Sie auf Add um fortzufahren.
- 5. Geben Sie einen Namen für die neue Klasse im C++ Treiber „StateMachineDrv“ an.
Aus dem angegebenen „Short Name“ ergeben sich die Namen der Modul-Klasse sowie der Header- und Source-Dateien. - 6. Klicken Sie auf OK um fortzufahren.
- Daraufhin erstellt der Assistent ein C++ Projekt, das fehlerfrei kompiliert werden kann.
Schritt 3: Ein neues TwinCAT 3 Interface anlegen
Hinweis | |
Namenskonflikt Wenn der Treiber im Verbund mit einem SPS-Modul verwendet wird, kann es zu Namenskollisionen kommen. |
- 1. Starten Sie den TMC Editor mittels Doppelklick auf StateMachineDrv.tmc.
- 2. Wählen Sie innerhalb des TMC Editors Data Types.
- 3. Fügen Sie eine neue Schnittstelle hinzu durch Klick auf Adds a new interface .
- Daraufhin wird ein neuer Eintrag IInterface1 aufgeführt.
- 4. Öffnen Sie IInterface1 mit Doppel-Klick, um die Eigenschaften des Interfaces zu verändern.
- 5. Geben Sie einen aussagekräftigeren Namen ein - in diesem Beispiel „IStateMachine“.
- Das Interface ist angelegt.
Schritt 4: Fügen Sie der Schnittstelle Methoden hinzu
- 1. Klicken Sie auf Edit Methods..., um eine Liste der Methoden dieser Schnittstelle zu erhalten:
Klicken Sie auf die + Schaltfläche, um eine neue standardmäßige Methode Method1 zu erzeugen. - 2. Ersetzen Sie den Standardnamen Method1 durch aussagekräftigen Namen, in diesem Beispiel „Start“.
- 3. Fügen Sie eine zweite Methode hinzu und nennen sie „Stop“.
- 4. Fügen Sie eine dritte Methode hinzu und nennen sie „SetState“.
- 5. Anschließend können Sie mit einem Klick auf Add a new parameter Parameter hinzufügen bzw. Parameter der Methode SetState bearbeiten.
- Standardmäßig wird der neue Parameter Parameter1 als Normal Type INT erzeugt.
- 6. Klicken Sie auf den Namen „Parameter1“, gehen Sie in das Bearbeitungsfeld und ändern Sie den Namen in „State“.
- 7. Nachdem Start, Stop und SetState definiert sind, definieren Sie eine weitere Methode.
- 8. Benennen Sie sie in „GetState“ um.
- 9. Fügen Sie einen Parameter hinzu und nennen ihn „pState“ (ist so konzipiert, um später ein Zeiger zu werden).
- 10. Ändern Sie Normal Type zu Is Pointer.
- Daraufhin erhalten Sie eine Liste aller Methoden. Mit den Schaltflächen können Sie die Reihenfolge der Methoden verändern.
Schritt 5: Neue Schnittstelle zum Modul hinzufügen
- 1. Wählen Sie das Modul, das mit der neuen Schnittstelle erweitert werden soll - in diesem Falle wählen Sie das Ziel Modules->CStateMachineModule.
- 2. Erweitern Sie die Liste der implementierten Schnittstellen mit Klick auf die Schaltfläche + mit Add a new interface to the module um eine neue Schnittstelle.
- 3. Alle verfügbaren Schnittstellen werden aufgeführt - wählen Sie die neue Schnittstelle IStateMachine und beenden Sie mit OK.
- Die neue Schnittstelle IStateMachine ist Teil der Modulbeschreibung.
Schritt 6: Den TwinCAT TMC Code Generator starten
- 1. Um den C/C++ Code anhand dieses Moduls zu generieren, klicken Sie mit der rechten Maustaste in das C/C++ Projekt und wählen dann den TwinCAT TMC Code Generator.
- Nun enthält das Modul StateMachineModule.cpp die neuen Schnittstellen
CModule1: Start()
CModule1: Stop()
CModule1: SetState(SHORT State)
CModule1: GetState(SHORT* pState).
Schritt 7: Implementierung der Membervariablen und des Konstruktors
Fügen Sie die Membervariablen in die Header-Datei StateMachineModule.h hinzu.
Schritt 8: Methoden implementieren
Implementieren Sie den Code für die vier Methoden in der StateMachineModule.cpp:
Schritt 9: Zyklische Aktualisierung implementieren
Die C++ Modulinstanz wird zyklisch aufgerufen - selbst dann, wenn die interne Zustandsmaschine sich im Stop-Modus befindet.
- Wenn die Zustandsmaschine nicht ausgeführt werden soll, dann signalisiert das m_bRun Flag, dass die Codeausführung der internen Zustandsmaschine zu verlassen ist.
- Bei Zustand „1“ muss der Zähler inkrementiert werden.
- Bei Zustand „2“ muss der Zähler dekrementiert werden.
- Der sich daraus ergebende Zählwert wird Value zugewiesen, die Membervariable des logischen Ausgangs des Datenbereichs ist. Dieser kann später der physikalischen IO-Ebene oder anderen Datenbereichen von anderen Modulen zugeordnet werden.
.
Schritt 10: Code kompilieren
- 1. Nach der Implementierung aller Schnittstellen kompilieren Sie den Code, indem Sie einen Rechtsklick auf die Zustandsmaschine machen und Build wählen.
- 2. Wiederholen Sie die Kompilierung und optimieren Sie Ihren Code so lange, bis das Ergebnis folgendermaßen aussieht:
Schritt 11: Eine Instanz des C++ Moduls erstellen
- 1. Machen Sie einen Rechtsklick auf das C++ Projekt und wählen Sie Add New Item..., um eine neue Modulinstanz zu erstellen.
- 2. Wählen Sie das Modul aus, das als neue Instanz hinzugefügt werden soll - in diesem Fall CStateMachineModule.
- 3. Ordnen Sie die Instanz einer Task zu:
Schritt 12: Fertig - Ergebnis überprüfen
- 1. Navigieren Sie zum neuen, im Solution-Baum aufgeführten, Modul und wählen die Registerkarte Interfaces auf der rechten Seite.
- Die neue Schnittstelle IStateMachine ist aufgelistet.