Semaphoren
Semaphoren werden genutzt, um den Zugriff auf limitierte Ressourcen zu synchronisieren. Sie können auch genutzt werden um eine Benachrichtigung (Notification Event) zu realisieren. Semaphoren werden durch die TwinCAT Realtime durch die Klasse CSemaphoreInstance bereitgestellt.
CSemaphoreInstance
Die Klasse CSemaphoreInstance bietet die Schnittstelle an, um Semaphoren zu handhaben. Um eine Semaphore anzulegen, benötigt die Instanz die Objekt-ID der TwinCAT Realtime Instanz, welche über OID_TCRTIME_CTRL bereitsteht, sowie eine Referenz zu dem TwinCAT Objekt-Server über einen Pointer auf ITComObjectServer.
Methoden:
- HRESULT SemCreate(WORD nCntInit, OTCID oid, ITComObjectServer* ipSrv); Erstellt die Semaphore mit nCntInit als initalen Wert der bereitstehenden Resourcen. Es wird S_OK bei Erfolg zurückgegeben und E_FAIL wenn die Semaphore nicht erzeugt werden kann.
- HRESULT SemDelete(); SemDelete() löscht die Semaphore. Liefert S_OK zurück.
- HRESULT SemPost() SemPost() erhöht die Anzahl der verfügbaren Resourcen. Wenn ein Task auf die Semaphore wartet, wird der Task mit der höchsten Priorität freigegeben d.h. sie kann ihre Ausführung fortsetzen. Gibt bei Erfolg S_OK zurück. Mögliche Fehlercodes:
MAKE_RTOS_HRESULT(51) | Semaphoren Overflow. Beispielsweise wenn der interne Speicher nicht ausreicht. |
- HRESULT SemPend(OSTICKS nTimeout); Reduziert die Anzahl der verfügbaren Ressourcen; sollten keine Ressourcen zur Verfügung stehen, blockiert die Task an dieser Stelle.
SemPend() wartet auf eine Semaphore, bis diese zur Verfügung steht. Ein Timeout kann in OSTICKS angegeben werden und ist damit Prozessor-abhängig. Das ITcRTime Interface in kann genutzt werden, um diese zu berechnen. Im Beispiel TcSemaphoreSample ist hierfür eine Methode TimeoutMsToTicks verwendet worden. Als spezielle Werte für nTimeout existieren:
RTIME_NOWAIT (-1) | Methode liefert sofort S_OK, wenn die Semaphore verfügbar ist. |
RTIME_ENDLESSWAIT (0) | Methode wartet unendlich lange auf die Verfügbarkeit der Semamphore |
Die Methode liefert S_OK, wenn den Semaphoren erfolgreich bezogen wurde; ansonsten:
MAKE_RTOS_HRESULT(10) | Zeigt einen Timeout an. Wenn nTimeout als RTIME_NOWAIT gesetzt wurde, ist diese Semaphore nicht verfügbar. |
Beispiel: