Timerproblem in SCL

schnecke

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

muss mich (leider) grad etwas in SCL einarbeiten. Im Speziellen geht es um eine Ein- u. Ausschaltverzögerung.

Die Einschaltverzögerung klappt jedoch nicht; der Ausgang wird sofort angesteuert. Die Ausschaltverzögerung funktioniert!

Code:
[SIZE=3][FONT=Times New Roman]FUNCTION_BLOCK FB10[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]VAR_INPUT[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]  Taste: BOOL;[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]END_VAR[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]VAR_IN_OUT[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]  Ausgang: BOOL;[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]END_VAR[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]VAR[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]  currTime_T10: S5TIME;[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]  biVal_T10: WORD;[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]  actFlag_T10: BOOL;[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]  currTime_T11: S5TIME;[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]  biVal_T11: WORD;[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]  actFlag_T11: BOOL;[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]END_VAR[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]BEGIN[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]  currTime_T10:= S_ODT (T_NO:= T10, S:=Taste, TV:= T#1s, R:= FALSE, BI:= biVal_T10, Q:= Ausgang);[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]  currTime_T11:= S_OFFDT (T_NO:= T11, S:=Taste, TV:= T#4s, R:= FALSE, BI:= biVal_T11, Q:= Ausgang);[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]END_FUNCTION_BLOCK[/FONT][/SIZE]
 
 
[SIZE=3][FONT=Times New Roman]DATA_BLOCK DB10  FB10[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]BEGIN[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]END_DATA_BLOCK[/FONT][/SIZE]
 
 
[SIZE=3][FONT=Times New Roman]ORGANIZATION_BLOCK OB1[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]VAR_TEMP[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]  info : ARRAY[0..19] OF BYTE;[/FONT][/SIZE]
 
[FONT=Times New Roman][SIZE=3]END_VAR[/SIZE][/FONT]
 
[SIZE=3][FONT=Times New Roman]  FB10.DB10(Taste:= E1.1, Ausgang:= A1.0);[/FONT][/SIZE]
 
[FONT=Times New Roman][SIZE=3]END_ORGANIZATION_BLOCK[/SIZE][/FONT]

Frage:

Was habe ich falsch gemacht?

Lieben Dank...
 
Ähh ... auf welche der beiden Zeilen soll (der eine) Ausgang den gehorchen ?
Das ist in SCL nicht anders, wie in AWL ...

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

hm - war der Meinung dass für eine Ein- u. eine Ausschaltverzögerung je so eine Zeile notwendig wäre...

Wie sonst könnte ich denn in einer Zeile beide Zeitfunktionen vereinen oder geht das gar nicht mit nur einer Zeile?
 
die einschaltverzögerung soll ja nur greifen wenn die taste gedrückt wird UND der ausgang NICHT ein ist
die ausschaltverzögerung soll ja nur greifen wenn die taste gedrückt wird UND der ausgang ein ist

...
 
Ok, danke vierlagig...

wenn ich deine Anmerkung umsetze, muss ich dann mit der Anweisung "IF" arbeiten?

Also

IF Taste:= true AND Ausgang:= false THEN;
actFlag_T10:= true;
ELSE IF
actFlag_T10:= true THEN;
Ausgang:= true;
END IF

entsprechend dann für die Ausschaltverzögerung?

@Harald:

Was bedeutet bitte T10.S - T10.Q ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Taste ---- T10.S - T10.Q ---- TempBool ---- T11.S - T11.Q ---- Ausgang

sollte das bedeuten:
Code:
[SIZE=3][FONT=Times New Roman]  currTime_T10:= S_ODT (T_NO:= T10, S:=Taste, TV:= T#1s, R:= FALSE, BI:= biVal_T10, Q:= [B]tempFlag[/B]);
  currTime_T11:= S_OFFDT (T_NO:= T11, S:=[B]tempFlag[/B], TV:= T#4s, R:= FALSE, BI:= biVal_T11, Q:= Ausgang);[/FONT][/SIZE]

Harald
 
Aja ok, vielen Dank Harald!

Ich nehme an, dazu muss dieses "tempFlag" unter VAR noch als "BOOL" deklariert werden, oder?
Startet dann die ASV unverzüglich über dieses "tempFlag"?


Würde das Ganze auch auf die von mir dargestellte Art mittels der IF-Anweisung funktionieren?
 
Zuletzt bearbeitet:
Würde das Ganze auch auf die von mir dargestellte Art mittels der IF-Anweisung funktionieren?
Das geht so noch einfacher :
Code:
actFlag_T10:= Taste an not Ausgang ;
Im Grunde entsteht SCL bei solchen Sachen aus der AWL-Syntax. Das heißt, dass alle Gesetzmäßigkeiten und Vorgehensweisen von AWL auch hier ihre Gültigkeit haben / behalten.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
tempFlag ist eine BOOL-Variable, die einfach nur zur Übergabe von T10.Q an T11.S benutzt wird
(also des Ausgangs des ersten Timers an den Eingang des zweiten Timers = hintereinander schalten).
In AWL würde ich das Flag als Schmiermerker oder Connector bezeichnen.

TEMP würde ausreichen, das Flag braucht kein Gedächtnis.

Mit IF ... kann man es bestimmt auch machen, doch das ist mir zu umständlich.

Harald
 
Ok, dank' euch!

TEMP würde ausreichen, das Flag braucht kein Gedächtnis.

Aber unter VAR muss es doch als BOOL deklariert werden, oder?


Code:
actFlag_T10:= Taste AND NOT Ausgang;
actFlag_T11:= Ausgang AND NOT Taste;

Wie müssten denn dann für obigen Code die Einträge hinter S:= und Q:= in den beiden Zeilen currTime_T10 und currTime_T11 lauten?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Sobald T10 true wird, wird dieses true über tempFlag an den Eingang von T11 gegeben.
Weil T11 eine Ausschaltverzögerung ist, geht der Ausgang von T11 und damit Ausgang sofort auf true.

Wenn Du den Code testen/simulieren würdest, dann würdest Du dieses Verhalten feststellen:
Code:
           | 1s |   |-      4s      -|
            _______
Taste    __|       |____________________
                 __
T10.Q    _______|  |____________________
                 ____________________
T11.Q    _______|                    |__
                 ____________________
Ausgang  _______|                    |__
Die Frage zu dieser Antwort hast Du mittlerweile wieder gelöscht ...

Zur neuen Frage:
TEMP würde ausreichen, das Flag braucht kein Gedächtnis.
Aber unter VAR muss es doch als BOOL deklariert werden, oder?

tempFlag muß auf jeden Fall irgendwo als BOOL deklariert werden, wenn Du es benutzen willst.
Das kann unter VAR sein, dann hat die Variable ein Gedächtnis und benötigt Platz im Instanz-DB.
Laut SCL-Hilfe gibt es auch noch VAR_TEMP, dann hat die Variable kein Gedächtnis und belegt
keinen Platz im Instanz-DB.

Harald
 
Die Frage zu dieser Antwort hast Du mittlerweile wieder gelöscht ...

Yep, weil ich es mittlerweile durch Simulieren nachvollziehen konnte und die Frage somit erledigt war!

Vielen Dank nochmals für deine Mühe...


Wenn ich folgenden Code anwenden würde:

Code:
actFlag_T10:= Taste AND NOT Ausgang;
actFlag_T11:= Ausgang AND NOT Taste;

Was müsste dann in den folgenden beiden Zeilen für S:= und Q:= eingetragen werden?

Code:
[FONT=Times New Roman][SIZE=3]currTime_T10:= S_ODT (T_NO:= T10, S:=[COLOR=red]?[/COLOR], TV:= T#1s, R:= FALSE, BI:= biVal_T10, Q:= [COLOR=red]?[/COLOR]);[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]currTime_T11:= S_OFFDT (T_NO:= T11, S:=[COLOR=red]?[/COLOR], TV:= T#4s, R:= FALSE, BI:= biVal_T11, Q:= [COLOR=red]?[/COLOR]);[/FONT][/SIZE]


Sorry, aber dieses SCL bringt mich als SPS-Anfängerin zur Verzweiflung...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
das hatte dir PN/DP im Beitrag#9 in diesem Thread schon beantwortet ... :rolleyes:

Gruß
Larry

1)

Ja, aber folgender Code kann doch auch für sich alleine stehen:

Code:
[FONT=Times New Roman][SIZE=3]currTime_T10:= S_ODT (T_NO:= T10, S:=Taste, TV:= T#1s, R:= FALSE, BI:= biVal_T10, Q:= [B]tempFlag[/B]);[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]currTime_T11:= S_OFFDT (T_NO:= T11, S:=[B]tempFlag[/B], TV:= T#4s, R:= FALSE, BI:= biVal_T11, Q:= Ausgang);[/FONT][/SIZE]

2)

Wenn ich nun aber deinem Vorschlag folge und programmiere

Code:
actFlag_T10:= Taste AND NOT Ausgang;
actFlag_T11:= Ausgang AND NOT Taste;

dann muss doch auch definiert werden, was eine Ein- u. eine Ausschaltverzögerung ist... wie wird das bewerkstelligt?

Doch wohl nicht auch über den Code unter 1) oder?
 
Hallo,
das geht mir jetzt wieder ein bißchen durcheinander ...
Die Funktion des Timers (Ein- oder Ausschaltverzögerung) hast du mit dem Aufruf schon festgelegt :
S_ODT = OnDelayTime = Einschaltverzögerung
S_OFFDT = OFFDelayTime = Ausschaltverzögerung

Wenn der Timer T10 nach Ablauf den Timer T1 starten soll, so geht das nur in dem du ihm die Information dafür übergibst. Dafür hat Harald (PN/DP) in seinem Beispiel die Temp-Variable "tempFlag" vom Typ Bool gewählt.

In meinem Beitrag wollte ich dir nur zeigen, dass du außer der IF-Geschichte (wie von dir angedacht) auch noch die Möglichkeit hast mit einer direkten Zuweisung zu arbeiten. Dein IF-Konstrukt würde nur funktionieren, wenn sich dein Baustein den Zustand merken kann - das würde bedeuten, dass du einen FB erstellst und die Hilfsvariable im STAT-Bereich deklariert ist. Ich weiß im Augenblick nicht, ob das bei dir nun so war. Meine Zuweisung (vorausgesetzt sie war sio korrekt) würde auch mit einer TEMP-Variablen und somit auch in einem FC funktionieren, da sie in jedem Programmzyklus wieder aus Neue erfolgt ...

Gruß
Larry
 
Hallo LL,

danke für deine Antwort - leider habe ich noch immer ein riesiges Verständnisproblem...

Die Aufgabe war ja, dass nach dem Drücken einer Taste nach 1s ein Ausgang angeht und wenn diese Taste losgelassen wird, der Ausgang nach 4s wieder ausgeht.

So, nun kann ich das über den Vorschlag von Harald (PN/DP) mittels der Temp-Variable "tempFlag" vom Typ Bool bewerkstelligen. Das ist soweit klar!

Was jedoch noch nicht klar ist:

Wenn ich nun das Ganze über eine direkte Zuweisung entsprechend folgendem Code

Code:
actFlag_T10:= Taste AND NOT Ausgang;
actFlag_T11:= Ausgang AND NOT Taste;

programmieren möchte, so muss ich doch ebenfalls die Timerart

S_ODT = OnDelayTime = Einschaltverzögerung
S_OFFDT = OFFDelayTime = Ausschaltverzögerung

irgendwo definieren - wo mache ich das denn?

... denn den Programmcode von Harald habe ich ja dann nicht, wenn ich es über eine direkte Zuweisung machen möchte!

Vielen Dank für die Hilfe...
 
Zurück
Oben