SCL: S5Time to Word

Larry Laffer

Super-Moderator , User des Jahres 2008-2009
Teammitglied
Beiträge
14.426
Reaktionspunkte
3.282
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
gibt es innerhalb von SCL eine Möglichkeit den Variablentyp S5Time in WORD (oder INT) umzuwandeln ?
Mir ist bislang nur die Möglichkeit eines AWL-FC's eingefallen, aber gefallen tut mir das nicht ...
 
Hallo Larry Laffer

Code:
VAR_TEMP
 S5Ti  : S5TIME; 
 Reg   AT S5Ti  : WORD ;
END_VAR

S5Ti :=  xxx;    //S5Time zuweisen

In " Reg " steht die Zeit im WORD Format(HEX) ;
mfG
hg
 
Danke für die Lösung, hab sie zwar noch nicht ausprobieren können, aber das sieht gut aus ...
Warscheinlich geht der Weg anders herum genau so ...

@Ralle: Hatte ich schon bedacht. Ich wollte sie hauptsächlich wegen der Weiterberechnung in WORD.
 
SCL: WORD zu S5TIME

Hallo,

ich wollte jetzt auch mal eine variable Zeit in SCL programmieren und habe folgenden Code geschrieben:

Code:
// aktTime ist WORD (da BCD Format WORD-breit ist)
// aktTimeIn ist S5TIME

    "aktTime" := INT_TO_BCD("t_pause" * 10);
    "aktTime" := "aktTime" AND W#16#FFF;
    "aktTime" := "aktTime" OR W#16#1000;
    "aktTimeIn" := "aktTime";
    
    currTime:= S_ODT  ( T_NO    := T0,
                        S       := Start_Timer,
                        TV      := "aktTimeIn",
                        Q       := Timer_Fertig
                        );

Jetzt meckert der Compiler bei der Zuweisung von aktTime nach aktTimeIn rum und sagt, dass der Datentyp nicht stimmt. Wie bekomme ich meinem Zeitwert im BCD-Format (16 Bit) nach S5TIME? Bzw. gibt es eine einfachere Löösung für die variable Zeit in SCL?

vielen Dank und viele Grüße von mir

Lars :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
du musst eine andere Sicht auf deine Variable für die Zuweisung machen :
Code:
var
   aktTime : WORD ;
   aktTimeIn : S5TIME ;
    w_aktTimeIn at akt_TimeIn : word ;

   und im Code dann :
 
   w_aktTimeIn := aktTime ;
Gruß
LL
 
Die bessere Lösung ist m.E. nach, gar nicht die S5-Timer zu verwenden, sondern dir IEC-Timer aus der Stabdard-Library. Dazu solltest du aber am besten einen Multiinstanz-FB verwenden, ansonsten benötigst du für jeden IEC-Timer einen eigenen IDB! Such mal in der Standard-Library unter IEC-Funktionblocks nach TON, TOFF und schau dir die Hilfe dazu an. Du hast dann auch nicht die Probleme mit T_No, die ja bei den S5Timern immer explizit angegeben werden muß und nie doppelt vergeben werden darf.
 
Ansonsten gibt es noch den FC40 in den IEC-Funktion Blocks, der wandelt Time in s5Time.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Timer mit variabler Zeitvorgabe

an Larry:

Danke für deinen Tipp, ich versuch das mal so...aber wo ist da der Unterschied zu meiner Variante? Du definierst die Variablen lokal in der Schnittstelle der FC und ich benutze globale Variablen? Und was macht die Zeile hier?:

Code:
w_aktTimeIn at akt_TimeIn : word;

an Ralle:

Danke auch dir für deinen Tipp, aber ich wollte es so einfach, wie möglich machen...ich kuck mir das trotzdem bei Gelegenheit mal an...den FC40 hatte ich auch schon gesehen

Gruß Lars
 
Hallo Lars,
das ist genau der Trick bei der AT-Sicht. Lies dir bitte dazu auf jeden Fall den Abschnitt in der SCL-Hilfe durch.

Die Befehlszeile von mir bewirkt, dass die Variable "w_aktTimeIn" als künstliche Sicht der Variablen "aktTimeIn" vom Typ WORD angesehen wird. Du arbeitest dabei mir der Ursprungs-Variablen weiter. Es entsteht nur eine andere "Sicht-"Weise ... Damit kommt SCL dann klar.

Gruß
LL
 
SCL S_ODT: Status der Zeit woanders abfragen

Hallo SPS-Gemeinde,

wollte gern wissen, ob ich den Ausgang Q der Funktion S_ODT auch woanders in meinem Programm-Code abfragen kann? Sprich, ob ich den Status des Timers auch an einer anderen Stelle im Code abfragen kann?

Oder MUSS ich den Ausgang Q bei Aufruf von S_ODT versorgen und, weshalb er deshalb implizit immer bei der Timer-Behandlung mit behandelt wird?!

der neugierige Lars
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Lars,
du kannst den Ausgang überall in der Instanz (auch ohne den restlichen Kram des SFB) verwenden, wenn er Bestandteil der aktuellen Instanz ist.
Also :
Code:
Var
xTimer : SFB4 ;
yTimer : SFB4 ;
 
if xTimer.Q and yTimer.Q then ...
elsif xTimer.Q or yTimer.Q then ...
end_If ;
PS: ein blöderes Beispiel fiel mir gerade nicht ein ...;)
 
Zurück
Oben