FRAGE:
Wie kann ich eine Wartefunktion "Sleep" in WinCC programmieren?
ANTWORT:
Sie können dafür die Windows API-Funktion "Sleep()" einsetzen. Das folgende Programmbeispiel zeigt, wie die Funktion "Sleep" verwendet wird.
#pragma code("Kernel32.dll")
void Sleep(int Milliseconds);
#pragma code()
Sleep(1000); //Zeitangabe in Millisekunden
Achtung:
Die Funktion "Sleep()" hat einen äußerst negativen Einfluss auf die Performance der Aktionsbearbeitung. Bitte beachten Sie daher unbedingt die folgenden Punkte, wenn Sie diese Funktion einsetzen möchten.
- Die Bearbeitung des C-Skriptes wird bei der Benutzung von Sleep() um die angegebene Zeit unterbrochen. Auftretende Anforderungen an die unterbrochene Funktion können während dieser Zeit nicht bearbeitet werden.
- Weiterhin werden alle Aktionen mit dem gleichen Trigger nicht mehr bearbeitet. Mit dem gleichen Trigger bedeutet, dass alle Aktionen mit zyklischem Trigger oder alle Aktionen mit einem Variablentrigger nicht mehr bearbeitet werden. Rufen Sie gleichzeitig Aktionen auf, welche zyklisch, azyklisch, auf einen Variablentrigger und auf ein Ereignis gestartet werden und wenn alle diese Funnktionen die Sleep()-Funktionen nutzen, dann werden sämtliche Aktionen in Ihrer Ausführung gestoppt. Im ungünstigsten Fall halten Sie mit vier gestarteten Aktionen, sämtliche Aktionen in Ihrer Bearbeitung an.
- Wenn Sie beispielsweise die Sleep()-Funktion in einer Aktion mit einem 10 Sekunden Trigger verwenden, dann werden alle zyklisch aufgerufenen Aktionen unterbrochen. Dies hat zur Folge, dass z.B. eine Aktion mit einem 1 Sekunden Trigger in Ihrer Abarbeitung unterbrochen wird und zusätzlich alle noch folgenden Aktionen ebenfalls nicht abgearbeitet werden. Somit werden nicht nur aktuelle Aktionen nicht abgearbeitet, sondern auch Aktionen, welche noch gestartet werden sollen.
- Die durch die Unterbrechung nicht abgearbeiteten Aufträge werden in einer Warteschlange gespeichert. Ist die Unterbrechung beendet, dann werden alle Anforderungen aus der Warteschlange abgearbeitet. Nach der Unterbrechung werden die Aktionen aus der Warteschlange aber nicht mehr in Ihrem Zyklus abgearbeitet. Wenn also, wie in dem zuvor geschilderten Fall, sich noch Aktionen in der Warteschlange befinden, dann werden diese nacheinander abgearbeitet. Bei dieser Abarbeitung wird keine Rücksicht mehr auf den Trigger genommen, sondern diese Aktionen werden so schnell wie möglich abgearbeitet (theoretisch gleichzeitig).