# Anfängerfrage - SCL Timer



## FrankTheTank (27 Juli 2011)

Hallo alle zusammen!

Ich fange gerade an, mir für meine Bachelorarbeit SPS Programmieren beizubringen. Ich verstehe allerdings die Timer nicht richtig. 

Dazu soll ein einfache SPS Programm schreiben, welches ein Förderband einschaltet, 3 Sekunden fahren lässt und anschließend wieder ausschaltet.

Mein Code sieht folgendermaßen aus:


```
VAR
   task_finished : BOOL := FALSE;
END_VAR

(* Foerderband anschalten *)
A 8.3 := 1;

(* 3 Sekunden warten *)
???

(* Foerderband ausschalten *)
A 8.3 := 0;
task_finished := TRUE;
```
An der Stelle "???" möchte ich jetzt 3 Sekunden warten. Dafür hätte ich den S_PULSE Timer verwendet. Allerdings verstehe ich nicht, was die ganzen Übergabeparameter machen. Aus der Hilfe vom Simatic Manager werd ich leider auch nicht schlau.


```
BCD_time_value := S_PULSE (
T_NO := Timer,
S := Start_input,
TV := Duration,
R := Reset_input,
Q := Timer_status,
BI := Binary_time_value);
```
Also wenn ich einen Timer will, der 3 Sekunden geht, dann übergeb ich als "TV := t#3s" und "S := TRUE" damit der sofort losläuft? Den Parameter Q kann ich dann abfragen, und der liefert "1" solange der Timer läuft, und "0" wenn der Timer ausgelaufen ist. Ändert sich der Parameter "R" von "0" auf "1", dann wird der Timer vorzeitig beendet. Verstehe ich das soweit richtig?
Was machen die anderen Übergabeparameter?

Danke schonmal für die Antworten,

mfg,
Frank


----------



## vollmi (27 Juli 2011)

Die Parameter die du nicht brauchst musst du im Aufruf garnicht aufführen.
OUT Parameter benutzt du im Aufruf garnicht, die werdem im Programm abgefragt. Im Beispiel eines Systemfunktionblocks


```
VAR
Timer1  : SFB4; // Zeitverzögerung für Alarmausgang
Timer1_Start :  BOOL;
END_VAR
 Timer1(IN := Timer1_Start,PT := T#3s); // Verzögerungstimer IST/Sollabweichung initialisieren

IF Timer1.Q THEN
    TIMERakt := 1;
ELSE
    TIMERakt := 0;
END_IF;
```

Ich hoffe das ist verständlich.


----------



## FrankTheTank (27 Juli 2011)

Ah, okay! Langsam wird mir das ganze etwas klarer. 

Würde denn folgender Code funktionieren?


```
VAR
    task_finished : BOOL := FALSE;
    meinTimer : TIMER;
END_VAR

IF NOT task_finished THEN
    (* 3 Sek Timer starten und Motor anschalten *)
    meinTimer := S_PULSE (S:=TRUE, TV := t#3s)
    A 8.3 := 1;

    (* wenn Timer abgelaufen, Motor stoppen *)
    IF NOT meinTimer.Q THEN
        A 8.3 := 0;
        task_finished := TRUE;
    END_IF

END_IF
```


----------



## vollmi (27 Juli 2011)

Nein. Timer dürfen nicht bedingt bearbeitet werden.

Du darfst mit einer Bedingung (IF, ELSE_IF etc) nur die EingangsVariable bearbeiten welche den Timer startet.

T_NO  kannst du natürlich nicht weglassen damit definierst du den hardwaretimer (warum nimmst du kein IEC Timer?

An S darfst du dann natürlich keine Konstante anhängen. da gehört die Variable hin die du mit der Startabfrage setzt.

Den Rückgabewert "meinTimer" musst du nicht als Rückgabewert nutzen. du kannst den Timer auch direkt als TIMER() aufrufen (ohne := und das davor). Stattdessen nutzt du "meinTimer" am an der S= Zuweisung.

mfG René


----------



## FrankTheTank (28 Juli 2011)

Nächster Versuch:


```
VAR
    task_finished : BOOL := FALSE;
    StarteMeinTimer : BOOL := FALSE;
    meinTimer := TIMER;
END_VAR

meinTimer := S_PULSE(T_NO := ???, S := StarteMeinTimer, TV := t#3s)
IF NOT task_finished THEN
    (* Motor und Timer starten *)
    A 8.3 := 1;
    StarteMeinTimer := 1;

    (* wenn Timer abgelaufen, Motor stoppen *)
    IF NOT meinTimer.Q THEN
        A 8.3 := 0;
        task_finished := TRUE;
    END_IF

END_IF
```
Ich weiß leider auch nicht, was ein IEC Timer ist und wie ich dem Programm sage, dass es ihn verwenden soll.
Was muss ich bei "T_NO" angeben?

Sorry wenn ich ein wenig länger brauche. Aber ohne Ausbildung, Lehrgang o.ä. fühlt sich der "Einstieg" in SPS Programmieren eher an wie ein Sprung in eiskaltes Wasser.


----------



## vollmi (28 Juli 2011)

FrankTheTank schrieb:


> Ich weiß leider auch nicht, was ein IEC Timer ist und wie ich dem Programm sage, dass es ihn verwenden soll.
> Was muss ich bei "T_NO" angeben?



SFB4 und SFB5 sind als IEC Timer schon auf den CPUs drauf 
SFB3 ist ein IEC Pulstimer ebenfalls schon auf der CPU drauf.

In der Bibliothek unter "System Function Blocks" zu finden.

Mit dem SFB3 würde das z.B. im Programm so aussehen Jetzt mal ohne deine Ausgaben auf die Ausgänge.


```
FUNCTION_BLOCK FB2000
VAR
Timer1  : SFB3; // Impulstimer definieren. SFB3 wird als Struktur in der FB Schnittstelle abgelegt
Timer1_Start :  BOOL; // Variable um Pulstimer zu starten (kann z.B. in dem IN Bereich des aktuellen FBs abgelegt werden.
END_VAR
BEGIN
 Timer1(IN := Timer1_Start,
        PT := T#3s); // Impulstimer wird mit den eingangsvariablen beschaltet

IF Timer1.Q THEN // abfrage ob Timerpuls aktiv
    TIMERakt := 1; // wenn ja dann TIMERakt auf True setzen
ELSE
    TIMERakt := 0; // Vice versa
END_IF;

END_FUNCTION_BLOCK
```

Da es ein SFB ist braucht er einen instanzdatenbaustein um seinen Status abzulegen. Wenn du ihn eh in einem FB ablegst spielt das keine rolle da der übergeordnete FB ja schon einen Instanzdatenbaustein besitzt (IDB)

Der S7 Timer braucht das nicht, dafür muss am T_NO eine einmalige Timernummer vergeben werden (einen freien noch nicht benutzten Timer).
In der Operationsliste der s7 steht wieviele Timer deine CPU zur verfügung stellt.  

mfG René


----------



## Oll_Bell (1 September 2018)

vollmi schrieb:


> Nein. Timer dürfen nicht bedingt bearbeitet werden.
> 
> Du darfst mit einer Bedingung (IF, ELSE_IF etc) nur die EingangsVariable bearbeiten welche den Timer startet.


und CASE? Auch dürfen nicht.

Wo und wie kann ich Timer_Q abfragen?
Gibt es die Möglichkeit den Status des Timers zu ermitteln,- aktiv oder nein? Bit,Byte, Register ablesen?

Wir groß Unterschied zwischen legacy S7 Timer und IEC-Timer?


----------

