# Delay Zeit in ST möglich?



## daniel1987 (25 März 2014)

Hallo, ist für die meisten von euch wahrscheinlich ne kindergartenfrage , aber ich bin eher so aus de C# schiene heraus und habe eine kleine frage, wenn ich eine Schleife schreiben will in ST und innerhalb der schleife eine kurze Wartezeit benötige muss ich das dann mit einem TOF Baustein realisieren oder gibts da auch alternativen?

Ich dachte an so etwas (Beispiel):

For ( i:=1 , i<100 , i++)

jetzt einfach eine Pausenzeit ablaufen lassen z.b. 1000ms 

und damit soll diese schleife einfach langsam 99 mal durchlaufen werden.
Bitte jetzt keine Antworten a la bist du doof? schäme mich ja schon...MFG


----------



## Matze001 (25 März 2014)

Ja du bist Doof  Nein nicht wirklich.

Wenn du aus der C# - Ecke kommst ist das ein normales vorgehen! Dort läuft das Programm ja "Linear" ab.
Leider ist das bei der SPS auch so, aber sie lebt von ihrem Cycle. Wenn du nun diesen Anhälst mit deiner "Pause" wird nichts anderes mehr gemacht.
C# kann ja sicher Threading und Callbacks, aber das ist bei einer SPS alles nicht in der Form umgesetzt.

Du könntest es jetzt so lösen:


```

```

IF i > 100 THEN

// Weiter gehts
i = 0;
ELSE
i = i + 1;

END_IF;

Die "Schleife" ist dein Programmzyklus, und deine Funktion wird in dem Beispiel 100 mal übersprungen und dann einmal ausgeführt.

Grüße

Marcel


----------



## daniel1987 (25 März 2014)

Danke für superschnelle antwort, also meinst du ich soll einfach sagen wir mal 100 mal durchlaufen lassen um 1sek. wartezeit zu simulieren?
darauf wäre ich jetzt so nicht gekommen.


----------



## Matze001 (25 März 2014)

naja es gibt noch ein paar faktoren die da stören!

z.B. schwankt die Zykluszeit, weil durch solche Aktionen wie deine mal mehr mal weniger Code ausgeführt wird!
Ich würde wenn du eine definierte Zeit brauchst beim Timer bleiben!

Grüße

Marcel


----------



## MasterOhh (25 März 2014)

```
DelayTimer :TON

DelayTimer(IN:= NOT DelayTimer.Q, PT := t#1s);
IF DelayTimer.Q THEN
  i:=i+1;
END_IF
```

Der Timer ist eine normale Einschaltverzögerung. Nach 1s (PT:=t#1s) wird Q auf true gesetzt und damit i um 1 erhöht.
Durch IN:= NOT DelayTimer.Q  setzt sich der Timer jedesmal selbst zurück wenn er ausgelöst hat und fängt wieder von vorne an....

Wenn du aus der Hochsprachenprogrammierung kommst, mache dich mit der zyklischen Programmabarbeitung von SPSen vertraut. Einige Probleme muss man in der SPS Welt anders angehen als man es sonst gewohnt ist.


----------



## computershooter (25 März 2014)

auch in C ist dass keine gute losung, besser ist das mit millis() und dann abfragen ob die zeit gelaufen ist.


----------



## daniel1987 (26 März 2014)

Danke MasterOhh hab es genauso gemacht funktioniert wunderbar...


----------

