SCL: Timer mit variabler Zeit

lindnerlars

Level-1
Beiträge
39
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Soooo, da ich diesen Beitrag offensichtlich NICHT ins FAQ schreiben kann (Teufel, wer weiß warum?!), kommt er nun hier hin. Es folgt ein kurzer Programmcode für einen Timer in einer Funktion FC0, den wir mit einer variablen Zeit (Zeitvariable) im Steuerablauf einstellen können. Als Vorwissen sei dieser Beitrag (http://www.sps-forum.de/showthread.php?t=2942) empfohlen.

Code:
FUNCTION FC0 : VOID

VAR_TEMP
    TimeIn   : S5TIME;
    TimeInS AT TimeIn : WORD;
END_VAR

// 1.während der Timer läuft, können wir ihn durch Zurücksetzen des "Start_Timer" anhalten
// 2.ist der Timer abgelaufen, kommt das "Timer_Fertig" Signal, dieses und den Timer können wir durch Rücksetzen des "Start_Timer" rücksetzen 
// "currTime" ist S5TIME und dient nur als Speicher für den Rückgabewert der Funktion
// mit der zweiten Zeile in Variablendeklaration stelle ich eine andere Sicht auf meine Variable "TimeIn" ein
// dies ist notwendig, damit die Zuweiung von WORD nach S5TIME klappt (da BCD WORD-breit ist)
// -> ist so was, wie ein anderer Datentyp für eine Variable (siehe S7-SCL Handbuch Kapitel 8.4)
// ach ja, wenn Zeitvariable DINT ist, dann noch DINT_TO_INT benutzen ;)
    
TimeInS := INT_TO_BCD("Zeitvariable") AND W#16#FFF OR W#16#2000;
"currTime" := S_ODT        (T_NO    :=  T0,
                                      S        :=  "Start_Timer",
                                      TV      :=  TimeIn,
                                      Q        :=  "Timer_Fertig"
                                      ); 
    
END_FUNCTION
Viel Spass damit...

Lars, der AWL-Geplagte :)
 
Zuletzt bearbeitet:
Hallo Lars,
der vorgestellte Baustein hat m.E. mindestens einen gravierenden Nachteil : er arbeitet immer mit dem gleichen Timer (T0). Du müßtest hier also die Timer-Nr. noch mit übergeben. Allerdings ... da der Baustein keine "echte" Umrechnung des Formates StTime in Sekunden (oder umgekehrt) macht ... welchen Vorteil bietet er mir ? Meinst du nich, dass der SFB4 (z.B.) haargenau das Gleiche leistet (und der íst schon da) ?

Ein ähnliches Problem, wie du es hattest, hatte ich auch schon mal. ich habe mir dann irgendwann einen FC gebastelt, der eine Zeitvorgabe (in Sek) in S5Time umwandelt. Das wird in der Form sicher auch für viele andere User im Forum gelten. Vielleicht wäre das auch für dich der Weg ...?

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo "Larry",

mmhmm, den SFB4 sehe ich heut zum ersten Mal...hab bis jetzt noch nie mit System- und Standardfunktionen gearbeitet, da dies bis jetzt noch nicht nötig war, aber vielleicht wärs gar nicht so schlecht, sich damit mal zu befassen, um das Rad nicht immer neu erfinden zu müssen... ;) Allerdings frage ich mich da jetzt, warum es da überhaupt S_ODT in SCL gibt, wenn wir eh den SFB4 nehmen können???

Der "gleiche Timer bei jedem Start-Signal" find ich net so wild, wenn du nur wenige Timer verwenden willst und für jedes Start-Signal einen eigenen Timer benutzt. Und wie meinstn das mit "keiner echten Umrechnung" in S5Time, ich dächte schon, dass ich von einem INT-Wert (wo die Zeit in s stehen soll) in S5TIME umrechne!?

Naja wie dem auch sei, so funktionierts bis jetzt, vielleicht änder ich das später noch mal.... :)

Gruß Lars :rolleyes:
 
Der "gleiche Timer bei jedem Start-Signal" find ich net so wild, wenn du nur wenige Timer verwenden willst und für jedes Start-Signal einen eigenen Timer benutzt.

