Step 7 Hilfe bei einer Zeitberechnung

sochn0

Level-2
Beiträge
62
Reaktionspunkte
0
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.
 
... 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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
.
@ TE
Nun trau´dich doch mal und zeige uns deinen
Entwurfs-Code (wie das Larry schon sagte).

Dann geht es sicherlich weiter. ;)

Gruss
 
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?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So würde ich das umsetzen (aber keine Stunde auf Genauigkeit beim Berechnen der Pausen getestet ):

Code:
[FONT=Courier New]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[/FONT]
 
Mit TONs dürfte es sogar noch etwas einfacher sein:

Code:
[FONT=Courier New]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[/FONT]
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.
 
Zuletzt bearbeitet:
(aber keine Stunde auf Genauigkeit beim Berechnen der Pausen getestet )
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:
[FONT=Courier New]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[/FONT]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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???
 
Jetzt wo du es sagst :ROFLMAO: Ich glaube ich sollte mich nach der Nachtschicht lieber schlafen legen :confused: Danke nochmal
 
Zurück
Oben