Beschreibung | Der objektorientierte Funktionsbaustein SEMA wird verwendet, um den Zugriff auf eine begrenzte Anzahl von Ressourcen zu steuern. Der Funktionsbaustein implementiert die Logik eines Semaphor. Er wird als zählender Semaphor verwendet, der mehreren Tasks den gleichzeitigen Zugriff auf eine Ressource ermöglicht.Der Zähler des Semaphor zählt, wie viele Tasks gleichzeitig auf eine Ressource zugreifen können. Der Initialwert gibt an, wie viele Tasks gleichzeitig auf die zugreifen können. Die Zählung beginnt bei 0. Der INT-Wert am FB-Eingang 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.Der Funktionsblock bietet die folgenden Methoden und einen Anfangswert, die für die Interaktion mit einem Semaphor verwendet werden:
- 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, auf die zuvor zugegriffen wurde, um einen Zählerwert frei. 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.)
|