TIA 7 stufen abfahren

Zuviel Werbung?
-> Hier kostenlos registrieren
// -------------------------
// Ablaufsteuerung
// -------------------------
begin

// Start-Taster setzt Anlage in Betrieb
IF "StartTaster" AND NOT #Daten.PruefungAktiv THEN
#Daten.PruefungAktiv := TRUE;
#Daten.Stufe := 0; // mit Stufe 0 beginnen
END_IF;

// Stop-Taster beendet sofort
IF "StopTaster" THEN
#Daten.PruefungAktiv := FALSE;
#Daten.Stufe := 0;
Timer(IN := FALSE);
END_IF;

// Ablauf nur wenn aktiv
IF #Daten.PruefungAktiv THEN
CASE #Daten.Stufe OF

// ---------------- STUFE 0 ----------------
0:
"Q0_0" := TRUE; // Spule laut Tabelle
IF "DruckIst" >= #Daten.DruckSoll[0] THEN
#Timer0Start(IN := TRUE,
PT := T#10S);
IF #Timer THEN
"Q0_0" := FALSE;
#Timer_0(IN := FALSE);
#Daten.Stufe := 1;
END_IF;
END_IF;

// ---------------- STUFE 1 ----------------
1:
"Q0_1" := TRUE;
IF "DruckIst" >= #Daten.DruckSoll[1] THEN
#Timer_0(IN := TRUE,
PT := T#10S);
IF Timer.Q THEN
"Q0_1" := FALSE;
Timer(IN := FALSE);
#Daten.Stufe := 2;
END_IF;
END_IF;

