Twincat Beckhoff, TP Reset nach erneutem Aufrufe

Newbie_frank

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe und hilfsbereite Forum User,

ich bin zur Zeit an einer Beckhoff PLC mit Twincat PLC... IEC61131-3 in strukturiertem Text unterwegs und normalerweise in der "Denkwelt" LabView und C zu finden. Leider plagt mich ein schon lange anhaltendes, vermutlich lächerliches, Problem und hoffe um eure Hilfe.
Ja, Forum und gegoogelt wurde schon von mir, allerdings ohne für mich eine finale Hilfestellung zu erhalten. TP gewählt da dieser zu wählen ist, wenn für eine Zeit x eine Aktion ausgeführt werden soll.

Die ebenfalls schon vorhandene Ablaufsteuerungen funktionieren soweit i.O. die PLC bekommt von einer weiteren Steuerung (PC) in einer Case Anweisung das Commando "Mache das u.g. Programm" und ruft das Programm im Projekt immer zu der entsprechenden Zeit auf.

Zur Laufzeit ist es leider so, dass sobald das PRG aufgerufen wird, der Timer für ewig auf True steht und nicht, wie in der Doku nach Zeit PT wieder auf false gestellt wird. Im Online Modus steht bei dem Timer dann schon beim ersten Starten:

FBSpuelzeit
.Starttime = T10s...
.IN True
.PT 10s
.Q True
.ET 580ms

==> ET bricht nach x Zeit ab, ggf. immer wieder erneuter Aufruf oder wegen der größeren Startzeit?


SW: MiniMaschine mit ein paar Ventilen.

(* Instanzbildung des Timers*)
FBSpuelzeit
(
PT := t_spuelzeit);


IF b_Freigabe_spuelen_timer (*spülzeit starten*)
THEN
FBSpuelzeit.IN := TRUE;
b_interne_freigabe_timer_start :=TRUE; (*Fallende Flanke und abgelaufene Zeit Flag starten*)
ELSE
(*FBSpuelzeit.IN := FALSE;*) ;
END_IF

IF FBSpuelzeit.Q
THEN
b_Freigabe_spuelen_timer:=FALSE;
END_IF

IF b_interne_freigabe_timer_start AND NOT FBSpuelzeit.Q (*Spülzeit abgelaufen*)
THEN (*erst Timer starten, wenn die Freigabe erneut für die Spülung gekommen ist *)
bEND_Spuelen:=TRUE;
b_interne_freigabe_timer_start :=FALSE;
ELSE
bEND_Spuelen:=FALSE;
END_IF


(*Spülzeit abgelaufen *)
IF bEND_Spuelen
THEN
b_Freigabe_spuelen_timer :=FALSE;
bVor_Rueck_zu :=FALSE;
FBSpuelzeit.IN := false;
bSt1_PKW_seitlich_Kuehler_gespuelt:=TRUE; (*gespült*)
bEnd_Spuelen :=FALSE;
(*Ventile A bis Z im Original*)
ELSE
bSt1_PKW_seitlich_Kuehler_gespuelt:=FALSE; (*noch nicht gespült*)
END_IF
 
Willkommen im Forum.

