API Hinweise
Die GROSSEN DONT's für die API-Entwicklung
Übergeben Sie keinen Zeiger auf Warteschlangen oder Rückrufmethoden
Die Kommunikation eines Treibers erfolgt asynchron. Wenn Sie einen Zeiger auf ein Callback-Objekt übergeben, ist der Zeiger möglicherweise nicht mehr gültig, wenn der Callback ausgeführt wird. Das Gleiche gilt für Sende- und Empfangsqueues.
Rufen Sie keine WinCC OA Methoden aus einem anderen Thread auf
WinCC OA Methoden sind in der Regel nicht thread-sicher und nicht reentrant, daher dürfen sie nur vom WinCC OA Thread aufgerufen werden.
Wenn eine Methode von einem anderen Thread, z.B. einem Kommunikationsstack, aufgerufen wird, müssen Sie eine Warteschlange als Schnittstelle zum WinCC OA Thread implementieren. Das Schreiben in die und das Lesen aus der Warteschlange muss durch Sperrprotokolle abgesichert werden.
Sie können die WinCC OA Implementierung eines Mutex (Mutex.hxx, ScopeMutex.hxx) verwenden.
Verwenden Sie keinen blockierenden Code
WinCC OA API-Komponenten (EWO, CtrlExt, Driver, DrvPlugin, Manager, AccessControlPlugin) sind single threaded.
- Verwenden Sie niemals blockierenden Code
- Implementieren Sie niemals synchrone Aufrufe
Berücksichtigen Sie immer, dass ein einzelner WinCC OA Treiber normalerweise viele Peripheriegeräte bedient. Wenn der Manager, d.h. die Threads, darauf warten, dass ein einzelnes Gerät mit irgendeiner Routine fertig wird, werden alle anderen Geräte ebenfalls blockiert.
Verwenden Sie Dispatch nicht in einem Callback
Die Funktion Manager::doReceive() wird automatisch von der Funktion
Manager::dispatch()
für jede eingehende Nachricht aufgerufen.
Der Manager verarbeitet eingehende Nachrichten in der Funktion
Manager::doReceive()
. Callback-Funktionen werden von der
Funktion Manager::dispatch()
verarbeitet.
Callback-Funktionen sind z.B.: WaitForAnswer::callBack()
,
HotLinkWaitForAnswer::hotLinkCallBack()
,
Manager::doReceive()
, CNSObserver::update()
,
usw.
Rufen Sie die Manager::dispatch()
Funktion nicht von einer
Callback-Funktion auf, um Rekursion und undefiniertes Verhalten zu vermeiden.
Rufen Sie nicht die Manager::dispatch()
Funktion in EWO, CtrlExt,
Driver, DrvPlugin und AccessControlPlugin auf, da dies intern im Framework
geschieht.
Die Funktion Manager::dispatch()
sollte nur in der
Manager::run()
Funktion aufgerufen werden. Dies wurde bereits
im API-Manager-Beispiel vorbereitet, Siehe:
wincc_oa\api\TemplateManager\_TEMPLATE_Manager.cxx