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

Ergebnis 1 bis 8 von 8

Thema: Seltsames Verhalten der TON-Timer bei der S7-1200

  1. #1
    Registriert seit
    29.03.2004
    Beiträge
    5.731
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Um einen Zeitimpuls (z.B. Sekundenimpuls) zu generieren, habe ich bei der 300/400er oder auch bei den
    Codesys-Steuerungen bisher oft einen TON-Timer verwendet, der am Eingang IN mit den negierten eigenen Ausgang Q
    beschaltet ist. Der Ausgang Q steht dann nach Ablauf der Zeit für genau einen Zyklus auf true.

    Bei der S7-1200 funktioniert das nicht mehr, bzw. ist es von der Programmierung abhängig ob es funktioniert.

    Ich habe mir ein kleines Testprogramm mit 4 verschiedenen Varianten von TON-Aufrufen geschrieben, aufgerufen im OB1.
    Um die verschiedenen Varianten von der Funktion her vergleichen zu können, wird wenn der Ausgang Q eines Timers auf true
    steht eine Integer-Variable inkrementiert.

    Code:
    FUNCTION_BLOCK "IECTimerTest"
    { S7_Optimized_Access := 'TRUE' }
    VERSION : 0.1
       VAR_INPUT 
          "PT" : Time := T#3s;   // Zeitwert für alle Timer
       END_VAR
    
       VAR_OUTPUT 
          "TON1_CNT" : Int;
          "TON2_CNT" : Int;
          "TON3_CNT" : Int;
          "TON4_CNT" : Int;
       END_VAR
    
       VAR 
          "TON1" : TON_TIME;
          "TON2" : TON_TIME;
          "TON3" : TON_TIME;
          "TON4" : TON_TIME;
          "TON2_Q" : Bool;
       END_VAR
    BEGIN
    	(* Test Timer 1 
    	 * Abfrage Q nach Timeraufruf, Zähler zählt nicht
    	 *)
    	#TON1(IN:=NOT #TON1.Q, PT:= #PT);
    	IF #TON1.Q THEN
    	  #TON1_CNT := #TON1_CNT + 1;
    	END_IF;
    	
    	
    	(* Test Timer 2
    	 * Q über Hilfsvariable auf Eingang, Zähler zählt
    	 *)
    	#TON2(IN:=NOT #TON2_Q, PT:= #PT, Q => #TON2_Q);
    	(* Timer 2 Zählimpuls, zählt *)
    	IF #TON2.Q THEN
    	  #TON2_CNT := #TON2_CNT + 1;
    	END_IF;
    	
    	
    	(* Test Timer 3
    	 * Abfrage Q vor dem Timeraufruf, Zähler zählt
    	 *)
    	IF #TON3.Q THEN
    	  #TON3_CNT := #TON3_CNT + 1;
    	END_IF;
    	#TON3(IN:=NOT #TON3.Q, PT:= #PT);
    	
    	
    	(* Test Timer 4
    	 * wie 1, aber mit Zeitverzögerung zwischen TON-Aufruf
    	 * und der Abfrage des Ausgangs Q. Je größer die Zeit für Wait, desto
    	 * schneller zählt der Zähler.
    	 *)
    	#TON4(IN:=NOT #TON4.Q, PT:= #PT);
    	"Wait"(T := t#10ms);
    	IF #TON4.Q THEN
    	  #TON4_CNT := #TON4_CNT + 1;
    	END_IF;
    END_FUNCTION_BLOCK
    Die Funktion Wait wartet in einer Schleife bis die parametrierte Zeit abgelaufen ist:

    Code:
    FUNCTION "Wait" : Void
    { S7_Optimized_Access := 'TRUE' }
    VERSION : 0.1
       VAR_INPUT 
          "PT" : Time;
       END_VAR
    
       VAR_TEMP 
          "starttime" : DTL;
          "acttime"  : DTL;
          "diff" : Time;
          "RD_SYS_T_RET_VAL" : Int;
       END_VAR
    BEGIN
    	(* Verweilt in der Funktion bis die an PT parametrierte Zeit abgelaufen ist. *)
    	#RD_SYS_T_RET_VAL := RD_SYS_T(OUT => #starttime);
    	REPEAT
    	  #RD_SYS_T_RET_VAL := RD_SYS_T(#acttime);
    	  #diff := T_DIFF(IN1 := #acttime, IN2 := #starttime);
    	UNTIL #diff >= #PT END_REPEAT;
    	
    END_FUNCTION

    Ergebnis:

    * Timer Variante 1
    Abfrage Q nach dem Timeraufruf. Zähler zählt überhaupt nicht bzw. hochsporadisch.

    * Timer Variante 2
    Timer-Ausgang Q über Hilfsvariable auf Eingang zurückgelegt. Zähler zählt.

    * Timer Variante 3
    Abfrage Timer-Ausgang Q vor dem Timeraufruf. Zähler zählt.

    * Timer Variante 4
    Grundsätzlich wie Variante 1, aber mit Zeitverzögerung zwischen TON-Aufruf und der Abfrage des Ausgangs Q.
    Je größer die Zeit für Wait, desto schneller zählt der Zähler.


    Jetzt versuche ich mir dieses Verhalten irgendwie zu erklären.
    Die einzige Möglichkeit die mir einfällt wäre, dass die TON-Timer bei der 1200 nicht im OB1 Zyklus wenn sie vom Programmablauf
    an der Reihe sind, sondern unabhängig davon in einer Art internen Task aufgerufen werden.
    Das wirft meine Vorstellung vom geordneten Ablauf in einer SPS etwas durcheinander.

    Gibt es noch eine andere Erklärung für dieses Verhalten?

    Vielleicht kann das ja jemand mit TIA V12, einem neueren Firmwarestand oder sogar mit einer 1500er testen.

    Meine Testumgebung:
    TIA V11 Sp3 Upd4
    1214 DC/DC/Relais HW2, FW V2.2.0
    Zitieren Zitieren Seltsames Verhalten der TON-Timer bei der S7-1200  

  2. Folgende 2 Benutzer sagen Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    rostiger Nagel (12.05.2013),voni_1 (15.04.2014)

  3. #2
    Registriert seit
    13.10.2007
    Beiträge
    12.027
    Danke
    2.784
    Erhielt 3.268 Danke für 2.156 Beiträge

    Standard

    Sag mal Thomas, hast du das mal in einer andern Sprache ausprobiert?
    Der SCL Editor hatte doch in V11 so seine Macken?
    - - -
    Wer als Werkzeug nur einen Hammer hat, sieht in jedem Problem einen Nagel.

  4. #3
    Avatar von Thomas_v2.1
    Thomas_v2.1 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.03.2004
    Beiträge
    5.731
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    In FUP ist das Verhalten genauso wie mit SCL, wobei ich da nur Variante 1 probiert habe.
    Ich habe auch nochmal mit dem TIA ein identisches Testprogramm für die 300/400er erstellt, da ist das Verhalten wie immer - also es funktioniert problemlos.

    Ich habe das Testprogramm jetzt eine Weile durchlaufen lassen, und Variante 2 zeigt auch Aussetzer in der Auswertung. Irgendwie scheint der TON nicht zu mögen dass man ihn mit seinen eigenen Daten als Parameter beschaltet.

  5. #4
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Ich bin mir nicht sicher, doch ich meine, dieses Verhalten gibt es auch schon bei S7-300, da funktioniert die direkte Rückführung nur sporadisch, aber nicht 100% sicher. Jedenfalls nutze ich da auch schon lange generell einen Zwischen-Merker, um den Ausgang auf den Eingang zurückzuführen.
    Oder war das nur in PLCSIM??? Oder ist es abhängig von der CPU und der Firmwareversion?

    Harald
    Geändert von PN/DP (13.05.2013 um 00:46 Uhr)
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  6. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    Blockmove (13.05.2013)

  7. #5
    Avatar von Thomas_v2.1
    Thomas_v2.1 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.03.2004
    Beiträge
    5.731
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Das ist jetzt beim TON ein Problem was sich wohl einfach umschiffen ließe.

    Ich habe nur Bedenken das sich solche negativen Seiteneffekte auch bei anderen Programmteilen wiederfinden.

    Eine TON-Instanz ist ja erstmal eine Struktur mit Variablen. Theoretisch spricht überhaupt nichts dagegen es so zu programmieren, denn TON1.Q sollte eine BOOL-Variable wie jede andere Variable auch sein. Warum sollte man hierfür eine weitere Variable verwenden?
    Das merkwürdige ist ja, dass man wenn man den Instanz-DB online beobachtet sehen kann wie die Zeiten nach Ablauf von PT aktualisiert werden obwohl die Abfrage auf Q nicht funktioniert.

  8. #6
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Ich kann mir nur vorstellen, daß Siemens da irgendeinen Mechanismus eingebaut hat, der den Timer am Laufen und Rücksetzen hält unabhängig vom Anwenderprogramm. Vollkommen azyklisch zum OB1.

    Vielleicht ist der Ausgang TONx.Q nicht einen ganzen Zyklus lang true, sondern nur solange, wie auflösungsabhängig die abgelaufene Zeit gleich der Vorgabezeit ist?
    Vielleicht ist TONx.Q gar keine Variable, sondern eine Methode, die nur ein Ergebnis liefert, wenn sie aufgerufen wird?

    Wie ist das eigentlich, wenn das Programm rund um den Timer nur einmal/wenige male(/oder nie) aufgerufen wird und noch vor Ablauf des Timers dann immer übersprungen wird und nur noch beobachtet? Startet er dann trotzdem neu?

    (ich weiß, das klingt jetzt sehr verworren, doch es ist schon spät)

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  9. #7
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.476
    Danke
    1.140
    Erhielt 1.238 Danke für 971 Beiträge

    Standard

    Ich kenn das Verhalten auch von einer 300er.
    Direkte Rückführung nutze ich aus diesem Grund auch nie.

    Gruß
    Dieter

  10. #8
    Registriert seit
    24.04.2013
    Beiträge
    309
    Danke
    23
    Erhielt 160 Danke für 88 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi

    vielleicht hilf euch diese Erklärung

    Step 7 Basic Aufruf Timer in Funktionsbaustein

    PN/DP hat vermutlich Recht. So wie sich das Teil verhält, scheint es sich um eine Methode zu handeln, die ein Ergebnis liefert wenn sie aufgerufen wird. ET und Q sind, um es mal mit C# auszudrücken, Getter. TON, TOF und TP sind dann so was wie Setter. Und die Instanz ist vom Typ IEC_TIMER. Warum da SCL bei den statischen Instanzen TON als Typ anzeigt ist mir nun wieder schleierhaft. In FUP kann man sogar array [ 1..100] of IEC_TIMER anlegen. Oder ganz global im DB. Und diesen dann in KOP und FUP wie bei den alten BCD Timern überall wiederverwenden. (Aber immer schön die Instanzen auseinander halten -- vor allem zeitlich )
    Geändert von HelleBarde (14.05.2013 um 00:04 Uhr)

Ähnliche Themen

  1. Zählerabfrage bei der S7-1200?
    Von pinolino im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 20.04.2011, 11:39
  2. Datenbaustein bei der S7-1200
    Von pinolino im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 31.03.2011, 11:51
  3. Antworten: 1
    Letzter Beitrag: 20.09.2010, 11:20
  4. Seltsames Verhalten einer S7-312 bei Real-Addition
    Von yohfreaker im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 09.10.2009, 23:08
  5. Antworten: 11
    Letzter Beitrag: 14.07.2008, 23:20

Lesezeichen

Berechtigungen

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