Globale Funktionsbausteine in PLCnext Engineer
Dieses Thema enthält die folgenden Abschnitte:
- Allgemeine Informationen zu globalen Funktionsbausteinen
- Anzeige globaler Funktionsbausteine im 'PLCnext'-Knoten in der ANLAGE
- Gleichzeitigen Zugriff auf gemeinsame Daten mit Mutex und Semaphor schützen
- Mutex
- Semaphor
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:
- Globale AS-Funktionsbausteine werden unterstützt. Für einen sorgfältigen Entwurf sind Sie als Anwender verantwortlich, damit die Synchronisierung fehlerfrei funktioniert (siehe den Abschnitt "Gleichzeitigen Zugriff auf gemeinsame Daten mit Mutex und Semaphor schützen" unten).
- EN/ENO für globale AS-Funktionsbausteine wird unterstützt. Für einen sorgfältigen Entwurf sind Sie als Anwender verantwortlich, damit die Synchronisierung fehlerfrei funktioniert.
- Verschachtelte lokale und globale Funktionsbausteine werden unterstützt. Für einen sorgfältigen Entwurf sind Sie als Anwender verantwortlich, damit die Synchronisierung fehlerfrei funktioniert.
- Globale Variablen in globalen Funktionsbausteinen werden unterstützt.
- Der Aufruf globaler Funktionsbausteine aus (lokalen oder globalen) Funktionsbaustein-Methoden heraus wird unterstützt.
- Globale Funktionsblöcke können in Namespaces organisiert werden.
- Die Online-Werte von globalen Funktionsbausteinen werden entsprechend der Task- und Event-Konfiguration synchronisiert.
- Eine sicherheitsbezogene Ressource unterstützt keine globalen Funktionsbausteine.
- Ein globaler Funktionsbaustein hat kein HMI-Tag in der Datenliste.
- Globale Funktionsbausteine sind nicht in der GDS-Portliste verfügbar.
- Ein globaler Funktionsbaustein kann nicht mit Prozessdaten-Elementen verbunden werden.
- Beim Refactoring für eine globale Funktionsbaustein-Instanz werden alle externen Variablen und alle Aufrufe der FB-Instanz erfasst.
- Wenn ein globaler Funktionsbaustein in mehreren Tasks verwendet wird, wird eine Compiler-Warnung in der FEHLERLISTE im MELDUNGEN-Fenster ausgegeben.
- Enthält ein globaler Funktionsbaustein Instanzvariablen, wird in der FEHLERLISTE im MELDUNGEN-Fenster ein Compiler-Fehler ausgegeben.
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
Feature | Mutex | Semaphor |
---|---|---|
Zweck | Gegenseitiger Ausschluss (nur 1 Task) | Ressourcenzählung oder Signalisierung |
Eigentümer | Nur der Task, der gesperrt hat, kann entsperren | Nur der Task, die den Semaphor erworben hat, kann ihn freigeben |
Anwendungsfall | Schützen einer gemeinsamen Ressource | Koordinierung des Zugriffs auf mehrere Ressourcen oder Signalisierung zwischen Tasks |
Blockierung? | Ja, wenn bereits gesperrt | Abhä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:
- Verhindert den gleichzeitigen Zugriff: Es wird sichergestellt, dass jeweils nur ein Task den Code zwischen den Synchronisationsmethoden ausführen kann.
- Verhindert Race Conditions: Es wird vor unvorhersehbarem Verhalten (unvorhersehbare Werte) aufgrund von gleichzeitigem Zugriff geschützt.
- Stellt Datenkonsistenz sicher.
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:
Funktionsbausteinmethoden | Verhalten | |
---|---|---|
LOCK | Sperrt 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).
|
|
UNLOCK | Entsperrt 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.
|
|
TRYLOCK | Versucht, den Mutex zu sperren (um Besitzer des Mutex zu werden). Er prüft, ob der Mutex verfügbar ist:
|
|
IS_ENTERED | Überprüft, ob der aktuelle Task die Sperre für den angegebenen Mutex hält.
|
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 |
Funktionsbausteinmethode | Verhalten | |
---|---|---|
ACQUIRE | Versucht, Zugriff auf die Ressource zu erhalten.
|
|
RELEASE | Gibt die Ressource frei, auf die zuvor zugegriffen wurde. So können sie später von anderen Tasks übernommen werden. | |
TRY_ACQUIRE | Versucht, Zugriff auf die Ressource zu erhalten, ohne zu warten (blockierend).
|
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.