TIA TONR aktualisiert Zeit nicht

BloodyMary

Level-2
Beiträge
27
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich versuche mit gerade an einer Schrittkette in SCL. Leider habe ich das Problem, dass in den aufgerufenen einzelnen Schrittbausteinen die Zeit nicht aktuallisiert wird.
Testweise habe ich einen Datenbaustein angelegt, wo ich vier Zeiten speichern kann.

Wenn ich nun das erste mal Werte in die Zeiten eintrage, z.B. für alle t#5s. Dann wird die Zeit von 5s für alle Schritte übernommen. Wenn ich jetzt aber den Automatikbetrieb ausschalte und die Werte im Datenbaustein überschreibe mit t#6s, dann wird beim nächsten Aufruf der einzelnen Schritte die Zeit aus dem Datenbaustein NICHT übernommen und er arbeitet weiter mit dem 5s.

So langsam bin ich mit meinem Latein am Ende und hoffe auf euer Schwarmwissen.


Automatik_FB:
Code:
#R_TRIG_Anwahl_Automatik(CLK := "UC20_PAE_DB".Hand_Auto);
#F_TRIG_Anwahl_Manuell(CLK := "UC20_PAE_DB".Hand_Auto);

IF "UC20_PAE_DB".Hand_Auto AND #R_TRIG_Automatik_Start.Q THEN
    #Schrittkette_Aktiv := TRUE;
    #Aktiver_Schritt := 0;
    #Schritt_aktiv_0 := TRUE;
ELSIF #F_TRIG_Anwahl_Manuell.Q THEN
    #Schrittkette_Aktiv := FALSE;
    #Aktiver_Schritt := 0;
END_IF;

#R_TRIG_Schritt_aktiv_1(CLK := #Schritt_aktiv_1);
#R_TRIG_Schritt_aktiv_2(CLK := #Schritt_aktiv_2);
#R_TRIG_Schritt_aktiv_3(CLK := #Schritt_aktiv_3);
#R_TRIG_Schritt_aktiv_4(CLK := #Schritt_aktiv_4);
#R_TRIG_Schritt_aktiv_5(CLK := #Schritt_aktiv_5);

// Start- / Stop-Taster
#R_TRIG_Automatik_Start(CLK := "UC20_PAE_DB".Automatik_Start);
#R_TRIG_Automatik_Stop(CLK := "UC20_PAE_DB".Automatik_Stop);


IF #Schrittkette_Aktiv THEN
    
    CASE #Aktiver_Schritt OF
        0:
            #Rezeptschritt_0(Schritt_aktiv:=#Schritt_aktiv_0,
                             Nächster_aktiv:=#Schritt_aktiv_1,
                             Schrittnummer:=#Aktiver_Schritt);
        1:
            #Rezeptschritt_1(Timer_In := #Schrittkette_Aktiv,
                             Timer_R := #R_TRIG_Schritt_aktiv_1.Q,
                             schrittzeit_time:="DB".Zeit1,
                             Schritt_aktiv:=#Schritt_aktiv_1,
                             Nächster_aktiv:=#Schritt_aktiv_2,
                             Schrittnummer:=#Aktiver_Schritt);
            
        2:
            #Rezeptschritt_2(Timer_In := #Schrittkette_Aktiv,
                             Timer_R := #R_TRIG_Schritt_aktiv_2.Q,
                             schrittzeit_time:="DB".Zeit2,
                             Schritt_aktiv:=#Schritt_aktiv_2,
                             Nächster_aktiv:=#Schritt_aktiv_3,
                             Schrittnummer:=#Aktiver_Schritt);
            
        3:
            #Rezeptschritt_3(Timer_In := #Schrittkette_Aktiv,
                             Timer_R := #R_TRIG_Schritt_aktiv_3.Q,
                             schrittzeit_time:="DB".Zeit3,
                             Schritt_aktiv:=#Schritt_aktiv_3,
                             Nächster_aktiv:=#Schritt_aktiv_4,
                             Schrittnummer:=#Aktiver_Schritt);
            
        4:
            #Rezeptschritt_4(Timer_In := #Schrittkette_Aktiv,
                             Timer_R := #R_TRIG_Schritt_aktiv_4.Q,
                             schrittzeit_time:="DB".Zeit4,
                             Schritt_aktiv:=#Schritt_aktiv_4,
                             Nächster_aktiv:=#Schritt_aktiv_5,
                             Schrittnummer:=#Aktiver_Schritt);
            
        5:
            #Rezeptschritt_5(Timer_In := #Schrittkette_Aktiv,
                             Timer_R := #R_TRIG_Schritt_aktiv_5.Q,
                             Schritt_aktiv:=#Schritt_aktiv_5,
                             Nächster_aktiv:=#Schritt_aktiv_6,
                             Schrittnummer:=#Aktiver_Schritt);
            
    END_CASE;
    
END_IF;

    IF #R_TRIG_Anwahl_Automatik.Q OR #F_TRIG_Anwahl_Manuell.Q THEN
        #Aktiver_Schritt := 0;
        #Rezept_Fertig := FALSE;
        #Initialisieren := TRUE;
        #Initialisieren_Fertig := FALSE;
        #Schritt_aktiv_0 := FALSE;
        #Schritt_aktiv_1 := FALSE;
        #Schritt_aktiv_2 := FALSE;
        #Schritt_aktiv_3 := FALSE;
        #Schritt_aktiv_4 := FALSE;
        #Schritt_aktiv_5 := FALSE;
        #Schritt_aktiv_6 := FALSE;
        #Schritt_aktiv_7 := FALSE;
        #Schritt_aktiv_8 := FALSE;
        #Schritt_aktiv_9 := FALSE;
        #Schritt_aktiv_10 := FALSE;
        #Schritt_aktiv_11 := FALSE;
        #Schritt_aktiv_12 := FALSE;
        #Schritt_aktiv_13 := FALSE;
        #Schritt_aktiv_14 := FALSE;
        #Schritt_aktiv_15 := FALSE;
        #Schritt_aktiv_16 := FALSE;
        #Schritt_aktiv_17 := FALSE;
        #Schritt_aktiv_18 := FALSE;
        #Schritt_aktiv_19 := FALSE;
        #Schritt_aktiv_20 := FALSE;
        #Schritt_aktiv_21 := FALSE;
        #Schritt_aktiv_22 := FALSE;
        #Schritt_aktiv_23 := FALSE;
        
        
        
    END_IF;

Rezeptschritt-FB:
Code:
#Timer_PT := DINT_TO_TIME(IN := INT_TO_DINT(IN := #i_Schrittdaten_Soll.Mischzeit) * 1000);


#Schrittzeit(IN := #Timer_In,
             R := #Timer_R,
             PT := #schrittzeit_time,
             Q => #Schrittzeit_abgelaufen,
             ET => #Abgelaufene_Zeit);


IF #Schrittzeit.Q OR #Schrittnummer = 0 THEN
    #Schritt_Fertig := TRUE;
    #Nächster_aktiv := TRUE;
    #Schritt_aktiv := FALSE;
    #test := FALSE;
    #Schrittnummer := #Schrittnummer + 1;
ELSE
    #Schritt_aktiv := TRUE;
    #Nächster_aktiv := FALSE;
    #Schritt_Fertig := FALSE;
END_IF;
 
Zeiten niemals in einer Schrittkette ansteuern, sondern nur abfragen (xxx.Q bzw. xxx.ET).
Die Ansteuerung der Zeiten außerhalb der Schrittkette (also, dass die Zeiten immer bearbeitet werden).

Hintergrund: Du hast sonst keinen Flankenwechsel an der Zeit bei Schrittwechsel.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Flankenwechsel funktioniert ja. Die Zeit wird ja hochgezählt. Aber er aktuallisiert nach dem ersten Durchlauf der Schrittkette nicht mehr die neue Vorgabe Schrittzeit.
 
Hintergrund: Du hast sonst keinen Flankenwechsel an der Zeit bei Schrittwechsel.
Das war die Antwort auf deine Frage - warum versuchst du es nicht erst bevor du weiter schreibst ?
Der Kommentar von Peter bezieht sich auf einen von vielen IMMER WIEDER gern gemachten Fehler mit den Timern innerhalb einer bedingten Bearbeitung. Der Timer möchte Ereigniswechsel mitbekommen ...
 
Leider scheine ich es nicht hin zu bekommen. Könntet ihr mir vielleicht bitte ein Beispiel geben, wie es richtig wäre?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
was passiert?
  • ein beliebiger Schritt ist aktiv, Timer.IN ist TRUE, weil Schrittkette_aktiv=TRUE
  • Zeit läuft ab, nächster Schritt wird aktiviert
  • Schrittkette_aktiv ist immer noch TRUE ohne Zustandswechsel
