WinCC V6.2 Wartezeit in C-Script

franzlurch

Level-1
Beiträge
339
Reaktionspunkte
6
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das sollte helfen:ROFLMAO:
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.
#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).
 
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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).
 
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.
 
Hi Ralle,

keine Ahnung. Hab das Audit Paket nicht. Ist zu teuer meint mein Chef soll Versuchen das ganze irgendwie so zu lösen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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...
 
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:
Code:
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).
 
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
 
Zurück
Oben