Variable über längere Zeit abfragen
-
Bei jedem Änderungs-Event die Zeit auf 2s zurücksetzen, wenn es auf den gewünschten Wert gegangen ist, bzw. den Timer stoppen, wenn es auf einen anderen Wert gegangen ist.
Beim Auslösen des Timers dann nochmal zur Sicherheit den Wert überprüfen und fertig.
-
Danke für die schnelle Antwort!
Ich habe es jetzt mal mit dem Systemtakt gemacht...funktioniert auch soweit. Es ist aber nicht so schön, da es ja abhängig von der Programmgröße bzw des Prozessortaktes ist.
Ich zähle jetzt die Programmdurchläufe und schließe daraus auf die ungefähre Zeit.Wird der Prozessor bei Sleep nicht einfach in einer Endlosschleife gehalten und kann währenddessen nichts anderes machen? oder liege ich da falsch?
-
c, c und nochmals c schrieb:
Wird der Prozessor bei Sleep nicht einfach in einer Endlosschleife gehalten und kann währenddessen nichts anderes machen? oder liege ich da falsch?
Normalerweise nicht.
-
c, c und nochmals c schrieb:
Wird der Prozessor bei Sleep nicht einfach in einer Endlosschleife gehalten und kann währenddessen nichts anderes machen? oder liege ich da falsch?
Auf PC ist sleep eigentlich immer passives Wartem, also ohne daß der Prozessor Schleifen dreht. delay war gewöhnlich aktives Warten, außer, wenn ich mich recht erinnere, auf dem Watcom-Compiler, wenn Windows drunter war.
-
Es ist aber nicht so schön, da es ja abhängig von der Programmgröße bzw des Prozessortaktes ist.
Das ist aber S_EVERZ in der S7 auch.
Ich glaube das die IEC Timer durch die "Rückführung" der Zeitscheiben aus dem Instanz DB etwas genauer sind.
Wobei die Abweichungen normalerweise nicht Prozessrelevant sind.....
-
Kannst du mal den Code posten, würde mich interessieren....
-
Hier mal vereinfacht:
int tz;
bool E,A;void main(){
tz=0;while (1)
{
if (E==true)
{tz++}
else
{tz=0;}if (tz>=66666666)
{A=true;}
else
{A=false;}
}}
-
Ok, aber das hält ja dein Programm wieder an, bzw. du wartest .
Kann evtl. jmd. das hier
sleep geht, wenn du dafür einen eigenen thread abstellen kannst.
systemtakt geht auch, wenn Du eine Hauptschleife hast, wo Du Dich einklinken kannst
genauer erklären??
-
unsrure110 schrieb:
Ok, aber das hält ja dein Programm wieder an, bzw. du wartest .
Kann evtl. jmd. das hier
sleep geht, wenn du dafür einen eigenen thread abstellen kannst.
[...]genauer erklären??
Threads ermöglichen Dir Parallelität im Programmablauf. D.h. ein Thread kann auch mal warten, während andere (z.B. das Hauptprogramm) weiterhin arbeiten.
Z.B. auf Linux: (mit pthread linken!)
#include <stdio.h> #include <stdbool.h> #include <assert.h> #include <unistd.h> #include <pthread.h> #define RUNS 5 typedef bool port; void toggle(port *p){ *p = !*p; printf("%s\n", *p ? "an" : "aus"); } void *thread_start(void* arg){ port *p = (port*)arg; for(int i=0; i<RUNS-1; ++i){ toggle(p); sleep(1); } toggle(p); return NULL; } int main(void){ port p = false; pthread_t t; int rc = pthread_create(&t, NULL, thread_start, (void*)&p); assert(rc==0); // Hauptprogramm macht was... rc = pthread_join(t, NULL); assert(rc==0); }
C11 unterstützt threads optional.
-
Ok... da muss ich mir ne Doku suchen und mich einlesen, das war jetzt etwas viel auf einmal.
Das geht aber für Win auch, nicht nur Linux ?
-
unsure110 schrieb:
Ok... da muss ich mir ne Doku suchen und mich einlesen, das war jetzt etwas viel auf einmal.
Das geht aber für Win auch, nicht nur Linux ?Ja. (Gute Einstellung!
)
Das ist allerdings ein dickes Brett.
Schon allein in meinem Beispiel könnte es zu einem race kommen, wennmain() p
änderte.
-
Das ist allerdings ein dickes Brett.
Allerdings, da muss ich mir mehr Zeit nehmen , ist aber sehr Interessant.
Ja. (Gute Einstellung!
)
Danke, aber ist doch normales "Vorgehen" würd ich mal sagen. Ich mein Forum ist meiner Ansicht nach für "Spezielle Fragen" da, aber das Grundverständis bzw. die Grundlagen müssen schon selbst erarbeitet werden, sonst wird das eh nichts.