ich find das wild, denn irgendwie hab ich den anspruch funktionen zu schreiben, die ich später bei bedarf aus einer bibliothek greifen kann ohne sie noch mal anpassen zu müssen, einfach rein, parametriert, ab gehter ... und das funktioniert bei deiner funktion eben nicht und wenn du es bei dieser einfachen anwendungen als nicht so tragisch betrachtest, dann bei einer etwas ausufernden auch nicht und irgendwann kommen die bausteine, in denen du anfängst globale und lokale variablen zu vermischen und dann wirds ganz großer mist ...
 
;) ... und um noch zu 4L mit ins Boot zu springen :

Was machst du, wenn du eine Zeit-Verzögerung von 1000 Sek. Haben willst ? Das geht nämlich auch noch ...
Und wenn der Baustein mehrfach eingesetzt wird, schreibst du ihn dann mehrfach ?

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...na dann gehts eben in dieser Form nur bis max. 999s!
Und es geht ja bei der Funktion nicht darum, dass die mehrfach aufgerufen werden soll (bei mir eh nur einmal), sondern nur darum, dass ein Timer mit variabler Zeit umgesetzt wurde...nicht mehr und nicht weniger!

Wenn das noch so weiter geht dann kommt mein Code dorthin:
:sm11:

Gruß Lars :)
 
Wenn es eh nur darum geht, die Funktion 1x aufzurufen,
dann finde ich SCL höflich "Oversized".
Da ist AWL für sowas um viele Welten effektiver, und in dem Fall sogar von Haus aus übersichtlicher.

Zur Umrechnung auf S5TIME bin ich ein Fan von der Standard-Library,
FC33 bzw. FC40 aus den IEC-Functions.

Mfg
Manuel
 
SCL: SFB4 mit Multiinstanz-DB

He Leute,

Ok, ich hab das jetzt mal versucht mit dem SFB4 zu machen und wollte den Tipp mit Multiinstanz-DB mit umsetzen, damit ich nicht für jede FB einen eigenen DB erstellen muss, was meinen gesamten Code unnötig aufblähen würde. Meine Lösung ist folgende:

Code:
FUNCTION_BLOCK FB1

VAR

Timer1 : SFB4;

END_VAR

BEGIN

Timer1(IN := E0.0,PT := T#3S); 
A0.0 := DB1.Q;

END_FUNCTION_BLOCK


ORGANIZATION_BLOCK OB1

VAR_TEMP
  // reserviert
  info : ARRAY[0..19] OF BYTE;
  // temporäre Variablen

END_VAR

FB1.DB1(); 
      
END_ORGANIZATION_BLOCK

Die Frage ist jetzt die:
Wie kann ich nun auf die Daten dieses Multiinstanz-DB in der FB (wo ich die Unter-FB aufrufe) abfragen? Ich muss ja wissen, wann der Timer abgelaufen ist ;)
Bei dieser Zeile:

Code:
A0.0 := DB1.Q;

meckert der Compiler, dass keine Rekursion in SCL erlaubt ist! Wo liegt der Fehler?

Und noch eine Frage: Wenn ich nun zwei SFB4 gleichzeitig mit dem gleichen Instanz-DB aufrufe, kommt es dann nicht zu Quereleien? Sprich das "Timer-Fertig" Signal von beiden stört sich dann gegenseitig?

viele Grüße vom Diplomanten Lars :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe ja gerade kein Sepp7 zur Hand. Aber sollte das nicht eher:

Code:
A0.0 := Timer1.Q;

lauten?

PS: Absolute Adressierungen sind Müll.
 
SCL: SFB4 mit Multiinstanz-DB

He cool, vielen Dank, jetzt gehts *freu*...war mir so nicht klar vorher, dass ich derart auf den Multiinstanz-DB zugreifen muss/kann :)

Meine Lösung ist jetzt Folgende:

Code:
FUNCTION_BLOCK FB1

VAR

Timer1 : SFB4;
Timer2 : SFB4;

END_VAR

Timer1(IN := E0.0,PT := T#3S); 
A0.0 := Timer1.Q;

Timer2(IN := E0.1,PT := T#3S); 
A0.1 := Timer2.Q;

END_FUNCTION_BLOCK
Und damit kann ich nun zwei Timer im FB starten, die auch unabhängig voneinander laufen und nicht jeder einen eigenen DB verlangen... :)

viele Grüße Lars

PS: Absolute Adressierung, ich weiß, das Programm war nur zu Testzwecken ;)
 
Zurück
Oben