Beispiel10: Modulkommunikation: Verwendung von Datenzeigern

Dieser Artikel beschriebt die Implementierung von zwei TC3 C++ Modulen, die über einen Datenzeiger kommunizieren.

Download

Hier erhalten Sie den Quellcode für dieses Beispiel.

1. Entpacken Sie die heruntergeladene ZIP-Datei.
2. Öffnen Sie mittels eines Visual Studios, in dem TwinCAT installiert ist, das Projekt über Open Project ….
3. Konfigurieren Sie das Signieren für dieses Projekt, indem Sie auf der Seite unter Rechtsklick auf dem Projekt->Properties->Tc Sign die TwinCAT Signierung anschalten und Ihr Zertifikat und ggf. Passwort konfigurieren.
Weitere Informationen zur Signierung der C++ Projekte erhalten Sie hier.
4. Wählen Sie Ihr Zielsystem aus.
5. Bauen Sie das Beispiel (z. B. Build->Build Solution).
6. Aktivieren Sie die Konfiguration mit einem Klick auf Beispiel10: Modulkommunikation: Verwendung von Datenzeigern 1:.
Das Beispiel ist einsatzbereit.

Beschreibung

Diese Kommunikation baut auf einem „geteilten“ Datenbereich auf: Von einem Modul bereitgestellt und über Zeiger von einem anderen Modul aus erreichbar.

Es ist nicht möglich, dass zwei verschiedene Datenzeiger mit demselben Eintrag in einen Ausgangs- oder Eingangsdatenbereich verknüpft sind, weil es ohne diese Limitierung zu Synchronisationsproblemen käme. Aus diesem Grunde sammelt ein ModuleDataProvider-Modul Ein- und Ausgang in einen Standarddatenbereich, der nicht dieser Einschränkung unterliegt.

Alles in allem beinhaltet dieses Beispiel die folgenden Module:

Der Nutzer des Beispiels triggert ModuleDataInOut mittels Setzen der Variablen ValueIn / Bit1 / Bit2:

Alle Module sind so konfiguriert, dass sie den gleichen Taskkontext haben, was nötig ist, weil der Zugriff über Zeiger keinerlei Synchronisierungsmechanismus bietet. Die Reihenfolge der Ausführung entspricht derjenigen, die auf der Registerkarte Kontextkonfiguration festgelegt wurde. Dieser Wert wird als Parameter SortOrder weitergegeben und im Smart Pointer des zyklischen Aufrufers (m_spCyclicCaller), in dem auch die Objekt-ID des zyklischen Aufrufers enthalten ist, gespeichert.

Das Beispiel verstehen

Das Modul ModuleDataInOut hat Ein- und Ausgangsvariablen. Diese sind mit den entsprechenden Variablen des Datenanbieters verknüpft.

Das Modul ModuleDataProvider stellt einen Eingangs- und einen Ausgangsdatenbereich zur Verfügung und implementiert die Schnittstelle ITcIoCylic. Die Methode InputUpdate kopiert Daten von den Eingangsvariablen auf das DataIn Symbol des standardmäßigen Datenbereichs Data und die Methode OutputUpdate kopiert Daten vom DataOut Symbol auf die Ausgangsvariablen.

Die Module ModuleDataAccessA und ModuleDataAccessB besitzen Zeiger auf Datenbereiche des Datenanbieters über Verknüpfungen. Diese Zeiger werden beim Übergang SAFEOP zu OP initialisiert. ModuleDataAccessA setzt das BitOut1 entsprechend Bit1 auf zyklische Weise. ModuleDataAccessB entsprechend mit BitOut2 / Bit2. Beide inkrementieren ValueOut mittels Multiplikation des internen Zählers mit dem Wert ValueIn.

Wichtig hierbei ist, dass alle Module im gleichen Context ausgeführt werden, da es über Datenzeiger (Datapointer) keinen Synchronisationsmechanismus gibt. Die Reihenfolge der Ausführung wird durch die Sort Order im Context-Tab des jeweiligen Moduls definiert. Dieses wird als Parameter SortOrder im SmartPointer (m_SpCyclicCaller) bereitgestellt, was ebenso die ObjectID bereithält.