FC_SemaphoreMeTake - Allgemeine Informationen
Typ |
Funktion |
Verfügbar ab: |
V1.0.7.0 |
Versionen: |
Aktuelle Version |
Reservierung einer Semaphore.
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.
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 |
Allgemeingültige, bibliotheksunabhängige Aussage zur Diagnose. Ein Wert ungleich ET_Diag.Ok entspricht einer Diagnosemeldung. |
|
q_etDiagExt |
POU-spezifischer, diagnosebezogener Ausgang. q_etDiag = ET_Diag.Ok -> Statusmeldung q_etDiag <> ET_Diag.Ok -> Diagnosemeldung |
Ein-/Ausgang |
Datentyp |
Beschreibung |
---|---|---|
iq_stSemMe |
Struktur der zu reservierenden Semaphore |
Datentyp |
Beschreibung |
---|---|
BOOL |
TRUE: Die Semaphore wurde erfolgreich reserviert. FALSE: Die Semaphore wurde nicht reserviert. |
q_etDiag |
q_etDiagExt |
Enumerationswert |
Beschreibung |
---|---|---|---|
OK |
0 |
OK |
|
InputParameterInvalid |
266 |
SemaphoreMe ist nicht initialisiert. |
|
UnexpectedProgramBehavior |
273 |
Anforderung der SemaphoreMe fehlgeschlagen. |
|
UnexpectedProgramBehavior |
269 |
Timeout beim Anfordern der SemaphoreMe |
Enumerationsname: |
Ok |
Enumerationswert: |
0 |
Beschreibung: |
OK |
Die Semaphore wurde erfolgreich reserviert.
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. |
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. |
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. |