gesehen?
 
Leider scheine ich es nicht hin zu bekommen. Könntet ihr mir vielleicht bitte ein Beispiel geben, wie es richtig wäre?
Du musst den Timer beim verlassen deines Aktiven Schrittketten Steps "Timer_In" auf FALSE legen....sonst bleibt er TRUE und im nächsten Step passiert nichts!

Da du keine Transition programmiert hast, welche das ablaufen der Zeit überwacht, wird das schwierig.

In Graph7 hättest du das sofort bemerkt.
 
Leider scheine ich es nicht hin zu bekommen. Könntet ihr mir vielleicht bitte ein Beispiel geben, wie es richtig wäre?
Du musst, wie es Peter schon geschrieben hat, den kompletten Timer-Aufruf außerhalb der Schrittkette stehen haben. Du darfst innerhalb der Schrittkette dann nur die Ausgänge dieses Timers ABFRAGEN. Alle Zuweisungen müssen außerhalb der bedingten Bearbeitung stattfinden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo BloodyMary,

hier mal ein Auszug aus einer Schrittkette. Beachte den Schritt Teil_Nest.
Bitte nicht wundern, warum ich in der Case Abfrage nur GOTOs drinnhabe, so bilde ich die Sprungliste von FUP nach (leichteres Einfügen und tauschen von Schritten) und meine Schrittkette hat einige der Möglichen von Graph-Ketten.

Code:
REGION Vorbereitung
  
    // Reset Schritnummer Kette
    IF #Reset THEN
        #S_Nr := 0;
        #S_Nr_Symb := 0;
    END_IF;
  
    // Reset von nur in Schrittkette gesetzten Variablen
    "Betrieb".Stat_1.Auto_wait := FALSE;
  
    // Weiterschaltbedingung Auto bzw. S+1
    #weiter := #Btr_Auto OR #"S+1";
  
    // Teil im Nest vorhanden?
    #TON_Teil_Nest(IN:="Operand",    // Operand einsetzen!
                 PT:=t#1000ms);
  
END_REGION

REGION Sprungtabelle
    IF #ein THEN
        CASE #S_Nr OF
            0: GOTO Init;
            1: GOTO Robot_weg;
            2: GOTO Teil_Nest;
            3: GOTO Tisch_1;
            4: GOTO Teil_Nest;
            5: GOTO Tisch_2;
          
        END_CASE;
    END_IF;
RETURN;     // Bausteinende
END_REGION

REGION Schritte
  
Init:               // Schrittname / Label
#S_Nr_Symb := 1;    // Symbolische Schrittnummer
#Dummy := 1;        // Aktion
IF "1" THEN         // Transition
    #S_Nr += 1;     // Schrittnummer erhöhen
END_IF;
RETURN;             // Schrittende

Teil_Nest:          // Teil in Nest
#S_Nr_Symb := 26;
#Dummy := 0;
IF #TON_Teil_Nest.Q AND #weiter THEN   // #weiter ist Weiterschaltbedingung Auto bzw. S+1
    #S_Nr += 1;
END_IF;
RETURN;
 
was passiert?
  • ein beliebiger Schritt ist aktiv, Timer.IN ist TRUE, weil Schrittkette_aktiv=TRUE
  • Zeit läuft ab, nächster Schritt wird aktiviert
  • Schrittkette_aktiv ist immer noch TRUE ohne Zustandswechsel
gesehen?
Ach so, das bedeutet, beim ersten Durchlauf hat der Timer die Zeit bekommen und wurde angeschaltet. Bei den nachfolgenden Durchläufen, war der Timer an und hat wegen des nicht vorhandenen Flankenwechsels die neue Zeit nicht übernehmen können.
Es wurde dann nur immer der Timer auf 0 resettet.
 
Ach so, das bedeutet, beim ersten Durchlauf hat der Timer die Zeit bekommen und wurde angeschaltet. Bei den nachfolgenden Durchläufen, war der Timer an und hat wegen des nicht vorhandenen Flankenwechsels die neue Zeit nicht übernehmen können.
Es wurde dann nur immer der Timer auf 0 resettet.

Super!

Fast verstanden: Es wurde dann nur immer der Timer auf 0 resettet. -> nicht ganz so, der Timer ist einfach abgelaufen.
 
Zurück
Oben