# WinCC V6.2 Wartezeit in C-Script



## franzlurch (23 Juni 2008)

Halli Hallo,

weiß jemand, ob es möglich ist in ein C-Script eine Wartezeit von z.B 500ms oder 1 Sek einzubauen. In normalem Ansi C weiß ich wies geht, aber ich finde in WinCC hierfür keinen "delay" Befehl oder ähnliches.


Christian


----------



## Ralle (23 Juni 2008)

Das würde ich nicht machen, nach meiner Erfahrung mit VBA in WinCC bleibt dann alles so lange stehen. Kann natürlich sein, das sich das mit C anders verhält, glaube ich aber nicht. Mit einer Schleife und Zählen geht es auf jeden Fall, z.Bsp. in einer Schleife eine Variable von 1-100000 zählen lassen, bei 100000 raus aus der Schleife. Aber wie gesagt, das ist nicht gut.

PS: Zählwert muß man selbst ermitteln, je nachdem, wie lange der Delay sein soll.


----------



## marlob (23 Juni 2008)

Das sollte helfen
Auf jeden Fall, das Achtung beachten


> *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.
> ...


----------



## vierlagig (23 Juni 2008)

ich würd die zeit auch irgendwie aus der cpu holen und nicht im skript zusammen basteln ... z.b. den 100ms takt übergeben und dann im skript entsprechend zusammen zählen


----------



## franzlurch (23 Juni 2008)

Hi Ralle, Hi Vierlagig

ich erklär die mal kurz für was ich das brauche, vielleicht hast du eine andere Idee. Und zwar will ich sowas wie die WinCC Option Audit realisieren. Ich hab diverse Parameter die ich mit loggen möchte wenn diese geändert werden. Dazu habe ich mir im TagLogging ein Archiv erstelle, worin ich den Namen der Variable, den alten sowie den neuen Wert der Variable und den Namen des Users der gerad eingeloggt ist archiviere. Als Archivierungsart habe ich azyklisch gewählt und will dies nun über eine Variable starten. Jetzt wollte ich die Variable bei änderung des Ausgabewertes meines E/A-Feldes setzen dann 500ms - 1 Sek warten, bis archiviert wurde, und dann die Variable wieder zurücksetzen.



Christian


----------



## Ralle (23 Juni 2008)

Wir brauchten so etwas ähnliches in einem ActiveX, nicht einmal da konnte man Sleep nutzen, ohne daß das gesamte Scriptsystem sich schlafen legte. Als Ersatz habe ich dann von der SPS immer wieder das Script angestoßen, mir ein Return zurückgebenlasen, nochmals angestoßen, bis der richtige Wert zurückkam. (Ging um eine Fertigmeldung eines Druckers, auf die man ebend so nicht warten konnte).


----------



## Ralle (23 Juni 2008)

franzlurch schrieb:


> Hi Ralle, Hi Vierlagig
> 
> ich erklär die mal kurz für was ich das brauche, vielleicht hast du eine andere Idee. Und zwar will ich sowas wie die WinCC Option Audit realisieren. Ich hab diverse Parameter die ich mit loggen möchte wenn diese geändert werden. Dazu habe ich mir im TagLogging ein Archiv erstelle, worin ich den Namen der Variable, den alten sowie den neuen Wert der Variable und den Namen des Users der gerad eingeloggt ist archiviere. Als Archivierungsart habe ich azyklisch gewählt und will dies nun über eine Variable starten. Jetzt wollte ich die Variable bei änderung des Ausgabewertes meines E/A-Feldes setzen dann 500ms - 1 Sek warten, bis archiviert wurde, und dann die Variable wieder zurücksetzen.
> 
> Christian



Gibts vom Audit keine Rckmeldemöglichkeit, daß archiviert wurde? Mit der könnte man evtl. das Zurücksetzen anstoßen.


----------



## franzlurch (23 Juni 2008)

Hi Ralle,

keine Ahnung. Hab das Audit Paket nicht. Ist zu teuer meint mein Chef soll Versuchen das ganze irgendwie so zu lösen.


----------



## franzlurch (23 Juni 2008)

Hat vielleicht schon mal jemand sowas realisiert ohne das Optionspaket Audit zu nutzen? Und kann mir noch nen Tipp geben wie ich das ganze noch lösen könnte.


Christian


----------



## vierlagig (23 Juni 2008)

einzige sinnvolle variante, die mir einfallen will, ist die anforderung und quittierung über die cpu...

also ein bit für die anforderung hin, zeit ablaufen laufen, quittierungs-bit zurück ... nur mit der gleichzeitigkeit wirds bißchen komisch/kritisch ... aber wenn du das skript verzögerst kommts wohl auf selbe raus...


----------



## HeizDuese (23 Juni 2008)

Zeitabläufe auf dem Leitsystem in Scripten sind immer ein unsaubere Sache.

Man kann z.B. eine Interne Varible (Typ Integer oder Word) definieren und in einer C-Aktion mit einem Zeittrigger so was in der Art hier machen:

```
Zaehlvariable = GetTagDWord("ZaehlvariablenName");
if ( Zaehlvariable > 0)
{
    SetTagDWord("ZaehlvariablenNamr", --Zaehlvariable);
}
return 0;
```
Man muss dann noch einen zyklischen Trigger definieren und an der Verwendungsstelle die Zaehlvariable auf einen Wert > 0 (noch besser > 1) setzen und dann auf 0 abfragen. Elegant ist es, wenn man die Runtine gleich wieder verlassen kann (Trigger auf Zählvariable) und dann die Zählvariable auf 0 (Zähler abgelaufen) abfragt. 

Das ist allerdings alles ein wenig druch's "Knie in die Brust geschossen".
Wenn man sowas von mehreren Stellen verwenden möchte, braucht man natürlich mehrere Variablen (die kann man aber alle in der einen globalen Aktion runterzählen lassen).


----------



## franzlurch (23 Juni 2008)

@HeizDuese

danke für deinen Tipp. Auf diesem Weg bin ich auch gerade. Mal schauen obs funzt.


----------



## franzlurch (24 Juni 2008)

*Tag Logging*

Moin Moin,

mal ein anderer Denkansatz von mir. Die Idee mit der Verz. Zeit gestern war nicht som der Hit. Im TagLogging kann ich ja bei den Eigenschaften der Archiv Variablen die *Archivierungsart auf azyklisch* stellen und die *Erfassung auf ereignisgesteuert. *Dann sollte doch immer archiviert werden, wenn ich eine Variable aktiviere. Da ich ja hier nun auch ein Script hinterlegen kann ist die frage, gibts hierbei ne Funtion, die eine Archivvariable auf änderung des Wertes abfragt???


Christian


----------

