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.

Anmerkung: Übergeben Sie immer instanziierte Objekte an Callback-Methoden von Sende- und Empfangsqueues, oder stellen Sie unbedingt sicher, dass der Zeiger gültig bleibt, bis der Callback erscheint oder das Queue-Objekt verarbeitet wird.

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