# REAL in S5time



## tomatensaft (18 Juli 2007)

Moagen,

würde gerne einen Real Wert in eine S5time für einen Timer umwandeln.

Ich mach das ganze so

L #WERT
TRUNC
T DINT
DTB
t DWORD

und dazwischen ?

T S5TIME


----------



## Larry Laffer (18 Juli 2007)

Hallo,
du must bei deiner Wandlung berücksichtigen, dass der Wert S5Time BCD-Codiert ist und das vorderste Byte der Faktor für den Rest ist (Wie früher bei S5)
"xyyy"
yyy := BCD von 000 bis 999
x    := (0) * 10 ms
x    := (1) * 100 ms
x    := (2) * 1 s
x    := (3) * 10 s

Das wars ...


----------



## borromeus (18 Juli 2007)

wandelt Minuten.....


```
FUNCTION "Real->S5T" : VOID
TITLE =
VERSION : 0.1

VAR_INPUT
  Zeit_min : REAL ; 
END_VAR
VAR_OUTPUT
  Zeit_W : WORD ;   
END_VAR
VAR_TEMP
  T_sek : REAL ;    
  OFlow : BOOL ;    
END_VAR
BEGIN
NETWORK
TITLE =
      L     #Zeit_min; 
      L     6.000000e+001; 
      *R    ; 
      T     #T_sek; 
      L     #T_sek; 
      L     9.990000e+000; 
      <R    ; 
      SPB   P0; 
      TAK   ; 
      L     9.990000e+001; 
      <R    ; 
      SPB   P1; 
      TAK   ; 
      L     9.990000e+002; 
      <R    ; 
      SPB   P2; 
      TAK   ; 
      L     9.999000e+003; 
      >R    ; 
      =     #OFlow; 
      SPA   P3; 
 
 
NETWORK
TITLE =
P0:   NOP   0; 
      L     #T_sek; 
      L     1.000000e+002; 
      *R    ; 
      RND   ; 
      ITB   ; 
      L     2#0; 
      OW    ; 
      T     #Zeit_W; 
      BEA   ; 
P1:   NOP   0; 
      L     #T_sek; 
      L     1.000000e+001; 
      *R    ; 
      RND   ; 
      ITB   ; 
      L     2#1000000000000; 
      OW    ; 
      T     #Zeit_W; 
      BEA   ; 
P2:   NOP   0; 
      L     #T_sek; 
      RND   ; 
      ITB   ; 
      L     2#10000000000000; 
      OW    ; 
      T     #Zeit_W; 
      BEA   ; 
P3:   NOP   0; 
      L     #T_sek; 
      L     1.000000e+001; 
      /R    ; 
      RND   ; 
      ITB   ; 
      L     2#11000000000000; 
      OW    ; 
      T     #Zeit_W; 
      UN    #OFlow; 
      BEB   ; 
      L     W#16#3999; 
      T     #Zeit_W; 
      BEA   ; 

END_FUNCTION
```


----------



## Ralle (18 Juli 2007)

Schau mal in die FAQ: http://www.sps-forum.de/showthread.php?t=2942

Da ist das nochmal genauer erklärt.


----------



## vladi (18 Juli 2007)

*S5 Time umwandeln*

Hi,
siehe auch IEC FCs, FC33, FC40, wandeln S5Time nach TIME und umgek.
Da TIME ein Long Integer ist, wo die Zeit einfach in ms steht, sind weitere Berechnungen einfach.

Vladi


----------



## TagebauCoder (18 Juli 2007)

Also: 

L #Wert_in_Real
Round
L 1000
*D
T #Wert_in_ms_als_DINT

FC40 füttern  damit, das wars.


----------



## eNDe (18 Juli 2007)

*Real nach S5TIME*

Hallo tomatensaft,
ich gehe mal davon aus, dass du eine "beliebige" Realzahl nach S5TIME wandeln willst. Die FC soll dann selbst die optimale Zeitdarstellung entscheiden. Hierfür der folgende Code:

