-

Globale Funktionsbausteine in PLCnext Engineer

Dieses Thema enthält die folgenden Abschnitte:

Allgemeine Informationen zu globalen Funktionsbausteinen

PLCnext Engineer ermöglicht die Erstellung globaler Funktionsbaustein-Instanzen. Global bedeutet, dass dieselbe Instanz des Funktionsbausteins aus verschiedenen Programm-POEs aufgerufen werden kann, d.h. der Funktionsbaustein kann von mehreren Programm-POEs innerhalb desselben Projekts aufgerufen werden.

Ein Funktionsbaustein mit der 'Verwendung' 'Extern' in der Variablentabelle der aufrufenden POE oder der 'Verwendung' 'Global' in der Datenliste erzeugt einen globalen Funktionsbaustein. (Die Deklaration eines externen Funktionsbausteins in der Variablentabelle einer POE führt zu einem automatisch generierten globalen Funktionsbaustein in der Datenliste).

Für globale Funktionsbausteine gilt das Folgende:

Anzeige globaler Funktionsbausteine im 'PLCnext'-Knoten in der ANLAGE

Globale Funktionsbausteine werden im 'PLCnext'-Knoten in der ANLAGE mit dem Overlay-Symbol angezeigt.

Gleichzeitigen Zugriff auf gemeinsame Daten mit Mutex und Semaphor schützen

Globale Funktionsbausteine können von mehreren Tasks gleichzeitig aufgerufen werden. Ohne Synchronisierung der gleichzeitigen Zugriffe können Race Conditions oder inkonsistente Daten auftreten. Ein Beispiel: Ein globaler Funktionsbaustein wird für die Motorsteuerung von zwei Tasks verwendet. Task A ändert die Drehzahl auf 100 U/min und Task B ändert die Drehzahl gleichzeitig auf 50 U/min. Dies kann zu Datenverlusten oder einem inkonsistenten Zustand führen. Um dies zu vermeiden, werden Synchronisierungstechniken wie Mutex und Semaphor verwendet.

Grundsätzlich sind Mutex und Semaphor beides Synchronisationsmechanismen, die für die Verwaltung des gleichzeitigen Zugriffs auf gemeinsame Daten verwendet werden. Mutex (kurz für "mutual exclusion", gegenseitiger Ausschluss) ist ein Sperrmechanismus, der sicherstellt, dass jeweils nur ein Task auf eine Ressource zugreifen kann. Ein Semaphor ist ein Signalisierungsmechanismus, der steuert, wie viele Tasks auf eine Ressource zugreifen dürfen. Dazu zählt der Semaphor die Anzahl der Prozesse, die Zugriff auf die gemeinsamen Daten haben.

Mutex vs. Semaphor

FeatureMutexSemaphor
ZweckGegenseitiger Ausschluss (nur 1 Task)Ressourcenzählung oder Signalisierung
EigentümerNur der Task, der gesperrt hat, kann entsperrenNur der Task, die den Semaphor erworben hat, kann ihn freigeben
AnwendungsfallSchützen einer gemeinsamen RessourceKoordinierung des Zugriffs auf mehrere Ressourcen oder Signalisierung zwischen Tasks
Blockierung?Ja, wenn bereits gesperrtAbhängig vom Wert (blockiert, wenn aktueller Zählerstand > maximaler Zählerstand)

Mutex:

Zählender Semaphor:

Mutex

Um sicherzustellen, dass jeweils nur ein Task auf die gemeinsamen Daten zugreifen kann, wird ein Mutex verwendet. Der Mutex ist ein Sperrmechanismus mit folgenden Funktionen:

So funktioniert ein Mutex

Wie bereits erwähnt, dient ein Mutex als Sperrmechanismus für Tasks, die gemeinsame Daten verwenden. Ein Mutex hat einen gesperrten und einen entsperrten Zustand. Wenn ein Task auf gemeinsam genutzte Daten zugreifen will, muss er zunächst den Mutex erwerben. Wenn der Mutex nicht von einem anderen Task gesperrt ist, sperrt der Task den Mutex und setzt die Ausführung fort. Falls der Mutex bereits von einem anderen Task gesperrt ist, wartet der anfordernde Task darauf, dass der Mutex wieder freigegeben wird. Der Task wird blockiert, bis der Mutex freigegeben wird. Tasks, die sich im Wartezustand befinden, werden der Mutex-Warteschlange hinzugefügt. Nach Abschluss der Operation an den gemeinsamen Daten gibt der Task den Mutex frei (entsperrt ihn), so dass andere Tasks ihn erwerben und auf die gemeinsamen Daten zugreifen können.

Hinweis
Im Falle einer Mutex-Sperre kann ein Task-Watchdog ausgelöst werden. Es wird daher empfohlen, eine TRYLOCK-Methode anstelle einer LOCK-Methode zu verwenden (siehe auch folgenden Tabelle).
 
IF myMX.TRYLOCK()
      // kritischer Abschnitt
      myMX.UNLOCK()
END_IF

Implementierung eines Mutex in PLCnext Engineer

Für die Synchronisierung gleichzeitiger Zugriffe auf gemeinsame Daten in PLCnext Engineer steht der objektorientierte Funktionsbaustein MUTEX zur Verfügung (enthalten in den KOMPONENTEN, Kategorie 'IEC 61131-3 | Funktionen & Funktionsbausteine | Synchronisierung der gleichzeitigen Ausführung'). Dieser Funktionsbaustein bietet die folgenden Methoden, die für die Interaktion mit einem Mutex verwendet werden:

FunktionsbausteinmethodenVerhalten
LOCKSperrt den Mutex (wird Besitzer des Mutex). Wenn der Mutex bereits von einem anderen Task gesperrt ist, wartet der Task (wird blockiert), bis er wieder verfügbar ist (d.h. von einem anderen Task entsperrt wurde).

Hinweis
Im Falle einer Mutex-Sperre kann ein Task-Watchdog ausgelöst werden. Es wird daher empfohlen, eine TRYLOCK-Methode anstelle einer LOCK-Methode zu verwenden (siehe auch den obigen Hinweis).

UNLOCKEntsperrt den Mutex, so dass der nächste wartende Task der Besitzer des Mutex werden kann (um ihn zu sperren).

Muss immer nach einem erfolgreichen TRYLOCK (Rückgabewert TRUE) aufgerufen werden.

Hinweis
Nur der Task, der den Mutex gesperrt hat, kann ihn wieder entsperren.

TRYLOCKVersucht, den Mutex zu sperren (um Besitzer des Mutex zu werden). Er prüft, ob der Mutex verfügbar ist:

  • Wenn ja, wird der Mutex gesperrt und TRUE zurückgegeben.
  • Wenn nein, wird sofort FALSE zurückgegeben, ohne zu warten.
IS_ENTEREDÜberprüft, ob der aktuelle Task die Sperre für den angegebenen Mutex hält.

  • TRUE = Task hat den Mutex gesperrt
  • FALSE = Task hat den Mutex nicht gesperrt.

Beispiel für einen Mutex in ST

Im folgenden Beispiel verwendet der globale Funktionsbaustein FB_counter einen Mutex, um den Zugriff auf die gemeinsame Variable internalCounter zu schützen. Eine Instanz von FB_counter wird in den Programmen MyProgramA und MyProgramB verwendet. MyProgramA wird von TaskA und MyProgramB von TaskB aufgerufen. Mit Hilfe des Mutex wird sichergestellt, dass zu jedem Zeitpunkt nur ein Aufruf den internalCounter aktualisieren (inkrementieren) kann. Sobald der Zähler inkrementiert ist, wird der Mutex entsperrt, so dass der nächste wartende Task auf die gemeinsame Variable zugreifen kann.

Weitere Infos
Wie man Methoden von Funktionsbausteinen verwendet, erfahren Sie im Thema "Methoden von FBs in PLCnext Engineer".

Semaphor

Ein Semaphor ist ein Synchronisierungsmechanismus, der es einer festgelegten Anzahl von Tasks erlaubt, auf eine Ressource zuzugreifen. Es ist wie ein Zähler, der zählt, wie viele Tasks gleichzeitig auf eine Ressource zugreifen können. Der Anfangswert des Semaphorzählers ist die Anzahl der Ressourcenzugriffe, die sofort erlaubt werden (Standardwert ist 0). Der Maximalwert des Zählers ist der Endwert, den der Semaphor erreichen kann (angegeben mit der Variable MaximumCount des SEMA-Funktionsbausteins; siehe unten). Das heißt, die Gesamtzahl der Ressourcen, für die ein gleichzeitiger Zugriff gewährt wird.

