Step 7 SCL-Code: Timer werden nicht gstartet!!!

DMA&JC

Level-1
Beiträge
11
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,
ich habe folgende SCL-Code geschrieben. Es enthält keine Fehler aber beim Simulieren werden die Timer nicht gestartet. Ich habe mich damit erwartet, dass der Timer 1(T1) genau starten würde, wenn "Aufbe_laueft AND Aut_Aufbe" 1 oder TRUE liefert.
Was mache ich falsch???

SCL-Code:


FUNCTION_BLOCK FB1

VAR_TEMP
Spch_fertig : BOOL; // temporäre Variablen
Aufbe_laueft : BOOL;
END_VAR

VAR
Valve5 : BOOL;// statische Variablen
Valve6 : BOOL;
Valve7 : BOOL;
Valve8 : BOOL;
Valve9 : BOOL;
Valve10 : BOOL;
Valve11 : BOOL;
Valve12 : BOOL;
Valve13 : BOOL;
Valve14 : BOOL;
Valve15 : BOOL;
Valve16 : BOOL;
Valve17 : BOOL;
Valve18 : BOOL;
Valve19 : BOOL;
Valve20 : BOOL;
Valve21 : BOOL;
Valve22 : BOOL;
MessungW1 : REAL;
MessungW2 : REAL;
MessungW3 : REAL;
MessungW4 : REAL;
MessungW5 : REAL;
MessungW6 : REAL;
MessungL1 : REAL;
MessungL2 : REAL;
MessungL3 : REAL;
OX_F_Zeit1 : S5TIME;
OX_F_Zeit2 : S5TIME;
OX_F_Zeit3 : S5TIME;
Komp_Zeit1 : S5TIME;
Komp_Zeit2 : S5TIME;
Tz1 : BOOL;
Tz2 : BOOL;
Tz3 : BOOL;
Tz4 : BOOL;
Tz5 : BOOL;
BiVal1 : WORD;
BiVal2 : WORD;
BiVal3 : WORD;
BiVal4 : WORD;
BiVal5 : WORD;
change : BOOL;
Aut_Aufbe : BOOL;

END_VAR

// Anweisungsteil
BEGIN
Spch_fertig := FALSE;
Aufbe_laueft := FALSE;
Valve5 := FALSE;
Valve6 := FALSE;
Valve7 := FALSE;
Valve8 := FALSE;
Valve9 := FALSE;
Valve10 := FALSE;
Valve11 := FALSE;
Valve12 := FALSE;
Valve13 := FALSE;
Valve14 := FALSE;
Valve15 := FALSE;
Valve16 := FALSE;
Valve17 := FALSE;
Valve18 := FALSE;
Valve19 := FALSE;
Valve20 := FALSE;
Valve21 := FALSE;
Valve22 := FALSE;
MessungW1 := 0.0;
MessungW2 := 0.0;
MessungW3 := 0.0;
MessungW4 := 0.0;
MessungW5 := 0.0;
MessungW6 := 0.0;
MessungL1 := 0.0;
MessungL2 := 0.0;
MessungL3 := 0.0;

WHILE Spch_fertig = FALSE DO

Tz1 := FALSE;
Tz2 := FALSE;
Tz3 := FALSE;
Tz4 := FALSE;
Tz5 := FALSE;

