Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 3 von 3

Thema: Twincat Beckhoff, TP Reset nach erneutem Aufrufe

  1. #1
    Registriert seit
    08.06.2015
    Beiträge
    2
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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
    Zitieren Zitieren Twincat Beckhoff, TP Reset nach erneutem Aufrufe  

  2. #2
    Registriert seit
    24.02.2009
    Beiträge
    1.242
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard

    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);     ==Nur hier wird der Eingangswert (FBSpueltimer.IN) des Timers verarbeitet==
     
     ==Soweit OK==
    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  
    
    == Hier ist der Haken: FBSpuelzeit.Q ist immernoch false, weil du den Timer nach FBSpuelzeit.IN := TRUE noch nicht wieder aufgerufen hast==
    == D.H. diese Bedingung wird im selben Zyklus wahr, indem du deine Spülzeit gestartet hast==
    == Weil du weiter oben b_internefreigabe_timer_start auf TRUE gesetzt hast, aber FBSpuelzeit.Q immernoch FALSE ist==
    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 *)
    ==bEND_Spuelen ist sofort nach der Startfreigabe TRUE (s.o.)==
    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.
    Sänd from mei Kombjudder mitse Dastadurr.

  3. #3
    Newbie_frank ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    08.06.2015
    Beiträge
    2
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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);     ==Nur hier wird der Eingangswert (FBSpueltimer.IN) des Timers verarbeitet==
    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  
    
    == Hier ist der Haken: FBSpuelzeit.Q ist immernoch false, weil du den Timer nach FBSpuelzeit.IN := TRUE noch nicht wieder aufgerufen hast==
    == D.H. diese Bedingung wird im selben Zyklus wahr, indem du deine Spülzeit gestartet hast==
    == Weil du weiter oben b_internefreigabe_timer_start auf TRUE gesetzt hast, aber FBSpuelzeit.Q immernoch FALSE ist==
    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

Ähnliche Themen

  1. [TwinCAT 2]: Reset EtherCAT Devices
    Von AleSantaCruz im Forum CODESYS und IEC61131
    Antworten: 6
    Letzter Beitrag: 29.08.2014, 10:53
  2. C7-633 Datum/Uhrzeit reset nach Spannungslos
    Von -ASDF- im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 30.08.2012, 16:39
  3. Antworten: 8
    Letzter Beitrag: 30.08.2012, 10:56
  4. Antworten: 4
    Letzter Beitrag: 23.06.2009, 19:16
  5. FUP - Ausgang nach Reset sicher in "AUS"
    Von Teletrabi im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 06.12.2007, 19:53

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •