# S5TIME in INTEGER?



## Felse (12 März 2009)

Hallo zusammen, habe folgendes Problem: Ich habe in meinem Wincc flex Projekt ein E/A Feld (INT), dieses Feld stellt eine Zeit dar, wenn ich nun in der SPS einen Timer Programmieren möchte, hat dessen Zeitwert den Typ S5TIME, wie kann ich nun also den Wert des E/A Feldes für meinen Timer nutzen (in SCL)?

```
BCD := S_ODTS(
          T_NO := "Zeit1",
          S    := TIMER_an,
          TV   := TV,
          R    := Reset,
          BI   := Dual,
          Q    := Status);
```
Das steht nun in meinem Code... Habs schonmal mit

```
TIME_TO_DINT (DINT_TO_INT(TV))
```
probiert, hat aber nicht geklappt. 
Bin für jede Hilfe dankbar.


----------



## Hotsch (12 März 2009)

Du kannst direkt die S5Time projektieren. In Flexible wird er dann vom Datentyp Timer dargestellt. Die Anzeige erfolgt in ms.


----------



## Felse (12 März 2009)

Ja, das weiß ich, aber mein Problem ist, dass ich diesen Wert als Integer vorher benötige um damit zu rechnen... Und wenn ich das Format jetzt ändere, hab ich quasi das gleiche Problem an anderer Stelle. Aber ich versuchs trotzdem mal.


----------



## Hotsch (12 März 2009)

Es gibt auch noch einen Baustein in der IEC Function Blocks Libary FC33 S5TI_TIM. Er wandelt das S5Time format in Time um. Dann müsste es eigentlich klappen.


----------



## Ralle (12 März 2009)

Oder lies mal dies hier: http://www.sps-forum.de/showthread.php?t=2942
Man kann es ja so oder so herum umrechnen, man muß nur wissen, wie sich das Format zusammensetzt.


----------



## Felse (12 März 2009)

@ralle
danke aber ich glaub das ist ein wenig zu kompliziert für mich...

Aber selbst mit der Lösung von Hotsch hab ich noch Probleme:
	
	



```
BCD := S_ODTS(
          T_NO := "Zeit1",
          S    := TIMER_an,
          TV   := TV,
          R    := Reset,
          BI   := Dual,
          Q    := Status);
          
          
          
          S5TI_TIM(IN := TV  // IN: S5TIME
                          ); // TIME
```
 Hab den Baustein aufgerufen, aber wie trag ich denn jetzt meine TIME Variable da ein?


----------



## Hotsch (12 März 2009)

```
TimeVar:=S5Ti_TIM(IN:=S5TimeVar);
```
 
Das müsste passen.


----------



## Felse (12 März 2009)

Leider nicht... Wenn ich das richtig verstanden habe, soll ich die Variable (meinen Zeitwert) da einfügen und das hab ich ja gemacht... TV

```
T_NO := "Zeit1",
          S    := TIMER_an,
          TV   := [COLOR=red]TV[/COLOR],
          R    := Reset,
          BI   := Dual,
          Q    := Status);
          
          
          
          S5TI_TIM(IN := [COLOR=red]TV[/COLOR] );
```
Fehlermeldung: "Ungültiger oder fehlender Funktionstyp". Aber warum?


----------



## Hotsch (12 März 2009)

Bei dir fehlt die Zuweisung am Anfang:

```
var
      TimeVar :time;
...
 
[B]TimeVar:=[/B]S5TI_TIM(IN := [COLOR=red]TV[/COLOR] );
```


----------



## Felse (12 März 2009)

Stimmt, manchmal bin ich eben so aber jetzt gehts, den normalen Time-Typ kann man ja mit der o.g. Funktion umwandeln. DANKE


----------



## Hotsch (12 März 2009)

> den normalen Time-Typ kann man ja mit der o.g. Funktion umwandeln.


 
Jo und genau aus dem Grund verwende ich nur TON und TOF in SCL. Der S5Timer ist einfach zu umständlich in SCL zu bedienen.


----------



## Felse (12 März 2009)

Ja das merk ich auch gerade..., und wie funktioniert das, hab noch nix davon gehört.


----------



## Hotsch (12 März 2009)

Als Beispiel für eine Einschaltverzögerung:

```
FB TestFB;
 
VAR
     TONVAR:TON;
     Zeit      :TIME:=t#1s;
end_var
 
BEGIN
     TONVAR(IN:=E0.1, PT:=Zeit);
     IF TONVAR.Q THEN
          ....
```
 
IN:=... wäre die Bedingung, wenn die Zeit startet. Über das .Q wird dann der Zustand des Timers abgefragt.


----------



## Felse (12 März 2009)

Aha, und weiter? Momentan denke ich, hab ich eben totalen Blödsinn gemacht...

```
BCD := S_ODTS(
          T_NO := "Zeit1",
          S    := TIMER_an,
          TV   := TV,
          R    := Reset,
          BI   := Dual,
          Q    := Status);
 
 
 
      TV_Eingabe:= S5TI_TIM(IN := TV ); // TIME
 
      Umwandeln:= TIME_TO_DINT (TV_Eingabe);
      PPI_PS_AUTO_RAMPE_ZIEL:= DINT_TO_REAL (Umwandeln);
```
So wie das jetzt ist, nimmt meine Variable (PPI_PS_AUTO_RAMPE_ZIEL) den Wert meines Timers an, ich will ja aber, das der Timer den Wert der Variable annimmt. Was muss ich da machen? Sicher den FC40 aus der gleichen Bibliothek, oder?


----------



## Hotsch (12 März 2009)

Dann hab ich dich am Anfang missverstanden. Das wäre dann Time in S5Time wandeln und nicht S5Time in Time. Dafür gibt es einen anderen Baustein:

FC 40 Tim_S5Ti


```
Umwandeln:=Real_TO_DINT(PPI_PS_AUTO_RAMPE_ZIEL);
TV_Eingabe:=DINT_TO_TIME(Umwandeln);
TV:=TIM_S5TI(IN:=TV_Eingabe);
```


----------



## Felse (12 März 2009)

Den hab ich ja jetzt verwendet, funzt aber nur mittelprächtig, da ich in der Simulation nur millisekunden statt der eingegebenen sekunden erhalte.
Geht bis zum letzten Schritt.

```
Umwandeln:= REAL_TO_DINT (PPI_PS_AUTO_RAMPE_ZIEL);
TV_Eingabe:= DINT_TO_TIME (Umwandeln);
[COLOR=red]TV:= TIM_S5TI(IN := TV_Eingabe);  [/COLOR][COLOR=blue]// ab hier stimmt der Wert nicht mehr[/COLOR]
```
 
Wenn ich z.B. ne 3 eingebe wird die bis zum letzten Schritt übergeben und bei der s5time stehen nur noch 3ms da.


----------



## Hotsch (12 März 2009)

Das sollte abhilfe schaffen:

```
Umwandeln:=Real_TO_DINT(PPI_PS_AUTO_RAMPE_ZIEL);
TV_Eingabe:=DINT_TO_TIME(Umwandeln)*1000;
TV:=TIM_S5TI(IN:=TV_Eingabe);
```
Die Zeitbasis ist ms. Du musst dann einfach den Wert mit dem entsprechenden Faktor umrechnen


----------



## Felse (12 März 2009)

Ja, hab ich schon gemacht... Jetzt nerv ich aber nicht mehr, ist ja schließlich gleich Mittag. 
Danke für die Hilfe.


----------

