Frage zu SCL

petzi

Level-1
Beiträge
255
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

habe grad bemerkt, dass der Timer in SCL immer abläuft - also auch dann, wenn E1.0 kurz nach deim Einschalten sofort wieder auf 0 gestellt wird.

In AWL ist das Verhalten einer Einschaltverzögerung doch anders...

Warum ist das in SCL anders?

Code:
FUNCTION FC1 : VOID
 
VAR
    biVal_R2 :WORD;//timer
    actFlag_R2: BOOL;//timer
    curr_time_R2 : S5TIME;//timer
    S5Timer_flag_R2 : BOOL; // Timer
END_VAR
 
BEGIN
 
      curr_time_R2 := S_ODT (T_NO:=T1, 
                        S:=S5Timer_flag_R2, 
                        TV:=T#3S,
                        R:=FALSE, 
                        BI:=biVal_R2, 
                        Q:=actFlag_R2); 
 
        IF (E1.0 = true) THEN                        // Start Timer
            S5Timer_flag_R2 := true; 
        END_IF;    
 
        IF (actFlag_R2 = true) THEN                  // Timer abgelaufen
            S5Timer_flag_R2 := false;
        END_IF;               
 
END_FUNCTION

Danke!
 
wenn ich deinen code nun richtige deute, hast du keine einschaltverzögerung sondern ein zeitgetriggertes flipflop programmiert, oder bin ich neuerdingszu doof für scl?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
oder bin ich neuerdingszu doof für scl?​

Nee Rupp, du sicher nicht - dann schon eher ich; ist aber auch Neuland für mich...

ALSO:

"S_ODT" ist ja eine Einschaltverzögerung. Der Timer sollte doch nur dann laufen, wenn "S5Timer_flag_R2" true ist - und die IF-Anweisung besagt ja, dass "S5Timer_flag_R2" nur dann true ist, wenn E1.0 den Status 1 hat - oder habe ich hier einen Denkfehler?
 
Zuletzt bearbeitet:
Hallo Petzi,
die Sequenz :
Code:
       IF (E1.0 = true) THEN                        // Start Timer
            S5Timer_flag_R2 := true; 
        END_IF;
bewirkt ein SETZEN des gewählten Bits.
In AWL würde das heißen :
Code:
U E1.0
S #S5Timer_flag_R2
damit hast du eine Art speichernde Einschaltverzörgerung programmiert (S_ODT ist natürlich eine Einschaltverzörgerung), weil auch nach Abfallen von E1.0 das Triggerbit weiterhin aktiv ist.
Du löscht das Bit ja erst dann wieder, wenn der Timer abgelaufen ist ...

Und das Tolle daran ... du hast es auch genau so, wie es arbeitet, dokumentiert. Wo ist also das Problem ...?

Gruß
Larry
 
also wenn du willst das die var: actFlag_R2 high bleibt mußt du die zweite if bedingung folgender massen nacharbeiten

IF (E1.0 = false) THEN // Timer abgelaufen
S5Timer_flag_R2 := false;
END_IF;,


Das sollte dann ein TON sein
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Und das Tolle daran ... du hast es auch genau so, wie es arbeitet, dokumentiert. Wo ist also das Problem ...?

Gruß
Larry

Danke für eure Antworten!

Das Problem ist:

Der Timer startet ja über "S5Timer_flag_R2". Dieses ist ja aber nur TRUE, wenn E1.0 den Status 1 hat (siehe IF-Anweisung). Wenn ich nun aber E1.0 nach dem Start auf 0 setze, so läuft der Timer dennoch, obwohl ja dann "S5Timer_flag_R2" FALSE sein sollte...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
deine bedingung E1.0 ist erfüllt, nur dann wird S5Timer_flag_R2 gesetzt

und danach nicht mehr angerührt, ergo nein es ist nicht immer so sonder nur wenn IF (?) erfüllt ist, d.h. du mußt entweder eine else-if/else-or/nor verzweigung programmieren oder aber du läßt die if-bedingung und programmierst "konventionell"

edit "wie und was gesetzt wird hängt vom zuweisungsoperator und seiner wertigkeit ab, fakt ist es passiert immer nur wenn if (?)= true ist
 
Hi,

noch etwas, ich weiß ja nicht ob das so gewollt ist, aber das beschreiben von temporären am Ende des Bausteins (FC) ist gefährlich. Im nächsten Zyklus kann diese einen anderen zustand haben. ;)

Gruss Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

noch etwas, ich weiß ja nicht ob das so gewollt ist, aber das beschreiben von temporären am Ende des Bausteins (FC) ist gefährlich. Im nächsten Zyklus kann diese einen anderen zustand haben. ;)

Gruss Daniel

bei größeren programmen ist das sogar ganz sicher so, ich empfehle auch dringend für operationen welche sub-programme steuern statics zu verwenden
 
Ja, das gilt auch für die TEMP-Variablen in einem FB.
Ein FB hat aber zusätzlich STAT-Variablen (in seinem Instanz-DB), die sind extra dafür da, sich ihren Inhalt zu merken.

Harald
 
Zurück
Oben