```
FUNCTION FC 5 : VOID
TITLE =
VERSION : 0.1
VAR_INPUT
  Zeitwert : REAL ; 
END_VAR
VAR_OUTPUT
  S5_TIME : WORD ;  
END_VAR
BEGIN
NETWORK
TITLE =Umwandlung Realzahl in Format S5TIME
      L     #Zeitwert; 
      L     9.990000e+000; // wandelbar in 1/100s ?
      <=R   ; 
      SPB   P0; // <-- ja
      TAK   ; 
      L     9.990000e+001; // wandelbar in 1/10s ?
      <=R   ; 
      SPB   P1; // <-- ja
      TAK   ; 
      L     9.990000e+002; // wandelbar in Sekunden ?
      <=R   ; 
      SPB   P2; // <-- ja
      TAK   ; 
      L     9.990000e+003; // wandelbar in 10s ?
      <=R   ; 
      SPB   P3; // <-- ja
      SPA   P4; // weil Bereichsüberschreitung
 
P0:   L     #Zeitwert; // Zeitwert wandeln in 1/100s-Wert
      L     1.000000e+002; 
      *R    ; 
      RND   ; 
      ITB   ; 
      T     #S5_TIME; 
      BEA   ; 
P1:   L     #Zeitwert; // Zeitwert wandeln in 1/10s-Wert
      L     1.000000e+001; 
      *R    ; 
      RND   ; 
      ITB   ; 
      OW    W#16#1000; 
      T     #S5_TIME; 
      BEA   ; 
P2:   L     #Zeitwert; // Zeitwert wandeln in Sekunden-Wert
      RND   ; 
      ITB   ; 
      OW    W#16#2000; 
      T     #S5_TIME; 
      BEA   ; 
P3:   L     #Zeitwert; // Zeitwert wandeln in 10s-Wert
      L     1.000000e-001; 
      *R    ; 
      RND   ; 
      ITB   ; 
      OW    W#16#3000; 
      T     #S5_TIME; 
      BEA   ; 
P4:   NOP   0; // Zeitbereich ist überschritten, deshalb:
      L     W#16#3999; // Zeit begrenzen auf 9990 s
      T     #S5_TIME; // oder andere Fehlerausgabe
END_FUNCTION
```
Es ist noch zu entscheiden was passieren soll, wenn der Zeit-Wertebereich nicht eingehalten wird. S5Time geht von 0,01s bis 9990s. Alle anderen Werte würden den "Zeitbereich" verletzen. Das könnte man innerhalb der FC behandeln oder den EN-Eingang der FC entsprechend beschalten, dass gar nicht erst "falsche" Werte in die FC gelangen!
Mfg eNDe


----------



## moeins (4 September 2007)

TagebauCoder schrieb:


> Also:
> 
> L #Wert_in_Real
> Round
> ...


Das funktioniert leider nicht, da der FC40 ein DINT am IN-Eingang nicht akzeptiert.


----------



## zotos (4 September 2007)

moeins schrieb:


> Das funktioniert leider nicht, da der FC40 ein DINT am IN-Eingang nicht akzeptiert.




```
L     #myReal
      RND   
      L     1000
      *D    
      T     #myTime
      CALL  "TIM_S5TI"
       IN     :=#myTime
       RET_VAL:=#myS5dreck
```

PS: Kann man sich nicht langsam mal von dem S5time Gelummps lösen?


----------



## OHGN (4 September 2007)

zotos schrieb:


> PS: Kann man sich nicht langsam mal von dem S5time Gelummps lösen?


 
Zugegebener Maßen hantiert sich dieser S5-Timer so schön einfach. Bestens geeignet als der "schnelle Timer zwischendurch".
Kein Datenbaustein, keine Multiinstanzen, sondern einfach einfügen und fertig.
Deshalb nutzen den auch noch so viele. 
Der einzige Weg wäre, dass Siemens den killt...


----------



## moeins (4 September 2007)

zotos schrieb:


> ```
> L     #myReal
> RND
> L     1000
> ...


Und wie sieht das ganze in FUP aus? Unsere Monteure wollen reine FUP-Programmierung.



zotos schrieb:


> PS: Kann man sich nicht langsam mal von dem S5time Gelummps lösen?


Liegt vielleicht daran das die "Zeiten" (Zeitbausteine) in der normalen S7 Bibliothek nur S5Time als Eingang akzeptieren. Ansonsten muß man ja die SFBs benutzen.

Ich glaube viele Programmierer vergessen bei Anwendung ihrer Tricks (Multiinstanzen, SFBs etc.) das im normalen Betrieb ein "0815" Elektriker mit Standard-SPS-Kenntnissen im Störungsfall den Fehler schnell finden muß. 
Daher versuche ich möglichst alles in FUP und Logisch einfach darzustellen - auch wenn der Code dadurch meisst etwas länger wird. 
Hab keinen Bock Nachts angerufen zu werden nur weil jemand durch die AWL nicht durchsteigt...


----------



## zotos (4 September 2007)

moeins schrieb:


> Und wie sieht das ganze in FUP aus?
> ...




siehe Anhang!
Ob man zu erst Rundet oder zu erst Multipliziert muss der Experte (also Du ) selbst entscheiden.



moeins schrieb:


> ....
> Unsere Monteure wollen reine FUP-Programmierung.
> 
> Liegt vielleicht daran das die "Zeiten" (Zeitbausteine) in der normalen S7 Bibliothek nur S5Time als Eingang akzeptieren. Ansonsten muß man ja die SFBs benutzen.
> ...



Ich glaube das viele möchte gern S7 Anwender einfach das lernen nach dem Grundkurs beendet haben. 

Weiterbildungsresistenz!


----------



## moeins (4 September 2007)

zotos schrieb:


> siehe Anhang!


Merci !



zotos schrieb:


> Ich glaube das viele möchte gern S7 Anwender einfach das lernen nach dem Grundkurs beendet haben.
> 
> Weiterbildungsresistenz!


Das Problem ist doch das die Elektrotechnik immer schneller fortschreitet (SPS, Frequenzumrichter/Servosysteme, Bus-Systeme, HMI etc.) und man selbst als Maschinenentwickler der alles können muß, kaum hinterher kommt.  Was sollen da die Elektriker machen (bei unserem Fachkräftemangel)   ?
Die Maschinenbauer und Kaufleute haben schon leichter, genormte Schrauben, Stahlsorten und Prozentrechnung gabs schon vor 20 Jahren


----------