Implementierung eines Semaphor in PLCnext Engineer

Um die Anzahl gleichzeitiger Zugriffe mehrerer Tasks auf eine bestimmte Ressource in PLCnext Engineer zu beschränken, steht der objektorientierte Funktionsbaustein SEMA zur Verfügung (enthalten in den KOMPONENTEN, Kategorie 'IEC 61131-3 | Funktionen & Funktionsbausteine | Synchronisierung der gleichzeitigen Ausführung'). Dieser Funktionsbaustein stellt die in der folgenden Tabelle beschriebenen Methoden und einen Anfangswert zur Verfügung, die für die Interaktion mit einem Semaphor verwendet werden.

Der Initialwert gibt an, wie viele Tasks gleichzeitig auf die zugreifen können. Die Zählung beginnt bei 0. Der als INT-Variable bereitgestellte Wert des Funktionsbausteins MaximumCount gibt an, wie oft maximal gleichzeitig auf die Ressource zugegriffen werden kann (Standardwert ist 0). Wird dieser Wert erreicht, blockiert der Semaphor den Zugriff auf die Ressource so lange, bis eine andere Task den Semaphor freigibt. Ein Semaphor mit einem MaximumCount-Wert von zwei kann zum Beispiel bis zu drei gleichzeitige Zugriffe verarbeiten.

Hinweis
Im Falle einer Semaphor-Anforderung kann ein Task-Watchdog ausgelöst werden. Es wird daher empfohlen, eine TRY_ACQUIRE-Methode anstelle einer ACQUIRE-Methode zu verwenden (siehe auch folgenden Tabelle).
 
IF TRY_ACQUIRE
      // kritischer Abschnitt
      RELEASE
END_IF

FunktionsbausteinmethodeVerhalten
ACQUIREVersucht, Zugriff auf die Ressource zu erhalten.

  • Solange die maximale Anzahl der erlaubten Tasks, die auf den Semaphor zugreifen dürfen, nicht erreicht ist, wird auf die Ressource zugegriffen und die Taskausführung fortgesetzt.
  • Wenn die maximale Anzahl der erlaubten Tasks, die auf den Semaphor zugreifen dürfen, erreicht ist, wartet der Task (ist blockiert), bis eine Ressource verfügbar wird.

Hinweis
Im Falle einer Semaphor-Anforderung kann ein Task-Watchdog ausgelöst werden. Es wird daher empfohlen, eine TRY_ACQUIRE-Methode anstelle einer ACQUIRE-Methode zu verwenden (siehe auch den obigen Hinweis).

RELEASEGibt die Ressource frei, auf die zuvor zugegriffen wurde. So können sie später von anderen Tasks übernommen werden.
TRY_ACQUIREVersucht, Zugriff auf die Ressource zu erhalten, ohne zu warten (blockierend).

  • Solange die maximale Anzahl der erlaubten Tasks, die auf den Semaphor zugreifen dürfen, nicht erreicht ist, wird auf die Ressource zugegriffen und die Taskausführung fortgesetzt.
  • Wenn die maximale Anzahl der erlaubten Tasks, die auf den Semaphor zugreifen dürfen, erreicht ist, fährt der Task mit dem Rückgabewert FALSE fort. (Der Aufrufer darf nicht auf den gesperrten Code zugreifen.)

Beispiel für einen Semaphor in ST

Nehmen wir an, es gibt drei Tasks (Task1, Task2 und Task3), die gleichzeitig auf die gemeinsame Variable sharedResource zugreifen wollen. Es werden jedoch immer nur zwei Tasks gleichzeitig zugelassen, und der nächste Task muss warten, bis die Ressource wieder verfügbar ist. Die maximale Anzahl der gleichzeitigen Tasks wird mit dem Semaphorzähler (Variable MaximumCount := INT#2; INT-Variable des SEMA-Funktionsbausteins) festgelegt. Wenn der Zähler weniger als zwei beträgt, kann ein Task den Semaphor erwerben und auf die Ressource zugreifen. Wenn der Zähler bereits auf zwei steht, muss der Task warten, bis der Semaphorzähler kleiner als zwei ist.