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

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

Thema: Hilfe bei einer Zeitberechnung

  1. #1
    Registriert seit
    22.06.2013
    Beiträge
    39
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo ich habe folgendes Problem ich bin gerade dabei einen Baustein zu schreiben der als Eingangsvariablen die Anzahl der Einschaltzyklen pro Stunde und die Einschaltdauer enthalten soll. Als Ausgangsvariablen soll einfach ein bzw aus als bool ausgegeben werden. Der Baustein soll mir wenn die Anzahl der einschaltzyklen z.b 4 ist und die einschaltdauer 10 ist, 4 mal in der Stunde für 10 min einschalten und wieder ausschalten. Der Basustein muss auch noch überprüfen ob die eingaben von zyklusanzahl und dauer in einer Stunde überhaupt möglich sind, wenn dies nicht der Fall ist sollte er einen Ausgang fail setzten. Ich habe als Steuerung eine S7 315 2DP. Aktuelle systemzeit ohne Millisekunden und einen Taktmerker von 1 Minute sind in der Steuerung schon vorhanden. Ich habe schon viele Varianten versucht komme aber einfach auf keinen grünen Zweig. Ich wäre für jede Hilfe sehr dankbar.
    Zitieren Zitieren Hilfe bei einer Zeitberechnung  

  2. #2
    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 sochn0 Beitrag anzeigen
    ... Ich habe schon viele Varianten versucht komme aber einfach auf keinen grünen Zweig. Ich wäre für jede Hilfe sehr dankbar.
    Dann wäre jetzt mein Vorschlag :
    Du postest mal deine (nach deiner Meinung) beste/schönste Variante und dann schauen wir mal, wie wir weiter kommen ...

    Gruß
    Larry

  3. #3
    sochn0 ist offline Benutzer
    Themenstarter
    Registriert seit
    22.06.2013
    Beiträge
    39
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Also ich wollte das so lösen das ich die Anzahl der Einschaltzyklen durch 60 dividiere dann hab ich schon mal die einschaltzeitpunkte zu den Einschaltzeitpunkten zähle ich nun die Einschaltdauer dazu. Ich wollte dann mit dem Minutentaktmerker einen Zähler hochzählen lassen und dann mit vergleicher ein bzw ausschalten so die Theorie in der Praxis hab ich das leider nicht hinbekommen.

  4. #4
    Registriert seit
    13.09.2010
    Beiträge
    2.292
    Danke
    178
    Erhielt 375 Danke für 355 Beiträge

    Standard

    .
    @ TE
    Nun trau´dich doch mal und zeige uns deinen
    Entwurfs-Code (wie das Larry schon sagte).

    Dann geht es sicherlich weiter.

    Gruss
    kind regards
    SoftMachine

  5. #5
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 919 Danke für 740 Beiträge

    Standard

    Zitat Zitat von sochn0 Beitrag anzeigen
    wenn die Anzahl der einschaltzyklen z.b 4 ist und die einschaltdauer 10 ist, 4 mal in der Stunde für 10 min einschalten und wieder ausschalten.
    Soll es dann in Deinem Beispiel mit 3 oder mit 4 Pausen die Stunde ergeben?

    Also: 1. 10min EIN + 6,6min AUS + 10min EIN + 6,6min AUS + 10min EIN + 6,6min AUS + 10min EIN = 1h

    oder: 2. 10min EIN + 5min AUS + 10min EIN + 5min AUS + 10min EIN + 5min AUS + 10min EIN + 5min AUS = 1h



    Und ist dann z.B 6x10min schon ein Fehler oder geht das gerade noch durch?

  6. #6
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 919 Danke für 740 Beiträge

    Standard

    So würde ich das umsetzen (aber keine Stunde auf Genauigkeit beim Berechnen der Pausen getestet ):

    Code:
    FUNCTION_BLOCK "Impulse"
    TITLE =Variable Impulse je Stunde
    VERSION : 0.1
    
    
    VAR_INPUT
      Start : BOOL ;	// Ausgabe aktivieren	
      Anzahl : INT ;	
      Dauer : INT ;	// in min
      Synchron : BOOL ;	// 1: Aus- = Ein-Anzahl; 0: Aus- = Ein-Anzahl - 1
    END_VAR
    
    VAR_OUTPUT
      EIN : BOOL ;	
      AUS : BOOL ;	
      FAIL : BOOL ;	
    END_VAR
    
    VAR
      FM_Start : BOOL ;	
      FM_Fail : BOOL ;	
      FM_Timer_EIN : BOOL ;	
      FM_Timer_AUS : BOOL ;	
      Timer_EIN : "TP";	
      Timer_AUS : "TP";	
    END_VAR
    
    VAR_TEMP
      Pausen : INT ;	
      AUS_gesamt : INT ;	
      EIN_ms : TIME ;	
      AUS_ms : TIME ;	
      Start_Timer : BOOL ;	
      Start_Timer_EIN : BOOL ;	
      Start_Timer_AUS : BOOL ;	
    END_VAR
    
    
    BEGIN
    
    NETWORK
    TITLE =Fail
          L     #Anzahl; 
          L     0; 
          ==I   ; 
          O(    ; 
          L     #Dauer; 
          ==I   ; 
          )     ; 
          O(    ; 
          L     #Anzahl; 
          *I    ; // Gesamte EIN-Zeit
          L     60; 
          >=I   ; // mehr oder gleich (keine Pausen möglich!) als 60min?
          )     ; 
          =     #FAIL; 
          -D    ; // Differenz
          DTR   ; // in REAL wandeln
          ABS   ; // Absolutwert
          RND   ; // zurück in DINT
          T     #AUS_gesamt; // speichern
    
    NETWORK
    TITLE =EIN-Zeit
          L     #Dauer; 
          L     L#60000; // ms je min
          *D    ; 
          T     #EIN_ms; 
    
    NETWORK
    TITLE =Anzahl AUS-Zeiten
          L     #Anzahl; 
          U     #Synchron; 
          SPB   TPau; 
          +     -1; 
    TPau: T     #Pausen; 
    
    NETWORK
    TITLE =AUS-Zeit
          L     #AUS_gesamt; 
          L     L#60000; // ms je Minute
          *D    ; 
          L     #Pausen; 
          /D    ; // ms je Pause
          T     #AUS_ms; 
    
    NETWORK
    TITLE =Fail-Zeiten
          U    #FAIL; // im Fehlerfall
          SPBN E_Fa;
          L    1; // Impulse auf 1ms verkürzen und somit beenden
          T     #EIN_ms; 
          T     #AUS_ms;
    E_Fa: NOP  0;
    
    NETWORK
    TITLE =Timer starten?
          U     #Start; 
          UN    #FAIL; 
          =     #Start_Timer; 
    
    NETWORK
    TITLE =Startimpuls Timer_EIN
          U     #Start; 
          FP    #FM_Start; 
          O(    ; 
          U     #Fail; 
          FN    #FM_Fail; 
          )     ; 
          O(    ; 
          U     #Timer_AUS.Q; 
          FN    #FM_Timer_AUS; 
          )     ; 
          U     #Start_Timer; 
          =     #Start_Timer_EIN; 
    
    NETWORK
    TITLE =Timer_EIN
          CALL #Timer_EIN (
               IN                       := #Start_Timer_EIN,
               PT                       := #EIN_ms);
    
    NETWORK
    TITLE =Startimpuls Timer_AUS
          U     #Timer_EIN.Q; 
          FN    #FM_Timer_EIN; 
          U     #Start_Timer; 
          =     #Start_Timer_AUS; 
    
    NETWORK
    TITLE =Timer_Aus
          CALL #Timer_AUS (
               IN                       := #Start_Timer_AUS,
               PT                       := #AUS_ms);
    
    NETWORK
    TITLE =Ausgang EIN
          U     #Start_Timer; 
          U     #Timer_EIN.Q; 
          =     #EIN; 
    
    NETWORK
    TITLE =Ausgang AUS
          U     #Start_Timer; 
          U     #Timer_AUS.Q; 
          =     #AUS; 
    
    
    END_FUNCTION_BLOCK

  7. #7
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 919 Danke für 740 Beiträge

    Standard

    Mit TONs dürfte es sogar noch etwas einfacher sein:

    Code:
    FUNCTION_BLOCK "Impulse"
    TITLE =Variable Impulse je Stunde
    VERSION : 0.1
    
    
    VAR_INPUT
      Start : BOOL ;    // Ausgabe aktivieren    
      Anzahl : INT ;    
      Dauer : INT ;    // in min
      Synchron : BOOL ;    // 1: Aus- = Ein-Anzahl; 0: Aus- = Ein-Anzahl - 1
    END_VAR
    
    VAR_OUTPUT
      EIN : BOOL ;    
      AUS : BOOL ;    
      FAIL : BOOL ;    
    END_VAR
    
    VAR
      Timer_EIN : "TON";    
      Timer_AUS : "TON";    
    END_VAR
    
    VAR_TEMP
      Pausen : INT ;    
      AUS_gesamt : INT ;    
      EIN_ms : TIME ;    
      AUS_ms : TIME ;    
      Start_Timer : BOOL ;    
      Start_Timer_EIN : BOOL ;    
      Start_Timer_AUS : BOOL ;    
      ET_Timer_EIN : TIME ;    
      ET_Timer_AUS : TIME ;    
    END_VAR
    
    
    BEGIN
    
    NETWORK
    TITLE =Fail
          L     #Anzahl; 
          L     0; 
          <=I   ; 
          O(    ; 
          L     #Dauer; 
          >=I   ; 
          )     ; 
          O(    ; 
          L     #Anzahl; 
          *I    ; // Gesamte EIN-Zeit
          L     60; 
          >=I   ; // mehr oder gleich (keine Pausen möglich!) als 60min
          )     ; 
          =     #FAIL; 
          -D    ; // Differenz
          DTR   ; // in REAL wandeln
          ABS   ; // Absolutwert
          RND   ; // zurück in DINT
          T     #AUS_gesamt; // speichern
    
    NETWORK
    TITLE =EIN-Zeit
          L     #Dauer; 
          L     L#60000; // ms je min
          *D    ; 
          T     #EIN_ms; 
    
    NETWORK
    TITLE =Anzahl AUS-Zeiten
          L     #Anzahl; 
          U     #Synchron; 
          SPB   TPau; 
          +     -1; 
    TPau: T     #Pausen; 
    
    NETWORK
    TITLE =AUS-Zeit
          L     #AUS_gesamt; 
          L     L#60000; // ms je Minute
          *D    ; 
          L     #Pausen; 
          /D    ; // ms je Pause
          T     #AUS_ms; 
    
    NETWORK
    TITLE =Timer starten?
          U     #Start; 
          UN    #FAIL; 
          =     #Start_Timer; 
    
    NETWORK
    TITLE =Timer_EIN starten
          U     #Start_Timer; 
          UN    #Timer_AUS.Q; 
          =     #Start_Timer_EIN; 
    
    NETWORK
    TITLE =Timer_EIN
          CALL #Timer_EIN (
               IN                       := #Start_Timer_EIN,
               PT                       := #EIN_ms,
               ET                       := #ET_Timer_EIN);
    
    NETWORK
    TITLE =Timer_AUS straten
          U     #Timer_EIN.Q; 
          =     #Start_Timer_AUS; 
    
    NETWORK
    TITLE =Timer_Aus
          CALL #Timer_AUS (
               IN                       := #Start_Timer_AUS,
               PT                       := #AUS_ms,
               ET                       := #ET_Timer_AUS);
    
    NETWORK
    TITLE =Ausgang EIN
          U     #Start_Timer; 
          UN    #Timer_EIN.Q; 
          =     #EIN; 
    
    NETWORK
    TITLE =Ausgang AUS
          U     #Start_Timer; 
          U     #Timer_EIN.Q; 
          =     #AUS; 
    
    
    END_FUNCTION_BLOCK
    PS: Bei Asynchronität zw. EIN und AUS müsste man jetzt noch die AUS-Zeiten mitzählen, um die letzte nach einer Stunde zu unterdrücken und gleich wieder mit der EIN-Zeit zu beginnen.
    Geändert von hucki (31.07.2013 um 03:37 Uhr) Grund: Dauer und Anzahl auch auf kleiner Null prüfen & PS

  8. #8
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 919 Danke für 740 Beiträge

    Standard

    Zitat Zitat von hucki Beitrag anzeigen
    (aber keine Stunde auf Genauigkeit beim Berechnen der Pausen getestet )
    Zitat Zitat von hucki Beitrag anzeigen
    PS: Bei Asynchronität zw. EIN und AUS müsste man jetzt noch die AUS-Zeiten mitzählen, um die letzte nach einer Stunde zu unterdrücken und gleich wieder mit der EIN-Zeit zu beginnen.
    Hab' das mal als Stunden-Timer anstatt des Zählers noch eingebaut, der den ganzen Spaß dann resettet und somit die ms-Ungenauigkeit bei der Berechnung hoffentlich in der letzten Phase auch gleich wieder mit "begradigt":

    Code:
    FUNCTION_BLOCK "Impulse"
    TITLE =Variable Impulse je Stunde
    VERSION : 0.1
    
    
    VAR_INPUT
      Start : BOOL ;	// Ausgabe aktivieren	
      Anzahl : INT ;	
      Dauer : INT ;	// in min
      Synchron : BOOL ;	// 1: Aus- = Ein-Anzahl; 0: Aus- = Ein-Anzahl - 1
    END_VAR
    
    VAR_OUTPUT
      EIN : BOOL ;	
      AUS : BOOL ;	
      FAIL : BOOL ;	
    END_VAR
    
    VAR
      Timer_EIN : "TON";	
      Timer_AUS : "TON";	
      Timer_H : "TON";	
    END_VAR
    
    VAR_TEMP
      Pausen : INT ;	
      AUS_gesamt : INT ;	
      EIN_ms : TIME ;	
      AUS_ms : TIME ;	
      Start_Timer : BOOL ;	
      Start_Timer_H : BOOL ;	
      Start_Timer_EIN : BOOL ;	
      Start_Timer_AUS : BOOL ;	
      ET_Timer_H : TIME ;	
      ET_Timer_EIN : TIME ;	
      ET_Timer_AUS : TIME ;	
    END_VAR
    
    
    BEGIN
    
    NETWORK
    TITLE =Fail
          L     #Anzahl; 
          L     #Dauer; 
          *I    ; // Gesamte EIN-Zeit
          L     1; 
          <I    ; // weniger als 1 min
          O(    ; 
          TAK   ; // Ergebnis wieder in Akku 1 holen
          L     60; 
          >=I   ; // mehr oder gleich (keine Pausen mehr möglich!) als 60 min
          )     ; 
          =     #FAIL; 
          -D    ; // Differenz
          DTR   ; // in REAL wandeln
          ABS   ; // Absolutwert
          RND   ; // zurück in DINT
          T     #AUS_gesamt; // speichern
    
    NETWORK
    TITLE =EIN-Zeit
          L     #Dauer; 
          L     L#60000; // ms je min
          *D    ; 
          T     #EIN_ms; 
    
    NETWORK
    TITLE =Anzahl AUS-Zeiten
          L     #Anzahl; 
          U     #Synchron; 
          SPB   TPau; 
          +     -1; 
    TPau: T     #Pausen; 
    
    NETWORK
    TITLE =AUS-Zeit
          L     #AUS_gesamt; 
          L     L#60000; // ms je Minute
          *D    ; 
          L     #Pausen; 
          /D    ; // ms je Pause
          T     #AUS_ms; 
    
    NETWORK
    TITLE =Timer starten?
          U     #Start; 
          UN    #FAIL; 
          =     #Start_Timer; 
    
    NETWORK
    TITLE =Stunden-Timer starten
          U     #Start_Timer; 
          UN    #Timer_H.Q; 
          =     #Start_Timer_H; 
    
    NETWORK
    TITLE =Stunden-Timer
          CALL #Timer_H (
               IN                       := #Start_Timer_H,
               PT                       := T#1H,
               ET                       := #ET_Timer_H);
    
    NETWORK
    TITLE =Timer_EIN starten
          U     #Start_Timer; 
          UN    #Timer_H.Q; 
          UN    #Timer_AUS.Q; 
          =     #Start_Timer_EIN; 
    
    NETWORK
    TITLE =Timer_EIN
          CALL #Timer_EIN (
               IN                       := #Start_Timer_EIN,
               PT                       := #EIN_ms,
               ET                       := #ET_Timer_EIN);
    
    NETWORK
    TITLE =Timer_AUS straten
          U     #Timer_EIN.Q; 
          =     #Start_Timer_AUS; 
    
    NETWORK
    TITLE =Timer_AUS
          CALL #Timer_AUS (
               IN                       := #Start_Timer_AUS,
               PT                       := #AUS_ms,
               ET                       := #ET_Timer_AUS);
    
    NETWORK
    TITLE =Ausgang EIN
          U     #Start_Timer; 
          UN    #Timer_EIN.Q; 
          =     #EIN; 
    
    NETWORK
    TITLE =Ausgang AUS
          U     #Start_Timer; 
          U     #Timer_EIN.Q; 
          =     #AUS; 
    
    
    END_FUNCTION_BLOCK

  9. #9
    sochn0 ist offline Benutzer
    Themenstarter
    Registriert seit
    22.06.2013
    Beiträge
    39
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo erstmal 1000 dank das du dich meiner sache angenommen hast hucki. Das Problem was ich jezt habe wenn ich deinen Code in die SCL Quelle kopiere und ihn dann übersetzten lass zeigt er mir 56 Fehler an. OK das bei den Titeln von den Netztwerken das Hochkomma fehlt das ist nicht das Problem aber Die Fehlermeldung Anweisung zu tief verschachtelt usw. Oder hab ich da was falsch gemacht???

  10. #10
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 919 Danke für 740 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von sochn0 Beitrag anzeigen
    wenn ich deinen Code in die SCL Quelle kopiere und ihn dann übersetzten lass zeigt er mir 56 Fehler an.
    Könnte daran liegen, das es keine SCL- sondern eine AWL-Quelle ist.

  11. Folgender Benutzer sagt Danke zu hucki für den nützlichen Beitrag:

    sochn0 (31.07.2013)

Ähnliche Themen

  1. Hilfe bei einer Steuerung
    Von Darknessfall83 im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 23.03.2013, 21:36
  2. Brauche Hilfe bei einer SCL-Programmierung
    Von Schneibel im Forum Programmierstrategien
    Antworten: 2
    Letzter Beitrag: 17.01.2012, 13:10
  3. Hilfe bei der Bearbeitung einer Aufgabenstellung!
    Von scrabble im Forum Programmierstrategien
    Antworten: 2
    Letzter Beitrag: 14.06.2008, 21:15
  4. benötige Hilfe bei einer SPS Aufgabe
    Von king-spirit im Forum Simatic
    Antworten: 35
    Letzter Beitrag: 12.03.2007, 19:22
  5. Hilfe bei Test einer Im308c
    Von chriss1233 im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 02.08.2006, 08:49

Lesezeichen

Berechtigungen

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