// ---------------- STUFE 2 ----------------
2:
"Q0_2" := TRUE;
IF "DruckIst" >= #Daten.DruckSoll[2] THEN
Timer(IN := TRUE,
PT := T#10S);
IF Timer.Q THEN
"Q0_2" := FALSE;
Timer(IN := FALSE);
#Daten.Stufe := 3;
END_IF;
END_IF;

// ---------------- STUFE 3 ----------------
3:
"Q0_3" := TRUE;
IF "DruckIst" >= #Daten.DruckSoll[3] THEN
Timer(IN := TRUE,
PT := T#10S);
IF Timer.Q THEN
"Q0_3" := FALSE;
Timer(IN := FALSE);
#Daten.Stufe := 4;
END_IF;
END_IF;

// ---------------- STUFE 4 ----------------
4:
"Q0_4" := TRUE;
IF "DruckIst" >= #Daten.DruckSoll[4] THEN
Timer(IN := TRUE,
PT := T#10S);
IF Timer.Q THEN
"Q0_4" := FALSE;
Timer(IN := FALSE);
#Daten.Stufe := 5;
END_IF;
END_IF;

// ---------------- STUFE 5 ----------------
5:
"Q0_5" := TRUE;
IF "DruckIst" >= #Daten.DruckSoll[5] THEN
Timer(IN := TRUE,
PT := T#10S);
IF Timer.Q THEN
"Q0_5" := FALSE;
Timer(IN := FALSE);
#Daten.Stufe := 6;
END_IF;
END_IF;

// ---------------- STUFE 6 ----------------
6:
"Q0_6" := TRUE;
IF "DruckIst" >= #Daten.DruckSoll[6] THEN
Timer(IN := TRUE,
PT := T#10S);
IF Timer.Q THEN
"Q0_6" := FALSE;
Timer(IN := FALSE);
#Daten.Stufe := 7;
END_IF;
END_IF;

// ---------------- STUFE 7 (letzte) ----------------
7:
"Q0_7" := TRUE;
IF "DruckIst" >= #Daten.DruckSoll[7] THEN
Timer(IN := TRUE,
PT := T#10S);
IF Timer.Q THEN
"Q0_7" := FALSE;
Timer(IN := FALSE);
#Daten.PruefungAktiv := FALSE; // Ablauf fertig
#Daten.Stufe := 0; // zurück auf 0
END_IF;
END_IF;

END_CASE;
END_IF;

END_FUNCTION_BLOCK


Kann mir jemand sagen wiso das es nicht geht ich bin da am studieren, habe alles deklariert in einem UDT
 
// -------------------------
// Ablaufsteuerung
// -------------------------
begin

// Start-Taster setzt Anlage in Betrieb
IF "StartTaster" AND NOT #Daten.PruefungAktiv THEN
#Daten.PruefungAktiv := TRUE;
#Daten.Stufe := 0; // mit Stufe 0 beginnen
END_IF;

// Stop-Taster beendet sofort
IF "StopTaster" THEN
#Daten.PruefungAktiv := FALSE;
#Daten.Stufe := 0;
Timer(IN := FALSE);
END_IF;

// Ablauf nur wenn aktiv
IF #Daten.PruefungAktiv THEN
CASE #Daten.Stufe OF

// ---------------- STUFE 0 ----------------
0:
"Q0_0" := TRUE; // Spule laut Tabelle
IF "DruckIst" >= #Daten.DruckSoll[0] THEN
#Timer0Start(IN := TRUE,
PT := T#10S);
IF #Timer THEN
"Q0_0" := FALSE;
#Timer_0(IN := FALSE);
#Daten.Stufe := 1;
END_IF;
END_IF;

// ---------------- STUFE 1 ----------------
1:
"Q0_1" := TRUE;
IF "DruckIst" >= #Daten.DruckSoll[1] THEN
#Timer_0(IN := TRUE,
PT := T#10S);
IF Timer.Q THEN
"Q0_1" := FALSE;
Timer(IN := FALSE);
#Daten.Stufe := 2;
END_IF;
END_IF;

// ---------------- STUFE 2 ----------------
2:
"Q0_2" := TRUE;
IF "DruckIst" >= #Daten.DruckSoll[2] THEN
Timer(IN := TRUE,
PT := T#10S);
IF Timer.Q THEN
"Q0_2" := FALSE;
Timer(IN := FALSE);
#Daten.Stufe := 3;
END_IF;
END_IF;

// ---------------- STUFE 3 ----------------
3:
"Q0_3" := TRUE;
IF "DruckIst" >= #Daten.DruckSoll[3] THEN
Timer(IN := TRUE,
PT := T#10S);
IF Timer.Q THEN
"Q0_3" := FALSE;
Timer(IN := FALSE);
#Daten.Stufe := 4;
END_IF;
END_IF;

// ---------------- STUFE 4 ----------------
4:
"Q0_4" := TRUE;
IF "DruckIst" >= #Daten.DruckSoll[4] THEN
Timer(IN := TRUE,
PT := T#10S);
IF Timer.Q THEN
"Q0_4" := FALSE;
Timer(IN := FALSE);
#Daten.Stufe := 5;
END_IF;
END_IF;

// ---------------- STUFE 5 ----------------
5:
"Q0_5" := TRUE;
IF "DruckIst" >= #Daten.DruckSoll[5] THEN
Timer(IN := TRUE,
PT := T#10S);
IF Timer.Q THEN
"Q0_5" := FALSE;
Timer(IN := FALSE);
#Daten.Stufe := 6;
END_IF;
END_IF;

// ---------------- STUFE 6 ----------------
6:
"Q0_6" := TRUE;
IF "DruckIst" >= #Daten.DruckSoll[6] THEN
Timer(IN := TRUE,
PT := T#10S);
IF Timer.Q THEN
"Q0_6" := FALSE;
Timer(IN := FALSE);
#Daten.Stufe := 7;
END_IF;
END_IF;

// ---------------- STUFE 7 (letzte) ----------------
7:
"Q0_7" := TRUE;
IF "DruckIst" >= #Daten.DruckSoll[7] THEN
Timer(IN := TRUE,
PT := T#10S);
IF Timer.Q THEN
"Q0_7" := FALSE;
Timer(IN := FALSE);
#Daten.PruefungAktiv := FALSE; // Ablauf fertig
#Daten.Stufe := 0; // zurück auf 0
END_IF;
END_IF;

END_CASE;
END_IF;

END_FUNCTION_BLOCK


Kann mir jemand sagen wiso das es nicht geht ich bin da am studieren, habe alles deklariert in einem UDT

"Geht nicht" ist keine Fehlerbeschreibung. Was genau geht denn nicht?

Was schon einmal auffällt ist, dass Du Zeiten nicht zyklisch aufrufst und auch die Bearbeitung der Ausgänge nicht zyklisch erfolgt.
Zeiten sollten nach Möglichkeit außerhalb von Bedingungen aufgerufen werden.
Wenn Du in einem Schritt einen Ausgang auf "TRUE" setzt und dann im nächsten Schritt nicht mehr bearbeitest, wird er immer TRUE bleiben.

VG
MFreiberger
 
"Geht nicht" ist keine Fehlerbeschreibung. Was genau geht denn nicht?

Was schon einmal auffällt ist, dass Du Zeiten nicht zyklisch aufrufst und auch die Bearbeitung der Ausgänge nicht zyklisch erfolgt.
Zeiten sollten nach Möglichkeit außerhalb von Bedingungen aufgerufen werden.
Wenn Du in einem Schritt einen Ausgang auf "TRUE" setzt und dann im nächsten Schritt nicht mehr bearbeitest, wird er immer TRUE bleiben.

VG
MFreiberger
Wo ich nicht weiter komme ist, bei dem Timer setzen und Reset es soll die Zeit starten und nach 10 Sekunden reset machen und zu nächste stufe gehen. Zweiter Punkt ist wieso es bei mir Fehler anzeigt bei Begin und am Schluss end _Function_block
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Timer müssen außerhalb der Bedingungen aufgerufen werden, da die Timer sonst nicht funktionieren.
Sie müssen zyklisch immer aufgerufen werden.

Anstatt den Eingang des Timers direkt zu setzen, sollte man Hilfsvariablen verwenden.
Innerhalb der Bedingungen die Timer nicht aufrufen, sondern die Hilfsvariablen setzen und rücksetzen.

Die Abfrage des Ausgangs des Timers kann man aber innerhalb der Bedingungen machen.
In deinem Code kommt die Abfrage #Timer vor. Soweit ich weiß, funktioniert das nicht.
Du musst dann #Timer.Q auswerten und nicht #Timer.

Ein weiterer Vorteil ist, dass man es dann auch einfacher debuggen kann, wenn die Timer oben alle aufgelistet sind.
Man kann sie auch nach unten packen, wenn man das möchte.


Code:
// timer_enable_0        Bool
// timer_enable_1        Bool
// timer_enable_2        Bool

// Timer_0               TON
// Timer_1               TON
// Timer_2               TON


// Timer immer außerhalb von Bedingungen abrufen
Timer_0(IN := timer_enable_0, PT := T#10s);
Timer_1(IN := timer_enable_1, PT := T#10s);
Timer_2(IN := timer_enable_2, PT := T#10s);



// in den Bedingungen timer_enable_0 - timer_enable_2 setzen
timer_enable_0 := True



// Abfrage des Ausgangs eines Timers
IF Timer_0.Q THEN
    // code:
END_IF;
 
Zurück
Oben