OX_F_Zeit1 := S_OFFDT(T_NO:=T1, S:=Aufbe_laueft AND Aut_Aufbe,TV:=T#60s,R :=FALSE,BI:=BiVal1,Q:=Tz1);
OX_F_Zeit2 := S_OFFDT(T_NO:=T2, S:=Tz1,TV:=T#60s,R :=FALSE,BI:=BiVal1,Q:=Tz2);
OX_F_Zeit3 := S_OFFDT(T_NO:=T3, S:=Tz2,TV:=T#60s,R :=FALSE,BI:=BiVal1,Q:=Tz3);

Komp_Zeit1 := S_OFFDT(T_NO:=T4, S:=Aufbe_laueft AND Aut_Aufbe,TV:=T#180s,R :=FALSE,BI:=BiVal1,Q:=Tz4);
Komp_Zeit2 := S_OFFDT(T_NO:=T5, S:=Tz4,TV:=T#180s,R :=FALSE,BI:=BiVal1,Q:=Tz5);

Valve5 := Aufbe_laueft AND Aut_Aufbe AND (NOT Tz1);
Valve6 := Aufbe_laueft AND Aut_Aufbe AND (NOT Tz1);
Valve16 := Aufbe_laueft AND Aut_Aufbe AND (NOT Tz1);
Valve19 := Aufbe_laueft AND Aut_Aufbe AND (NOT Tz1);

Valve7 := TZ1 AND (NOT Tz2);
Valve8 := TZ1 AND (NOT Tz2);
Valve17 := TZ1 AND (NOT Tz2);
Valve20 := TZ1 AND (NOT Tz2);

Valve9 := Tz2 AND (NOT Tz3);
Valve10 := Tz2 AND (NOT Tz3);
Valve18 := Tz2 AND (NOT Tz3);
Valve21 := Tz2 AND (NOT Tz3);

Valve22 := Aufbe_laueft AND Aut_Aufbe AND (NOT Spch_fertig);

IF Aufbe_laueft=TRUE AND Aut_Aufbe=TRUE AND Tz1=TRUE THEN
MessungW1 := MessungW1 + 1.0;
MessungW4 := MessungW4 + 1.0;
ELSE
MessungW1 := MessungW1;
MessungW4 := MessungW4;
END_IF;

IF Tz2=TRUE THEN
MessungW2 := MessungW2 + 1.0;
MessungW5 := MessungW5 + 1.0;
ELSE
MessungW2 := MessungW2;
MessungW5 := MessungW5;
END_IF;

IF Tz3=TRUE THEN
MessungW3 := MessungW3 + 1.0;
MessungW6 := MessungW6 + 1.0;
ELSE
MessungW3 := MessungW3;
MessungW6 := MessungW6;
END_IF;

IF MessungW4 + MessungW5 + MessungW6 >= 30 THEN
Spch_fertig := TRUE;
ELSE
Spch_fertig := FALSE;
END_IF;

END_WHILE;

END_FUNCTION_BLOCK
 
DMA&JC,
alle deine Beiträge handelt um SCL.
Wäre es nicht ein Versuch wert, solche Aufgaben in KOP oder FUP zu lösen ?
besonders den S_OFFDT in SCL finde ich unschön.
In STEP7 Classic, ist den Online Sicht in SCL nicht wirklich gut. Besonders für logische Aufgaben wie diese ist es schwierig zu sehen was passiert.

Und dein Verstand zu SCL ist auch nicht wirklich gut (wenn ich ehrlich sein darf).
Z.B:
Code:
[COLOR=#333333]IF Aufbe_laueft=TRUE AND Aut_Aufbe=TRUE AND Tz1=TRUE THEN[/COLOR]
[COLOR=#333333]MessungW1 := MessungW1 + 1.0;[/COLOR]
[COLOR=#333333]MessungW4 := MessungW4 + 1.0;[/COLOR]
[COLOR=#ff0000]ELSE 
MessungW1 := MessungW1;
MessungW4 := MessungW4;[/COLOR]
[COLOR=#333333]END_IF;[/COLOR]
Du siehst wohl das den ELSE ist völlig redundant ?
Mit KOP und FUP ist viel einfacher logik zu programmieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich denke, deine Zeitwerte an den Timern sind falsch.
Dort werden S5Time-Werte erwartet, also s5t#60s statt T#60s.
Durch das falsche Format könnte es sein, dass dort "irgendwas" drinsteht.
Komisch, dass der Compiler so etwas nicht aussortiert.

Du verwendest einen FB. An deiner Stelle würde ich die Hardwaretimer rauswerfen und Softwaretimer (TON, TOFF) einsetzen, die du im STAT-Bereich des FB deklarfieren kannst.
Dann funktionieren auch die Zeitangaben T#60s.

Ausßerdem kritisch: die While-Schleife sorgt dafür, dass der FB erst zurückkehrt, wenn alles erledigt ist und bestimmte Werte erreicht wurden.
Das kann u.U. dazu führen, dass die SPS in Stop geht, wenn der Spaß zu lange dauert oder einer der Meßwerte sich aus unbekanntem Grund (Sensor defekt) nicht korrekt ergibt.
Hier würde ich grundsätzlich auf eine While-Schleife verzichten, denn das SPS-Programm an sich ist schon eine Endlosschleifen. Du mußt nur dafür sorgen, dass der Inhalt der bisherigen While-Schleife durchlaufen wird, solange dein Ergebnis noch nicht fertig ist, dann setzt du dein "Fertig-Bit" und umspringst den Anweisungsteil im FB, der bisher in der While-Schleife stand.
 
Zuletzt bearbeitet:
Ich habe mich damit erwartet, dass der Timer 1(T1) genau starten würde, wenn "Aufbe_laueft AND Aut_Aufbe" 1 oder TRUE liefert.
Was mache ich falsch???
- Aufbe_laueft wird niemals TRUE (es gibt nur eine FALSE-Zuweisung) - deshalb kann auch der T1 nie starten
- Aut_Aufbe wird in dem gezeigten Code nie etwas zugewiesen

Wird Dein FB auch aufgerufen?
Ist Deine SPS in RUN?


BOOL-Ausdrücke braucht man nicht auf TRUE oder FALSE vergleichen - sie liefern schon TRUE oder FALSE
Code:
IF Aufbe_laueft=TRUE AND Aut_Aufbe=TRUE AND Tz1=TRUE THEN
    MessungW1 := MessungW1 + 1.0;
    MessungW4 := MessungW4 + 1.0;
ELSE
    MessungW1 := MessungW1;
    MessungW4 := MessungW4;
END_IF;
besser so:
Code:
IF Aufbe_laueft AND Aut_Aufbe AND Tz1 THEN
    MessungW1 := MessungW1 + 1.0;
    MessungW4 := MessungW4 + 1.0;
END_IF;

BOOL-Zuweisungen muß man nicht umständlich in IF-Anweisungen packen
Code:
IF MessungW4 + MessungW5 + MessungW6 >= 30 THEN
    Spch_fertig := TRUE;
ELSE
    Spch_fertig := FALSE;
END_IF;
besser so:
Code:
Spch_fertig := MessungW4 + MessungW5 + MessungW6 >= 30 ;

Ansonsten bin ich der selben Meinung wie Jesper, daß logische Verknüpfungen in einer für logische Verknüpfungen besser geeigneten Sprache programmiert werden sollten ---> KOP oder FUP - was nebenbei auch noch viel besser beobachtbar ist und bei der Fehlersuche und für den Anfänger-Lerneffekt mehr hilfreich ist.

PS: Programmcode wird übersichtlicher dargestellt wenn man ihn in [CODE]-Tags einfügt: der #-Button im Beitragseditor

Harald
 
Ich bin bekennender SCL-Banause.
Die folgende Zeile hat mich so verwirrt, dass ich mal im Web gesucht habe, wie man in SCL S5Timer anspricht.

OX_F_Zeit1 := S_OFFDT(T_NO:=T1, S:=Aufbe_laueft AND Aut_Aufbe,TV:=T#60s,R :=FALSE,BI:=BiVal1,Q:=Tz1);

Bin leider noch nicht so richtig fündig geworden.
S_OFFDT dürfte der Typ SA sein,
T_NO bzw. T1 der Timer (die TimerNr),
S der Eingang, mit dessen negativer Flanke die AusschaltVerzögerung gestartet wird,
TV der ZeitWert (hier entsprechend KH 2060 bzw. KT 60.2 - um es mal in S5 zu formulieren - also genauso falsch wie T#60s),
R der ResetEingang,
BI die Ausgabe des ZeitWertes im DualFormat,
Q das AusgabeBit,
(nicht genannt) BCD die Ausgabe des ZeitWertes im BCD-Format.

Was mich stutzig macht, sind die WertZuweisungen
- BI:=irgendeinWort
- Q:=irgendeinBit
BI und Q dürften doch nur rechts von ":=" stehen, z.B. irgendeinWort:=T1.BI oder irgendeinBit:=T1.Q oder täuscht mich mein "SprachEmpfinden"?
- irgendwas-im-S5TimerFormat:=S_OFFDT(…)
Hierfür würde ich etwas in der Form irgendeinWort:=T1.BI erwarten.

Gruss, Heinileini




 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also eigentlich ruft man Timer in SCL so auf, dass man eingibt: "Timername(IN := Startbedingung, PT := Timerlaufzeit)" für TON und TOF- Timer. Die alten S5 Timer sind ja nicht FB- Fähig.

Wenn man den Timer abfragen will, nimmt man einfach #Timername.Q. Das ist ein Bitund kann entweder TRUE oder FALSE sein.
 
Also eigentlich ruft man Timer in SCL so auf, dass man eingibt: "Timername(IN := Startbedingung, PT := Timerlaufzeit)"
Wenn man den Timer abfragen will, nimmt man einfach #Timername.Q. Das ist ein Bitund kann entweder TRUE oder FALSE sein.
Das ist ein IEC Timer. Ist aber am weiten mehr besser als S5Timer in SCL !
Die IEC Timer müssen entweder lokal deklariert sein, als Teil von den FB Variablendeklaration (emfehlenswert) oder global deklariert mit ein Instanz-DB pro Timer (eigentlich nicht emfehlenswert).
 
Was mich stutzig macht, sind die WertZuweisungen
- BI:=irgendeinWort
- Q:=irgendeinBit
BI und Q dürften doch nur rechts von ":=" stehen
Das ist in dem "classic" SCL noch so wie bei einem CALL in AWL, da steht links immer der Übergabeparameter - egal ob INPUT oder OUTPUT oder INOUT - und rechts steht der angeschlossene Wert. Die Links-nach-Rechts-Zuweisung "=>" bei OUTPUT-Parametern wurde später erst erfunden bzw. von woanders her übernommen.

Harald
 
Zurück
Oben