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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Timertrick: Zeit Messen, Anhalten, Weiterlaufen lassen,..

  1. #1
    Registriert seit
    12.08.2006
    Beiträge
    67
    Danke
    0
    Erhielt 69 Danke für 6 Beiträge

    Blinzeln


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute, ich bin auf einen kleinen Trick für Zusatztimer gestoßen:

    CPU-Zykluszeit messen und im DINT aufsummieren ergibt einen ms-DINT Wert (entspricht IEC-Format, bis zu 23Tage!).

    Auf diese Weise kann man Zeiten einfach messen und die Messung beliebig anhalten und weiterlaufen lassen. Der letzte Zeitwert übersteht auch einen Steuerspannungsausfall (Timer mach da weiter wo CPU vor Spannungsausfall stand).

    Habe mir so eine Funktion für 100 zusätzliche Timer (in einem DB) geschrieben. Die Zykluszeitmessung erfolgt durch die Sytemzeitabfrage mit SFC1, (Auswertung der Minutenzeit). Funktioniert als anhaltbare T_ON-Zeit und zeigt mir die Istzeit ms-genau an.

    Was meint Ihr dazu?
    Zitieren Zitieren Timertrick: Zeit Messen, Anhalten, Weiterlaufen lassen,..  

  2. #2
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Zeig doch mal Deine Lösung. Lustiger weise habe ich gestern Abend gerade an der gleichen Geschichte gebastelt.

    Also hier meine erste Version:
    Code:
    FUNCTION FC4 : BOOL
     
    VAR_INPUT
      IN : BOOL;
      PT : DINT;
    END_VAR
    
    VAR
      myDT  : DT; 
      myTOD     : TOD;
      myTime    : DINT;
      DevNull   : INT;
    END_VAR
    
    VAR_IN_OUT
      ET : DINT;
      LT : DINT;
    END_VAR
    
    BEGIN
      DevNull := READ_CLK(CDT:=myDT);  
      myTOD   := DT_TO_TOD(myDT); 
      myTime  := TOD_TO_DINT(myTOD);
      
      FC4 := FALSE;
      IF IN THEN
        IF ET >= PT THEN
          FC4 := TRUE;
        ELSE
          ET  := ET + (myTime - LT);
        END_IF;
      ELSE
        ET := 0;
      END_IF;
      LT := myTime;      
    END_FUNCTION;
    Also noch ohne Kommentare da noch ganz frisch. Eigentlich bräuchte man das ET nicht unbedingt statisch zu halten. Leider muss ich noch eine IN_OUT variable dazu setzen um eine Flanke von IN zu erzeugen. Ich habe hier im Forum gelesen das es bei dem Ergebnis von READ_CLK einen Überlauf geben kann. Das muss ich auch noch abchecken.

    //Edit: An sich finde ich den Trick eher Lahm. Da es ja TON/TOF gibt. Ich wollte mir das ganze Elend nur betrachten das die S7 Programmierer ertragen müssen wenn sie auf FBs verzichten und die IN_OUT Schiene fahren.
    Geändert von zotos (25.08.2007 um 15:11 Uhr)
    If you open your Mind too much, your Brain will fall out.

  3. #3
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.626
    Danke
    377
    Erhielt 801 Danke für 642 Beiträge

    Standard

    Es lautet als du ein S7 programmierst.
    Sprichst du vielleicht über die FC80 "TONR" die du in der TI-S7 Bibliothek finden kannst ?
    Für dieses brauchst du nicht SFC1 "READ_CLK" zu verwenden. Du kannst das #OB1_PREV_CYCLE in OB1 einfach verwenden.

    edit:
    Eigentlich merkwürdig, das es gibt kein retentive IEC Timer.
    Ich schätze, es ist warum der FC80 Timer zu finden ist.
    Geändert von JesperMP (25.08.2007 um 09:07 Uhr)
    Jesper M. Pedersen

  4. #4
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    So ich habe gerade mal eine zweite Version erstellt. Mit zwei Modi 0=TON, 1=TOF. Den Überlauf der Systemzeit habe ich auch noch nicht gesehen und auch nicht testen können (ich werde hier noch mal im Forum suchen).
    Das ganze ist nur eine Fingerübung, recht minimal im Umfang daher aber auch genügsam.

    Code:
    FUNCTION FC4 : BOOL
     
    VAR_INPUT
      MODE      : INT;  (* Timermode 0=TON, 1=TOF *)
      IN        : BOOL; (* Signal *)
      PT        : DINT; (* Preset Time *)
    END_VAR
    
    VAR_IN_OUT
      ST        : DINT; (* Start Time *)
    END_VAR
    
    VAR_TEMP
      myDT      : DT; 
      myTOD     : TOD;
      myTime    : DINT;
      Fault     : INT;  (* ToDo: error logging *)
      RetVal    : BOOL; (* Function Output *)
      ET        : DINT; (* Elaps Time *)
    END_VAR
    
    BEGIN
      Fault   := READ_CLK(CDT:=myDT);  
      myTOD   := DT_TO_TOD(myDT); 
      myTime  := TOD_TO_DINT(myTOD);
    
      (* Set Start Time *)
      IF (MODE = 0 AND NOT IN) OR (MODE <> 0 AND IN) THEN
          ST := myTime; 
      END_IF;
      
      (* Calculate Elapse Time *)    
      ET := myTime - ST;
    
      (* Switch Mode *)
      IF MODE <> 0 THEN
        (* Mode: TOF *)
        IF NOT IN THEN      
          IF ET >= PT THEN
            RetVal := FALSE;
          ELSE
            ET  := ET + (myTime - ST);      
          END_IF;
        ELSE
          RetVal := TRUE;  
        END_IF;
      ELSE
      (* Mode: TON //default*)
        RetVal := FALSE;
        IF IN THEN  
          IF ET >= PT THEN
            RetVal := TRUE;
          ELSE
            ET  := ET + (myTime - ST);
          END_IF;
        END_IF;
      END_IF;
      
      FC4 := RetVal;
    END_FUNCTION;
    If you open your Mind too much, your Brain will fall out.

  5. #5
    Registriert seit
    12.08.2006
    Beiträge
    67
    Danke
    0
    Erhielt 69 Danke für 6 Beiträge

    Standard

    Als Anhang der Code im PDF-Format.
    372 byte für den FB, 1050 für den zugehörigen DB.
    Freigabe und Start zusammen angesteuert ergibt normale Einschaltverzögerung.
    "Istzeit" kann bei Bedarf auch nach Time umdeklariert werden.
    Angehängte Dateien Angehängte Dateien

  6. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    Zitat Zitat von Hartmut Lux Beitrag anzeigen
    Was meint Ihr dazu ?
    Hallo Hartmut,
    das mit deiner Indexierung (Timer 0 .. 99) wird so nicht funktionieren.
    Wenn du deinen FB nochmals aufrufst (für einen neuen Timer), dann wirst du dazu aufgefordert einen neuen DB zu nehmen (anzulegen). Das heißt, den Index kannst du dir sparen. Der bildet sich automatisch durch zusätzliche DB's (ähnlich wie beim IEC-Timer SFB4, SFB5).

  7. #7
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Ein FB?
    Dann kann ich ja gleich die IEC Timer TON TOF nehmen.
    Wobei ich bei einem FC auch den von JesperMP genannten aus der lib nehmen kann.
    If you open your Mind too much, your Brain will fall out.

  8. #8
    Registriert seit
    12.08.2006
    Beiträge
    67
    Danke
    0
    Erhielt 69 Danke für 6 Beiträge

    Standard

    @ Larry Laffer: Das mit der Inidizierung der Timer funktioniert definitiv. Der Baustein ist getestet und im Einsatz. Man kann einen FB auch mehrmals mit dem gleichen DB aufrufen. Es ändert sich eben nur die Timer-Nr.

    Der Vorteil ist, auch gegenüber Siemens(@ Zotos),daß man nur einen DB pro hundert Timer hat und nicht 100.

    Der generelle Vorteil dieser Timer aber ist: man kann die Zeit belibig unterbrechen und weiterlaufen lassen ohne ein zusätzliches "Umschaufeln" des Istwertes. Z.B. gut für zeitbedingtes Abschalten, wenn das System mal zwischendurch aus ist. Der Zeitwert läuft sozusagen als Rampe deren Hochlauf zwischendurch angehalten werden kann.

    Das Aufsummieren der Zykluszeit ist dabei einfacher und sicherer als eine Berechnung der Zeitdifferenz aus der Systemzeit.

    Als Anhang nochmal der FB statt dem Quelltext(als Mini-Bibliothek).
    Angehängte Dateien Angehängte Dateien

  9. Folgender Benutzer sagt Danke zu Hartmut Lux für den nützlichen Beitrag:

    jokey (05.09.2008)

  10. #9
    Registriert seit
    12.08.2006
    Beiträge
    67
    Danke
    0
    Erhielt 69 Danke für 6 Beiträge

    Standard

    Nochmal zur Erklärung: solche FB's sollten aus Speichergründen kein Ersatz für die S5-Timer sein, sondern sind gut für verstellbare bzw. berechnete Zeiten. Das Thema ist nur eine alternative Möglichkeit zu Zählern und Differenzberechnungen.

  11. #10
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    ...
    schon verstanden.
    Ich hätte es nur als Multi-Instanz-FB aufgezogen (hatte ich ja schon geschrieben).
    Selber habe ich auch einen ähnlichen FB für die Laufzeit-Erfassung (Betriebszeit) von Aggregaten. Er ist halt nur ahnlich angelegt wie die Siemens System-Bausteine.

    Wie auch immer, es läßt sich, je nachdem wie man es aufzieht ja als Ergänzung zu den vorhandenen Funktionen machen ...

Ähnliche Themen

  1. IEC-Zeiten unterbrechen und weiterlaufen lassen
    Von simaticfan im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 26.07.2011, 12:44
  2. Zeit Messen?!
    Von MikeJ im Forum Simatic
    Antworten: 22
    Letzter Beitrag: 02.12.2010, 20:00
  3. Zeit anhalten
    Von Glitsch Master im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 22.09.2009, 20:20
  4. Zeit mit einem Timer anhalten und weiterlaufen lassen
    Von Holger Levetzow im Forum Simatic
    Antworten: 17
    Letzter Beitrag: 24.10.2008, 20:52
  5. Zeit Zählen, anhalten und weiterzählern
    Von Waelder im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 07.06.2005, 17:36

Lesezeichen

Berechtigungen

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