Kleiner Tip, wenn du Quellcode postest nutze bitte CODE Tags (Die Schaltfläche mit # im Menü) damit der Code besser lesbar wird.

Erstmal eine Gegenfrage, rufst du den Timer noch irgendwo anders auf? Denn nach dem Überfliegen deines Quelltextes bin ich eigentlich der Meinung, dass der Timer, so wie du es Programmiert hast, niemals gestartet werden kann.

Code:
(* Instanzbildung des Timers*)
FBSpuelzeit
(
PT := t_spuelzeit);     [B]==Nur hier wird der Eingangswert (FBSpueltimer.IN) des Timers verarbeitet[/B]==
 
[B] ==Soweit OK[/B]==
IF b_Freigabe_spuelen_timer (*spülzeit starten*)
THEN
 FBSpuelzeit.IN := TRUE;   
 b_interne_freigabe_timer_start :=TRUE;  
ELSE
 (*FBSpuelzeit.IN := FALSE;*)  ;
END_IF

IF FBSpuelzeit.Q
THEN
 b_Freigabe_spuelen_timer:=FALSE;
END_IF  

[B]== Hier ist der Haken: FBSpuelzeit.Q ist immernoch false, weil du den Timer nach FBSpuelzeit.IN := TRUE noch nicht wieder aufgerufen hast==[/B]
[B]== D.H. diese Bedingung wird im selben Zyklus wahr, indem du deine Spülzeit gestartet hast==[/B]
[B]== Weil du weiter oben b_internefreigabe_timer_start auf TRUE gesetzt hast, aber FBSpuelzeit.Q immernoch FALSE ist==[/B]
IF  b_interne_freigabe_timer_start AND NOT FBSpuelzeit.Q   (*Spülzeit abgelaufen*)
THEN             
 bEND_Spuelen:=TRUE;
 b_interne_freigabe_timer_start :=FALSE;
ELSE
 bEND_Spuelen:=FALSE;
END_IF
 
 
(*Spülzeit abgelaufen *)
[B]==bEND_Spuelen ist sofort nach der Startfreigabe TRUE (s.o.)==[/B]
IF  bEND_Spuelen
THEN
 b_Freigabe_spuelen_timer :=FALSE;
 bVor_Rueck_zu :=FALSE;
 FBSpuelzeit.IN := false;  
 bSt1_PKW_seitlich_Kuehler_gespuelt:=TRUE;  (*gespült*)
 bEnd_Spuelen :=FALSE;
  (*Ventile A bis Z im Original*)
ELSE
 bSt1_PKW_seitlich_Kuehler_gespuelt:=FALSE;  (*noch nicht gespült*)
END_IF

Also aus Sicht des Timers wird seine Eingangsvariable IN niemals true, weil du sie noch im selben Zyklus wieder auf false setzt, bevor der Timer im nächsten Zyklus wieder aufgerufen wird.

Das der Timer trotzdem losläuft wäre dann eigentlich ein Zeichen dafür, das du noch woanders auf ihn zugreifst.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

danke für die Rückmeldung.
Nein, der Timer TP wird nirgends anders weiter verwendet. Der Code, sorry für die Darstellung, ist nicht ausgeschnitten.
Andersrum gefragt vom PAP her:
  • nach Zeit t1 wird das u.g. PRG "Spuelen" aufgerufen
  • Neustart Timer TP
  • nach Ablauf Timer TP ==> Aktion ausführen, Fertig, PRG "Spuelen" bis zum nächsten Aufruf abgearbeitet und das andere erledigt
  • nach erneuter Zeit t2 wird das PRG "Spuelen" erneut aufgerufen und es soll wieder bei t1 beginnen usw...

Also:

Ich muss doch den Timer einmalig instantizieren mit

Code:
FBSpuelzeit
(
PT := t_spuelzeit);     [B]==Nur hier wird der Eingangswert (FBSpueltimer.IN) des Timers verarbeitet[/B]==

und nach n.ter Bedingung:

Code:
IF b_Freigabe_spuelen_timer (*spülzeit starten*)
THEN
 FBSpuelzeit.IN := TRUE;   
 b_interne_freigabe_timer_start :=TRUE;  
ELSE
 (*FBSpuelzeit.IN := FALSE;*)  ;
END_IF

IF FBSpuelzeit.Q
THEN
 b_Freigabe_spuelen_timer:=FALSE;
END_IF  

[B]== Hier ist der Haken: FBSpuelzeit.Q ist immernoch false, weil du den Timer nach FBSpuelzeit.IN := TRUE noch nicht wieder aufgerufen hast==[/B]
[B]== D.H. diese Bedingung wird im selben Zyklus wahr, indem du deine Spülzeit gestartet hast==[/B]
[B]== Weil du weiter oben b_internefreigabe_timer_start auf TRUE gesetzt hast, aber FBSpuelzeit.Q immernoch FALSE ist==[/B]

einmalig starten (Flanke toggeln) und das habe ich doch nicht richtig getan, aber wie dann? Also Ziel ist, Timer starten. Gemäß deines Hinweises "weil du den Timer nach FBSpuelzeit.IN := TRUE noch nicht wieder aufgerufen hast=="
wie soll ich denn den Timer dann erneut aufrufen, also zum starten?

Achso, ich erwarte kein fertiges Programm, ich will es verstehen :)

Grüße
 
Zurück
Oben