FC_SemaphoreMeTake

 

FC_SemaphoreMeTake - Allgemeine Informationen

Übersicht

Typ

Funktion

Verfügbar ab:

V1.0.7.0

Versionen:

Aktuelle Version

Aufgabe

Reservierung einer Semaphore.

Beschreibung

Die Funktion führt den Vorgang Take() für die angegebene Semaphore aus.

Die folgenden Aktionen hängen vom Zustand der Semaphore ab.

oWenn die Semaphore voll ist, wechselt sie in den Zustand Leer und die aufrufende Task setzt ihre Ausführung fort, die Task besitzt dann die Semaphore.

oWenn die Semaphore leer ist und i_xNoTimeOut = FALSE, wird die aufrufende Task blockiert. Sie wartet darauf, dass der Besitzer der Semaphore den Vorgang Give() ausführt. Wenn der Vorgang Give() aufgrund eines Programmierfehlers nicht ausgeführt wird, meldet die blockierte Task nach einem langen Timeout einen Ausnahmefehler. Eine Diagnosemeldung wird in den Systemlogger eingetragen.

oWenn die Semaphore leer ist und i_xNoTimeOut = TRUE, wird die aufrufende Task nicht blockiert. Die Funktion meldet lediglich, dass die Semaphore leer ist. Zu einem späteren Zeitpunkt kann der Aufruf der Funktion wiederholt werden, um erneut zu versuchen, die Semaphore zu reservieren.

Eine beliebig große Zahl von Tasks kann gleichzeitig an einer Semaphore warten.

Für Einschränkungen bei der Verwendung siehe die Hinweise zur Verwendung der Funktion „SemaphoreMutualExclusion" Function.

Schnittstelle

Eingang

Datentyp

Beschreibung

i_xNoTimeout

BOOL

FALSE: Die Semaphore wird reserviert, je nach ihrem Zustand, oder ein Fehler wird gemeldet.

TRUE: Die Task wird angehalten, bis die Semaphore freigegeben wurde, oder der Timeout abgelaufen ist.

Ausgang

Datentyp

Beschreibung

q_etDiag

GD.ET_Diag

Allgemeingültige, bibliotheksunabhängige Aussage zur Diagnose.

Ein Wert ungleich ET_Diag.Ok entspricht einer Diagnosemeldung.

q_etDiagExt

ET_DiagExt

POU-spezifischer, diagnosebezogener Ausgang.

q_etDiag = ET_Diag.Ok -> Statusmeldung

q_etDiag <> ET_Diag.Ok -> Diagnosemeldung

Ein-/Ausgang

Datentyp

Beschreibung

iq_stSemMe

ST_SemaphoreMe

Struktur der zu reservierenden Semaphore

Rückgabewert

Datentyp

Beschreibung

BOOL

TRUE: Die Semaphore wurde erfolgreich reserviert.

FALSE: Die Semaphore wurde nicht reserviert.

Diagnosemeldungen

q_etDiag

q_etDiagExt

Enumerationswert

Beschreibung

OK

Ok

0

OK

InputParameterInvalid

SemaphoreMeNotInitialized

266

SemaphoreMe ist nicht initialisiert.

UnexpectedProgramBehavior

SemaphoreMeTakeFailed

273

Anforderung der SemaphoreMe fehlgeschlagen.

UnexpectedProgramBehavior

SemaphoreMeTakeTimeout

269

Timeout beim Anfordern der SemaphoreMe

Ok

Enumerationsname:

Ok

Enumerationswert:

0

Beschreibung:

OK

Die Semaphore wurde erfolgreich reserviert.

SemaphoreMeNotInitialized

Enumerationsname:

SemaphoreMeNotInitialized

Enumerationswert:

266

Beschreibung:

SemaphoreMe ist nicht initialisiert.

Problem

Ursache

Lösung

-

Die Semaphore ist nicht initialisiert.

Übergeben Sie am Eingang FC_SemaphoreMeCreate dieselbe Semaphore, die beim Aufruf von iq_stSemMe verwendet wurde.

SemaphoreMeTakeFailed

Enumerationsname:

SemaphoreMeTakeFailed

Enumerationswert:

273

Beschreibung:

Anforderung der SemaphoreMe fehlgeschlagen.

Problem

Ursache

Lösung

-

Es ist ein Fehler in der internen Abarbeitung aufgetreten.

Bitte informieren Sie das Supportteam über diesen Fehler.

SemaphoreMeTakeTimeout

Enumerationsname:

SemaphoreMeTakeTimeout

Enumerationswert:

269

Beschreibung:

Timeout beim Anfordern der SemaphoreMe

Problem

Ursache

Lösung

-

Die Semaphore wurde nicht während des Timeouts freigegeben.

Stellen Sie sicher, dass die Semaphore zuvor mit FC_SemaphoreMeGive freigegeben und nicht wieder mit FC_SemaphoreMeTake reserviert wurde.

Setzen Sie den Eingang i_xNoTimeout auf TRUE, um den Zustand der Semaphore abzufragen und - falls diese belegt ist - es im nächsten Programmzyklus erneut zu versuchen.

-

Es ist ein Fehler in der internen Abarbeitung aufgetreten.

Bitte informieren Sie das Supportteam über diesen Fehler.